@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
@@ -0,0 +1,370 @@
1
+ import { BedrockAgentRuntimeClient, RetrieveCommand } from '@aws-sdk/client-bedrock-agent-runtime';
2
+ import { BedrockAgentClient, IngestKnowledgeBaseDocumentsCommand, } from '@aws-sdk/client-bedrock-agent';
3
+ import { v7 as uuidv7 } from 'uuid';
4
+ import { logger } from '../../logging/logger.js';
5
+ const DEFAULT_MAX_SEARCH_RESULTS = 10;
6
+ /** Converts a caller metadata value into a Bedrock attribute value, or `undefined` if unsupported. */
7
+ function toAttributeValue(value) {
8
+ if (typeof value === 'string')
9
+ return { type: 'STRING', stringValue: value };
10
+ if (typeof value === 'number')
11
+ return { type: 'NUMBER', numberValue: value };
12
+ if (typeof value === 'boolean')
13
+ return { type: 'BOOLEAN', booleanValue: value };
14
+ if (Array.isArray(value) && value.length > 0 && value.every((item) => typeof item === 'string')) {
15
+ return { type: 'STRING_LIST', stringListValue: value };
16
+ }
17
+ return undefined;
18
+ }
19
+ /**
20
+ * A {@link MemoryStore} backed by Amazon Bedrock Knowledge Bases. Supports semantic search via
21
+ * Retrieve and document ingestion via IngestKnowledgeBaseDocuments for CUSTOM and S3 data sources.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * import { BedrockKnowledgeBaseStore } from '@strands-agents/sdk/vended-memory-stores/bedrock-knowledge-base'
26
+ *
27
+ * const store = new BedrockKnowledgeBaseStore({
28
+ * config: {
29
+ * knowledgeBaseId: 'KB123',
30
+ * dataSourceType: 'CUSTOM',
31
+ * dataSourceId: 'DS456',
32
+ * },
33
+ * scope: 'user-abc',
34
+ * writable: true,
35
+ * })
36
+ *
37
+ * const results = await store.search('what are my preferences?')
38
+ * const { documentId } = await store.add('User prefers dark mode')
39
+ * ```
40
+ */
41
+ export class BedrockKnowledgeBaseStore {
42
+ name;
43
+ description;
44
+ maxSearchResults;
45
+ writable;
46
+ extraction;
47
+ _runtimeClient;
48
+ _agentClient;
49
+ _s3Client;
50
+ _s3Config;
51
+ _knowledgeBaseId;
52
+ _dataSourceType;
53
+ _dataSourceId;
54
+ /**
55
+ * Logical namespace isolating documents: applied as a metadata filter on {@link search} and stamped
56
+ * on writes via {@link add}. Unlike {@link name}, it is not a store-identity field, so it never
57
+ * affects `MemoryManager` routing. For per-tenant isolation, construct one store per scope — cheap,
58
+ * since they can share a single {@link BedrockKnowledgeBaseConfig}.
59
+ */
60
+ scope;
61
+ /** Metadata attribute key used for scope-based filtering. */
62
+ scopeMetadataKey;
63
+ /**
64
+ * Explicit retrieval filter. When set, it overrides the scope-derived filter for {@link search}.
65
+ * Note the asymmetry: an explicit filter affects search only; writes always scope by {@link scope}.
66
+ */
67
+ filter;
68
+ constructor(options) {
69
+ const { config, scope, name, description, writable, maxSearchResults, filter, extraction } = options;
70
+ this.name = name;
71
+ if (description !== undefined)
72
+ this.description = description;
73
+ if (maxSearchResults !== undefined) {
74
+ if (maxSearchResults < 1) {
75
+ throw new Error('BedrockKnowledgeBaseStore: maxSearchResults must be at least 1.');
76
+ }
77
+ this.maxSearchResults = maxSearchResults;
78
+ }
79
+ this.writable = writable ?? false;
80
+ if (extraction !== undefined)
81
+ this.extraction = extraction;
82
+ this._runtimeClient = config.runtimeClient ?? new BedrockAgentRuntimeClient({});
83
+ this._agentClient = config.agentClient;
84
+ this._s3Client = config.s3?.client;
85
+ this._s3Config = config.s3;
86
+ this._knowledgeBaseId = config.knowledgeBaseId;
87
+ this._dataSourceType = config.dataSourceType;
88
+ this._dataSourceId = config.dataSourceId;
89
+ if (this.writable)
90
+ this._validateWriteConfig();
91
+ this.scope = scope;
92
+ this.scopeMetadataKey = config.scopeMetadataKey ?? 'namespace';
93
+ this.filter = filter;
94
+ }
95
+ /**
96
+ * Resolves the effective retrieval filter for a search: an explicit {@link filter} wins; otherwise
97
+ * one is derived from {@link scope} / {@link scopeMetadataKey}.
98
+ */
99
+ _resolveFilter() {
100
+ if (this.filter)
101
+ return this.filter;
102
+ if (this.scope)
103
+ return { equals: { key: this.scopeMetadataKey, value: this.scope } };
104
+ return undefined;
105
+ }
106
+ /**
107
+ * Searches the knowledge base for entries matching the query.
108
+ *
109
+ * @param query - The search query text
110
+ * @param options - Optional search configuration
111
+ * @returns Matching memory entries ordered by relevance. Each entry's `metadata` includes
112
+ * user-provided attributes plus two reserved synthetic keys: `_relevanceScore` (number) and
113
+ * `_sourceLocation` (Bedrock retrieval location object).
114
+ */
115
+ async search(query, options) {
116
+ if (options?.maxSearchResults !== undefined && options.maxSearchResults < 1) {
117
+ throw new Error('BedrockKnowledgeBaseStore: maxSearchResults must be at least 1.');
118
+ }
119
+ const limit = options?.maxSearchResults || this.maxSearchResults || DEFAULT_MAX_SEARCH_RESULTS;
120
+ const filter = this._resolveFilter();
121
+ let response;
122
+ try {
123
+ response = await this._runtimeClient.send(new RetrieveCommand({
124
+ knowledgeBaseId: this._knowledgeBaseId,
125
+ retrievalQuery: { text: query },
126
+ retrievalConfiguration: {
127
+ vectorSearchConfiguration: {
128
+ numberOfResults: limit,
129
+ ...(filter && { filter }),
130
+ },
131
+ },
132
+ }));
133
+ }
134
+ catch (error) {
135
+ logger.error(`store=<${this.name}>, knowledgeBaseId=<${this._knowledgeBaseId}>, error=<${error}> | knowledge base retrieve failed`, error);
136
+ throw error;
137
+ }
138
+ return (response.retrievalResults ?? []).map((result) => {
139
+ const metadata = {};
140
+ if (result.metadata) {
141
+ for (const [key, value] of Object.entries(result.metadata)) {
142
+ metadata[key] = value;
143
+ }
144
+ }
145
+ if (result.location) {
146
+ metadata._sourceLocation = result.location;
147
+ }
148
+ if (result.score != null) {
149
+ metadata._relevanceScore = result.score;
150
+ }
151
+ return {
152
+ content: result.content?.text ?? '',
153
+ metadata,
154
+ };
155
+ });
156
+ }
157
+ /**
158
+ * Ingests `content` (with optional `metadata`) into the knowledge base.
159
+ *
160
+ * Only `CUSTOM` and `S3` data sources support this — they are the sole `dataSourceType`s that
161
+ * accept direct ingestion (`IngestKnowledgeBaseDocuments`). `OTHER` backends sync from an external
162
+ * store or are query-only, so the store is read-only and `add` is unavailable. Requires
163
+ * `dataSourceId` (and, for `S3`, an `s3` config); see {@link BedrockKnowledgeBaseStoreConfig}.
164
+ *
165
+ * @param content - The text content to ingest
166
+ * @param metadata - Optional metadata attributes to attach to the document
167
+ * @returns The document identifier (UUID for CUSTOM, s3:// URI for S3)
168
+ */
169
+ async add(content, metadata) {
170
+ if (!this.writable) {
171
+ throw new Error('BedrockKnowledgeBaseStore: store is not writable. Set writable: true in config to enable add().');
172
+ }
173
+ if (!content.trim()) {
174
+ throw new Error('BedrockKnowledgeBaseStore: content must not be empty.');
175
+ }
176
+ const { dataSourceId, dataSourceType } = this._validateWriteConfig();
177
+ // S3 and CUSTOM data sources accept fundamentally different documents. S3 ingests objects, so
178
+ // its document references objects uploaded to S3 first; CUSTOM ingests the text inline. Either
179
+ // way the store mints the document's identifier (CUSTOM: a UUID; S3: the content object's URI)
180
+ // and returns it, so the caller has a stable handle to the document Bedrock now tracks.
181
+ let document;
182
+ let documentId;
183
+ if (dataSourceType === 'S3') {
184
+ const objectUris = await this._uploadS3Objects(content, metadata);
185
+ document = this._buildS3Document(objectUris);
186
+ documentId = objectUris.contentUri;
187
+ }
188
+ else {
189
+ documentId = uuidv7();
190
+ document = this._buildCustomDocument(documentId, content, metadata);
191
+ }
192
+ try {
193
+ await this._getAgentClient().send(new IngestKnowledgeBaseDocumentsCommand({
194
+ knowledgeBaseId: this._knowledgeBaseId,
195
+ dataSourceId,
196
+ documents: [document],
197
+ }));
198
+ }
199
+ catch (error) {
200
+ logger.error(`store=<${this.name}>, knowledgeBaseId=<${this._knowledgeBaseId}>, dataSourceId=<${dataSourceId}>, dataSourceType=<${dataSourceType}>, error=<${error}> | knowledge base document ingestion failed`, error);
201
+ throw error;
202
+ }
203
+ return { documentId };
204
+ }
205
+ /**
206
+ * Uploads the objects that back one S3 ingestion and returns their `s3://` URIs.
207
+ *
208
+ * A single `add` produces up to *two* objects — hence the plural name and the multi-URI return:
209
+ * - `contentUri`: the content itself, uploaded as a `.txt` object. Always written.
210
+ * - `sidecarUri`: a `<object-key>.metadata.json` sidecar carrying scope/metadata, written *only*
211
+ * when there is any to attach (so it's optional in the return). Unlike a `CUSTOM` document, an
212
+ * S3 document can't carry attributes inline, so the sidecar is Bedrock's out-of-band convention
213
+ * for attaching them: it sits beside the content object and Bedrock pairs the two by name.
214
+ *
215
+ * Bedrock reads and indexes these objects on ingestion.
216
+ *
217
+ * Note: uploads are not transactional. If the sidecar upload (or the subsequent ingestion) fails
218
+ * after the content object lands, the uploaded object(s) remain in the bucket un-ingested. They are
219
+ * inert — a later data-source sync may pick them up, or they can be cleaned up out of band.
220
+ */
221
+ async _uploadS3Objects(content, metadata) {
222
+ const s3 = this._s3Config;
223
+ const prefix = s3.prefix.endsWith('/') ? s3.prefix : `${s3.prefix}/`;
224
+ const key = `${prefix}${uuidv7()}.txt`;
225
+ const contentUri = await this._putObject(s3, key, content, 'text/plain; charset=utf-8');
226
+ const attributes = this._buildS3SidecarAttributes(metadata);
227
+ if (Object.keys(attributes).length === 0) {
228
+ return { contentUri };
229
+ }
230
+ // The sidecar must sit beside the source object and be named `<object-key>.metadata.json`.
231
+ const sidecar = JSON.stringify({ metadataAttributes: attributes });
232
+ const sidecarUri = await this._putObject(s3, `${key}.metadata.json`, sidecar, 'application/json');
233
+ return { contentUri, sidecarUri };
234
+ }
235
+ /** Uploads a single object to the configured bucket and returns its `s3://` URI. */
236
+ async _putObject(s3, key, body, contentType) {
237
+ try {
238
+ const { PutObjectCommand } = await import('@aws-sdk/client-s3');
239
+ const client = await this._getS3Client();
240
+ await client.send(new PutObjectCommand({ Bucket: s3.bucket, Key: key, Body: body, ContentType: contentType }));
241
+ }
242
+ catch (error) {
243
+ logger.error(`store=<${this.name}>, uri=<s3://${s3.bucket}/${key}>, error=<${error}> | S3 upload failed before ingestion`, error);
244
+ throw error;
245
+ }
246
+ return `s3://${s3.bucket}/${key}`;
247
+ }
248
+ /**
249
+ * Builds a document for an `S3` data source from the URIs produced by {@link _uploadS3Objects}.
250
+ *
251
+ * Takes both URIs because an S3 document references objects by location rather than carrying data
252
+ * inline: `contentUri` becomes the document's content (the object to index), and `sidecarUri`,
253
+ * when present, becomes its metadata (an `S3_LOCATION` pointing at the sidecar). With no
254
+ * scope/metadata there's no sidecar, so `sidecarUri` is omitted and the document carries no
255
+ * metadata.
256
+ */
257
+ _buildS3Document({ contentUri, sidecarUri, }) {
258
+ const document = {
259
+ content: {
260
+ dataSourceType: 'S3',
261
+ s3: { s3Location: { uri: contentUri } },
262
+ },
263
+ };
264
+ if (sidecarUri) {
265
+ document.metadata = {
266
+ type: 'S3_LOCATION',
267
+ s3Location: { uri: sidecarUri },
268
+ };
269
+ }
270
+ return document;
271
+ }
272
+ /**
273
+ * Resolves scope and caller metadata into a flat list of key-value pairs, handling collision
274
+ * detection and unsupported-type filtering. Shared by both CUSTOM (inline attributes) and S3
275
+ * (sidecar) document builders.
276
+ */
277
+ _resolveAttributes(metadata) {
278
+ const attrs = [];
279
+ if (this.scope) {
280
+ attrs.push({ key: this.scopeMetadataKey, value: { type: 'STRING', stringValue: this.scope } });
281
+ }
282
+ if (metadata) {
283
+ for (const [key, value] of Object.entries(metadata)) {
284
+ if (this.scope && key === this.scopeMetadataKey) {
285
+ logger.warn(`store=<${this.name}>, key=<${key}> | dropping metadata key that collides with scopeMetadataKey`);
286
+ continue;
287
+ }
288
+ const attributeValue = toAttributeValue(value);
289
+ if (attributeValue) {
290
+ attrs.push({ key, value: attributeValue });
291
+ }
292
+ else {
293
+ logger.debug(`store=<${this.name}>, key=<${key}> | dropping metadata value of unsupported type`);
294
+ }
295
+ }
296
+ }
297
+ return attrs;
298
+ }
299
+ /**
300
+ * Builds a document for a `CUSTOM` data source: the text ingested inline, with the scope and any
301
+ * caller metadata attached as inline attributes for retrieval filtering. The caller supplies
302
+ * `documentId` (so it can return that same id to its own caller) and it becomes the document's
303
+ * `customDocumentIdentifier`.
304
+ */
305
+ _buildCustomDocument(documentId, content, metadata) {
306
+ const attrs = this._resolveAttributes(metadata);
307
+ const document = {
308
+ content: {
309
+ dataSourceType: 'CUSTOM',
310
+ custom: {
311
+ customDocumentIdentifier: { id: documentId },
312
+ sourceType: 'IN_LINE',
313
+ inlineContent: {
314
+ type: 'TEXT',
315
+ textContent: { data: content },
316
+ },
317
+ },
318
+ },
319
+ };
320
+ if (attrs.length > 0) {
321
+ document.metadata = {
322
+ type: 'IN_LINE_ATTRIBUTE',
323
+ inlineAttributes: attrs.map(({ key, value }) => ({ key, value })),
324
+ };
325
+ }
326
+ return document;
327
+ }
328
+ /**
329
+ * Builds the `metadataAttributes` map for an S3 `.metadata.json` sidecar from the scope and caller
330
+ * metadata. Returns an empty map when there's nothing to attach — {@link _uploadS3Objects} treats
331
+ * that as "no sidecar" and skips writing the second object.
332
+ */
333
+ _buildS3SidecarAttributes(metadata) {
334
+ const attrs = this._resolveAttributes(metadata);
335
+ const attributes = {};
336
+ for (const { key, value } of attrs) {
337
+ attributes[key] = { value, includeForEmbedding: false };
338
+ }
339
+ return attributes;
340
+ }
341
+ _validateWriteConfig() {
342
+ if (this._dataSourceType !== 'CUSTOM' && this._dataSourceType !== 'S3') {
343
+ throw new Error(`BedrockKnowledgeBaseStore: add requires dataSourceType 'CUSTOM' or 'S3', but it is '${this._dataSourceType ?? 'undefined'}'. ` +
344
+ "'OTHER' backends are read-only.");
345
+ }
346
+ if (!this._dataSourceId) {
347
+ throw new Error('BedrockKnowledgeBaseStore: dataSourceId is required for write operations. ' +
348
+ 'Provide it in the config to enable add().');
349
+ }
350
+ if (this._dataSourceType === 'S3' && !this._s3Config) {
351
+ throw new Error("BedrockKnowledgeBaseStore: s3 config is required when dataSourceType is 'S3'. " +
352
+ 'Provide bucket and prefix to enable add().');
353
+ }
354
+ return { dataSourceId: this._dataSourceId, dataSourceType: this._dataSourceType };
355
+ }
356
+ async _getS3Client() {
357
+ if (!this._s3Client) {
358
+ const { S3Client: S3ClientImpl } = await import('@aws-sdk/client-s3');
359
+ this._s3Client = new S3ClientImpl({});
360
+ }
361
+ return this._s3Client;
362
+ }
363
+ _getAgentClient() {
364
+ if (!this._agentClient) {
365
+ this._agentClient = new BedrockAgentClient({});
366
+ }
367
+ return this._agentClient;
368
+ }
369
+ }
370
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../src/vended-memory-stores/bedrock-knowledge-base/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-storage-sandbox.test.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage-sandbox.test.node.d.ts","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'fs';
3
+ import { FileStorage } from '../storage.js';
4
+ import { TestSandbox } from '../../../__fixtures__/test-sandbox.node.js';
5
+ const TEST_DIR = '/tmp/strands-test-file-storage-sandbox';
6
+ describe.skipIf(process.platform === 'win32')('FileStorage with sandbox', () => {
7
+ let sandbox;
8
+ let storage;
9
+ beforeEach(() => {
10
+ fs.rmSync(TEST_DIR, { recursive: true, force: true });
11
+ fs.mkdirSync(TEST_DIR, { recursive: true });
12
+ sandbox = new TestSandbox(TEST_DIR);
13
+ storage = new FileStorage({ sandbox });
14
+ });
15
+ afterEach(() => {
16
+ fs.rmSync(TEST_DIR, { recursive: true, force: true });
17
+ });
18
+ it('stores and retrieves text content', async () => {
19
+ const reference = await storage.store('test-key', new TextEncoder().encode('hello offloaded'), 'text/plain');
20
+ const retrieved = await storage.retrieve(reference);
21
+ expect(new TextDecoder().decode(retrieved.content)).toBe('hello offloaded');
22
+ expect(retrieved.contentType).toBe('text/plain');
23
+ });
24
+ it('stores and retrieves JSON content', async () => {
25
+ const json = JSON.stringify({ key: 'value' });
26
+ const reference = await storage.store('json-key', new TextEncoder().encode(json), 'application/json');
27
+ const retrieved = await storage.retrieve(reference);
28
+ expect(new TextDecoder().decode(retrieved.content)).toBe(json);
29
+ expect(retrieved.contentType).toBe('application/json');
30
+ });
31
+ it('stores and retrieves binary content', async () => {
32
+ const bytes = new Uint8Array([0, 1, 2, 127, 128, 254, 255]);
33
+ const reference = await storage.store('binary-key', bytes, 'application/octet-stream');
34
+ const retrieved = await storage.retrieve(reference);
35
+ expect(Array.from(retrieved.content)).toStrictEqual(Array.from(bytes));
36
+ });
37
+ it('creates files under the artifact directory with a type-derived extension', async () => {
38
+ const reference = await storage.store('my-key', new TextEncoder().encode('test'), 'text/plain');
39
+ expect(reference.startsWith('./artifacts/')).toBe(true);
40
+ expect(reference).toContain('my-key');
41
+ expect(reference.endsWith('.txt')).toBe(true);
42
+ });
43
+ it('uses a custom artifact directory', async () => {
44
+ const custom = new FileStorage({ artifactDir: 'custom-artifacts', sandbox });
45
+ const reference = await custom.store('key', new TextEncoder().encode('custom path'), 'text/plain');
46
+ expect(reference.startsWith('custom-artifacts/')).toBe(true);
47
+ expect(new TextDecoder().decode((await custom.retrieve(reference)).content)).toBe('custom path');
48
+ });
49
+ it('persists content types across instances via .metadata.json', async () => {
50
+ const reference = await storage.store('persist', new TextEncoder().encode('{}'), 'application/json');
51
+ const reopened = new FileStorage({ sandbox });
52
+ expect((await reopened.retrieve(reference)).contentType).toBe('application/json');
53
+ });
54
+ it('throws on retrieve with an out-of-bounds reference', async () => {
55
+ await expect(storage.retrieve('nonexistent/path.txt')).rejects.toThrow('Reference not found');
56
+ });
57
+ it('throws on path traversal in a reference', async () => {
58
+ await expect(storage.retrieve('./artifacts/../escape.txt')).rejects.toThrow('Reference not found');
59
+ });
60
+ it('produces unique references for repeated keys', async () => {
61
+ const ref1 = await storage.store('key', new TextEncoder().encode('first'), 'text/plain');
62
+ const ref2 = await storage.store('key', new TextEncoder().encode('second'), 'text/plain');
63
+ expect(ref1).not.toBe(ref2);
64
+ expect(new TextDecoder().decode((await storage.retrieve(ref1)).content)).toBe('first');
65
+ expect(new TextDecoder().decode((await storage.retrieve(ref2)).content)).toBe('second');
66
+ });
67
+ });
68
+ //# sourceMappingURL=file-storage-sandbox.test.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage-sandbox.test.node.js","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.test.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.test.node.d.ts","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-offloader/__tests__/plugin.test.node.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ import { describe, it, expect, afterEach } from 'vitest';
2
+ import { existsSync, mkdtempSync, rmSync } from 'fs';
3
+ import { tmpdir } from 'os';
4
+ import { join } from 'path';
5
+ import { ContextOffloader } from '../plugin.js';
6
+ import { FileStorage } from '../storage.js';
7
+ import { AfterToolCallEvent } from '../../../hooks/events.js';
8
+ import { TextBlock, ToolResultBlock } from '../../../types/messages.js';
9
+ import { createMockAgent, invokeTrackedHook } from '../../../__fixtures__/agent-helpers.js';
10
+ import { MockMessageModel } from '../../../__fixtures__/mock-message-model.js';
11
+ import { TestSandbox } from '../../../__fixtures__/test-sandbox.node.js';
12
+ const mockModel = new MockMessageModel();
13
+ let testDirs = [];
14
+ function makeTempDir() {
15
+ const dir = mkdtempSync(join(tmpdir(), 'context-offloader-sandbox-'));
16
+ testDirs.push(dir);
17
+ return dir;
18
+ }
19
+ function makeAgent(sandbox) {
20
+ return createMockAgent({ extra: { model: mockModel, sandbox } });
21
+ }
22
+ function makeEvent(agent, toolUseId, content) {
23
+ return new AfterToolCallEvent({
24
+ agent,
25
+ toolUse: { name: 'some_tool', toolUseId, input: {} },
26
+ tool: undefined,
27
+ result: new ToolResultBlock({
28
+ toolUseId,
29
+ status: 'success',
30
+ content: [new TextBlock(content)],
31
+ }),
32
+ invocationState: {},
33
+ });
34
+ }
35
+ function makeToolContext(agent, reference) {
36
+ return {
37
+ toolUse: {
38
+ name: 'retrieve_offloaded_content',
39
+ toolUseId: 'retrieve-123',
40
+ input: { reference },
41
+ },
42
+ agent,
43
+ invocationState: {},
44
+ interrupt: () => {
45
+ throw new Error('interrupt not available in mock context');
46
+ },
47
+ };
48
+ }
49
+ function getReference(event) {
50
+ const preview = event.result.content[0].text;
51
+ const match = preview.match(/\.\/artifacts\/\S+\.txt/);
52
+ expect(match).not.toBeNull();
53
+ return match[0];
54
+ }
55
+ afterEach(() => {
56
+ for (const dir of testDirs) {
57
+ rmSync(dir, { recursive: true, force: true });
58
+ }
59
+ testDirs = [];
60
+ });
61
+ describe.skipIf(process.platform === 'win32')('ContextOffloader with FileStorage', () => {
62
+ it('isolates a shared storage config by agent sandbox', async () => {
63
+ const dirA = makeTempDir();
64
+ const dirB = makeTempDir();
65
+ const agentA = makeAgent(new TestSandbox(dirA));
66
+ const agentB = makeAgent(new TestSandbox(dirB));
67
+ const plugin = new ContextOffloader({
68
+ storage: new FileStorage(),
69
+ maxResultTokens: 10,
70
+ previewTokens: 5,
71
+ includeRetrievalTool: true,
72
+ });
73
+ const retrievalTool = plugin.getTools()[0];
74
+ plugin.initAgent(agentA);
75
+ plugin.initAgent(agentB);
76
+ const contentA = `agent A content\n${'a'.repeat(1000)}`;
77
+ const contentB = `agent B content\n${'b'.repeat(1000)}`;
78
+ const eventA = makeEvent(agentA, 'tool-a', contentA);
79
+ const eventB = makeEvent(agentB, 'tool-b', contentB);
80
+ await invokeTrackedHook(agentA, eventA);
81
+ await invokeTrackedHook(agentB, eventB);
82
+ const refA = getReference(eventA);
83
+ const refB = getReference(eventB);
84
+ expect(existsSync(join(dirA, refA))).toBe(true);
85
+ expect(existsSync(join(dirB, refA))).toBe(false);
86
+ expect(existsSync(join(dirB, refB))).toBe(true);
87
+ expect(existsSync(join(dirA, refB))).toBe(false);
88
+ await expect(retrievalTool.invoke({ reference: refA }, makeToolContext(agentA, refA))).resolves.toBe(contentA);
89
+ await expect(retrievalTool.invoke({ reference: refB }, makeToolContext(agentB, refB))).resolves.toBe(contentB);
90
+ await expect(retrievalTool.invoke({ reference: refA }, makeToolContext(agentB, refA))).resolves.toContain('Error: reference not found');
91
+ });
92
+ });
93
+ //# sourceMappingURL=plugin.test.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.test.node.js","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-offloader/__tests__/plugin.test.node.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,6 @@
18
18
  */
19
19
  export { ContextOffloader } from './plugin.js';
20
20
  export type { ContextOffloaderConfig } from './plugin.js';
21
- export type { Storage } from './storage.js';
21
+ export type { Storage, FileStorageOptions } from './storage.js';
22
22
  export { InMemoryStorage, FileStorage, S3Storage } from './storage.js';
23
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/vended-plugins/context-offloader/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/vended-plugins/context-offloader/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import type { Plugin } from '../../plugins/plugin.js';
2
2
  import type { Tool } from '../../tools/tool.js';
3
3
  import type { LocalAgent } from '../../types/agent.js';
4
- import type { Storage } from './storage.js';
4
+ import { type Storage } from './storage.js';
5
5
  /** Configuration for the {@link ContextOffloader} plugin. */
6
6
  export interface ContextOffloaderConfig {
7
7
  /** Storage backend for persisting offloaded content. */
@@ -36,10 +36,13 @@ export declare class ContextOffloader implements Plugin {
36
36
  private readonly _maxResultTokens;
37
37
  private readonly _previewTokens;
38
38
  private readonly _includeRetrievalTool;
39
+ private readonly _storageByAgent;
39
40
  private _retrievalTool;
40
41
  constructor(config: ContextOffloaderConfig);
41
42
  initAgent(agent: LocalAgent): void;
42
43
  getTools(): Tool[];
44
+ private _storageForAgent;
45
+ private _storageForToolContext;
43
46
  private _createRetrievalTool;
44
47
  private _storeBlock;
45
48
  private _buildPreviewText;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../src/vended-plugins/context-offloader/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAUtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AA2F3C,6DAA6D;AAC7D,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAA;IAChB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,QAAQ,CAAC,IAAI,+BAA8B;IAE3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,cAAc,CAAkB;gBAE5B,MAAM,EAAE,sBAAsB;IAc1C,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIlC,QAAQ,IAAI,IAAI,EAAE;IAMlB,OAAO,CAAC,oBAAoB;YAmDd,WAAW;IAiCzB,OAAO,CAAC,iBAAiB;YAiCX,iBAAiB;CA4DhC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../../src/vended-plugins/context-offloader/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAUtD,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AA2FxD,6DAA6D;AAC7D,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAA;IAChB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mFAAmF;IACnF,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,QAAQ,CAAC,IAAI,+BAA8B;IAE3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,cAAc,CAAkB;gBAE5B,MAAM,EAAE,sBAAsB;IAc1C,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAKlC,QAAQ,IAAI,IAAI,EAAE;IAMlB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,oBAAoB;YAmDd,WAAW;IAkCzB,OAAO,CAAC,iBAAiB;YAiCX,iBAAiB;CA6DhC"}