@strands-agents/sdk 1.0.0-rc.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/LICENSE +175 -0
  2. package/README.md +340 -0
  3. package/dist/src/__fixtures__/agent-helpers.d.ts +22 -1
  4. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  5. package/dist/src/__fixtures__/agent-helpers.js +45 -1
  6. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  7. package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -1
  8. package/dist/src/__fixtures__/mock-plugin.js +3 -1
  9. package/dist/src/__fixtures__/mock-plugin.js.map +1 -1
  10. package/dist/src/__fixtures__/tool-helpers.d.ts +5 -2
  11. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  12. package/dist/src/__fixtures__/tool-helpers.js +23 -4
  13. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  14. package/dist/src/__tests__/interrupt.test.d.ts +2 -0
  15. package/dist/src/__tests__/interrupt.test.d.ts.map +1 -0
  16. package/dist/src/__tests__/interrupt.test.js +259 -0
  17. package/dist/src/__tests__/interrupt.test.js.map +1 -0
  18. package/dist/src/__tests__/mcp.test.js +448 -2
  19. package/dist/src/__tests__/mcp.test.js.map +1 -1
  20. package/dist/src/a2a/__tests__/events.test.js +2 -0
  21. package/dist/src/a2a/__tests__/events.test.js.map +1 -1
  22. package/dist/src/a2a/__tests__/executor.test.js +16 -5
  23. package/dist/src/a2a/__tests__/executor.test.js.map +1 -1
  24. package/dist/src/a2a/a2a-agent.d.ts +8 -3
  25. package/dist/src/a2a/a2a-agent.d.ts.map +1 -1
  26. package/dist/src/a2a/a2a-agent.js +12 -6
  27. package/dist/src/a2a/a2a-agent.js.map +1 -1
  28. package/dist/src/a2a/executor.d.ts +13 -0
  29. package/dist/src/a2a/executor.d.ts.map +1 -1
  30. package/dist/src/a2a/executor.js +19 -1
  31. package/dist/src/a2a/executor.js.map +1 -1
  32. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +2 -0
  33. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +1 -0
  34. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +23 -0
  35. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +1 -0
  36. package/dist/src/agent/__tests__/agent.cancel.test.js +1 -1
  37. package/dist/src/agent/__tests__/agent.cancel.test.js.map +1 -1
  38. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +2 -0
  39. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +1 -0
  40. package/dist/src/agent/__tests__/agent.concurrent.test.js +488 -0
  41. package/dist/src/agent/__tests__/agent.concurrent.test.js.map +1 -0
  42. package/dist/src/agent/__tests__/agent.hook.test.js +724 -12
  43. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  44. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +2 -0
  45. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +1 -0
  46. package/dist/src/agent/__tests__/agent.interrupt.test.js +730 -0
  47. package/dist/src/agent/__tests__/agent.interrupt.test.js.map +1 -0
  48. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +2 -0
  49. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +1 -0
  50. package/dist/src/agent/__tests__/agent.invocation-state.test.js +219 -0
  51. package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +1 -0
  52. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +2 -0
  53. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +1 -0
  54. package/dist/src/agent/__tests__/agent.model-retry.test.js +161 -0
  55. package/dist/src/agent/__tests__/agent.model-retry.test.js.map +1 -0
  56. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +2 -0
  57. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +1 -0
  58. package/dist/src/agent/__tests__/agent.stateful-model.test.js +169 -0
  59. package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +1 -0
  60. package/dist/src/agent/__tests__/agent.test.js +217 -2
  61. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  62. package/dist/src/agent/__tests__/agent.tracer.test.node.js +39 -0
  63. package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +1 -1
  64. package/dist/src/agent/__tests__/snapshot.test.js +51 -4
  65. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  66. package/dist/src/agent/agent-as-tool.d.ts.map +1 -1
  67. package/dist/src/agent/agent-as-tool.js +4 -2
  68. package/dist/src/agent/agent-as-tool.js.map +1 -1
  69. package/dist/src/agent/agent.d.ts +109 -4
  70. package/dist/src/agent/agent.d.ts.map +1 -1
  71. package/dist/src/agent/agent.js +790 -224
  72. package/dist/src/agent/agent.js.map +1 -1
  73. package/dist/src/agent/snapshot.d.ts +2 -2
  74. package/dist/src/agent/snapshot.d.ts.map +1 -1
  75. package/dist/src/agent/snapshot.js +20 -2
  76. package/dist/src/agent/snapshot.js.map +1 -1
  77. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +230 -9
  78. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -1
  79. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +19 -6
  80. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
  81. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +58 -4
  82. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  83. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +76 -1
  84. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +1 -1
  85. package/dist/src/conversation-manager/conversation-manager.d.ts +67 -22
  86. package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -1
  87. package/dist/src/conversation-manager/conversation-manager.js +65 -13
  88. package/dist/src/conversation-manager/conversation-manager.js.map +1 -1
  89. package/dist/src/conversation-manager/index.d.ts +1 -1
  90. package/dist/src/conversation-manager/index.d.ts.map +1 -1
  91. package/dist/src/conversation-manager/index.js +1 -1
  92. package/dist/src/conversation-manager/index.js.map +1 -1
  93. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +17 -3
  94. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  95. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +10 -4
  96. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  97. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts +23 -1
  98. package/dist/src/conversation-manager/summarizing-conversation-manager.d.ts.map +1 -1
  99. package/dist/src/conversation-manager/summarizing-conversation-manager.js +39 -17
  100. package/dist/src/conversation-manager/summarizing-conversation-manager.js.map +1 -1
  101. package/dist/src/errors.d.ts +11 -0
  102. package/dist/src/errors.d.ts.map +1 -1
  103. package/dist/src/errors.js +12 -0
  104. package/dist/src/errors.js.map +1 -1
  105. package/dist/src/hooks/__tests__/events.test.js +267 -73
  106. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  107. package/dist/src/hooks/__tests__/registry.test.js +182 -18
  108. package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
  109. package/dist/src/hooks/events.d.ts +193 -51
  110. package/dist/src/hooks/events.d.ts.map +1 -1
  111. package/dist/src/hooks/events.js +182 -26
  112. package/dist/src/hooks/events.js.map +1 -1
  113. package/dist/src/hooks/index.d.ts +3 -2
  114. package/dist/src/hooks/index.d.ts.map +1 -1
  115. package/dist/src/hooks/index.js +1 -0
  116. package/dist/src/hooks/index.js.map +1 -1
  117. package/dist/src/hooks/registry.d.ts +12 -12
  118. package/dist/src/hooks/registry.d.ts.map +1 -1
  119. package/dist/src/hooks/registry.js +55 -15
  120. package/dist/src/hooks/registry.js.map +1 -1
  121. package/dist/src/hooks/types.d.ts +23 -0
  122. package/dist/src/hooks/types.d.ts.map +1 -1
  123. package/dist/src/hooks/types.js +17 -1
  124. package/dist/src/hooks/types.js.map +1 -1
  125. package/dist/src/index.d.ts +12 -7
  126. package/dist/src/index.d.ts.map +1 -1
  127. package/dist/src/index.js +4 -1
  128. package/dist/src/index.js.map +1 -1
  129. package/dist/src/interrupt.d.ts +220 -0
  130. package/dist/src/interrupt.d.ts.map +1 -0
  131. package/dist/src/interrupt.js +274 -0
  132. package/dist/src/interrupt.js.map +1 -0
  133. package/dist/src/logging/__tests__/warn-once.test.d.ts +2 -0
  134. package/dist/src/logging/__tests__/warn-once.test.d.ts.map +1 -0
  135. package/dist/src/logging/__tests__/warn-once.test.js +30 -0
  136. package/dist/src/logging/__tests__/warn-once.test.js.map +1 -0
  137. package/dist/src/logging/warn-once.d.ts +13 -0
  138. package/dist/src/logging/warn-once.d.ts.map +1 -0
  139. package/dist/src/logging/warn-once.js +18 -0
  140. package/dist/src/logging/warn-once.js.map +1 -0
  141. package/dist/src/mcp.d.ts +43 -3
  142. package/dist/src/mcp.d.ts.map +1 -1
  143. package/dist/src/mcp.js +85 -17
  144. package/dist/src/mcp.js.map +1 -1
  145. package/dist/src/mime.d.ts +2 -1
  146. package/dist/src/mime.d.ts.map +1 -1
  147. package/dist/src/mime.js +1 -0
  148. package/dist/src/mime.js.map +1 -1
  149. package/dist/src/models/__tests__/anthropic.test.js +147 -3
  150. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  151. package/dist/src/models/__tests__/bedrock.test.js +228 -2
  152. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  153. package/dist/src/models/__tests__/defaults.test.d.ts +2 -0
  154. package/dist/src/models/__tests__/defaults.test.d.ts.map +1 -0
  155. package/dist/src/models/__tests__/defaults.test.js +36 -0
  156. package/dist/src/models/__tests__/defaults.test.js.map +1 -0
  157. package/dist/src/models/__tests__/google.test.js +135 -0
  158. package/dist/src/models/__tests__/google.test.js.map +1 -1
  159. package/dist/src/models/__tests__/model.test.js +149 -1
  160. package/dist/src/models/__tests__/model.test.js.map +1 -1
  161. package/dist/src/models/anthropic.d.ts +20 -1
  162. package/dist/src/models/anthropic.d.ts.map +1 -1
  163. package/dist/src/models/anthropic.js +42 -8
  164. package/dist/src/models/anthropic.js.map +1 -1
  165. package/dist/src/models/bedrock.d.ts +27 -1
  166. package/dist/src/models/bedrock.d.ts.map +1 -1
  167. package/dist/src/models/bedrock.js +100 -12
  168. package/dist/src/models/bedrock.js.map +1 -1
  169. package/dist/src/models/defaults.d.ts +47 -0
  170. package/dist/src/models/defaults.d.ts.map +1 -0
  171. package/dist/src/models/defaults.js +170 -0
  172. package/dist/src/models/defaults.js.map +1 -0
  173. package/dist/src/models/google/model.d.ts +14 -1
  174. package/dist/src/models/google/model.d.ts.map +1 -1
  175. package/dist/src/models/google/model.js +54 -8
  176. package/dist/src/models/google/model.js.map +1 -1
  177. package/dist/src/models/google/types.d.ts +8 -0
  178. package/dist/src/models/google/types.d.ts.map +1 -1
  179. package/dist/src/models/model.d.ts +65 -0
  180. package/dist/src/models/model.d.ts.map +1 -1
  181. package/dist/src/models/model.js +138 -0
  182. package/dist/src/models/model.js.map +1 -1
  183. package/dist/src/models/openai/__tests__/chat.test.d.ts +2 -0
  184. package/dist/src/models/openai/__tests__/chat.test.d.ts.map +1 -0
  185. package/dist/src/models/{__tests__/openai.test.js → openai/__tests__/chat.test.js} +117 -7
  186. package/dist/src/models/openai/__tests__/chat.test.js.map +1 -0
  187. package/dist/src/models/openai/__tests__/responses.test.d.ts +2 -0
  188. package/dist/src/models/openai/__tests__/responses.test.d.ts.map +1 -0
  189. package/dist/src/models/openai/__tests__/responses.test.js +668 -0
  190. package/dist/src/models/openai/__tests__/responses.test.js.map +1 -0
  191. package/dist/src/models/openai/chat-adapter.d.ts +33 -0
  192. package/dist/src/models/openai/chat-adapter.d.ts.map +1 -0
  193. package/dist/src/models/openai/chat-adapter.js +383 -0
  194. package/dist/src/models/openai/chat-adapter.js.map +1 -0
  195. package/dist/src/models/openai/errors.d.ts +16 -0
  196. package/dist/src/models/openai/errors.d.ts.map +1 -0
  197. package/dist/src/models/openai/errors.js +40 -0
  198. package/dist/src/models/openai/errors.js.map +1 -0
  199. package/dist/src/models/openai/formatting.d.ts +18 -0
  200. package/dist/src/models/openai/formatting.d.ts.map +1 -0
  201. package/dist/src/models/openai/formatting.js +38 -0
  202. package/dist/src/models/openai/formatting.js.map +1 -0
  203. package/dist/src/models/openai/index.d.ts +19 -0
  204. package/dist/src/models/openai/index.d.ts.map +1 -0
  205. package/dist/src/models/openai/index.js +18 -0
  206. package/dist/src/models/openai/index.js.map +1 -0
  207. package/dist/src/models/openai/model.d.ts +77 -0
  208. package/dist/src/models/openai/model.d.ts.map +1 -0
  209. package/dist/src/models/openai/model.js +211 -0
  210. package/dist/src/models/openai/model.js.map +1 -0
  211. package/dist/src/models/openai/responses-adapter.d.ts +78 -0
  212. package/dist/src/models/openai/responses-adapter.d.ts.map +1 -0
  213. package/dist/src/models/openai/responses-adapter.js +467 -0
  214. package/dist/src/models/openai/responses-adapter.js.map +1 -0
  215. package/dist/src/models/openai/types.d.ts +131 -0
  216. package/dist/src/models/openai/types.d.ts.map +1 -0
  217. package/dist/src/models/openai/types.js +5 -0
  218. package/dist/src/models/openai/types.js.map +1 -0
  219. package/dist/src/multiagent/__tests__/events.test.js +122 -28
  220. package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
  221. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +2 -0
  222. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +1 -0
  223. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +95 -0
  224. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +1 -0
  225. package/dist/src/multiagent/__tests__/graph.test.js +69 -0
  226. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -1
  227. package/dist/src/multiagent/__tests__/nodes.test.js +18 -2
  228. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  229. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +2 -0
  230. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +1 -0
  231. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +56 -0
  232. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +1 -0
  233. package/dist/src/multiagent/__tests__/swarm.test.js +77 -0
  234. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
  235. package/dist/src/multiagent/events.d.ts +19 -1
  236. package/dist/src/multiagent/events.d.ts.map +1 -1
  237. package/dist/src/multiagent/events.js +18 -0
  238. package/dist/src/multiagent/events.js.map +1 -1
  239. package/dist/src/multiagent/graph.d.ts +27 -5
  240. package/dist/src/multiagent/graph.d.ts.map +1 -1
  241. package/dist/src/multiagent/graph.js +61 -15
  242. package/dist/src/multiagent/graph.js.map +1 -1
  243. package/dist/src/multiagent/index.d.ts +1 -1
  244. package/dist/src/multiagent/index.d.ts.map +1 -1
  245. package/dist/src/multiagent/multiagent.d.ts +21 -6
  246. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  247. package/dist/src/multiagent/nodes.d.ts +28 -3
  248. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  249. package/dist/src/multiagent/nodes.js +42 -7
  250. package/dist/src/multiagent/nodes.js.map +1 -1
  251. package/dist/src/multiagent/swarm.d.ts +20 -4
  252. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  253. package/dist/src/multiagent/swarm.js +65 -16
  254. package/dist/src/multiagent/swarm.js.map +1 -1
  255. package/dist/src/plugins/__tests__/registry.test.js +1 -1
  256. package/dist/src/plugins/__tests__/registry.test.js.map +1 -1
  257. package/dist/src/plugins/model-plugin.d.ts +20 -0
  258. package/dist/src/plugins/model-plugin.d.ts.map +1 -0
  259. package/dist/src/plugins/model-plugin.js +29 -0
  260. package/dist/src/plugins/model-plugin.js.map +1 -0
  261. package/dist/src/registry/__tests__/tool-registry.test.js +11 -0
  262. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -1
  263. package/dist/src/registry/tool-registry.d.ts +4 -0
  264. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  265. package/dist/src/registry/tool-registry.js +6 -0
  266. package/dist/src/registry/tool-registry.js.map +1 -1
  267. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +2 -0
  268. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +1 -0
  269. package/dist/src/retry/__tests__/backoff-strategy.test.js +116 -0
  270. package/dist/src/retry/__tests__/backoff-strategy.test.js.map +1 -0
  271. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +2 -0
  272. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +1 -0
  273. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +225 -0
  274. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +1 -0
  275. package/dist/src/retry/backoff-strategy.d.ts +108 -0
  276. package/dist/src/retry/backoff-strategy.d.ts.map +1 -0
  277. package/dist/src/retry/backoff-strategy.js +86 -0
  278. package/dist/src/retry/backoff-strategy.js.map +1 -0
  279. package/dist/src/retry/default-model-retry-strategy.d.ts +76 -0
  280. package/dist/src/retry/default-model-retry-strategy.d.ts.map +1 -0
  281. package/dist/src/retry/default-model-retry-strategy.js +104 -0
  282. package/dist/src/retry/default-model-retry-strategy.js.map +1 -0
  283. package/dist/src/retry/index.d.ts +8 -0
  284. package/dist/src/retry/index.d.ts.map +1 -0
  285. package/dist/src/retry/index.js +7 -0
  286. package/dist/src/retry/index.js.map +1 -0
  287. package/dist/src/retry/model-retry-strategy.d.ts +80 -0
  288. package/dist/src/retry/model-retry-strategy.d.ts.map +1 -0
  289. package/dist/src/retry/model-retry-strategy.js +85 -0
  290. package/dist/src/retry/model-retry-strategy.js.map +1 -0
  291. package/dist/src/retry/retry-strategy.d.ts +34 -0
  292. package/dist/src/retry/retry-strategy.d.ts.map +1 -0
  293. package/dist/src/retry/retry-strategy.js +25 -0
  294. package/dist/src/retry/retry-strategy.js.map +1 -0
  295. package/dist/src/session/__tests__/session-manager.test.js +52 -11
  296. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  297. package/dist/src/session/session-manager.d.ts +6 -0
  298. package/dist/src/session/session-manager.d.ts.map +1 -1
  299. package/dist/src/session/session-manager.js +17 -0
  300. package/dist/src/session/session-manager.js.map +1 -1
  301. package/dist/src/telemetry/__tests__/meter.test.js +23 -0
  302. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -1
  303. package/dist/src/telemetry/meter.d.ts +15 -0
  304. package/dist/src/telemetry/meter.d.ts.map +1 -1
  305. package/dist/src/telemetry/meter.js +14 -0
  306. package/dist/src/telemetry/meter.js.map +1 -1
  307. package/dist/src/tools/__tests__/tool.test.js +24 -1
  308. package/dist/src/tools/__tests__/tool.test.js.map +1 -1
  309. package/dist/src/tools/function-tool.d.ts.map +1 -1
  310. package/dist/src/tools/function-tool.js +6 -1
  311. package/dist/src/tools/function-tool.js.map +1 -1
  312. package/dist/src/tools/mcp-tool.d.ts +24 -3
  313. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  314. package/dist/src/tools/mcp-tool.js +103 -31
  315. package/dist/src/tools/mcp-tool.js.map +1 -1
  316. package/dist/src/tools/tool.d.ts +21 -2
  317. package/dist/src/tools/tool.d.ts.map +1 -1
  318. package/dist/src/tools/tool.js +12 -0
  319. package/dist/src/tools/tool.js.map +1 -1
  320. package/dist/src/tsconfig.tsbuildinfo +1 -1
  321. package/dist/src/types/__tests__/agent.test.js +48 -0
  322. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  323. package/dist/src/types/agent.d.ts +77 -9
  324. package/dist/src/types/agent.d.ts.map +1 -1
  325. package/dist/src/types/agent.js +30 -6
  326. package/dist/src/types/agent.js.map +1 -1
  327. package/dist/src/types/elicitation.d.ts +15 -0
  328. package/dist/src/types/elicitation.d.ts.map +1 -0
  329. package/dist/src/types/elicitation.js +2 -0
  330. package/dist/src/types/elicitation.js.map +1 -0
  331. package/dist/src/types/interrupt.d.ts +103 -0
  332. package/dist/src/types/interrupt.d.ts.map +1 -0
  333. package/dist/src/types/interrupt.js +63 -0
  334. package/dist/src/types/interrupt.js.map +1 -0
  335. package/dist/src/types/messages.d.ts +2 -1
  336. package/dist/src/types/messages.d.ts.map +1 -1
  337. package/dist/src/types/messages.js.map +1 -1
  338. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +2 -0
  339. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +1 -0
  340. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +292 -0
  341. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +1 -0
  342. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +2 -0
  343. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +1 -0
  344. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +148 -0
  345. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +1 -0
  346. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +2 -0
  347. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +1 -0
  348. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +78 -0
  349. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +1 -0
  350. package/dist/src/vended-plugins/context-offloader/index.d.ts +23 -0
  351. package/dist/src/vended-plugins/context-offloader/index.d.ts.map +1 -0
  352. package/dist/src/vended-plugins/context-offloader/index.js +21 -0
  353. package/dist/src/vended-plugins/context-offloader/index.js.map +1 -0
  354. package/dist/src/vended-plugins/context-offloader/plugin.d.ts +48 -0
  355. package/dist/src/vended-plugins/context-offloader/plugin.d.ts.map +1 -0
  356. package/dist/src/vended-plugins/context-offloader/plugin.js +244 -0
  357. package/dist/src/vended-plugins/context-offloader/plugin.js.map +1 -0
  358. package/dist/src/vended-plugins/context-offloader/storage.d.ts +114 -0
  359. package/dist/src/vended-plugins/context-offloader/storage.d.ts.map +1 -0
  360. package/dist/src/vended-plugins/context-offloader/storage.js +204 -0
  361. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -0
  362. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +21 -5
  363. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +1 -1
  364. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +4 -0
  365. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  366. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  367. package/dist/src/vended-tools/bash/bash.js +0 -3
  368. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  369. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +4 -0
  370. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -1
  371. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +4 -0
  372. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  373. package/package.json +17 -9
  374. package/dist/src/models/__tests__/openai.test.d.ts +0 -2
  375. package/dist/src/models/__tests__/openai.test.d.ts.map +0 -1
  376. package/dist/src/models/__tests__/openai.test.js.map +0 -1
  377. package/dist/src/models/openai.d.ts +0 -312
  378. package/dist/src/models/openai.d.ts.map +0 -1
  379. package/dist/src/models/openai.js +0 -789
  380. package/dist/src/models/openai.js.map +0 -1
@@ -0,0 +1,148 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { InMemoryStorage, S3Storage } from '../storage.js';
3
+ describe('InMemoryStorage', () => {
4
+ it('stores and retrieves text content', async () => {
5
+ const storage = new InMemoryStorage();
6
+ const content = new TextEncoder().encode('hello world');
7
+ const ref = await storage.store('key1', content, 'text/plain');
8
+ const result = await storage.retrieve(ref);
9
+ expect(new TextDecoder().decode(result.content)).toBe('hello world');
10
+ expect(result.contentType).toBe('text/plain');
11
+ });
12
+ it('stores and retrieves binary content', async () => {
13
+ const storage = new InMemoryStorage();
14
+ const content = new Uint8Array([1, 2, 3, 4, 5]);
15
+ const ref = await storage.store('key1', content, 'image/png');
16
+ const result = await storage.retrieve(ref);
17
+ expect(result.content).toEqual(content);
18
+ expect(result.contentType).toBe('image/png');
19
+ });
20
+ it('generates unique references', async () => {
21
+ const storage = new InMemoryStorage();
22
+ const content = new TextEncoder().encode('test');
23
+ const ref1 = await storage.store('key1', content);
24
+ const ref2 = await storage.store('key2', content);
25
+ expect(ref1).not.toBe(ref2);
26
+ });
27
+ it('uses mem_ prefix in references', async () => {
28
+ const storage = new InMemoryStorage();
29
+ const ref = await storage.store('mykey', new TextEncoder().encode('test'));
30
+ expect(ref).toMatch(/^mem_\d+_mykey$/);
31
+ });
32
+ it('throws on missing reference', async () => {
33
+ const storage = new InMemoryStorage();
34
+ await expect(storage.retrieve('nonexistent')).rejects.toThrow('Reference not found: nonexistent');
35
+ });
36
+ it('clears all stored content', async () => {
37
+ const storage = new InMemoryStorage();
38
+ const ref = await storage.store('key1', new TextEncoder().encode('test'));
39
+ storage.clear();
40
+ await expect(storage.retrieve(ref)).rejects.toThrow('Reference not found');
41
+ });
42
+ it('defaults content type to text/plain', async () => {
43
+ const storage = new InMemoryStorage();
44
+ const ref = await storage.store('key1', new TextEncoder().encode('test'));
45
+ const result = await storage.retrieve(ref);
46
+ expect(result.contentType).toBe('text/plain');
47
+ });
48
+ });
49
+ describe('S3Storage', () => {
50
+ let mockSend;
51
+ let mockS3Client;
52
+ beforeEach(() => {
53
+ mockSend = vi.fn();
54
+ mockS3Client = { send: mockSend };
55
+ });
56
+ describe('store', () => {
57
+ it('returns s3:// URI as reference', async () => {
58
+ mockSend.mockResolvedValue({});
59
+ const storage = new S3Storage('my-bucket', { s3Client: mockS3Client });
60
+ const ref = await storage.store('key1', new TextEncoder().encode('test'), 'text/plain');
61
+ expect(ref).toMatch(/^s3:\/\/my-bucket\//);
62
+ expect(ref).toContain('key1');
63
+ });
64
+ it('includes prefix in s3 key', async () => {
65
+ mockSend.mockResolvedValue({});
66
+ const storage = new S3Storage('my-bucket', { prefix: 'artifacts', s3Client: mockS3Client });
67
+ const ref = await storage.store('key1', new TextEncoder().encode('test'));
68
+ expect(ref).toMatch(/^s3:\/\/my-bucket\/artifacts\//);
69
+ });
70
+ it('normalizes trailing slashes on prefix', async () => {
71
+ mockSend.mockResolvedValue({});
72
+ const storage = new S3Storage('b', { prefix: 'p///', s3Client: mockS3Client });
73
+ const ref = await storage.store('k', new TextEncoder().encode('x'));
74
+ expect(ref).toMatch(/^s3:\/\/b\/p\//);
75
+ // Check no double slashes in the path portion (after s3://)
76
+ const pathPortion = ref.replace('s3://', '');
77
+ expect(pathPortion).not.toContain('//');
78
+ });
79
+ it('sends correct PutObject params', async () => {
80
+ mockSend.mockResolvedValue({});
81
+ const storage = new S3Storage('my-bucket', { s3Client: mockS3Client });
82
+ const content = new TextEncoder().encode('hello');
83
+ await storage.store('key1', content, 'application/json');
84
+ expect(mockSend).toHaveBeenCalledOnce();
85
+ const command = mockSend.mock.calls[0][0];
86
+ expect(command.input.Bucket).toBe('my-bucket');
87
+ expect(command.input.Body).toBe(content);
88
+ expect(command.input.ContentType).toBe('application/json');
89
+ });
90
+ it('sanitizes keys', async () => {
91
+ mockSend.mockResolvedValue({});
92
+ const storage = new S3Storage('b', { s3Client: mockS3Client });
93
+ const ref = await storage.store('../../etc/passwd', new TextEncoder().encode('x'));
94
+ expect(ref).not.toContain('..');
95
+ expect(ref).not.toContain('etc/passwd');
96
+ });
97
+ });
98
+ describe('retrieve', () => {
99
+ it('retrieves content by s3:// URI', async () => {
100
+ mockSend.mockResolvedValueOnce({}).mockResolvedValueOnce({
101
+ Body: { transformToByteArray: () => Promise.resolve(new Uint8Array([1, 2, 3])) },
102
+ ContentType: 'image/png',
103
+ });
104
+ const storage = new S3Storage('my-bucket', { s3Client: mockS3Client });
105
+ const ref = await storage.store('key1', new Uint8Array([1, 2, 3]), 'image/png');
106
+ const result = await storage.retrieve(ref);
107
+ expect(result.content).toEqual(new Uint8Array([1, 2, 3]));
108
+ expect(result.contentType).toBe('image/png');
109
+ });
110
+ it('retrieves content by raw key', async () => {
111
+ mockSend.mockResolvedValue({
112
+ Body: { transformToByteArray: () => Promise.resolve(new TextEncoder().encode('hello')) },
113
+ ContentType: 'text/plain',
114
+ });
115
+ const storage = new S3Storage('b', { s3Client: mockS3Client });
116
+ const result = await storage.retrieve('some/raw/key');
117
+ expect(new TextDecoder().decode(result.content)).toBe('hello');
118
+ const command = mockSend.mock.calls[0][0];
119
+ expect(command.input.Key).toBe('some/raw/key');
120
+ });
121
+ it('throws on bucket mismatch', async () => {
122
+ const storage = new S3Storage('my-bucket', { s3Client: mockS3Client });
123
+ await expect(storage.retrieve('s3://wrong-bucket/key')).rejects.toThrow('bucket mismatch');
124
+ });
125
+ it('throws on NoSuchKey error', async () => {
126
+ const noSuchKey = new Error('not found');
127
+ noSuchKey.name = 'NoSuchKey';
128
+ mockSend.mockRejectedValue(noSuchKey);
129
+ const storage = new S3Storage('b', { s3Client: mockS3Client });
130
+ await expect(storage.retrieve('missing-key')).rejects.toThrow('Reference not found');
131
+ });
132
+ it('defaults contentType to application/octet-stream when missing', async () => {
133
+ mockSend.mockResolvedValue({
134
+ Body: { transformToByteArray: () => Promise.resolve(new Uint8Array([0])) },
135
+ });
136
+ const storage = new S3Storage('b', { s3Client: mockS3Client });
137
+ const result = await storage.retrieve('key');
138
+ expect(result.contentType).toBe('application/octet-stream');
139
+ });
140
+ it('rethrows non-NoSuchKey errors', async () => {
141
+ const networkError = new Error('network timeout');
142
+ mockSend.mockRejectedValue(networkError);
143
+ const storage = new S3Storage('b', { s3Client: mockS3Client });
144
+ await expect(storage.retrieve('key')).rejects.toThrow('network timeout');
145
+ });
146
+ });
147
+ });
148
+ //# sourceMappingURL=storage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-offloader/__tests__/storage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storage.test.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.node.d.ts","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-offloader/__tests__/storage.test.node.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { FileStorage } from '../storage.js';
3
+ import * as fs from 'node:fs/promises';
4
+ import * as path from 'node:path';
5
+ import * as os from 'node:os';
6
+ describe('FileStorage', () => {
7
+ let tmpDir;
8
+ beforeEach(async () => {
9
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'context-offloader-test-'));
10
+ });
11
+ afterEach(async () => {
12
+ await fs.rm(tmpDir, { recursive: true, force: true });
13
+ });
14
+ it('stores and retrieves text content', async () => {
15
+ const storage = new FileStorage(tmpDir);
16
+ const content = new TextEncoder().encode('hello world');
17
+ const ref = await storage.store('key1', content, 'text/plain');
18
+ const result = await storage.retrieve(ref);
19
+ expect(new TextDecoder().decode(result.content)).toBe('hello world');
20
+ expect(result.contentType).toBe('text/plain');
21
+ });
22
+ it('stores and retrieves binary content', async () => {
23
+ const storage = new FileStorage(tmpDir);
24
+ const content = new Uint8Array([1, 2, 3, 4, 5]);
25
+ const ref = await storage.store('key1', content, 'image/png');
26
+ const result = await storage.retrieve(ref);
27
+ expect(result.content).toEqual(content);
28
+ expect(result.contentType).toBe('image/png');
29
+ });
30
+ it('returns file path as reference preserving configured directory', async () => {
31
+ const storage = new FileStorage(tmpDir);
32
+ const content = new TextEncoder().encode('test');
33
+ const ref = await storage.store('k1', content, 'text/plain');
34
+ expect(ref.startsWith(tmpDir)).toBe(true);
35
+ expect(ref).toMatch(/\.txt$/);
36
+ });
37
+ it('uses correct file extensions', async () => {
38
+ const storage = new FileStorage(tmpDir);
39
+ const content = new TextEncoder().encode('test');
40
+ const txtRef = await storage.store('k1', content, 'text/plain');
41
+ expect(txtRef).toMatch(/\.txt$/);
42
+ const jsonRef = await storage.store('k2', content, 'application/json');
43
+ expect(jsonRef).toMatch(/\.json$/);
44
+ const pngRef = await storage.store('k3', content, 'image/png');
45
+ expect(pngRef).toMatch(/\.png$/);
46
+ });
47
+ it('throws on missing reference', async () => {
48
+ const storage = new FileStorage(tmpDir);
49
+ await expect(storage.retrieve(path.join(tmpDir, 'nonexistent.txt'))).rejects.toThrow('Reference not found');
50
+ });
51
+ it('sanitizes keys for safe filenames', async () => {
52
+ const storage = new FileStorage(tmpDir);
53
+ const content = new TextEncoder().encode('test');
54
+ const ref = await storage.store('../../../etc/passwd', content, 'text/plain');
55
+ expect(ref).not.toContain('..');
56
+ });
57
+ it('prevents path traversal on retrieve', async () => {
58
+ const storage = new FileStorage(tmpDir);
59
+ await expect(storage.retrieve('../../etc/passwd')).rejects.toThrow('Reference not found');
60
+ });
61
+ it('creates artifact directory if it does not exist', async () => {
62
+ const nestedDir = path.join(tmpDir, 'nested', 'dir');
63
+ const storage = new FileStorage(nestedDir);
64
+ const content = new TextEncoder().encode('test');
65
+ await storage.store('key1', content, 'text/plain');
66
+ const stat = await fs.stat(nestedDir);
67
+ expect(stat.isDirectory()).toBe(true);
68
+ });
69
+ it('persists metadata across instances', async () => {
70
+ const storage1 = new FileStorage(tmpDir);
71
+ const content = new TextEncoder().encode('test');
72
+ const ref = await storage1.store('key1', content, 'application/json');
73
+ const storage2 = new FileStorage(tmpDir);
74
+ const result = await storage2.retrieve(ref);
75
+ expect(result.contentType).toBe('application/json');
76
+ });
77
+ });
78
+ //# sourceMappingURL=storage.test.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.node.js","sourceRoot":"","sources":["../../../../../src/vended-plugins/context-offloader/__tests__/storage.test.node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAE7B,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,MAAc,CAAA;IAElB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACvD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;QAE9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC1C,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACpE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;QAE7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAChD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;QAE5D,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAEhD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAEhC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAA;QACtE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAElC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC7G,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAChD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;QAC7E,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACvC,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QACpD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAChD,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAA;QAElD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAChD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAA;QAErE,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Context offloading plugin for Strands Agents.
3
+ *
4
+ * This module provides the ContextOffloader plugin and Storage backends for
5
+ * automatically offloading oversized tool results to external storage, replacing
6
+ * them with truncated previews and actionable storage references.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { Agent } from '@strands-agents/sdk'
11
+ * import { ContextOffloader, InMemoryStorage } from '@strands-agents/sdk/vended-plugins/context-offloader'
12
+ *
13
+ * const agent = new Agent({
14
+ * model,
15
+ * plugins: [new ContextOffloader({ storage: new InMemoryStorage() })],
16
+ * })
17
+ * ```
18
+ */
19
+ export { ContextOffloader } from './plugin.js';
20
+ export type { ContextOffloaderConfig } from './plugin.js';
21
+ export type { Storage } from './storage.js';
22
+ export { InMemoryStorage, FileStorage, S3Storage } from './storage.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Context offloading plugin for Strands Agents.
3
+ *
4
+ * This module provides the ContextOffloader plugin and Storage backends for
5
+ * automatically offloading oversized tool results to external storage, replacing
6
+ * them with truncated previews and actionable storage references.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { Agent } from '@strands-agents/sdk'
11
+ * import { ContextOffloader, InMemoryStorage } from '@strands-agents/sdk/vended-plugins/context-offloader'
12
+ *
13
+ * const agent = new Agent({
14
+ * model,
15
+ * plugins: [new ContextOffloader({ storage: new InMemoryStorage() })],
16
+ * })
17
+ * ```
18
+ */
19
+ export { ContextOffloader } from './plugin.js';
20
+ export { InMemoryStorage, FileStorage, S3Storage } from './storage.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/vended-plugins/context-offloader/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG9C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,48 @@
1
+ import type { Plugin } from '../../plugins/plugin.js';
2
+ import type { Tool } from '../../tools/tool.js';
3
+ import type { LocalAgent } from '../../types/agent.js';
4
+ import type { Storage } from './storage.js';
5
+ /** Configuration for the {@link ContextOffloader} plugin. */
6
+ export interface ContextOffloaderConfig {
7
+ /** Storage backend for persisting offloaded content. */
8
+ storage: Storage;
9
+ /** Token threshold above which tool results are offloaded. Defaults to 2,500. */
10
+ maxResultTokens?: number;
11
+ /** Number of tokens to keep as an inline preview. Defaults to 1,000. */
12
+ previewTokens?: number;
13
+ /** Whether to register the `retrieve_offloaded_content` tool. Defaults to true. */
14
+ includeRetrievalTool?: boolean;
15
+ }
16
+ /**
17
+ * Plugin that offloads oversized tool results to reduce context consumption.
18
+ *
19
+ * When a tool result exceeds the configured token threshold, this plugin stores
20
+ * each content block to a storage backend and replaces the in-context result with
21
+ * a truncated text preview plus per-block storage references.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * import { ContextOffloader, InMemoryStorage } from '@strands-agents/sdk/vended-plugins/context-offloader'
26
+ *
27
+ * const agent = new Agent({
28
+ * model,
29
+ * plugins: [new ContextOffloader({ storage: new InMemoryStorage() })],
30
+ * })
31
+ * ```
32
+ */
33
+ export declare class ContextOffloader implements Plugin {
34
+ readonly name = "strands:context-offloader";
35
+ private readonly _storage;
36
+ private readonly _maxResultTokens;
37
+ private readonly _previewTokens;
38
+ private readonly _includeRetrievalTool;
39
+ private _retrievalTool;
40
+ constructor(config: ContextOffloaderConfig);
41
+ initAgent(agent: LocalAgent): void;
42
+ getTools(): Tool[];
43
+ private _createRetrievalTool;
44
+ private _storeBlock;
45
+ private _buildPreviewText;
46
+ private _handleToolResult;
47
+ }
48
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +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;AAmE3C,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;IAQlB,OAAO,CAAC,oBAAoB;YAoBd,WAAW;IAiCzB,OAAO,CAAC,iBAAiB;YA4BX,iBAAiB;CA4DhC"}
@@ -0,0 +1,244 @@
1
+ import { AfterToolCallEvent } from '../../hooks/events.js';
2
+ import { TextBlock, JsonBlock, ToolResultBlock, Message } from '../../types/messages.js';
3
+ import { ImageBlock, VideoBlock, DocumentBlock } from '../../types/media.js';
4
+ import { tool } from '../../tools/tool-factory.js';
5
+ import { z } from 'zod';
6
+ import { logger } from '../../logging/logger.js';
7
+ const CHARS_PER_TOKEN = 4;
8
+ const DEFAULT_MAX_RESULT_TOKENS = 2_500;
9
+ const DEFAULT_PREVIEW_TOKENS = 1_000;
10
+ const RETRIEVAL_TOOL_NAME = 'retrieve_offloaded_content';
11
+ function slicePreview(text, previewTokens) {
12
+ const maxChars = previewTokens * CHARS_PER_TOKEN;
13
+ if (text.length <= maxChars)
14
+ return text;
15
+ return text.slice(0, maxChars);
16
+ }
17
+ function getBytes(block) {
18
+ if (block instanceof ImageBlock && block.source.type === 'imageSourceBytes') {
19
+ return block.source.bytes;
20
+ }
21
+ if (block instanceof VideoBlock && block.source.type === 'videoSourceBytes') {
22
+ return block.source.bytes;
23
+ }
24
+ if (block instanceof DocumentBlock) {
25
+ if (block.source.type === 'documentSourceBytes')
26
+ return block.source.bytes;
27
+ if (block.source.type === 'documentSourceText')
28
+ return new TextEncoder().encode(block.source.text);
29
+ }
30
+ return undefined;
31
+ }
32
+ function decodeStoredContent(content, contentType, reference) {
33
+ if (contentType.startsWith('text/')) {
34
+ return new TextDecoder().decode(content);
35
+ }
36
+ if (contentType === 'application/json') {
37
+ const text = new TextDecoder().decode(content);
38
+ try {
39
+ return JSON.parse(text);
40
+ }
41
+ catch {
42
+ return text;
43
+ }
44
+ }
45
+ // Return native content blocks for binary types so the agent sees the actual content.
46
+ // FunctionTool._wrapInToolResult passes ImageBlock/VideoBlock/DocumentBlock through as-is
47
+ // at runtime, even though the callback type signature only accepts JSONValue.
48
+ if (contentType.startsWith('image/')) {
49
+ const format = contentType.split('/').pop();
50
+ return new ImageBlock({
51
+ format: format,
52
+ source: { bytes: content },
53
+ });
54
+ }
55
+ if (contentType.startsWith('video/')) {
56
+ const format = contentType.split('/').pop();
57
+ return new VideoBlock({
58
+ format: format,
59
+ source: { bytes: content },
60
+ });
61
+ }
62
+ if (contentType.startsWith('application/')) {
63
+ const format = contentType.split('/').pop();
64
+ return new DocumentBlock({
65
+ format: format,
66
+ name: reference,
67
+ source: { bytes: content },
68
+ });
69
+ }
70
+ return new TextDecoder('utf-8', { fatal: false }).decode(content);
71
+ }
72
+ /**
73
+ * Plugin that offloads oversized tool results to reduce context consumption.
74
+ *
75
+ * When a tool result exceeds the configured token threshold, this plugin stores
76
+ * each content block to a storage backend and replaces the in-context result with
77
+ * a truncated text preview plus per-block storage references.
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * import { ContextOffloader, InMemoryStorage } from '@strands-agents/sdk/vended-plugins/context-offloader'
82
+ *
83
+ * const agent = new Agent({
84
+ * model,
85
+ * plugins: [new ContextOffloader({ storage: new InMemoryStorage() })],
86
+ * })
87
+ * ```
88
+ */
89
+ export class ContextOffloader {
90
+ name = 'strands:context-offloader';
91
+ _storage;
92
+ _maxResultTokens;
93
+ _previewTokens;
94
+ _includeRetrievalTool;
95
+ _retrievalTool;
96
+ constructor(config) {
97
+ const maxResultTokens = config.maxResultTokens ?? DEFAULT_MAX_RESULT_TOKENS;
98
+ const previewTokens = config.previewTokens ?? DEFAULT_PREVIEW_TOKENS;
99
+ if (maxResultTokens <= 0)
100
+ throw new Error('maxResultTokens must be positive');
101
+ if (previewTokens < 0)
102
+ throw new Error('previewTokens must be non-negative');
103
+ if (previewTokens >= maxResultTokens)
104
+ throw new Error('previewTokens must be less than maxResultTokens');
105
+ this._storage = config.storage;
106
+ this._maxResultTokens = maxResultTokens;
107
+ this._previewTokens = previewTokens;
108
+ this._includeRetrievalTool = config.includeRetrievalTool ?? true;
109
+ }
110
+ initAgent(agent) {
111
+ agent.addHook(AfterToolCallEvent, (event) => this._handleToolResult(event));
112
+ }
113
+ getTools() {
114
+ if (!this._includeRetrievalTool)
115
+ return [];
116
+ if (!this._retrievalTool) {
117
+ this._retrievalTool = this._createRetrievalTool();
118
+ }
119
+ return [this._retrievalTool];
120
+ }
121
+ _createRetrievalTool() {
122
+ const storage = this._storage;
123
+ return tool({
124
+ name: RETRIEVAL_TOOL_NAME,
125
+ description: 'Retrieve offloaded content by reference. Use this tool when you see a placeholder with a reference (ref: ...) and need the full content. Only use this as a fallback if the data cannot be accessed using your existing tools.',
126
+ inputSchema: z.object({
127
+ reference: z.string().describe('The reference string from the offload placeholder.'),
128
+ }),
129
+ callback: async (input) => {
130
+ try {
131
+ const result = await storage.retrieve(input.reference);
132
+ return decodeStoredContent(result.content, result.contentType, input.reference);
133
+ }
134
+ catch {
135
+ return `Error: reference not found: ${input.reference}`;
136
+ }
137
+ },
138
+ });
139
+ }
140
+ async _storeBlock(block, key) {
141
+ if (block instanceof TextBlock && block.text) {
142
+ const ref = await this._storage.store(key, new TextEncoder().encode(block.text), 'text/plain');
143
+ return { ref, contentType: 'text/plain', description: `text, ${block.text.length.toLocaleString()} chars` };
144
+ }
145
+ if (block instanceof JsonBlock) {
146
+ const jsonStr = JSON.stringify(block.json, null, 2);
147
+ const jsonBytes = new TextEncoder().encode(jsonStr);
148
+ const ref = await this._storage.store(key, jsonBytes, 'application/json');
149
+ return { ref, contentType: 'application/json', description: `json, ${jsonBytes.length.toLocaleString()} bytes` };
150
+ }
151
+ if (block instanceof ImageBlock || block instanceof VideoBlock || block instanceof DocumentBlock) {
152
+ const bytes = getBytes(block);
153
+ const contentType = block instanceof ImageBlock
154
+ ? `image/${block.format}`
155
+ : block instanceof VideoBlock
156
+ ? `video/${block.format}`
157
+ : `application/${block.format}`;
158
+ const label = block instanceof DocumentBlock ? block.name : contentType;
159
+ if (bytes) {
160
+ const ref = await this._storage.store(key, bytes, contentType);
161
+ return { ref, contentType, description: `${label}, ${bytes.length.toLocaleString()} bytes` };
162
+ }
163
+ return { ref: '', contentType, description: `${label}, 0 bytes` };
164
+ }
165
+ logger.warn('unsupported content block type encountered during offloading, skipping');
166
+ return { ref: '', contentType: 'unknown', description: 'unknown block type' };
167
+ }
168
+ _buildPreviewText(content, references, tokenCount, fullText) {
169
+ const preview = fullText ? slicePreview(fullText, this._previewTokens) : '';
170
+ const refLines = references
171
+ .filter((r) => r.ref)
172
+ .map((r) => ` ${r.ref} (${r.description})`)
173
+ .join('\n');
174
+ let guidance = 'Tool result was offloaded to external storage due to size.\n' +
175
+ 'Use the preview below to answer if possible.\n' +
176
+ 'Use your available tools to selectively access the data you need.';
177
+ if (this._includeRetrievalTool) {
178
+ guidance += '\nYou can also use retrieve_offloaded_content with a reference to get the full content.';
179
+ }
180
+ return (`[Offloaded: ${content.length} blocks, ~${tokenCount.toLocaleString()} tokens]\n` +
181
+ `${guidance}\n\n` +
182
+ `${preview}\n\n` +
183
+ `[Stored references:]\n${refLines}`);
184
+ }
185
+ async _handleToolResult(event) {
186
+ if (event.result.status === 'error')
187
+ return;
188
+ // Skip results from the retrieval tool to prevent circular offloading
189
+ if (this._includeRetrievalTool && event.toolUse.name === RETRIEVAL_TOOL_NAME)
190
+ return;
191
+ const content = event.result.content;
192
+ const toolUseId = event.result.toolUseId;
193
+ const tokenCount = await event.agent.model.countTokens([new Message({ role: 'user', content: [event.result] })]);
194
+ if (tokenCount <= this._maxResultTokens)
195
+ return;
196
+ // Extract text preview from text/JSON blocks
197
+ const textParts = [];
198
+ for (const block of content) {
199
+ if (block instanceof TextBlock && block.text)
200
+ textParts.push(block.text);
201
+ else if (block instanceof JsonBlock)
202
+ textParts.push(JSON.stringify(block.json, null, 2));
203
+ }
204
+ const fullText = textParts.join('\n');
205
+ // Store each content block to the storage backend
206
+ let references;
207
+ try {
208
+ references = await Promise.all(content.map((block, i) => this._storeBlock(block, `${toolUseId}_${i}`)));
209
+ }
210
+ catch (err) {
211
+ logger.warn(`tool_use_id=<${toolUseId}> | failed to offload tool result, keeping original`, err);
212
+ return;
213
+ }
214
+ logger.debug(`tool_use_id=<${toolUseId}>, blocks=<${references.length}>, tokens=<${tokenCount}> | tool result offloaded`);
215
+ // Build replacement content: preview text + media placeholders
216
+ const newContent = [
217
+ new TextBlock(this._buildPreviewText(content, references, tokenCount, fullText)),
218
+ ];
219
+ for (let i = 0; i < content.length; i++) {
220
+ const block = content[i];
221
+ const ref = references[i]?.ref ?? '';
222
+ if (block instanceof TextBlock || block instanceof JsonBlock)
223
+ continue;
224
+ const bytes = getBytes(block);
225
+ const size = bytes ? bytes.length : 0;
226
+ let label;
227
+ if (block instanceof ImageBlock)
228
+ label = `image: ${block.format}`;
229
+ else if (block instanceof VideoBlock)
230
+ label = `video: ${block.format}`;
231
+ else if (block instanceof DocumentBlock)
232
+ label = `document: ${block.format}, ${block.name}`;
233
+ if (label) {
234
+ newContent.push(new TextBlock(`[${label}, ${size} bytes${ref ? ` | ref: ${ref}` : ''}]`));
235
+ }
236
+ }
237
+ event.result = new ToolResultBlock({
238
+ toolUseId: event.result.toolUseId,
239
+ status: event.result.status,
240
+ content: newContent,
241
+ });
242
+ }
243
+ }
244
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../../src/vended-plugins/context-offloader/plugin.ts"],"names":[],"mappings":"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"}