@strands-agents/sdk 0.5.0 → 0.7.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 (486) hide show
  1. package/README.md +64 -0
  2. package/dist/src/__fixtures__/agent-helpers.d.ts +37 -4
  3. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  4. package/dist/src/__fixtures__/agent-helpers.js +31 -4
  5. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  6. package/dist/src/__fixtures__/metrics-helpers.d.ts +55 -0
  7. package/dist/src/__fixtures__/metrics-helpers.d.ts.map +1 -0
  8. package/dist/src/__fixtures__/metrics-helpers.js +57 -0
  9. package/dist/src/__fixtures__/metrics-helpers.js.map +1 -0
  10. package/dist/src/__fixtures__/mock-message-model.d.ts +8 -4
  11. package/dist/src/__fixtures__/mock-message-model.d.ts.map +1 -1
  12. package/dist/src/__fixtures__/mock-message-model.js +25 -7
  13. package/dist/src/__fixtures__/mock-message-model.js.map +1 -1
  14. package/dist/src/__fixtures__/mock-meter.d.ts +32 -0
  15. package/dist/src/__fixtures__/mock-meter.d.ts.map +1 -0
  16. package/dist/src/__fixtures__/mock-meter.js +47 -0
  17. package/dist/src/__fixtures__/mock-meter.js.map +1 -0
  18. package/dist/src/__fixtures__/mock-plugin.d.ts +13 -0
  19. package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -0
  20. package/dist/src/__fixtures__/{mock-hook-provider.js → mock-plugin.js} +8 -5
  21. package/dist/src/__fixtures__/mock-plugin.js.map +1 -0
  22. package/dist/src/__fixtures__/mock-storage-provider.d.ts +5 -0
  23. package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +1 -1
  24. package/dist/src/__fixtures__/mock-storage-provider.js +23 -6
  25. package/dist/src/__fixtures__/mock-storage-provider.js.map +1 -1
  26. package/dist/src/__fixtures__/slim-types.d.ts +2 -1
  27. package/dist/src/__fixtures__/slim-types.d.ts.map +1 -1
  28. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  29. package/dist/src/__fixtures__/tool-helpers.js +5 -2
  30. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  31. package/dist/src/__tests__/index.test.js +21 -0
  32. package/dist/src/__tests__/index.test.js.map +1 -1
  33. package/dist/src/__tests__/mcp.test.js +45 -15
  34. package/dist/src/__tests__/mcp.test.js.map +1 -1
  35. package/dist/src/__tests__/mime.test.d.ts +2 -0
  36. package/dist/src/__tests__/mime.test.d.ts.map +1 -0
  37. package/dist/src/__tests__/mime.test.js +83 -0
  38. package/dist/src/__tests__/mime.test.js.map +1 -0
  39. package/dist/src/__tests__/state-store.test.d.ts +2 -0
  40. package/dist/src/__tests__/state-store.test.d.ts.map +1 -0
  41. package/dist/src/__tests__/{app-state.test.js → state-store.test.js} +86 -51
  42. package/dist/src/__tests__/state-store.test.js.map +1 -0
  43. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +2 -0
  44. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +1 -0
  45. package/dist/src/a2a/__tests__/a2a-agent.test.js +364 -0
  46. package/dist/src/a2a/__tests__/a2a-agent.test.js.map +1 -0
  47. package/dist/src/a2a/__tests__/adapters.test.d.ts +2 -0
  48. package/dist/src/a2a/__tests__/adapters.test.d.ts.map +1 -0
  49. package/dist/src/a2a/__tests__/adapters.test.js +151 -0
  50. package/dist/src/a2a/__tests__/adapters.test.js.map +1 -0
  51. package/dist/src/a2a/__tests__/executor.test.d.ts +2 -0
  52. package/dist/src/a2a/__tests__/executor.test.d.ts.map +1 -0
  53. package/dist/src/a2a/__tests__/executor.test.js +196 -0
  54. package/dist/src/a2a/__tests__/executor.test.js.map +1 -0
  55. package/dist/src/a2a/__tests__/server.test.d.ts +2 -0
  56. package/dist/src/a2a/__tests__/server.test.d.ts.map +1 -0
  57. package/dist/src/a2a/__tests__/server.test.js +51 -0
  58. package/dist/src/a2a/__tests__/server.test.js.map +1 -0
  59. package/dist/src/a2a/__tests__/server.test.node.d.ts +2 -0
  60. package/dist/src/a2a/__tests__/server.test.node.d.ts.map +1 -0
  61. package/dist/src/a2a/__tests__/server.test.node.js +110 -0
  62. package/dist/src/a2a/__tests__/server.test.node.js.map +1 -0
  63. package/dist/src/a2a/a2a-agent.d.ts +132 -0
  64. package/dist/src/a2a/a2a-agent.d.ts.map +1 -0
  65. package/dist/src/a2a/a2a-agent.js +255 -0
  66. package/dist/src/a2a/a2a-agent.js.map +1 -0
  67. package/dist/src/a2a/adapters.d.ts +27 -0
  68. package/dist/src/a2a/adapters.d.ts.map +1 -0
  69. package/dist/src/a2a/adapters.js +175 -0
  70. package/dist/src/a2a/adapters.js.map +1 -0
  71. package/dist/src/a2a/events.d.ts +42 -0
  72. package/dist/src/a2a/events.d.ts.map +1 -0
  73. package/dist/src/a2a/events.js +35 -0
  74. package/dist/src/a2a/events.js.map +1 -0
  75. package/dist/src/a2a/executor.d.ts +57 -0
  76. package/dist/src/a2a/executor.d.ts.map +1 -0
  77. package/dist/src/a2a/executor.js +130 -0
  78. package/dist/src/a2a/executor.js.map +1 -0
  79. package/dist/src/a2a/express-server.d.ts +67 -0
  80. package/dist/src/a2a/express-server.d.ts.map +1 -0
  81. package/dist/src/a2a/express-server.js +95 -0
  82. package/dist/src/a2a/express-server.js.map +1 -0
  83. package/dist/src/a2a/index.d.ts +16 -0
  84. package/dist/src/a2a/index.d.ts.map +1 -0
  85. package/dist/src/a2a/index.js +16 -0
  86. package/dist/src/a2a/index.js.map +1 -0
  87. package/dist/src/a2a/logging.d.ts +8 -0
  88. package/dist/src/a2a/logging.d.ts.map +1 -0
  89. package/dist/src/a2a/logging.js +15 -0
  90. package/dist/src/a2a/logging.js.map +1 -0
  91. package/dist/src/a2a/server.d.ts +67 -0
  92. package/dist/src/a2a/server.d.ts.map +1 -0
  93. package/dist/src/a2a/server.js +67 -0
  94. package/dist/src/a2a/server.js.map +1 -0
  95. package/dist/src/agent/__tests__/agent.hook.test.js +87 -51
  96. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  97. package/dist/src/agent/__tests__/agent.test.js +176 -101
  98. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  99. package/dist/src/agent/__tests__/agent.tracer.test.js +10 -10
  100. package/dist/src/agent/__tests__/agent.tracer.test.js.map +1 -1
  101. package/dist/src/agent/__tests__/snapshot.test.js +11 -11
  102. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  103. package/dist/src/agent/agent.d.ts +71 -58
  104. package/dist/src/agent/agent.d.ts.map +1 -1
  105. package/dist/src/agent/agent.js +177 -93
  106. package/dist/src/agent/agent.js.map +1 -1
  107. package/dist/src/agent/snapshot.d.ts.map +1 -1
  108. package/dist/src/agent/snapshot.js +3 -2
  109. package/dist/src/agent/snapshot.js.map +1 -1
  110. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +2 -0
  111. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +1 -0
  112. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +100 -0
  113. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +1 -0
  114. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +26 -10
  115. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +1 -1
  116. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +84 -21
  117. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  118. package/dist/src/conversation-manager/conversation-manager.d.ts +87 -0
  119. package/dist/src/conversation-manager/conversation-manager.d.ts.map +1 -0
  120. package/dist/src/conversation-manager/conversation-manager.js +59 -0
  121. package/dist/src/conversation-manager/conversation-manager.js.map +1 -0
  122. package/dist/src/conversation-manager/index.d.ts +1 -0
  123. package/dist/src/conversation-manager/index.d.ts.map +1 -1
  124. package/dist/src/conversation-manager/index.js +1 -0
  125. package/dist/src/conversation-manager/index.js.map +1 -1
  126. package/dist/src/conversation-manager/null-conversation-manager.d.ts +12 -8
  127. package/dist/src/conversation-manager/null-conversation-manager.d.ts.map +1 -1
  128. package/dist/src/conversation-manager/null-conversation-manager.js +13 -7
  129. package/dist/src/conversation-manager/null-conversation-manager.js.map +1 -1
  130. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts +28 -19
  131. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  132. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +44 -36
  133. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  134. package/dist/src/errors.d.ts +6 -0
  135. package/dist/src/errors.d.ts.map +1 -1
  136. package/dist/src/errors.js +9 -0
  137. package/dist/src/errors.js.map +1 -1
  138. package/dist/src/hooks/__tests__/events.test.js +2 -0
  139. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  140. package/dist/src/hooks/__tests__/registry.test.js +10 -154
  141. package/dist/src/hooks/__tests__/registry.test.js.map +1 -1
  142. package/dist/src/hooks/events.d.ts +60 -44
  143. package/dist/src/hooks/events.d.ts.map +1 -1
  144. package/dist/src/hooks/events.js +11 -11
  145. package/dist/src/hooks/events.js.map +1 -1
  146. package/dist/src/hooks/index.d.ts +4 -4
  147. package/dist/src/hooks/index.d.ts.map +1 -1
  148. package/dist/src/hooks/index.js +2 -2
  149. package/dist/src/hooks/registry.d.ts +1 -32
  150. package/dist/src/hooks/registry.d.ts.map +1 -1
  151. package/dist/src/hooks/registry.js +1 -47
  152. package/dist/src/hooks/registry.js.map +1 -1
  153. package/dist/src/hooks/types.d.ts +0 -31
  154. package/dist/src/hooks/types.d.ts.map +1 -1
  155. package/dist/src/index.d.ts +30 -15
  156. package/dist/src/index.d.ts.map +1 -1
  157. package/dist/src/index.js +21 -8
  158. package/dist/src/index.js.map +1 -1
  159. package/dist/src/mcp.d.ts +38 -0
  160. package/dist/src/mcp.d.ts.map +1 -1
  161. package/dist/src/mcp.js +23 -6
  162. package/dist/src/mcp.js.map +1 -1
  163. package/dist/src/mime.d.ts +24 -0
  164. package/dist/src/mime.d.ts.map +1 -0
  165. package/dist/src/mime.js +82 -0
  166. package/dist/src/mime.js.map +1 -0
  167. package/dist/src/models/__tests__/anthropic.test.js +78 -1
  168. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  169. package/dist/src/models/__tests__/bedrock.test.js +2050 -131
  170. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  171. package/dist/src/models/__tests__/gemini.test.js +100 -1
  172. package/dist/src/models/__tests__/gemini.test.js.map +1 -1
  173. package/dist/src/models/__tests__/model.test.js +131 -0
  174. package/dist/src/models/__tests__/model.test.js.map +1 -1
  175. package/dist/src/models/__tests__/openai.test.js +184 -32
  176. package/dist/src/models/__tests__/openai.test.js.map +1 -1
  177. package/dist/src/models/__tests__/streaming.test.d.ts +2 -0
  178. package/dist/src/models/__tests__/streaming.test.d.ts.map +1 -0
  179. package/dist/src/models/__tests__/streaming.test.js +50 -0
  180. package/dist/src/models/__tests__/streaming.test.js.map +1 -0
  181. package/dist/src/models/anthropic.d.ts.map +1 -1
  182. package/dist/src/models/anthropic.js +6 -7
  183. package/dist/src/models/anthropic.js.map +1 -1
  184. package/dist/src/models/bedrock.d.ts +144 -11
  185. package/dist/src/models/bedrock.d.ts.map +1 -1
  186. package/dist/src/models/bedrock.js +416 -28
  187. package/dist/src/models/bedrock.js.map +1 -1
  188. package/dist/src/models/gemini/adapters.d.ts.map +1 -1
  189. package/dist/src/models/gemini/adapters.js +65 -14
  190. package/dist/src/models/gemini/adapters.js.map +1 -1
  191. package/dist/src/models/model.d.ts +18 -0
  192. package/dist/src/models/model.d.ts.map +1 -1
  193. package/dist/src/models/model.js +57 -11
  194. package/dist/src/models/model.js.map +1 -1
  195. package/dist/src/models/openai.d.ts +15 -0
  196. package/dist/src/models/openai.d.ts.map +1 -1
  197. package/dist/src/models/openai.js +108 -64
  198. package/dist/src/models/openai.js.map +1 -1
  199. package/dist/src/models/streaming.d.ts +88 -2
  200. package/dist/src/models/streaming.d.ts.map +1 -1
  201. package/dist/src/models/streaming.js +26 -0
  202. package/dist/src/models/streaming.js.map +1 -1
  203. package/dist/src/multiagent/__tests__/events.test.js +41 -8
  204. package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
  205. package/dist/src/multiagent/__tests__/graph.test.d.ts +2 -0
  206. package/dist/src/multiagent/__tests__/graph.test.d.ts.map +1 -0
  207. package/dist/src/multiagent/__tests__/graph.test.js +453 -0
  208. package/dist/src/multiagent/__tests__/graph.test.js.map +1 -0
  209. package/dist/src/multiagent/__tests__/nodes.test.js +34 -16
  210. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  211. package/dist/src/multiagent/__tests__/queue.test.js +22 -0
  212. package/dist/src/multiagent/__tests__/queue.test.js.map +1 -1
  213. package/dist/src/multiagent/__tests__/swarm.test.d.ts +2 -0
  214. package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +1 -0
  215. package/dist/src/multiagent/__tests__/swarm.test.js +264 -0
  216. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -0
  217. package/dist/src/multiagent/edge.d.ts +9 -2
  218. package/dist/src/multiagent/edge.d.ts.map +1 -1
  219. package/dist/src/multiagent/events.d.ts +63 -15
  220. package/dist/src/multiagent/events.d.ts.map +1 -1
  221. package/dist/src/multiagent/events.js +28 -3
  222. package/dist/src/multiagent/events.js.map +1 -1
  223. package/dist/src/multiagent/graph.d.ts +135 -0
  224. package/dist/src/multiagent/graph.d.ts.map +1 -0
  225. package/dist/src/multiagent/graph.js +400 -0
  226. package/dist/src/multiagent/graph.js.map +1 -0
  227. package/dist/src/multiagent/index.d.ts +8 -3
  228. package/dist/src/multiagent/index.d.ts.map +1 -1
  229. package/dist/src/multiagent/index.js +3 -1
  230. package/dist/src/multiagent/index.js.map +1 -1
  231. package/dist/src/multiagent/multiagent.d.ts +41 -0
  232. package/dist/src/multiagent/multiagent.d.ts.map +1 -0
  233. package/dist/src/multiagent/multiagent.js +2 -0
  234. package/dist/src/multiagent/multiagent.js.map +1 -0
  235. package/dist/src/multiagent/nodes.d.ts +24 -25
  236. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  237. package/dist/src/multiagent/nodes.js +42 -15
  238. package/dist/src/multiagent/nodes.js.map +1 -1
  239. package/dist/src/multiagent/plugins.d.ts +70 -0
  240. package/dist/src/multiagent/plugins.d.ts.map +1 -0
  241. package/dist/src/multiagent/plugins.js +70 -0
  242. package/dist/src/multiagent/plugins.js.map +1 -0
  243. package/dist/src/multiagent/queue.d.ts +6 -0
  244. package/dist/src/multiagent/queue.d.ts.map +1 -1
  245. package/dist/src/multiagent/queue.js +13 -0
  246. package/dist/src/multiagent/queue.js.map +1 -1
  247. package/dist/src/multiagent/state.d.ts +4 -2
  248. package/dist/src/multiagent/state.d.ts.map +1 -1
  249. package/dist/src/multiagent/state.js +5 -2
  250. package/dist/src/multiagent/state.js.map +1 -1
  251. package/dist/src/multiagent/swarm.d.ts +112 -0
  252. package/dist/src/multiagent/swarm.d.ts.map +1 -0
  253. package/dist/src/multiagent/swarm.js +256 -0
  254. package/dist/src/multiagent/swarm.js.map +1 -0
  255. package/dist/src/plugins/__tests__/plugin.test.d.ts +2 -0
  256. package/dist/src/plugins/__tests__/plugin.test.d.ts.map +1 -0
  257. package/dist/src/plugins/__tests__/plugin.test.js +114 -0
  258. package/dist/src/plugins/__tests__/plugin.test.js.map +1 -0
  259. package/dist/src/plugins/__tests__/registry.test.d.ts +2 -0
  260. package/dist/src/plugins/__tests__/registry.test.d.ts.map +1 -0
  261. package/dist/src/plugins/__tests__/registry.test.js +147 -0
  262. package/dist/src/plugins/__tests__/registry.test.js.map +1 -0
  263. package/dist/src/plugins/index.d.ts +30 -0
  264. package/dist/src/plugins/index.d.ts.map +1 -0
  265. package/dist/src/plugins/index.js +30 -0
  266. package/dist/src/plugins/index.js.map +1 -0
  267. package/dist/src/plugins/plugin.d.ts +74 -0
  268. package/dist/src/plugins/plugin.d.ts.map +1 -0
  269. package/dist/src/plugins/plugin.js +8 -0
  270. package/dist/src/plugins/plugin.js.map +1 -0
  271. package/dist/src/plugins/registry.d.ts +25 -0
  272. package/dist/src/plugins/registry.d.ts.map +1 -0
  273. package/dist/src/plugins/registry.js +41 -0
  274. package/dist/src/plugins/registry.js.map +1 -0
  275. package/dist/src/registry/__tests__/tool-registry.test.d.ts +2 -0
  276. package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +1 -0
  277. package/dist/src/registry/__tests__/tool-registry.test.js +124 -0
  278. package/dist/src/registry/__tests__/tool-registry.test.js.map +1 -0
  279. package/dist/src/registry/tool-registry.d.ts +32 -20
  280. package/dist/src/registry/tool-registry.d.ts.map +1 -1
  281. package/dist/src/registry/tool-registry.js +60 -158
  282. package/dist/src/registry/tool-registry.js.map +1 -1
  283. package/dist/src/session/__tests__/file-storage.test.node.js +75 -15
  284. package/dist/src/session/__tests__/file-storage.test.node.js.map +1 -1
  285. package/dist/src/session/__tests__/s3-storage.test.d.ts +2 -0
  286. package/dist/src/session/__tests__/s3-storage.test.d.ts.map +1 -0
  287. package/dist/src/session/__tests__/{s3-storage.test.node.js → s3-storage.test.js} +161 -75
  288. package/dist/src/session/__tests__/s3-storage.test.js.map +1 -0
  289. package/dist/src/session/__tests__/session-manager.test.d.ts +2 -0
  290. package/dist/src/session/__tests__/session-manager.test.d.ts.map +1 -0
  291. package/dist/src/session/__tests__/session-manager.test.js +443 -0
  292. package/dist/src/session/__tests__/session-manager.test.js.map +1 -0
  293. package/dist/src/session/__tests__/validation.test.js +28 -1
  294. package/dist/src/session/__tests__/validation.test.js.map +1 -1
  295. package/dist/src/session/file-storage.d.ts +53 -27
  296. package/dist/src/session/file-storage.d.ts.map +1 -1
  297. package/dist/src/session/file-storage.js +103 -52
  298. package/dist/src/session/file-storage.js.map +1 -1
  299. package/dist/src/session/index.d.ts +6 -14
  300. package/dist/src/session/index.d.ts.map +1 -1
  301. package/dist/src/session/index.js +4 -13
  302. package/dist/src/session/index.js.map +1 -1
  303. package/dist/src/session/s3-storage.d.ts +49 -20
  304. package/dist/src/session/s3-storage.d.ts.map +1 -1
  305. package/dist/src/session/s3-storage.js +120 -35
  306. package/dist/src/session/s3-storage.js.map +1 -1
  307. package/dist/src/session/session-manager.d.ts +87 -0
  308. package/dist/src/session/session-manager.d.ts.map +1 -0
  309. package/dist/src/session/session-manager.js +128 -0
  310. package/dist/src/session/session-manager.js.map +1 -0
  311. package/dist/src/session/storage.d.ts +20 -12
  312. package/dist/src/session/storage.d.ts.map +1 -1
  313. package/dist/src/session/types.d.ts +8 -20
  314. package/dist/src/session/types.d.ts.map +1 -1
  315. package/dist/src/session/validation.d.ts +7 -0
  316. package/dist/src/session/validation.d.ts.map +1 -1
  317. package/dist/src/session/validation.js +12 -0
  318. package/dist/src/session/validation.js.map +1 -1
  319. package/dist/src/{app-state.d.ts → state-store.d.ts} +11 -11
  320. package/dist/src/state-store.d.ts.map +1 -0
  321. package/dist/src/{app-state.js → state-store.js} +8 -7
  322. package/dist/src/state-store.js.map +1 -0
  323. package/dist/src/structured-output/__tests__/context.test.js +13 -13
  324. package/dist/src/structured-output/__tests__/context.test.js.map +1 -1
  325. package/dist/src/structured-output/context.js +1 -1
  326. package/dist/src/structured-output/context.js.map +1 -1
  327. package/dist/src/telemetry/__tests__/config.test.d.ts +2 -0
  328. package/dist/src/telemetry/__tests__/config.test.d.ts.map +1 -0
  329. package/dist/src/telemetry/__tests__/config.test.js +64 -0
  330. package/dist/src/telemetry/__tests__/config.test.js.map +1 -0
  331. package/dist/src/telemetry/__tests__/config.test.node.js +66 -36
  332. package/dist/src/telemetry/__tests__/config.test.node.js.map +1 -1
  333. package/dist/src/telemetry/__tests__/meter.test.d.ts +2 -0
  334. package/dist/src/telemetry/__tests__/meter.test.d.ts.map +1 -0
  335. package/dist/src/telemetry/__tests__/meter.test.js +624 -0
  336. package/dist/src/telemetry/__tests__/meter.test.js.map +1 -0
  337. package/dist/src/telemetry/__tests__/tracer.test.node.js +123 -2
  338. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -1
  339. package/dist/src/telemetry/config.d.ts +104 -23
  340. package/dist/src/telemetry/config.d.ts.map +1 -1
  341. package/dist/src/telemetry/config.js +152 -43
  342. package/dist/src/telemetry/config.js.map +1 -1
  343. package/dist/src/telemetry/index.d.ts +10 -7
  344. package/dist/src/telemetry/index.d.ts.map +1 -1
  345. package/dist/src/telemetry/index.js +9 -6
  346. package/dist/src/telemetry/index.js.map +1 -1
  347. package/dist/src/telemetry/meter.d.ts +296 -0
  348. package/dist/src/telemetry/meter.d.ts.map +1 -0
  349. package/dist/src/telemetry/meter.js +365 -0
  350. package/dist/src/telemetry/meter.js.map +1 -0
  351. package/dist/src/telemetry/tracer.d.ts +27 -0
  352. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  353. package/dist/src/telemetry/tracer.js +79 -4
  354. package/dist/src/telemetry/tracer.js.map +1 -1
  355. package/dist/src/telemetry/types.d.ts +2 -0
  356. package/dist/src/telemetry/types.d.ts.map +1 -1
  357. package/dist/src/telemetry/utils.d.ts +10 -0
  358. package/dist/src/telemetry/utils.d.ts.map +1 -0
  359. package/dist/src/telemetry/utils.js +13 -0
  360. package/dist/src/telemetry/utils.js.map +1 -0
  361. package/dist/src/tools/__tests__/tool-factory.test.d.ts +2 -0
  362. package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +1 -0
  363. package/dist/src/tools/__tests__/tool-factory.test.js +98 -0
  364. package/dist/src/tools/__tests__/tool-factory.test.js.map +1 -0
  365. package/dist/src/tools/__tests__/tool.test.js +22 -1
  366. package/dist/src/tools/__tests__/tool.test.js.map +1 -1
  367. package/dist/src/tools/__tests__/zod-tool.test-d.js +1 -1
  368. package/dist/src/tools/__tests__/zod-tool.test-d.js.map +1 -1
  369. package/dist/src/tools/__tests__/zod-tool.test.js +3 -4
  370. package/dist/src/tools/__tests__/zod-tool.test.js.map +1 -1
  371. package/dist/src/tools/function-tool.d.ts +26 -3
  372. package/dist/src/tools/function-tool.d.ts.map +1 -1
  373. package/dist/src/tools/function-tool.js +88 -3
  374. package/dist/src/tools/function-tool.js.map +1 -1
  375. package/dist/src/tools/tool-factory.d.ts +22 -0
  376. package/dist/src/tools/tool-factory.d.ts.map +1 -0
  377. package/dist/src/tools/tool-factory.js +55 -0
  378. package/dist/src/tools/tool-factory.js.map +1 -0
  379. package/dist/src/tools/tool.d.ts +2 -2
  380. package/dist/src/tools/tool.d.ts.map +1 -1
  381. package/dist/src/tools/zod-tool.d.ts +55 -52
  382. package/dist/src/tools/zod-tool.d.ts.map +1 -1
  383. package/dist/src/tools/zod-tool.js +7 -61
  384. package/dist/src/tools/zod-tool.js.map +1 -1
  385. package/dist/src/tsconfig.tsbuildinfo +1 -1
  386. package/dist/src/types/__tests__/agent.test.js +11 -0
  387. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  388. package/dist/src/types/__tests__/citations.test.d.ts +2 -0
  389. package/dist/src/types/__tests__/citations.test.d.ts.map +1 -0
  390. package/dist/src/types/__tests__/citations.test.js +104 -0
  391. package/dist/src/types/__tests__/citations.test.js.map +1 -0
  392. package/dist/src/types/__tests__/media.test.js +22 -16
  393. package/dist/src/types/__tests__/media.test.js.map +1 -1
  394. package/dist/src/types/__tests__/messages.test.js +26 -0
  395. package/dist/src/types/__tests__/messages.test.js.map +1 -1
  396. package/dist/src/types/agent.d.ts +82 -7
  397. package/dist/src/types/agent.d.ts.map +1 -1
  398. package/dist/src/types/agent.js +9 -0
  399. package/dist/src/types/agent.js.map +1 -1
  400. package/dist/src/types/citations.d.ts +180 -0
  401. package/dist/src/types/citations.d.ts.map +1 -0
  402. package/dist/src/types/citations.js +45 -0
  403. package/dist/src/types/citations.js.map +1 -0
  404. package/dist/src/types/media.d.ts +27 -30
  405. package/dist/src/types/media.d.ts.map +1 -1
  406. package/dist/src/types/media.js +15 -56
  407. package/dist/src/types/media.js.map +1 -1
  408. package/dist/src/types/messages.d.ts +23 -5
  409. package/dist/src/types/messages.d.ts.map +1 -1
  410. package/dist/src/types/messages.js +26 -26
  411. package/dist/src/types/messages.js.map +1 -1
  412. package/dist/src/types/serializable.d.ts +34 -4
  413. package/dist/src/types/serializable.d.ts.map +1 -1
  414. package/dist/src/types/serializable.js +31 -2
  415. package/dist/src/types/serializable.js.map +1 -1
  416. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +5 -4
  417. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  418. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  419. package/dist/src/vended-tools/bash/bash.js +1 -2
  420. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  421. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +1 -0
  422. package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.js +11 -4
  423. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +1 -0
  424. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts +1 -1
  425. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.d.ts.map +1 -1
  426. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js +3 -3
  427. package/dist/src/vended-tools/{file_editor → file-editor}/file-editor.js.map +1 -1
  428. package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts.map +1 -1
  429. package/dist/src/vended-tools/file-editor/index.js.map +1 -0
  430. package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts.map +1 -1
  431. package/dist/src/vended-tools/file-editor/types.js.map +1 -0
  432. package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +1 -0
  433. package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js.map +1 -1
  434. package/dist/src/vended-tools/http-request/http-request.d.ts.map +1 -0
  435. package/dist/src/vended-tools/{http_request → http-request}/http-request.js +1 -2
  436. package/dist/src/vended-tools/http-request/http-request.js.map +1 -0
  437. package/dist/src/vended-tools/{http_request → http-request}/index.d.ts.map +1 -1
  438. package/dist/src/vended-tools/http-request/index.js.map +1 -0
  439. package/dist/src/vended-tools/{http_request → http-request}/types.d.ts.map +1 -1
  440. package/dist/src/vended-tools/http-request/types.js.map +1 -0
  441. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +5 -4
  442. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +1 -1
  443. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  444. package/dist/src/vended-tools/notebook/notebook.js +2 -2
  445. package/dist/src/vended-tools/notebook/notebook.js.map +1 -1
  446. package/package.json +66 -12
  447. package/dist/src/__fixtures__/mock-hook-provider.d.ts +0 -10
  448. package/dist/src/__fixtures__/mock-hook-provider.d.ts.map +0 -1
  449. package/dist/src/__fixtures__/mock-hook-provider.js.map +0 -1
  450. package/dist/src/__tests__/app-state.test.d.ts +0 -2
  451. package/dist/src/__tests__/app-state.test.d.ts.map +0 -1
  452. package/dist/src/__tests__/app-state.test.js.map +0 -1
  453. package/dist/src/app-state.d.ts.map +0 -1
  454. package/dist/src/app-state.js.map +0 -1
  455. package/dist/src/multiagent/base.d.ts +0 -25
  456. package/dist/src/multiagent/base.d.ts.map +0 -1
  457. package/dist/src/multiagent/base.js +0 -2
  458. package/dist/src/multiagent/base.js.map +0 -1
  459. package/dist/src/registry/registry.d.ts +0 -117
  460. package/dist/src/registry/registry.d.ts.map +0 -1
  461. package/dist/src/registry/registry.js +0 -298
  462. package/dist/src/registry/registry.js.map +0 -1
  463. package/dist/src/session/__tests__/s3-storage.test.node.d.ts +0 -2
  464. package/dist/src/session/__tests__/s3-storage.test.node.d.ts.map +0 -1
  465. package/dist/src/session/__tests__/s3-storage.test.node.js.map +0 -1
  466. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.d.ts.map +0 -1
  467. package/dist/src/vended-tools/file_editor/__tests__/file-editor.test.node.js.map +0 -1
  468. package/dist/src/vended-tools/file_editor/index.js.map +0 -1
  469. package/dist/src/vended-tools/file_editor/types.js.map +0 -1
  470. package/dist/src/vended-tools/http_request/__tests__/http-request.test.d.ts.map +0 -1
  471. package/dist/src/vended-tools/http_request/http-request.d.ts.map +0 -1
  472. package/dist/src/vended-tools/http_request/http-request.js.map +0 -1
  473. package/dist/src/vended-tools/http_request/index.js.map +0 -1
  474. package/dist/src/vended-tools/http_request/types.js.map +0 -1
  475. /package/dist/src/vended-tools/{file_editor → file-editor}/__tests__/file-editor.test.node.d.ts +0 -0
  476. /package/dist/src/vended-tools/{file_editor → file-editor}/index.d.ts +0 -0
  477. /package/dist/src/vended-tools/{file_editor → file-editor}/index.js +0 -0
  478. /package/dist/src/vended-tools/{file_editor → file-editor}/types.d.ts +0 -0
  479. /package/dist/src/vended-tools/{file_editor → file-editor}/types.js +0 -0
  480. /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.d.ts +0 -0
  481. /package/dist/src/vended-tools/{http_request → http-request}/__tests__/http-request.test.js +0 -0
  482. /package/dist/src/vended-tools/{http_request → http-request}/http-request.d.ts +0 -0
  483. /package/dist/src/vended-tools/{http_request → http-request}/index.d.ts +0 -0
  484. /package/dist/src/vended-tools/{http_request → http-request}/index.js +0 -0
  485. /package/dist/src/vended-tools/{http_request → http-request}/types.d.ts +0 -0
  486. /package/dist/src/vended-tools/{http_request → http-request}/types.js +0 -0
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html
8
8
  */
9
- import { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, DocumentFormat, ImageFormat, } from '@aws-sdk/client-bedrock-runtime';
9
+ import { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, DocumentFormat, ImageFormat, VideoFormat, } from '@aws-sdk/client-bedrock-runtime';
10
10
  import { Model } from '../models/model.js';
11
11
  import { ContextWindowOverflowError, ModelThrottledError, normalizeError } from '../errors.js';
12
12
  import { ensureDefined } from '../types/validation.js';
@@ -24,6 +24,12 @@ const DEFAULT_BEDROCK_REGION_SUPPORTS_FIP = false;
24
24
  * @see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ToolResultBlock.html
25
25
  */
26
26
  const MODELS_INCLUDE_STATUS = ['anthropic.claude'];
27
+ /**
28
+ * Models that support the Anthropic-style prompt caching strategy.
29
+ * Used to auto-detect when `cacheConfig.strategy` is `'auto'`.
30
+ * @see https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html
31
+ */
32
+ const MODELS_SUPPORTING_ANTHROPIC_CACHING = ['anthropic', 'claude'];
27
33
  /**
28
34
  * Error messages that indicate context window overflow.
29
35
  * Used to detect when input exceeds the model's context window.
@@ -44,6 +50,14 @@ const STOP_REASON_MAP = {
44
50
  content_filtered: 'contentFiltered',
45
51
  guardrail_intervened: 'guardrailIntervened',
46
52
  };
53
+ /**
54
+ * Default message for redacted input.
55
+ */
56
+ const DEFAULT_REDACT_INPUT_MESSAGE = '[User input redacted.]';
57
+ /**
58
+ * Default message for redacted output.
59
+ */
60
+ const DEFAULT_REDACT_OUTPUT_MESSAGE = '[Assistant output redacted.]';
47
61
  /**
48
62
  * Converts a snake_case string to camelCase.
49
63
  * Used for mapping unknown stop reasons from Bedrock to SDK format.
@@ -105,7 +119,7 @@ export class BedrockModel extends Model {
105
119
  * modelId: 'global.anthropic.claude-sonnet-4-5-20250929-v1:0',
106
120
  * maxTokens: 2048,
107
121
  * temperature: 0.8,
108
- * cachePrompt: 'ephemeral'
122
+ * cacheConfig: { strategy: 'auto' }
109
123
  * })
110
124
  *
111
125
  * // With client configuration
@@ -141,6 +155,41 @@ export class BedrockModel extends Model {
141
155
  }
142
156
  applyDefaultRegion(this._client.config);
143
157
  }
158
+ /**
159
+ * Returns the cache strategy for this model based on its model ID.
160
+ * Returns the appropriate cache strategy name, or null if automatic caching is not supported.
161
+ *
162
+ * @returns Cache strategy name or null
163
+ */
164
+ _getCacheStrategy() {
165
+ return MODELS_SUPPORTING_ANTHROPIC_CACHING.some((pattern) => this._config.modelId?.includes(pattern))
166
+ ? 'anthropic'
167
+ : null;
168
+ }
169
+ /**
170
+ * Determines if caching should be enabled.
171
+ * Returns true when:
172
+ * - strategy is 'anthropic' (explicit enable)
173
+ * - strategy is 'auto' and model supports caching (auto-detect)
174
+ *
175
+ * @returns True if caching should be enabled
176
+ */
177
+ _shouldEnableCaching() {
178
+ const cacheConfig = this._config.cacheConfig;
179
+ if (!cacheConfig) {
180
+ return false;
181
+ }
182
+ let strategy = cacheConfig.strategy;
183
+ if (strategy === 'auto') {
184
+ const detectedStrategy = this._getCacheStrategy();
185
+ if (!detectedStrategy) {
186
+ logger.warn(`model_id=<${this._config.modelId}> | cache_config is enabled but this model does not support automatic caching`);
187
+ return false;
188
+ }
189
+ strategy = detectedStrategy;
190
+ }
191
+ return strategy === 'anthropic';
192
+ }
144
193
  /**
145
194
  * Updates the model configuration.
146
195
  * Merges the provided configuration with existing settings.
@@ -212,10 +261,12 @@ export class BedrockModel extends Model {
212
261
  const response = await this._client.send(command);
213
262
  // Stream the response
214
263
  if (response.stream) {
264
+ let lastStopReason;
215
265
  for await (const chunk of response.stream) {
216
266
  // Map Bedrock events to SDK events
217
- const events = this._mapStreamedBedrockEventToSDKEvent(chunk);
218
- for (const event of events) {
267
+ const result = this._mapStreamedBedrockEventToSDKEvent(chunk, lastStopReason);
268
+ lastStopReason = result.stopReason;
269
+ for (const event of result.events) {
219
270
  yield event;
220
271
  }
221
272
  }
@@ -251,21 +302,12 @@ export class BedrockModel extends Model {
251
302
  modelId: this._config.modelId,
252
303
  messages: this._formatMessages(messages),
253
304
  };
254
- // Add system prompt with optional caching
305
+ // Add system prompt
255
306
  if (options?.systemPrompt !== undefined) {
256
307
  if (typeof options.systemPrompt === 'string') {
257
- // String path: apply cachePrompt config if set
258
- const system = [{ text: options.systemPrompt }];
259
- if (this._config.cachePrompt) {
260
- system.push({ cachePoint: { type: this._config.cachePrompt } });
261
- }
262
- request.system = system;
308
+ request.system = [{ text: options.systemPrompt }];
263
309
  }
264
310
  else if (options.systemPrompt.length > 0) {
265
- // Array path: use as-is, but warn if cachePrompt config is also set
266
- if (this._config.cachePrompt) {
267
- logger.warn('cachePrompt config is ignored when systemPrompt is an array, use explicit cache points instead');
268
- }
269
311
  request.system = options.systemPrompt.map((block) => this._formatContentBlock(block));
270
312
  }
271
313
  }
@@ -278,10 +320,8 @@ export class BedrockModel extends Model {
278
320
  inputSchema: { json: spec.inputSchema },
279
321
  },
280
322
  }));
281
- if (this._config.cacheTools) {
282
- tools.push({
283
- cachePoint: { type: this._config.cacheTools },
284
- });
323
+ if (this._shouldEnableCaching()) {
324
+ tools.push({ cachePoint: { type: 'default' } });
285
325
  }
286
326
  const toolConfig = {
287
327
  tools: tools,
@@ -316,6 +356,17 @@ export class BedrockModel extends Model {
316
356
  if (this._config.additionalArgs) {
317
357
  Object.assign(request, this._config.additionalArgs);
318
358
  }
359
+ // Add guardrail configuration
360
+ if (this._config.guardrailConfig) {
361
+ request.guardrailConfig = {
362
+ guardrailIdentifier: this._config.guardrailConfig.guardrailIdentifier,
363
+ guardrailVersion: this._config.guardrailConfig.guardrailVersion,
364
+ trace: this._config.guardrailConfig.trace ?? 'enabled',
365
+ ...(this._config.guardrailConfig.streamProcessingMode && {
366
+ streamProcessingMode: this._config.guardrailConfig.streamProcessingMode,
367
+ }),
368
+ };
369
+ }
319
370
  return request;
320
371
  }
321
372
  /**
@@ -325,15 +376,140 @@ export class BedrockModel extends Model {
325
376
  * @returns Bedrock-formatted messages
326
377
  */
327
378
  _formatMessages(messages) {
328
- return messages.reduce((acc, message) => {
379
+ // Pre-compute the index of the last user message containing text/image content
380
+ // This ensures guardContent wrapping is maintained across tool execution cycles
381
+ const lastUserTextIdx = this._config.guardrailConfig?.guardLatestUserMessage
382
+ ? this._findLastUserTextMessageIndex(messages)
383
+ : undefined;
384
+ const formattedMessages = messages.reduce((acc, message, idx) => {
385
+ const shouldApplyGuardBlocks = idx === lastUserTextIdx;
329
386
  const content = message.content
330
- .map((block) => this._formatContentBlock(block))
387
+ .map((block) => {
388
+ const formattedBlock = this._formatContentBlock(block);
389
+ return shouldApplyGuardBlocks ? this._applyGuardBlocks(formattedBlock) : formattedBlock;
390
+ })
331
391
  .filter((block) => block !== undefined);
332
392
  if (content.length > 0) {
333
393
  acc.push({ role: message.role, content });
334
394
  }
335
395
  return acc;
336
396
  }, []);
397
+ // Inject cache point if caching is enabled
398
+ if (this._shouldEnableCaching()) {
399
+ this._injectCachePoint(formattedMessages);
400
+ }
401
+ return formattedMessages;
402
+ }
403
+ /**
404
+ * Inject a cache point at the end of the last user message.
405
+ * Strips any existing cache points from all messages first.
406
+ *
407
+ * @param messages - List of messages to inject cache point into (modified in place)
408
+ */
409
+ _injectCachePoint(messages) {
410
+ if (messages.length === 0) {
411
+ return;
412
+ }
413
+ let lastUserIdx = null;
414
+ // Strip existing cache points and find last user message
415
+ for (let msgIdx = 0; msgIdx < messages.length; msgIdx++) {
416
+ const msg = messages[msgIdx];
417
+ if (!msg)
418
+ continue;
419
+ const content = msg.content ?? [];
420
+ for (let blockIdx = content.length - 1; blockIdx >= 0; blockIdx--) {
421
+ const block = content[blockIdx];
422
+ if (block && 'cachePoint' in block) {
423
+ content.splice(blockIdx, 1);
424
+ logger.warn(`msg_idx=<${msgIdx}>, block_idx=<${blockIdx}> | stripped existing cache point (auto mode manages cache points)`);
425
+ }
426
+ }
427
+ if (msg.role === 'user') {
428
+ lastUserIdx = msgIdx;
429
+ }
430
+ }
431
+ // Add cache point to last user message
432
+ if (lastUserIdx !== null) {
433
+ const lastMsg = messages[lastUserIdx];
434
+ if (lastMsg && lastMsg.content) {
435
+ lastMsg.content.push({ cachePoint: { type: 'default' } });
436
+ logger.debug(`msg_idx=<${lastUserIdx}> | added cache point to last user message`);
437
+ }
438
+ }
439
+ }
440
+ /**
441
+ * Wraps a formatted content block in guardContent for guardrail evaluation.
442
+ *
443
+ * When guardLatestUserMessage is enabled, this method wraps text and image blocks
444
+ * in guardContent blocks to signal to Bedrock's guardrails to evaluate only that content.
445
+ * Other content types (toolUse, toolResult, etc.) pass through unchanged.
446
+ *
447
+ * @param formattedBlock - The formatted content block to potentially wrap
448
+ * @returns The block wrapped in guardContent if applicable, or the original block
449
+ */
450
+ _applyGuardBlocks(formattedBlock) {
451
+ if (formattedBlock === undefined) {
452
+ return undefined;
453
+ }
454
+ if ('text' in formattedBlock) {
455
+ return {
456
+ guardContent: {
457
+ text: {
458
+ text: formattedBlock.text,
459
+ },
460
+ },
461
+ };
462
+ }
463
+ if ('image' in formattedBlock) {
464
+ // Extract image data and validate for guardContent compatibility
465
+ const imageBlock = formattedBlock.image;
466
+ if (!imageBlock?.format || !imageBlock?.source) {
467
+ return formattedBlock;
468
+ }
469
+ const format = imageBlock.format;
470
+ // Bedrock guardrails only support png/jpeg formats
471
+ if (format !== 'png' && format !== 'jpeg') {
472
+ console.warn(`Image format '${format}' not supported by Bedrock guardrails, skipping guardContent wrap`);
473
+ return formattedBlock;
474
+ }
475
+ // Bedrock guardrails only support bytes source (not S3 or URL)
476
+ if (!('bytes' in imageBlock.source)) {
477
+ console.warn('Image source must be bytes for Bedrock guardrails, skipping guardContent wrap');
478
+ return formattedBlock;
479
+ }
480
+ return {
481
+ guardContent: {
482
+ image: {
483
+ format: format,
484
+ source: imageBlock.source,
485
+ },
486
+ },
487
+ };
488
+ }
489
+ // Other content types (toolUse, toolResult, etc.) pass through unchanged
490
+ return formattedBlock;
491
+ }
492
+ /**
493
+ * Find the index of the last user message containing text or image content.
494
+ *
495
+ * This is used for guardLatestUserMessage guardrail evaluation to ensure that guardContent
496
+ * wrapping targets the correct message even when toolResult messages (role='user') follow
497
+ * the actual user text/image input during tool execution cycles.
498
+ *
499
+ * @param messages - Array of messages to search
500
+ * @returns Index of the last user message with text/image content, or undefined if not found
501
+ */
502
+ _findLastUserTextMessageIndex(messages) {
503
+ for (let idx = messages.length - 1; idx >= 0; idx--) {
504
+ const msg = messages[idx];
505
+ if (msg === undefined)
506
+ continue;
507
+ if (msg.role === 'user' &&
508
+ msg.content.some((block) => block.type === 'textBlock' || block.type === 'imageBlock')) {
509
+ return idx;
510
+ }
511
+ }
512
+ return undefined;
337
513
  }
338
514
  /**
339
515
  * Determines whether to include the status field in tool results.
@@ -382,6 +558,30 @@ export class BedrockModel extends Model {
382
558
  return { text: content.text };
383
559
  case 'jsonBlock':
384
560
  return { json: content.json };
561
+ case 'imageBlock':
562
+ return {
563
+ image: {
564
+ format: content.format,
565
+ source: this._formatMediaSource(content.source),
566
+ },
567
+ };
568
+ case 'videoBlock':
569
+ return {
570
+ video: {
571
+ format: content.format === '3gp' ? 'three_gp' : content.format,
572
+ source: this._formatMediaSource(content.source),
573
+ },
574
+ };
575
+ case 'documentBlock':
576
+ return {
577
+ document: {
578
+ name: content.name,
579
+ format: content.format,
580
+ source: this._formatDocumentSource(content.source),
581
+ ...(content.citations && { citations: content.citations }),
582
+ ...(content.context && { context: content.context }),
583
+ },
584
+ };
385
585
  }
386
586
  });
387
587
  return {
@@ -440,6 +640,13 @@ export class BedrockModel extends Model {
440
640
  ...(block.context && { context: block.context }),
441
641
  },
442
642
  };
643
+ case 'citationsBlock':
644
+ return {
645
+ citationsContent: {
646
+ citations: block.citations.map((c) => this._mapCitationToBedrock(c)),
647
+ content: block.content,
648
+ },
649
+ };
443
650
  case 'guardContentBlock': {
444
651
  if (block.text) {
445
652
  return {
@@ -494,8 +701,8 @@ export class BedrockModel extends Model {
494
701
  case 'videoSourceS3Location':
495
702
  return {
496
703
  s3Location: {
497
- uri: source.s3Location.uri,
498
- ...(source.s3Location.bucketOwner && { bucketOwner: source.s3Location.bucketOwner }),
704
+ uri: source.location.uri,
705
+ ...(source.location.bucketOwner && { bucketOwner: source.location.bucketOwner }),
499
706
  },
500
707
  };
501
708
  default:
@@ -530,8 +737,8 @@ export class BedrockModel extends Model {
530
737
  case 'documentSourceS3Location':
531
738
  return {
532
739
  s3Location: {
533
- uri: source.s3Location.uri,
534
- ...(source.s3Location.bucketOwner && { bucketOwner: source.s3Location.bucketOwner }),
740
+ uri: source.location.uri,
741
+ ...(source.location.bucketOwner && { bucketOwner: source.location.bucketOwner }),
535
742
  },
536
743
  };
537
744
  default:
@@ -591,6 +798,19 @@ export class BedrockModel extends Model {
591
798
  }
592
799
  events.push({ type: 'modelContentBlockStopEvent' });
593
800
  },
801
+ citationsContent: (block) => {
802
+ if (!block)
803
+ return;
804
+ events.push({ type: 'modelContentBlockStartEvent' });
805
+ const mapped = this._mapBedrockCitationsData(block);
806
+ const delta = {
807
+ type: 'citationsDelta',
808
+ citations: mapped.citations,
809
+ content: mapped.content,
810
+ };
811
+ events.push({ type: 'modelContentBlockDeltaEvent', delta });
812
+ events.push({ type: 'modelContentBlockStopEvent' });
813
+ },
594
814
  };
595
815
  const content = ensureDefined(message.content, 'message.content');
596
816
  content.forEach((block) => {
@@ -624,6 +844,16 @@ export class BedrockModel extends Model {
624
844
  latencyMs: ensureDefined(event.metrics.latencyMs, 'metrics.latencyMs'),
625
845
  };
626
846
  }
847
+ // Handle trace and guardrail check for non-streaming responses
848
+ if (event.trace) {
849
+ metadataEvent.trace = event.trace;
850
+ // Check for blocked guardrails and emit redaction events
851
+ if (this._config.guardrailConfig && event.trace.guardrail && stopReasonRaw === 'guardrail_intervened') {
852
+ for (const redactionEvent of this._generateRedactionEvents(event.trace.guardrail)) {
853
+ events.push(redactionEvent);
854
+ }
855
+ }
856
+ }
627
857
  events.push(metadataEvent);
628
858
  return events;
629
859
  }
@@ -631,10 +861,12 @@ export class BedrockModel extends Model {
631
861
  * Maps a Bedrock event to SDK streaming events.
632
862
  *
633
863
  * @param chunk - Bedrock event chunk
634
- * @returns Array of SDK streaming events
864
+ * @param lastStopReason - Stop reason from previous messageStop event
865
+ * @returns Object containing events array and optional stopReason
635
866
  */
636
- _mapStreamedBedrockEventToSDKEvent(chunk) {
867
+ _mapStreamedBedrockEventToSDKEvent(chunk, lastStopReason) {
637
868
  const events = [];
869
+ let stopReason = lastStopReason;
638
870
  // Extract the event type key
639
871
  const eventType = ensureDefined(Object.keys(chunk)[0], 'eventType');
640
872
  const eventData = chunk[eventType];
@@ -695,6 +927,17 @@ export class BedrockModel extends Model {
695
927
  events.push({ type: 'modelContentBlockDeltaEvent', delta: reasoningDelta });
696
928
  }
697
929
  },
930
+ citationsContent: (block) => {
931
+ if (!block)
932
+ return;
933
+ const mapped = this._mapBedrockCitationsData(block);
934
+ const delta = {
935
+ type: 'citationsDelta',
936
+ citations: mapped.citations,
937
+ content: mapped.content,
938
+ };
939
+ events.push({ type: 'modelContentBlockDeltaEvent', delta });
940
+ },
698
941
  };
699
942
  for (const key in delta) {
700
943
  if (key in deltaHandlers) {
@@ -717,6 +960,7 @@ export class BedrockModel extends Model {
717
960
  case 'messageStop': {
718
961
  const data = eventData;
719
962
  const stopReasonRaw = ensureDefined(data.stopReason, 'messageStop.stopReason');
963
+ stopReason = stopReasonRaw;
720
964
  const event = {
721
965
  type: 'modelMessageStopEvent',
722
966
  stopReason: this._transformStopReason(stopReasonRaw, data),
@@ -754,6 +998,12 @@ export class BedrockModel extends Model {
754
998
  }
755
999
  if (data.trace) {
756
1000
  event.trace = data.trace;
1001
+ // Check for blocked guardrails in trace and emit redaction events
1002
+ if (this._config.guardrailConfig && data.trace.guardrail && lastStopReason === 'guardrail_intervened') {
1003
+ for (const redactionEvent of this._generateRedactionEvents(data.trace.guardrail)) {
1004
+ events.push(redactionEvent);
1005
+ }
1006
+ }
757
1007
  }
758
1008
  events.push(event);
759
1009
  break;
@@ -774,7 +1024,7 @@ export class BedrockModel extends Model {
774
1024
  logger.warn(`event_type=<${eventType}> | unsupported bedrock event type`);
775
1025
  break;
776
1026
  }
777
- return events;
1027
+ return stopReason !== undefined ? { events, stopReason } : { events };
778
1028
  }
779
1029
  /**
780
1030
  * Transforms a Bedrock stop reason into the SDK's format.
@@ -803,6 +1053,144 @@ export class BedrockModel extends Model {
803
1053
  }
804
1054
  return mappedStopReason;
805
1055
  }
1056
+ /**
1057
+ * Maps a Bedrock object-key citation location to the SDK's type-field format.
1058
+ *
1059
+ * Bedrock uses object-key discrimination (`{ documentChar: { ... } }`) while the SDK uses
1060
+ * type-field discrimination (`{ type: 'documentChar', ... }`). Also normalizes Bedrock's
1061
+ * `searchResultLocation` key to the shorter `searchResult`.
1062
+ *
1063
+ * @param bedrockLocation - Bedrock citation location with object-key discrimination
1064
+ * @returns SDK CitationLocation with type field discrimination
1065
+ */
1066
+ _mapBedrockCitationLocation(bedrockLocation) {
1067
+ if (bedrockLocation.documentChar) {
1068
+ const loc = bedrockLocation.documentChar;
1069
+ return { type: 'documentChar', documentIndex: loc.documentIndex, start: loc.start, end: loc.end };
1070
+ }
1071
+ if (bedrockLocation.documentPage) {
1072
+ const loc = bedrockLocation.documentPage;
1073
+ return { type: 'documentPage', documentIndex: loc.documentIndex, start: loc.start, end: loc.end };
1074
+ }
1075
+ if (bedrockLocation.documentChunk) {
1076
+ const loc = bedrockLocation.documentChunk;
1077
+ return { type: 'documentChunk', documentIndex: loc.documentIndex, start: loc.start, end: loc.end };
1078
+ }
1079
+ if (bedrockLocation.searchResultLocation) {
1080
+ const loc = bedrockLocation.searchResultLocation;
1081
+ return { type: 'searchResult', searchResultIndex: loc.searchResultIndex, start: loc.start, end: loc.end };
1082
+ }
1083
+ if (bedrockLocation.web) {
1084
+ const loc = bedrockLocation.web;
1085
+ return { type: 'web', url: loc.url, ...(loc.domain && { domain: loc.domain }) };
1086
+ }
1087
+ logger.warn(`citation_location=<${JSON.stringify(bedrockLocation)}> | unknown citation location type`);
1088
+ return undefined;
1089
+ }
1090
+ /**
1091
+ * Maps a Bedrock CitationsContentBlock to SDK CitationsBlockData.
1092
+ *
1093
+ * @param bedrockData - Bedrock CitationsContentBlock
1094
+ * @returns SDK CitationsBlockData with type-field CitationLocations
1095
+ */
1096
+ _mapBedrockCitationsData(bedrockData) {
1097
+ return {
1098
+ citations: (bedrockData.citations ?? [])
1099
+ .map((citation) => {
1100
+ const location = citation.location ? this._mapBedrockCitationLocation(citation.location) : undefined;
1101
+ if (!location)
1102
+ return undefined;
1103
+ return {
1104
+ source: citation.source ?? '',
1105
+ title: citation.title ?? '',
1106
+ sourceContent: (citation.sourceContent ?? []).map((sc) => ({ text: sc.text })),
1107
+ location,
1108
+ };
1109
+ })
1110
+ .filter((c) => c !== undefined),
1111
+ content: (bedrockData.content ?? []).map((gc) => ({ text: gc.text })),
1112
+ };
1113
+ }
1114
+ /**
1115
+ * Maps an SDK Citation to Bedrock's Citation format.
1116
+ *
1117
+ * @param citation - SDK Citation with type-field location
1118
+ * @returns Bedrock Citation with object-key location
1119
+ */
1120
+ _mapCitationToBedrock(citation) {
1121
+ return {
1122
+ location: this._mapCitationLocationToBedrock(citation.location),
1123
+ sourceContent: citation.sourceContent.map((sc) => ({ text: sc.text })),
1124
+ source: citation.source,
1125
+ title: citation.title,
1126
+ };
1127
+ }
1128
+ /**
1129
+ * Maps an SDK CitationLocation to Bedrock's object-key format.
1130
+ *
1131
+ * @param location - SDK CitationLocation with type field
1132
+ * @returns Bedrock CitationLocation with object-key discrimination
1133
+ */
1134
+ _mapCitationLocationToBedrock(location) {
1135
+ switch (location.type) {
1136
+ case 'documentChar': {
1137
+ const { type: _, ...fields } = location;
1138
+ return { documentChar: fields };
1139
+ }
1140
+ case 'documentPage': {
1141
+ const { type: _, ...fields } = location;
1142
+ return { documentPage: fields };
1143
+ }
1144
+ case 'documentChunk': {
1145
+ const { type: _, ...fields } = location;
1146
+ return { documentChunk: fields };
1147
+ }
1148
+ case 'searchResult': {
1149
+ const { type: _, ...fields } = location;
1150
+ return { searchResultLocation: fields };
1151
+ }
1152
+ case 'web':
1153
+ return { web: { url: location.url, ...(location.domain && { domain: location.domain }) } };
1154
+ default:
1155
+ return location;
1156
+ }
1157
+ }
1158
+ /**
1159
+ * Generate redaction events based on guardrail configuration.
1160
+ *
1161
+ * @param guardrailData - The guardrail trace assessment data
1162
+ * @returns Array of redaction events to emit
1163
+ */
1164
+ _generateRedactionEvents(guardrailData) {
1165
+ const events = [];
1166
+ const redaction = this._config.guardrailConfig?.redaction;
1167
+ // Default: redact input is true unless explicitly set to false
1168
+ if (redaction?.input !== false) {
1169
+ logger.debug('redacting input due to guardrail');
1170
+ events.push({
1171
+ type: 'modelRedactionEvent',
1172
+ inputRedaction: {
1173
+ replaceContent: redaction?.inputMessage ?? DEFAULT_REDACT_INPUT_MESSAGE,
1174
+ },
1175
+ });
1176
+ }
1177
+ // Only redact output if explicitly enabled
1178
+ if (redaction?.output) {
1179
+ logger.debug('redacting output due to guardrail');
1180
+ const outputRedactionEvent = {
1181
+ type: 'modelRedactionEvent',
1182
+ outputRedaction: {
1183
+ replaceContent: redaction?.outputMessage ?? DEFAULT_REDACT_OUTPUT_MESSAGE,
1184
+ },
1185
+ };
1186
+ // Include the original model output if available
1187
+ if (guardrailData.modelOutput && guardrailData.modelOutput.length > 0) {
1188
+ outputRedactionEvent.outputRedaction.redactedContent = guardrailData.modelOutput.join('');
1189
+ }
1190
+ events.push(outputRedactionEvent);
1191
+ }
1192
+ return events;
1193
+ }
806
1194
  }
807
1195
  /**
808
1196
  * Adds middleware to override the Authorization header with a Bearer token.