@strands-agents/sdk 1.4.0 → 1.5.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 (352) hide show
  1. package/README.md +11 -11
  2. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  3. package/dist/src/__fixtures__/agent-helpers.js +6 -0
  4. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  5. package/dist/src/__fixtures__/register-node-defaults.d.ts +2 -0
  6. package/dist/src/__fixtures__/register-node-defaults.d.ts.map +1 -0
  7. package/dist/src/__fixtures__/register-node-defaults.js +6 -0
  8. package/dist/src/__fixtures__/register-node-defaults.js.map +1 -0
  9. package/dist/src/__fixtures__/test-sandbox.node.d.ts.map +1 -1
  10. package/dist/src/__fixtures__/test-sandbox.node.js +4 -3
  11. package/dist/src/__fixtures__/test-sandbox.node.js.map +1 -1
  12. package/dist/src/__tests__/default-slot.test.d.ts +2 -0
  13. package/dist/src/__tests__/default-slot.test.d.ts.map +1 -0
  14. package/dist/src/__tests__/default-slot.test.js +33 -0
  15. package/dist/src/__tests__/default-slot.test.js.map +1 -0
  16. package/dist/src/a2a/__tests__/async-lock.test.d.ts +2 -0
  17. package/dist/src/a2a/__tests__/async-lock.test.d.ts.map +1 -0
  18. package/dist/src/a2a/__tests__/async-lock.test.js +137 -0
  19. package/dist/src/a2a/__tests__/async-lock.test.js.map +1 -0
  20. package/dist/src/a2a/__tests__/executor.test.js +146 -8
  21. package/dist/src/a2a/__tests__/executor.test.js.map +1 -1
  22. package/dist/src/a2a/__tests__/server.test.js +20 -0
  23. package/dist/src/a2a/__tests__/server.test.js.map +1 -1
  24. package/dist/src/a2a/async-lock.d.ts +22 -0
  25. package/dist/src/a2a/async-lock.d.ts.map +1 -0
  26. package/dist/src/a2a/async-lock.js +38 -0
  27. package/dist/src/a2a/async-lock.js.map +1 -0
  28. package/dist/src/a2a/executor.d.ts +59 -24
  29. package/dist/src/a2a/executor.d.ts.map +1 -1
  30. package/dist/src/a2a/executor.js +209 -32
  31. package/dist/src/a2a/executor.js.map +1 -1
  32. package/dist/src/a2a/index.d.ts +1 -1
  33. package/dist/src/a2a/index.d.ts.map +1 -1
  34. package/dist/src/a2a/index.js +1 -1
  35. package/dist/src/a2a/index.js.map +1 -1
  36. package/dist/src/a2a/server.d.ts +18 -2
  37. package/dist/src/a2a/server.d.ts.map +1 -1
  38. package/dist/src/a2a/server.js +13 -2
  39. package/dist/src/a2a/server.js.map +1 -1
  40. package/dist/src/agent/__tests__/agent.context-manager.test.d.ts +2 -0
  41. package/dist/src/agent/__tests__/agent.context-manager.test.d.ts.map +1 -0
  42. package/dist/src/agent/__tests__/agent.context-manager.test.js +107 -0
  43. package/dist/src/agent/__tests__/agent.context-manager.test.js.map +1 -0
  44. package/dist/src/agent/__tests__/agent.tracer.test.node.js +14 -0
  45. package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +1 -1
  46. package/dist/src/agent/agent.d.ts +132 -2
  47. package/dist/src/agent/agent.d.ts.map +1 -1
  48. package/dist/src/agent/agent.js +478 -188
  49. package/dist/src/agent/agent.js.map +1 -1
  50. package/dist/src/conversation-manager/__tests__/pin.test.d.ts +2 -0
  51. package/dist/src/conversation-manager/__tests__/pin.test.d.ts.map +1 -0
  52. package/dist/src/conversation-manager/__tests__/pin.test.js +119 -0
  53. package/dist/src/conversation-manager/__tests__/pin.test.js.map +1 -0
  54. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +49 -0
  55. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  56. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +58 -0
  57. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
  58. package/dist/src/conversation-manager/pin-message.d.ts +45 -0
  59. package/dist/src/conversation-manager/pin-message.d.ts.map +1 -0
  60. package/dist/src/conversation-manager/pin-message.js +106 -0
  61. package/dist/src/conversation-manager/pin-message.js.map +1 -0
  62. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +7 -0
  63. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  64. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +27 -4
  65. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  66. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +7 -0
  67. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
  68. package/dist/src/conversation-manager/summarizing-conversation-manager.js +18 -4
  69. package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
  70. package/dist/src/default-slot.d.ts +6 -0
  71. package/dist/src/default-slot.d.ts.map +1 -0
  72. package/dist/src/default-slot.js +18 -0
  73. package/dist/src/default-slot.js.map +1 -0
  74. package/dist/src/errors.d.ts +8 -0
  75. package/dist/src/errors.d.ts.map +1 -1
  76. package/dist/src/errors.js +11 -0
  77. package/dist/src/errors.js.map +1 -1
  78. package/dist/src/index.d.ts +8 -1
  79. package/dist/src/index.d.ts.map +1 -1
  80. package/dist/src/index.js +7 -1
  81. package/dist/src/index.js.map +1 -1
  82. package/dist/src/index.node.d.ts +2 -0
  83. package/dist/src/index.node.d.ts.map +1 -0
  84. package/dist/src/index.node.js +9 -0
  85. package/dist/src/index.node.js.map +1 -0
  86. package/dist/src/interrupt.d.ts +5 -1
  87. package/dist/src/interrupt.d.ts.map +1 -1
  88. package/dist/src/interrupt.js +6 -0
  89. package/dist/src/interrupt.js.map +1 -1
  90. package/dist/src/memory/__tests__/memory-manager.test.d.ts +2 -0
  91. package/dist/src/memory/__tests__/memory-manager.test.d.ts.map +1 -0
  92. package/dist/src/memory/__tests__/memory-manager.test.js +493 -0
  93. package/dist/src/memory/__tests__/memory-manager.test.js.map +1 -0
  94. package/dist/src/memory/extraction/__tests__/extraction.test.d.ts +2 -0
  95. package/dist/src/memory/extraction/__tests__/extraction.test.d.ts.map +1 -0
  96. package/dist/src/memory/extraction/__tests__/extraction.test.js +637 -0
  97. package/dist/src/memory/extraction/__tests__/extraction.test.js.map +1 -0
  98. package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts +2 -0
  99. package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts.map +1 -0
  100. package/dist/src/memory/extraction/__tests__/model-extractor.test.js +68 -0
  101. package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +1 -0
  102. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts +2 -0
  103. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts.map +1 -0
  104. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js +81 -0
  105. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js.map +1 -0
  106. package/dist/src/memory/extraction/coordinator.d.ts +128 -0
  107. package/dist/src/memory/extraction/coordinator.d.ts.map +1 -0
  108. package/dist/src/memory/extraction/coordinator.js +245 -0
  109. package/dist/src/memory/extraction/coordinator.js.map +1 -0
  110. package/dist/src/memory/extraction/model-extractor.d.ts +32 -0
  111. package/dist/src/memory/extraction/model-extractor.d.ts.map +1 -0
  112. package/dist/src/memory/extraction/model-extractor.js +118 -0
  113. package/dist/src/memory/extraction/model-extractor.js.map +1 -0
  114. package/dist/src/memory/extraction/resolve-extraction-config.d.ts +46 -0
  115. package/dist/src/memory/extraction/resolve-extraction-config.d.ts.map +1 -0
  116. package/dist/src/memory/extraction/resolve-extraction-config.js +59 -0
  117. package/dist/src/memory/extraction/resolve-extraction-config.js.map +1 -0
  118. package/dist/src/memory/extraction/triggers.d.ts +41 -0
  119. package/dist/src/memory/extraction/triggers.d.ts.map +1 -0
  120. package/dist/src/memory/extraction/triggers.js +59 -0
  121. package/dist/src/memory/extraction/triggers.js.map +1 -0
  122. package/dist/src/memory/extraction/types.d.ts +133 -0
  123. package/dist/src/memory/extraction/types.d.ts.map +1 -0
  124. package/dist/src/memory/extraction/types.js +19 -0
  125. package/dist/src/memory/extraction/types.js.map +1 -0
  126. package/dist/src/memory/index.d.ts +9 -0
  127. package/dist/src/memory/index.d.ts.map +1 -0
  128. package/dist/src/memory/index.js +5 -0
  129. package/dist/src/memory/index.js.map +1 -0
  130. package/dist/src/memory/memory-manager.d.ts +131 -0
  131. package/dist/src/memory/memory-manager.d.ts.map +1 -0
  132. package/dist/src/memory/memory-manager.js +404 -0
  133. package/dist/src/memory/memory-manager.js.map +1 -0
  134. package/dist/src/memory/types.d.ts +213 -0
  135. package/dist/src/memory/types.d.ts.map +1 -0
  136. package/dist/src/memory/types.js +2 -0
  137. package/dist/src/memory/types.js.map +1 -0
  138. package/dist/src/middleware/__tests__/agent-middleware.test.d.ts +2 -0
  139. package/dist/src/middleware/__tests__/agent-middleware.test.d.ts.map +1 -0
  140. package/dist/src/middleware/__tests__/agent-middleware.test.js +1207 -0
  141. package/dist/src/middleware/__tests__/agent-middleware.test.js.map +1 -0
  142. package/dist/src/middleware/__tests__/custom-stages.test.d.ts +2 -0
  143. package/dist/src/middleware/__tests__/custom-stages.test.d.ts.map +1 -0
  144. package/dist/src/middleware/__tests__/custom-stages.test.js +97 -0
  145. package/dist/src/middleware/__tests__/custom-stages.test.js.map +1 -0
  146. package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts +2 -0
  147. package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts.map +1 -0
  148. package/dist/src/middleware/__tests__/middleware-interrupts.test.js +267 -0
  149. package/dist/src/middleware/__tests__/middleware-interrupts.test.js.map +1 -0
  150. package/dist/src/middleware/__tests__/registry.test.d.ts +2 -0
  151. package/dist/src/middleware/__tests__/registry.test.d.ts.map +1 -0
  152. package/dist/src/middleware/__tests__/registry.test.js +525 -0
  153. package/dist/src/middleware/__tests__/registry.test.js.map +1 -0
  154. package/dist/src/middleware/index.d.ts +5 -0
  155. package/dist/src/middleware/index.d.ts.map +1 -0
  156. package/dist/src/middleware/index.js +3 -0
  157. package/dist/src/middleware/index.js.map +1 -0
  158. package/dist/src/middleware/registry.d.ts +58 -0
  159. package/dist/src/middleware/registry.d.ts.map +1 -0
  160. package/dist/src/middleware/registry.js +107 -0
  161. package/dist/src/middleware/registry.js.map +1 -0
  162. package/dist/src/middleware/stages.d.ts +138 -0
  163. package/dist/src/middleware/stages.d.ts.map +1 -0
  164. package/dist/src/middleware/stages.js +31 -0
  165. package/dist/src/middleware/stages.js.map +1 -0
  166. package/dist/src/middleware/types.d.ts +88 -0
  167. package/dist/src/middleware/types.d.ts.map +1 -0
  168. package/dist/src/middleware/types.js +2 -0
  169. package/dist/src/middleware/types.js.map +1 -0
  170. package/dist/src/models/__tests__/anthropic.test.js +16 -1
  171. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  172. package/dist/src/models/__tests__/bedrock.test.js +39 -0
  173. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  174. package/dist/src/models/__tests__/model.test.js +46 -3
  175. package/dist/src/models/__tests__/model.test.js.map +1 -1
  176. package/dist/src/models/anthropic.js +2 -2
  177. package/dist/src/models/anthropic.js.map +1 -1
  178. package/dist/src/models/bedrock.d.ts.map +1 -1
  179. package/dist/src/models/bedrock.js +12 -5
  180. package/dist/src/models/bedrock.js.map +1 -1
  181. package/dist/src/models/defaults.d.ts.map +1 -1
  182. package/dist/src/models/defaults.js +2 -0
  183. package/dist/src/models/defaults.js.map +1 -1
  184. package/dist/src/models/model.d.ts.map +1 -1
  185. package/dist/src/models/model.js +7 -3
  186. package/dist/src/models/model.js.map +1 -1
  187. package/dist/src/models/openai/__tests__/responses.test.js +8 -14
  188. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -1
  189. package/dist/src/sandbox/__tests__/default.test.browser.d.ts +2 -0
  190. package/dist/src/sandbox/__tests__/default.test.browser.d.ts.map +1 -0
  191. package/dist/src/sandbox/__tests__/default.test.browser.js +11 -0
  192. package/dist/src/sandbox/__tests__/default.test.browser.js.map +1 -0
  193. package/dist/src/sandbox/__tests__/default.test.node.d.ts +2 -0
  194. package/dist/src/sandbox/__tests__/default.test.node.d.ts.map +1 -0
  195. package/dist/src/sandbox/__tests__/default.test.node.js +23 -0
  196. package/dist/src/sandbox/__tests__/default.test.node.js.map +1 -0
  197. package/dist/src/sandbox/__tests__/docker.test.node.d.ts +2 -0
  198. package/dist/src/sandbox/__tests__/docker.test.node.d.ts.map +1 -0
  199. package/dist/src/sandbox/__tests__/docker.test.node.js +89 -0
  200. package/dist/src/sandbox/__tests__/docker.test.node.js.map +1 -0
  201. package/dist/src/sandbox/__tests__/errors.test.node.d.ts +2 -0
  202. package/dist/src/sandbox/__tests__/errors.test.node.d.ts.map +1 -0
  203. package/dist/src/sandbox/__tests__/errors.test.node.js +33 -0
  204. package/dist/src/sandbox/__tests__/errors.test.node.js.map +1 -0
  205. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts +2 -0
  206. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts.map +1 -0
  207. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js +124 -0
  208. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js.map +1 -0
  209. package/dist/src/sandbox/__tests__/posix-shell.test.node.js +50 -4
  210. package/dist/src/sandbox/__tests__/posix-shell.test.node.js.map +1 -1
  211. package/dist/src/sandbox/__tests__/ssh.test.node.d.ts +2 -0
  212. package/dist/src/sandbox/__tests__/ssh.test.node.d.ts.map +1 -0
  213. package/dist/src/sandbox/__tests__/ssh.test.node.js +262 -0
  214. package/dist/src/sandbox/__tests__/ssh.test.node.js.map +1 -0
  215. package/dist/src/sandbox/base.d.ts +22 -4
  216. package/dist/src/sandbox/base.d.ts.map +1 -1
  217. package/dist/src/sandbox/base.js +15 -2
  218. package/dist/src/sandbox/base.js.map +1 -1
  219. package/dist/src/sandbox/constants.d.ts +18 -0
  220. package/dist/src/sandbox/constants.d.ts.map +1 -1
  221. package/dist/src/sandbox/constants.js +20 -0
  222. package/dist/src/sandbox/constants.js.map +1 -1
  223. package/dist/src/sandbox/default.d.ts +3 -0
  224. package/dist/src/sandbox/default.d.ts.map +1 -0
  225. package/dist/src/sandbox/default.js +3 -0
  226. package/dist/src/sandbox/default.js.map +1 -0
  227. package/dist/src/sandbox/docker.d.ts +38 -0
  228. package/dist/src/sandbox/docker.d.ts.map +1 -0
  229. package/dist/src/sandbox/docker.js +59 -0
  230. package/dist/src/sandbox/docker.js.map +1 -0
  231. package/dist/src/sandbox/errors.d.ts +26 -0
  232. package/dist/src/sandbox/errors.d.ts.map +1 -0
  233. package/dist/src/sandbox/errors.js +35 -0
  234. package/dist/src/sandbox/errors.js.map +1 -0
  235. package/dist/src/sandbox/index.d.ts +5 -0
  236. package/dist/src/sandbox/index.d.ts.map +1 -0
  237. package/dist/src/sandbox/index.js +4 -0
  238. package/dist/src/sandbox/index.js.map +1 -0
  239. package/dist/src/sandbox/not-a-sandbox-local-environment.d.ts +16 -0
  240. package/dist/src/sandbox/not-a-sandbox-local-environment.d.ts.map +1 -0
  241. package/dist/src/sandbox/not-a-sandbox-local-environment.js +83 -0
  242. package/dist/src/sandbox/not-a-sandbox-local-environment.js.map +1 -0
  243. package/dist/src/sandbox/posix-shell.d.ts +21 -0
  244. package/dist/src/sandbox/posix-shell.d.ts.map +1 -1
  245. package/dist/src/sandbox/posix-shell.js +41 -3
  246. package/dist/src/sandbox/posix-shell.js.map +1 -1
  247. package/dist/src/sandbox/ssh.d.ts +56 -0
  248. package/dist/src/sandbox/ssh.d.ts.map +1 -0
  249. package/dist/src/sandbox/ssh.js +119 -0
  250. package/dist/src/sandbox/ssh.js.map +1 -0
  251. package/dist/src/sandbox/stream-process.d.ts.map +1 -1
  252. package/dist/src/sandbox/stream-process.js +3 -2
  253. package/dist/src/sandbox/stream-process.js.map +1 -1
  254. package/dist/src/tsconfig.tsbuildinfo +1 -1
  255. package/dist/src/types/agent.d.ts +21 -0
  256. package/dist/src/types/agent.d.ts.map +1 -1
  257. package/dist/src/types/agent.js.map +1 -1
  258. package/dist/src/types/messages.d.ts +1 -1
  259. package/dist/src/types/messages.d.ts.map +1 -1
  260. package/dist/src/types/messages.js.map +1 -1
  261. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts +2 -0
  262. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.d.ts.map +1 -0
  263. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js +611 -0
  264. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.js.map +1 -0
  265. package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts +2 -0
  266. package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.d.ts.map +1 -0
  267. package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.js +2 -0
  268. package/dist/src/vended-memory-stores/bedrock-knowledge-base/index.js.map +1 -0
  269. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts +230 -0
  270. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.d.ts.map +1 -0
  271. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js +370 -0
  272. package/dist/src/vended-memory-stores/bedrock-knowledge-base/store.js.map +1 -0
  273. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts +2 -0
  274. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts.map +1 -0
  275. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js +68 -0
  276. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js.map +1 -0
  277. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts +2 -0
  278. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts.map +1 -0
  279. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +93 -0
  280. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +1 -0
  281. package/dist/src/vended-plugins/context-offloader/index.d.ts +1 -1
  282. package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -1
  283. package/dist/src/vended-plugins/context-offloader/plugin.d.ts +4 -1
  284. package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -1
  285. package/dist/src/vended-plugins/context-offloader/plugin.js +29 -7
  286. package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -1
  287. package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -1
  288. package/dist/src/vended-plugins/context-offloader/search.js +3 -5
  289. package/dist/src/vended-plugins/context-offloader/search.js.map +1 -1
  290. package/dist/src/vended-plugins/context-offloader/storage.d.ts +29 -5
  291. package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -1
  292. package/dist/src/vended-plugins/context-offloader/storage.js +75 -11
  293. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
  294. package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts +2 -0
  295. package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts.map +1 -0
  296. package/dist/src/vended-plugins/goal/__tests__/plugin.test.js +736 -0
  297. package/dist/src/vended-plugins/goal/__tests__/plugin.test.js.map +1 -0
  298. package/dist/src/vended-plugins/goal/index.d.ts +21 -0
  299. package/dist/src/vended-plugins/goal/index.d.ts.map +1 -0
  300. package/dist/src/vended-plugins/goal/index.js +20 -0
  301. package/dist/src/vended-plugins/goal/index.js.map +1 -0
  302. package/dist/src/vended-plugins/goal/judge.d.ts +41 -0
  303. package/dist/src/vended-plugins/goal/judge.d.ts.map +1 -0
  304. package/dist/src/vended-plugins/goal/judge.js +92 -0
  305. package/dist/src/vended-plugins/goal/judge.js.map +1 -0
  306. package/dist/src/vended-plugins/goal/plugin.d.ts +214 -0
  307. package/dist/src/vended-plugins/goal/plugin.d.ts.map +1 -0
  308. package/dist/src/vended-plugins/goal/plugin.js +287 -0
  309. package/dist/src/vended-plugins/goal/plugin.js.map +1 -0
  310. package/dist/src/vended-plugins/index.d.ts +2 -1
  311. package/dist/src/vended-plugins/index.d.ts.map +1 -1
  312. package/dist/src/vended-plugins/index.js +2 -1
  313. package/dist/src/vended-plugins/index.js.map +1 -1
  314. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +17 -7
  315. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
  316. package/dist/src/vended-plugins/skills/agent-skills.d.ts +21 -7
  317. package/dist/src/vended-plugins/skills/agent-skills.d.ts.map +1 -1
  318. package/dist/src/vended-plugins/skills/agent-skills.js +144 -77
  319. package/dist/src/vended-plugins/skills/agent-skills.js.map +1 -1
  320. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +44 -4
  321. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  322. package/dist/src/vended-tools/bash/bash.d.ts +3 -24
  323. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  324. package/dist/src/vended-tools/bash/bash.js +9 -9
  325. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  326. package/dist/src/vended-tools/bash/index.d.ts +3 -1
  327. package/dist/src/vended-tools/bash/index.d.ts.map +1 -1
  328. package/dist/src/vended-tools/bash/index.js +2 -1
  329. package/dist/src/vended-tools/bash/index.js.map +1 -1
  330. package/dist/src/vended-tools/bash/make-bash.d.ts +22 -0
  331. package/dist/src/vended-tools/bash/make-bash.d.ts.map +1 -0
  332. package/dist/src/vended-tools/bash/make-bash.js +40 -0
  333. package/dist/src/vended-tools/bash/make-bash.js.map +1 -0
  334. package/dist/src/vended-tools/bash/types.d.ts +1 -0
  335. package/dist/src/vended-tools/bash/types.d.ts.map +1 -1
  336. package/dist/src/vended-tools/bash/types.js +2 -0
  337. package/dist/src/vended-tools/bash/types.js.map +1 -1
  338. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +83 -1
  339. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
  340. package/dist/src/vended-tools/file-editor/file-editor.d.ts +19 -10
  341. package/dist/src/vended-tools/file-editor/file-editor.d.ts.map +1 -1
  342. package/dist/src/vended-tools/file-editor/file-editor.js +188 -218
  343. package/dist/src/vended-tools/file-editor/file-editor.js.map +1 -1
  344. package/dist/src/vended-tools/file-editor/index.d.ts +2 -1
  345. package/dist/src/vended-tools/file-editor/index.d.ts.map +1 -1
  346. package/dist/src/vended-tools/file-editor/index.js +1 -1
  347. package/dist/src/vended-tools/file-editor/index.js.map +1 -1
  348. package/package.json +41 -6
  349. package/dist/src/utils/shell-quote.d.ts +0 -12
  350. package/dist/src/utils/shell-quote.d.ts.map +0 -1
  351. package/dist/src/utils/shell-quote.js +0 -14
  352. package/dist/src/utils/shell-quote.js.map +0 -1
package/README.md CHANGED
@@ -14,10 +14,10 @@
14
14
  </h2>
15
15
 
16
16
  <div align="center">
17
- <a href="https://github.com/strands-agents/sdk-python/graphs/commit-activity"><img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/strands-agents/sdk-python"/></a>
18
- <a href="https://github.com/strands-agents/sdk-python/issues"><img alt="GitHub open issues" src="https://img.shields.io/github/issues/strands-agents/sdk-python"/></a>
19
- <a href="https://github.com/strands-agents/sdk-python/pulls"><img alt="GitHub open pull requests" src="https://img.shields.io/github/issues-pr/strands-agents/sdk-python"/></a>
20
- <a href="https://github.com/strands-agents/sdk-python/blob/main/LICENSE.APACHE"><img alt="License" src="https://img.shields.io/github/license/strands-agents/sdk-python"/></a>
17
+ <a href="https://github.com/strands-agents/harness-sdk/graphs/commit-activity"><img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/strands-agents/harness-sdk"/></a>
18
+ <a href="https://github.com/strands-agents/harness-sdk/issues"><img alt="GitHub open issues" src="https://img.shields.io/github/issues/strands-agents/harness-sdk"/></a>
19
+ <a href="https://github.com/strands-agents/harness-sdk/pulls"><img alt="GitHub open pull requests" src="https://img.shields.io/github/issues-pr/strands-agents/harness-sdk"/></a>
20
+ <a href="https://github.com/strands-agents/harness-sdk/blob/main/LICENSE.APACHE"><img alt="License" src="https://img.shields.io/github/license/strands-agents/harness-sdk"/></a>
21
21
  <a href="https://www.npmjs.com/package/@strands-agents/sdk"><img alt="NPM Version" src="https://img.shields.io/npm/v/@strands-agents/sdk"/></a>
22
22
  <a href="https://discord.gg/strands"><img alt="Strands Discord" src="https://img.shields.io/badge/Discord-Strands-5865F2?logo=discord&logoColor=white"/></a>
23
23
  </div>
@@ -25,7 +25,7 @@
25
25
  <p>
26
26
  <a href="https://strandsagents.com/">Documentation</a>
27
27
  ◆ <a href="https://github.com/strands-agents/samples">Samples</a>
28
- ◆ <a href="https://github.com/strands-agents/sdk-python">Python SDK</a>
28
+ ◆ <a href="https://github.com/strands-agents/harness-sdk/tree/main/strands-py">Python SDK</a>
29
29
  ◆ <a href="https://github.com/strands-agents/tools">Tools</a>
30
30
  ◆ <a href="https://github.com/strands-agents/agent-builder">Agent Builder</a>
31
31
  ◆ <a href="https://github.com/strands-agents/mcp-server">MCP Server</a>
@@ -75,7 +75,7 @@ const result = await agent.invoke('What is the square root of 1764?')
75
75
  console.log(result)
76
76
  ```
77
77
 
78
- > **Note**: For the default Amazon Bedrock model provider, you'll need AWS credentials configured and model access enabled for Claude Sonnet 4 in your region.
78
+ > **Note**: For the default Amazon Bedrock model provider, you'll need AWS credentials configured and model access enabled for Claude Sonnet 4.6 in your region.
79
79
 
80
80
  ---
81
81
 
@@ -103,7 +103,7 @@ import { Agent, BedrockModel } from '@strands-agents/sdk'
103
103
 
104
104
  const model = new BedrockModel({
105
105
  region: 'us-east-1',
106
- modelId: 'anthropic.claude-3-5-sonnet-20240620-v1:0',
106
+ modelId: 'global.anthropic.claude-sonnet-4-6',
107
107
  maxTokens: 4096,
108
108
  temperature: 0.7
109
109
  })
@@ -313,13 +313,13 @@ For detailed guidance, tutorials, and concept overviews, please visit:
313
313
  - **[MCP](./examples/mcp/)**: MCP integration example
314
314
  - **[Browser Agent](./examples/browser-agent/)**: Browser-based agent with DOM manipulation
315
315
 
316
- - **[Contributing Guide](https://github.com/strands-agents/sdk-python/blob/main/CONTRIBUTING.md)**: Development setup and guidelines
316
+ - **[Contributing Guide](https://github.com/strands-agents/harness-sdk/blob/main/CONTRIBUTING.md)**: Development setup and guidelines
317
317
 
318
318
  ---
319
319
 
320
320
  ## Contributing ❤️
321
321
 
322
- We welcome contributions! See our [Contributing Guide](https://github.com/strands-agents/sdk-python/blob/main/CONTRIBUTING.md) for details on:
322
+ We welcome contributions! See our [Contributing Guide](https://github.com/strands-agents/harness-sdk/blob/main/CONTRIBUTING.md) for details on:
323
323
 
324
324
  - Development setup and environment
325
325
  - Testing and code quality standards
@@ -336,11 +336,11 @@ Come meet the Strands team and other users on [**Discord**](https://discord.com/
336
336
 
337
337
  ## License
338
338
 
339
- This project is licensed under the Apache License 2.0 - see the [LICENSE](https://github.com/strands-agents/sdk-python/blob/main/LICENSE.APACHE) file for details.
339
+ This project is licensed under the Apache License 2.0 - see the [LICENSE](https://github.com/strands-agents/harness-sdk/blob/main/LICENSE.APACHE) file for details.
340
340
 
341
341
  ---
342
342
 
343
343
  ## Security
344
344
 
345
- See [CONTRIBUTING](https://github.com/strands-agents/sdk-python/blob/main/CONTRIBUTING.md#security-issue-notifications) for more information on reporting security issues.
345
+ See [CONTRIBUTING](https://github.com/strands-agents/harness-sdk/blob/main/CONTRIBUTING.md#security-issue-notifications) for more information on reporting security issues.
346
346
 
@@ -1 +1 @@
1
- {"version":3,"file":"agent-helpers.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/agent-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAA6B,MAAM,mBAAmB,CAAA;AAC/F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,OAAO,EAAa,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,oBAAoB,CAAA;AACpE,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC/E,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEjF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,wBAAwB,CAAC,aAAa,CAAC,CAAA;IAClD,QAAQ,EAAE,YAAY,CAAC,aAAa,CAAC,CAAA;CACtC,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACpC;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAAE,YAAY,EAAE,WAAW,EAAE,CAAA;CAAE,CAAA;AAE/D;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,CAkB/D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1G;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAChF;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IAEtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAgC1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,gBAAgB,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAwB,GAC5E,cAAc,CA8BhB"}
1
+ {"version":3,"file":"agent-helpers.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/agent-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAA6B,MAAM,mBAAmB,CAAA;AAC/F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,OAAO,EAAa,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG3D,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,oBAAoB,CAAA;AACpE,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC/E,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEjF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,wBAAwB,CAAC,aAAa,CAAC,CAAA;IAClD,QAAQ,EAAE,YAAY,CAAC,aAAa,CAAC,CAAA;CACtC,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACpC;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAAE,YAAY,EAAE,WAAW,EAAE,CAAA;CAAE,CAAA;AAE/D;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,CAuB/D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1G;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAChF;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IAEtB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAgC1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,gBAAgB,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAwB,GAC5E,cAAc,CA8BhB"}
@@ -6,6 +6,7 @@ import { expect } from 'vitest';
6
6
  import { Message, TextBlock } from '../types/messages.js';
7
7
  import { StateStore } from '../state-store.js';
8
8
  import { ToolRegistry } from '../registry/tool-registry.js';
9
+ import { defaultSandbox } from '../sandbox/default.js';
9
10
  import { expectLoopMetrics } from './metrics-helpers.js';
10
11
  /**
11
12
  * Helper to create a mock Agent for testing.
@@ -23,6 +24,11 @@ export function createMockAgent(data) {
23
24
  modelState: new StateStore(),
24
25
  toolRegistry: data?.toolRegistry ?? new ToolRegistry(),
25
26
  cancelSignal: new AbortController().signal,
27
+ // Mirror the real Agent.sandbox getter: resolve the environment default lazily.
28
+ // An explicit `extra.sandbox` below overrides this accessor.
29
+ get sandbox() {
30
+ return defaultSandbox.get();
31
+ },
26
32
  addHook: (eventType, callback) => {
27
33
  trackedHooks.push({
28
34
  eventType: eventType,
@@ -1 +1 @@
1
- {"version":3,"file":"agent-helpers.js","sourceRoot":"","sources":["../../../src/__fixtures__/agent-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-helpers.js","sourceRoot":"","sources":["../../../src/__fixtures__/agent-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register-node-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-node-defaults.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/register-node-defaults.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { defaultSandbox } from '../sandbox/default.js';
2
+ import { NotASandboxLocalEnvironment } from '../sandbox/not-a-sandbox-local-environment.js';
3
+ // In production, index.node.ts registers this on import. Tests don't go through that entry
4
+ // point, so this setup file does it instead.
5
+ defaultSandbox.set(new NotASandboxLocalEnvironment());
6
+ //# sourceMappingURL=register-node-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-node-defaults.js","sourceRoot":"","sources":["../../../src/__fixtures__/register-node-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAA;AAE3F,2FAA2F;AAC3F,6CAA6C;AAC7C,cAAc,CAAC,GAAG,CAAC,IAAI,2BAA2B,EAAE,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"test-sandbox.node.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/test-sandbox.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEvE;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,iBAAiB;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;gBAEf,UAAU,EAAE,MAAM;IAKvB,gBAAgB,CACrB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,cAAc,CAAC,WAAW,GAAG,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC;CAKlE"}
1
+ {"version":3,"file":"test-sandbox.node.d.ts","sourceRoot":"","sources":["../../../src/__fixtures__/test-sandbox.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAGlF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEvE;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,iBAAiB;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;gBAEf,UAAU,EAAE,MAAM;IAKvB,gBAAgB,CACrB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,cAAc,CAAC,WAAW,GAAG,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC;CAMlE"}
@@ -1,5 +1,5 @@
1
- import { PosixShellSandbox } from '../sandbox/posix-shell.js';
2
- import { shellQuote } from '../utils/shell-quote.js';
1
+ import { buildShellEnvPrefix, PosixShellSandbox } from '../sandbox/posix-shell.js';
2
+ import { shellQuote } from '../sandbox/constants.js';
3
3
  import { streamProcess } from '../sandbox/stream-process.js';
4
4
  /**
5
5
  * Test sandbox that executes commands within a specific working directory.
@@ -15,7 +15,8 @@ export class TestSandbox extends PosixShellSandbox {
15
15
  }
16
16
  async *executeStreaming(command, options) {
17
17
  const cwd = options?.cwd ?? this.workingDir;
18
- const fullCommand = `cd ${shellQuote(cwd)} && ${command}`;
18
+ const envPrefix = buildShellEnvPrefix(options?.env);
19
+ const fullCommand = `cd ${shellQuote(cwd)} && ${envPrefix}${command}`;
19
20
  yield* streamProcess('sh', ['-c', fullCommand], { timeout: options?.timeout, signal: options?.signal });
20
21
  }
21
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"test-sandbox.node.js","sourceRoot":"","sources":["../../../src/__fixtures__/test-sandbox.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAI5D;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,iBAAiB;IACvC,UAAU,CAAQ;IAE3B,YAAY,UAAkB;QAC5B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,CAAC,gBAAgB,CACrB,OAAe,EACf,OAAwB;QAExB,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAA;QAC3C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAA;QACzD,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IACzG,CAAC;CACF"}
1
+ {"version":3,"file":"test-sandbox.node.js","sourceRoot":"","sources":["../../../src/__fixtures__/test-sandbox.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAI5D;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,iBAAiB;IACvC,UAAU,CAAQ;IAE3B,YAAY,UAAkB;QAC5B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,CAAC,gBAAgB,CACrB,OAAe,EACf,OAAwB;QAExB,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAA;QAC3C,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACnD,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,SAAS,GAAG,OAAO,EAAE,CAAA;QACrE,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IACzG,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=default-slot.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-slot.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/default-slot.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { createDefaultSlot } from '../default-slot.js';
3
+ import { DefaultNotConfiguredError } from '../errors.js';
4
+ describe('createDefaultSlot', () => {
5
+ it('throws DefaultNotConfiguredError when read before configured', () => {
6
+ const slot = createDefaultSlot('not set');
7
+ expect(() => slot.get()).toThrow(DefaultNotConfiguredError);
8
+ expect(() => slot.get()).toThrow('not set');
9
+ });
10
+ it('returns the configured value after set', () => {
11
+ const slot = createDefaultSlot('not set');
12
+ slot.set('value');
13
+ expect(slot.get()).toBe('value');
14
+ });
15
+ it('stores falsy values that the sentinel must not confuse with unset', () => {
16
+ const numbers = createDefaultSlot('no number');
17
+ numbers.set(0);
18
+ expect(numbers.get()).toBe(0);
19
+ const nullable = createDefaultSlot('no value');
20
+ nullable.set(null);
21
+ expect(nullable.get()).toBeNull();
22
+ const maybe = createDefaultSlot('no value');
23
+ maybe.set(undefined);
24
+ expect(maybe.get()).toBeUndefined();
25
+ });
26
+ it('overwrites on a subsequent set', () => {
27
+ const slot = createDefaultSlot('not set');
28
+ slot.set('first');
29
+ slot.set('second');
30
+ expect(slot.get()).toBe('second');
31
+ });
32
+ });
33
+ //# sourceMappingURL=default-slot.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-slot.test.js","sourceRoot":"","sources":["../../../src/__tests__/default-slot.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AAExD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,IAAI,GAAG,iBAAiB,CAAS,SAAS,CAAC,CAAA;QACjD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAA;QAC3D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,IAAI,GAAG,iBAAiB,CAAS,SAAS,CAAC,CAAA;QACjD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACjB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,OAAO,GAAG,iBAAiB,CAAS,WAAW,CAAC,CAAA;QACtD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACd,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE7B,MAAM,QAAQ,GAAG,iBAAiB,CAAgB,UAAU,CAAC,CAAA;QAC7D,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAClB,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;QAEjC,MAAM,KAAK,GAAG,iBAAiB,CAAqB,UAAU,CAAC,CAAA;QAC/D,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACpB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,aAAa,EAAE,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,iBAAiB,CAAS,SAAS,CAAC,CAAA;QACjD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACjB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=async-lock.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-lock.test.d.ts","sourceRoot":"","sources":["../../../../src/a2a/__tests__/async-lock.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { describe, expect, it } from 'vitest';
54
+ import { AsyncLock } from '../async-lock.js';
55
+ describe('AsyncLock', () => {
56
+ it('serializes critical sections in FIFO order', async () => {
57
+ const lock = new AsyncLock();
58
+ const order = [];
59
+ async function task(id, delayMs) {
60
+ const env_1 = { stack: [], error: void 0, hasError: false };
61
+ try {
62
+ const _release = __addDisposableResource(env_1, await lock.acquire(), false);
63
+ order.push(id);
64
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
65
+ }
66
+ catch (e_1) {
67
+ env_1.error = e_1;
68
+ env_1.hasError = true;
69
+ }
70
+ finally {
71
+ __disposeResources(env_1);
72
+ }
73
+ }
74
+ // Start three tasks "concurrently". Despite descending delays, the lock
75
+ // forces them to run one at a time in acquisition order.
76
+ await Promise.all([task(1, 15), task(2, 10), task(3, 5)]);
77
+ expect(order).toStrictEqual([1, 2, 3]);
78
+ });
79
+ it('prevents overlap of holders', async () => {
80
+ const lock = new AsyncLock();
81
+ let active = 0;
82
+ let maxActive = 0;
83
+ async function task() {
84
+ const env_2 = { stack: [], error: void 0, hasError: false };
85
+ try {
86
+ const _release = __addDisposableResource(env_2, await lock.acquire(), false);
87
+ active++;
88
+ maxActive = Math.max(maxActive, active);
89
+ await new Promise((resolve) => setTimeout(resolve, 5));
90
+ active--;
91
+ }
92
+ catch (e_2) {
93
+ env_2.error = e_2;
94
+ env_2.hasError = true;
95
+ }
96
+ finally {
97
+ __disposeResources(env_2);
98
+ }
99
+ }
100
+ await Promise.all([task(), task(), task(), task()]);
101
+ expect(maxActive).toBe(1);
102
+ });
103
+ it('releases the lock even if the holder throws', async () => {
104
+ const env_3 = { stack: [], error: void 0, hasError: false };
105
+ try {
106
+ const lock = new AsyncLock();
107
+ try {
108
+ const env_4 = { stack: [], error: void 0, hasError: false };
109
+ try {
110
+ const _release = __addDisposableResource(env_4, await lock.acquire(), false);
111
+ throw new Error('boom');
112
+ }
113
+ catch (e_3) {
114
+ env_4.error = e_3;
115
+ env_4.hasError = true;
116
+ }
117
+ finally {
118
+ __disposeResources(env_4);
119
+ }
120
+ }
121
+ catch {
122
+ // swallow; the `using` handle is disposed as the block unwinds
123
+ }
124
+ // A subsequent acquire must resolve (would hang if the lock leaked).
125
+ const _release2 = __addDisposableResource(env_3, await lock.acquire(), false);
126
+ expect(true).toBe(true);
127
+ }
128
+ catch (e_4) {
129
+ env_3.error = e_4;
130
+ env_3.hasError = true;
131
+ }
132
+ finally {
133
+ __disposeResources(env_3);
134
+ }
135
+ });
136
+ });
137
+ //# sourceMappingURL=async-lock.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-lock.test.js","sourceRoot":"","sources":["../../../../src/a2a/__tests__/async-lock.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAA;QAC5B,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,KAAK,UAAU,IAAI,CAAC,EAAU,EAAE,OAAe;;;gBAC7C,MAAM,QAAQ,kCAAG,MAAM,IAAI,CAAC,OAAO,EAAE,QAAA,CAAA;gBACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACd,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;;;;;;;;;SAC7D;QAED,wEAAwE;QACxE,yDAAyD;QACzD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAEzD,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAA;QAC5B,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,IAAI,SAAS,GAAG,CAAC,CAAA;QAEjB,KAAK,UAAU,IAAI;;;gBACjB,MAAM,QAAQ,kCAAG,MAAM,IAAI,CAAC,OAAO,EAAE,QAAA,CAAA;gBACrC,MAAM,EAAE,CAAA;gBACR,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;gBACvC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;gBACtD,MAAM,EAAE,CAAA;;;;;;;;;SACT;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAEnD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;;;YAC3D,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAA;YAE5B,IAAI,CAAC;;;oBACH,MAAM,QAAQ,kCAAG,MAAM,IAAI,CAAC,OAAO,EAAE,QAAA,CAAA;oBACrC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;;;;;;;;;aACxB;YAAC,MAAM,CAAC;gBACP,+DAA+D;YACjE,CAAC;YAED,qEAAqE;YACrE,MAAM,SAAS,kCAAG,MAAM,IAAI,CAAC,OAAO,EAAE,QAAA,CAAA;YACtC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;;;;;;;;;KACxB,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -39,7 +39,7 @@ describe('A2AExecutor', () => {
39
39
  it('streams text deltas as artifact chunks and publishes completed status', async () => {
40
40
  const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Agent response' });
41
41
  const agent = new Agent({ model, printer: false });
42
- const executor = new A2AExecutor(agent);
42
+ const executor = new A2AExecutor({ agent });
43
43
  const eventBus = createMockEventBus();
44
44
  await executor.execute(createRequestContext('Hello agent'), eventBus);
45
45
  // First event registers the task with the ResultManager
@@ -79,7 +79,7 @@ describe('A2AExecutor', () => {
79
79
  { type: 'textBlock', text: 'Second' },
80
80
  ]);
81
81
  const agent = new Agent({ model, printer: false });
82
- const executor = new A2AExecutor(agent);
82
+ const executor = new A2AExecutor({ agent });
83
83
  const eventBus = createMockEventBus();
84
84
  await executor.execute(createRequestContext('Hello'), eventBus);
85
85
  const artifactEvents = eventBus.events.filter((e) => e.kind === 'artifact-update');
@@ -92,7 +92,7 @@ describe('A2AExecutor', () => {
92
92
  const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Response' });
93
93
  const agent = new Agent({ model, printer: false });
94
94
  vi.spyOn(agent, 'stream');
95
- const executor = new A2AExecutor(agent);
95
+ const executor = new A2AExecutor({ agent });
96
96
  const eventBus = createMockEventBus();
97
97
  const context = {
98
98
  taskId: 'task-1',
@@ -115,7 +115,7 @@ describe('A2AExecutor', () => {
115
115
  const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Response' });
116
116
  const agent = new Agent({ model, printer: false });
117
117
  const streamSpy = vi.spyOn(agent, 'stream');
118
- const executor = new A2AExecutor(agent);
118
+ const executor = new A2AExecutor({ agent });
119
119
  const eventBus = createMockEventBus();
120
120
  const context = createRequestContext('hello', 'task-42');
121
121
  await executor.execute(context, eventBus);
@@ -126,7 +126,7 @@ describe('A2AExecutor', () => {
126
126
  it('re-throws when agent throws, publishing only the initial task event', async () => {
127
127
  const model = new MockMessageModel().addTurn(new Error('Agent failed'));
128
128
  const agent = new Agent({ model, printer: false });
129
- const executor = new A2AExecutor(agent);
129
+ const executor = new A2AExecutor({ agent });
130
130
  const eventBus = createMockEventBus();
131
131
  await expect(executor.execute(createRequestContext('Hello'), eventBus)).rejects.toThrow('Agent failed');
132
132
  // Only the initial task registration event is published before the error
@@ -161,7 +161,7 @@ describe('A2AExecutor', () => {
161
161
  });
162
162
  },
163
163
  };
164
- const executor = new A2AExecutor(mockAgent);
164
+ const executor = new A2AExecutor({ agentFactory: () => mockAgent });
165
165
  const eventBus = createMockEventBus();
166
166
  await executor.execute(createRequestContext('Generate an image'), eventBus);
167
167
  const artifactEvents = eventBus.events.filter((e) => e.kind === 'artifact-update');
@@ -182,7 +182,7 @@ describe('A2AExecutor', () => {
182
182
  it('throws A2AError.invalidRequest when parts produce no content blocks', async () => {
183
183
  const model = new MockMessageModel().addTurn({ type: 'textBlock', text: 'Response' });
184
184
  const agent = new Agent({ model, printer: false });
185
- const executor = new A2AExecutor(agent);
185
+ const executor = new A2AExecutor({ agent });
186
186
  const eventBus = createMockEventBus();
187
187
  const context = {
188
188
  taskId: 'task-1',
@@ -197,11 +197,149 @@ describe('A2AExecutor', () => {
197
197
  it('throws A2AError.unsupportedOperation', async () => {
198
198
  const model = new MockMessageModel().addTurn({ type: 'textBlock', text: '' });
199
199
  const agent = new Agent({ model, printer: false });
200
- const executor = new A2AExecutor(agent);
200
+ const executor = new A2AExecutor({ agent });
201
201
  const eventBus = createMockEventBus();
202
202
  await expect(executor.cancelTask('task-1', eventBus)).rejects.toThrow('Task cancellation is not supported');
203
203
  expect(eventBus.events).toStrictEqual([]);
204
204
  });
205
205
  });
206
206
  });
207
+ // ============================================================================
208
+ // Per-context conversation isolation
209
+ //
210
+ // These tests drive a real Agent (with a deterministic echo model) through a
211
+ // single executor across two distinct A2A contextIds, asserting that no
212
+ // conversation state leaks between contexts, while a single context still
213
+ // accumulates its own history across turns.
214
+ // ============================================================================
215
+ /**
216
+ * Deterministic, network-free model that echoes the latest user text prefixed
217
+ * with `ECHO[<history-length>]`, so tests can observe per-context history growth.
218
+ */
219
+ class EchoModel extends MockMessageModel {
220
+ async *stream(messages) {
221
+ const lastUser = [...messages].reverse().find((m) => m.role === 'user');
222
+ const lastText = lastUser?.content.find((b) => b.type === 'textBlock')?.text ?? '';
223
+ const reply = `ECHO[${messages.length}]: ${lastText}`;
224
+ yield { type: 'modelMessageStartEvent', role: 'assistant' };
225
+ yield { type: 'modelContentBlockStartEvent' };
226
+ yield { type: 'modelContentBlockDeltaEvent', delta: { type: 'textDelta', text: reply } };
227
+ yield { type: 'modelContentBlockStopEvent' };
228
+ yield { type: 'modelMessageStopEvent', stopReason: 'endTurn' };
229
+ }
230
+ }
231
+ function makeEchoAgent() {
232
+ return new Agent({ model: new EchoModel(), printer: false });
233
+ }
234
+ function ctxRequest(contextId, taskId, text) {
235
+ return {
236
+ taskId,
237
+ contextId,
238
+ userMessage: {
239
+ kind: 'message',
240
+ messageId: `msg-${taskId}`,
241
+ role: 'user',
242
+ parts: [{ kind: 'text', text }],
243
+ },
244
+ };
245
+ }
246
+ function artifactTexts(eventBus) {
247
+ return eventBus.events
248
+ .filter((e) => e.kind === 'artifact-update')
249
+ .flatMap((e) => e.artifact.parts)
250
+ .filter((p) => p.kind === 'text')
251
+ .map((p) => p.text);
252
+ }
253
+ describe('A2AExecutor context isolation', () => {
254
+ describe('constructor validation', () => {
255
+ it('throws when neither agent nor agentFactory is provided', () => {
256
+ expect(() => new A2AExecutor()).toThrow("Provide exactly one of 'agent' or 'agentFactory'.");
257
+ });
258
+ it('throws when both agent and agentFactory are provided', () => {
259
+ const agent = new Agent({ model: new MockMessageModel(), printer: false });
260
+ expect(() => new A2AExecutor({ agent, agentFactory: () => agent })).toThrow("Provide exactly one of 'agent' or 'agentFactory'.");
261
+ });
262
+ it('throws when maxContexts is less than 1', () => {
263
+ expect(() => new A2AExecutor({ agentFactory: makeEchoAgent, maxContexts: 0 })).toThrow('maxContexts must be at least 1');
264
+ });
265
+ });
266
+ describe('factory mode', () => {
267
+ it('builds one agent per context and reuses it within a context', async () => {
268
+ const built = [];
269
+ const agentsByContext = new Map();
270
+ const executor = new A2AExecutor({
271
+ agentFactory: (contextId) => {
272
+ built.push(contextId);
273
+ const agent = makeEchoAgent();
274
+ agentsByContext.set(contextId, agent);
275
+ return agent;
276
+ },
277
+ });
278
+ await executor.execute(ctxRequest('ctx-A', 'a-1', 'first'), createMockEventBus());
279
+ await executor.execute(ctxRequest('ctx-A', 'a-2', 'second'), createMockEventBus());
280
+ await executor.execute(ctxRequest('ctx-B', 'b-1', 'first'), createMockEventBus());
281
+ // Factory invoked once per distinct context, not per request.
282
+ expect(built).toStrictEqual(['ctx-A', 'ctx-B']);
283
+ // Distinct Agent instances per context.
284
+ expect(agentsByContext.get('ctx-A')).not.toBe(agentsByContext.get('ctx-B'));
285
+ });
286
+ it('isolates history across contexts and continues it within one', async () => {
287
+ const executor = new A2AExecutor({ agentFactory: makeEchoAgent });
288
+ // ctx-A turn 1: just the user message in history -> ECHO[1].
289
+ let bus = createMockEventBus();
290
+ await executor.execute(ctxRequest('ctx-A', 'a-1', 'SECRET-AAAA'), bus);
291
+ expect(artifactTexts(bus).some((t) => t.includes('ECHO[1]:') && t.includes('SECRET-AAAA'))).toBe(true);
292
+ // ctx-A turn 2: history now has user1, assistant1, user2 -> ECHO[3].
293
+ bus = createMockEventBus();
294
+ await executor.execute(ctxRequest('ctx-A', 'a-2', 'again'), bus);
295
+ expect(artifactTexts(bus).some((t) => t.includes('ECHO[3]:'))).toBe(true);
296
+ // ctx-B is independent -> starts fresh, never sees ctx-A's secret.
297
+ bus = createMockEventBus();
298
+ await executor.execute(ctxRequest('ctx-B', 'b-1', 'hello'), bus);
299
+ const textsB = artifactTexts(bus);
300
+ expect(textsB.some((t) => t.includes('ECHO[1]:'))).toBe(true);
301
+ expect(textsB.some((t) => t.includes('SECRET-AAAA'))).toBe(false);
302
+ });
303
+ it('evicts the least-recently-used context beyond maxContexts', async () => {
304
+ const built = [];
305
+ const executor = new A2AExecutor({
306
+ agentFactory: (contextId) => {
307
+ built.push(contextId);
308
+ return makeEchoAgent();
309
+ },
310
+ maxContexts: 2,
311
+ });
312
+ await executor.execute(ctxRequest('ctx-A', 'a-1', 'hi'), createMockEventBus());
313
+ await executor.execute(ctxRequest('ctx-B', 'b-1', 'hi'), createMockEventBus());
314
+ await executor.execute(ctxRequest('ctx-A', 'a-2', 'again'), createMockEventBus()); // touch A
315
+ await executor.execute(ctxRequest('ctx-C', 'c-1', 'hi'), createMockEventBus()); // evicts B
316
+ // B was evicted, so reusing it rebuilds a fresh agent (factory called again for B).
317
+ await executor.execute(ctxRequest('ctx-B', 'b-2', 'hi'), createMockEventBus());
318
+ expect(built).toStrictEqual(['ctx-A', 'ctx-B', 'ctx-C', 'ctx-B']);
319
+ });
320
+ });
321
+ describe('single-agent mode (deprecated)', () => {
322
+ it('isolates history across contexts via snapshot swapping', async () => {
323
+ const executor = new A2AExecutor({ agent: makeEchoAgent() });
324
+ let bus = createMockEventBus();
325
+ await executor.execute(ctxRequest('ctx-A', 'a-1', 'SECRET-AAAA'), bus);
326
+ expect(artifactTexts(bus).some((t) => t.includes('ECHO[1]:') && t.includes('SECRET-AAAA'))).toBe(true);
327
+ // ctx-A continues -> ECHO[3].
328
+ bus = createMockEventBus();
329
+ await executor.execute(ctxRequest('ctx-A', 'a-2', 'again'), bus);
330
+ expect(artifactTexts(bus).some((t) => t.includes('ECHO[3]:'))).toBe(true);
331
+ // ctx-B starts fresh and never sees ctx-A's secret.
332
+ bus = createMockEventBus();
333
+ await executor.execute(ctxRequest('ctx-B', 'b-1', 'hello'), bus);
334
+ const textsB = artifactTexts(bus);
335
+ expect(textsB.some((t) => t.includes('ECHO[1]:'))).toBe(true);
336
+ expect(textsB.some((t) => t.includes('SECRET-AAAA'))).toBe(false);
337
+ });
338
+ it('throws when a single agent has a sessionManager', () => {
339
+ const agent = makeEchoAgent();
340
+ agent.sessionManager = {};
341
+ expect(() => new A2AExecutor({ agent })).toThrow('sessionManager is not supported');
342
+ });
343
+ });
344
+ });
207
345
  //# sourceMappingURL=executor.test.js.map