@strands-agents/sdk 1.7.0 → 1.8.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 (659) hide show
  1. package/dist/src/agent/agent.d.ts +1 -1
  2. package/dist/src/agent/agent.d.ts.map +1 -1
  3. package/dist/src/agent/agent.js +1 -1
  4. package/dist/src/agent/agent.js.map +1 -1
  5. package/dist/src/context-manager/modes/agentic/agentic-context.d.ts +3 -3
  6. package/dist/src/context-manager/modes/agentic/agentic-context.d.ts.map +1 -1
  7. package/dist/src/index.d.ts +1 -1
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +1 -1
  10. package/dist/src/index.js.map +1 -1
  11. package/dist/src/index.node.d.ts.map +1 -1
  12. package/dist/src/index.node.js +3 -0
  13. package/dist/src/index.node.js.map +1 -1
  14. package/dist/src/interventions/actions.d.ts.map +1 -1
  15. package/dist/src/interventions/actions.js.map +1 -1
  16. package/dist/src/{mcp.d.ts → mcp/client.d.ts} +13 -4
  17. package/dist/src/mcp/client.d.ts.map +1 -0
  18. package/dist/src/{mcp.js → mcp/client.js} +15 -3
  19. package/dist/src/mcp/client.js.map +1 -0
  20. package/dist/src/mcp/config.d.ts +52 -0
  21. package/dist/src/mcp/config.d.ts.map +1 -0
  22. package/dist/src/mcp/config.js +12 -0
  23. package/dist/src/mcp/config.js.map +1 -0
  24. package/dist/src/mcp/config.node.d.ts +16 -0
  25. package/dist/src/mcp/config.node.d.ts.map +1 -0
  26. package/dist/src/mcp/config.node.js +145 -0
  27. package/dist/src/mcp/config.node.js.map +1 -0
  28. package/dist/src/mcp/index.d.ts +3 -0
  29. package/dist/src/mcp/index.d.ts.map +1 -0
  30. package/dist/src/mcp/index.js +2 -0
  31. package/dist/src/mcp/index.js.map +1 -0
  32. package/dist/src/models/model.d.ts.map +1 -1
  33. package/dist/src/models/model.js +2 -1
  34. package/dist/src/models/model.js.map +1 -1
  35. package/dist/src/multiagent/graph.d.ts +7 -0
  36. package/dist/src/multiagent/graph.d.ts.map +1 -1
  37. package/dist/src/multiagent/graph.js +22 -1
  38. package/dist/src/multiagent/graph.js.map +1 -1
  39. package/dist/src/multiagent/nodes.d.ts +5 -0
  40. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  41. package/dist/src/multiagent/nodes.js +15 -0
  42. package/dist/src/multiagent/nodes.js.map +1 -1
  43. package/dist/src/multiagent/state.d.ts.map +1 -1
  44. package/dist/src/multiagent/state.js.map +1 -1
  45. package/dist/src/tools/function-tool.d.ts +1 -1
  46. package/dist/src/tools/function-tool.d.ts.map +1 -1
  47. package/dist/src/tools/function-tool.js +4 -12
  48. package/dist/src/tools/function-tool.js.map +1 -1
  49. package/dist/src/tools/mcp-tool.d.ts +2 -1
  50. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  51. package/dist/src/tools/mcp-tool.js +1 -0
  52. package/dist/src/tools/mcp-tool.js.map +1 -1
  53. package/dist/src/tools/tool-factory.d.ts +1 -1
  54. package/dist/src/tools/tool-factory.d.ts.map +1 -1
  55. package/dist/src/tools/types.d.ts +4 -0
  56. package/dist/src/tools/types.d.ts.map +1 -1
  57. package/dist/src/tools/zod-tool.d.ts +4 -2
  58. package/dist/src/tools/zod-tool.d.ts.map +1 -1
  59. package/dist/src/tools/zod-tool.js.map +1 -1
  60. package/dist/src/tsconfig.tsbuildinfo +1 -1
  61. package/dist/src/types/media.d.ts.map +1 -1
  62. package/dist/src/types/media.js.map +1 -1
  63. package/dist/src/types/messages.d.ts.map +1 -1
  64. package/dist/src/types/messages.js.map +1 -1
  65. package/dist/src/vended-memory-stores/local/index.d.ts +2 -0
  66. package/dist/src/vended-memory-stores/local/index.d.ts.map +1 -0
  67. package/dist/src/vended-memory-stores/local/index.js +2 -0
  68. package/dist/src/vended-memory-stores/local/index.js.map +1 -0
  69. package/dist/src/vended-memory-stores/local/store.d.ts +122 -0
  70. package/dist/src/vended-memory-stores/local/store.d.ts.map +1 -0
  71. package/dist/src/vended-memory-stores/local/store.js +281 -0
  72. package/dist/src/vended-memory-stores/local/store.js.map +1 -0
  73. package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -1
  74. package/dist/src/vended-plugins/context-offloader/search.js +4 -2
  75. package/dist/src/vended-plugins/context-offloader/search.js.map +1 -1
  76. package/dist/src/vended-plugins/context-offloader/storage.js +1 -1
  77. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
  78. package/dist/src/vended-plugins/skills/skill.d.ts.map +1 -1
  79. package/dist/src/vended-plugins/skills/skill.js.map +1 -1
  80. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  81. package/package.json +21 -14
  82. package/dist/src/__fixtures__/agent-helpers.d.ts +0 -136
  83. package/dist/src/__fixtures__/agent-helpers.d.ts.map +0 -1
  84. package/dist/src/__fixtures__/agent-helpers.js +0 -156
  85. package/dist/src/__fixtures__/agent-helpers.js.map +0 -1
  86. package/dist/src/__fixtures__/environment.d.ts +0 -12
  87. package/dist/src/__fixtures__/environment.d.ts.map +0 -1
  88. package/dist/src/__fixtures__/environment.js +0 -12
  89. package/dist/src/__fixtures__/environment.js.map +0 -1
  90. package/dist/src/__fixtures__/metrics-helpers.d.ts +0 -55
  91. package/dist/src/__fixtures__/metrics-helpers.d.ts.map +0 -1
  92. package/dist/src/__fixtures__/metrics-helpers.js +0 -57
  93. package/dist/src/__fixtures__/metrics-helpers.js.map +0 -1
  94. package/dist/src/__fixtures__/mock-message-model.d.ts +0 -103
  95. package/dist/src/__fixtures__/mock-message-model.d.ts.map +0 -1
  96. package/dist/src/__fixtures__/mock-message-model.js +0 -245
  97. package/dist/src/__fixtures__/mock-message-model.js.map +0 -1
  98. package/dist/src/__fixtures__/mock-meter.d.ts +0 -32
  99. package/dist/src/__fixtures__/mock-meter.d.ts.map +0 -1
  100. package/dist/src/__fixtures__/mock-meter.js +0 -47
  101. package/dist/src/__fixtures__/mock-meter.js.map +0 -1
  102. package/dist/src/__fixtures__/mock-plugin.d.ts +0 -13
  103. package/dist/src/__fixtures__/mock-plugin.d.ts.map +0 -1
  104. package/dist/src/__fixtures__/mock-plugin.js +0 -35
  105. package/dist/src/__fixtures__/mock-plugin.js.map +0 -1
  106. package/dist/src/__fixtures__/mock-span.d.ts +0 -78
  107. package/dist/src/__fixtures__/mock-span.d.ts.map +0 -1
  108. package/dist/src/__fixtures__/mock-span.js +0 -93
  109. package/dist/src/__fixtures__/mock-span.js.map +0 -1
  110. package/dist/src/__fixtures__/mock-storage-provider.d.ts +0 -42
  111. package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +0 -1
  112. package/dist/src/__fixtures__/mock-storage-provider.js +0 -122
  113. package/dist/src/__fixtures__/mock-storage-provider.js.map +0 -1
  114. package/dist/src/__fixtures__/model-test-helpers.d.ts +0 -56
  115. package/dist/src/__fixtures__/model-test-helpers.d.ts.map +0 -1
  116. package/dist/src/__fixtures__/model-test-helpers.js +0 -85
  117. package/dist/src/__fixtures__/model-test-helpers.js.map +0 -1
  118. package/dist/src/__fixtures__/register-node-defaults.d.ts +0 -2
  119. package/dist/src/__fixtures__/register-node-defaults.d.ts.map +0 -1
  120. package/dist/src/__fixtures__/register-node-defaults.js +0 -6
  121. package/dist/src/__fixtures__/register-node-defaults.js.map +0 -1
  122. package/dist/src/__fixtures__/slim-types.d.ts +0 -51
  123. package/dist/src/__fixtures__/slim-types.d.ts.map +0 -1
  124. package/dist/src/__fixtures__/slim-types.js +0 -6
  125. package/dist/src/__fixtures__/slim-types.js.map +0 -1
  126. package/dist/src/__fixtures__/test-sandbox.node.d.ts +0 -15
  127. package/dist/src/__fixtures__/test-sandbox.node.d.ts.map +0 -1
  128. package/dist/src/__fixtures__/test-sandbox.node.js +0 -23
  129. package/dist/src/__fixtures__/test-sandbox.node.js.map +0 -1
  130. package/dist/src/__fixtures__/tool-helpers.d.ts +0 -45
  131. package/dist/src/__fixtures__/tool-helpers.d.ts.map +0 -1
  132. package/dist/src/__fixtures__/tool-helpers.js +0 -101
  133. package/dist/src/__fixtures__/tool-helpers.js.map +0 -1
  134. package/dist/src/__tests__/default-slot.test.d.ts +0 -2
  135. package/dist/src/__tests__/default-slot.test.d.ts.map +0 -1
  136. package/dist/src/__tests__/default-slot.test.js +0 -33
  137. package/dist/src/__tests__/default-slot.test.js.map +0 -1
  138. package/dist/src/__tests__/errors.test.d.ts +0 -2
  139. package/dist/src/__tests__/errors.test.d.ts.map +0 -1
  140. package/dist/src/__tests__/errors.test.js +0 -170
  141. package/dist/src/__tests__/errors.test.js.map +0 -1
  142. package/dist/src/__tests__/index.test.d.ts +0 -2
  143. package/dist/src/__tests__/index.test.d.ts.map +0 -1
  144. package/dist/src/__tests__/index.test.js +0 -48
  145. package/dist/src/__tests__/index.test.js.map +0 -1
  146. package/dist/src/__tests__/interrupt.test.d.ts +0 -2
  147. package/dist/src/__tests__/interrupt.test.d.ts.map +0 -1
  148. package/dist/src/__tests__/interrupt.test.js +0 -264
  149. package/dist/src/__tests__/interrupt.test.js.map +0 -1
  150. package/dist/src/__tests__/mcp.test.d.ts +0 -2
  151. package/dist/src/__tests__/mcp.test.d.ts.map +0 -1
  152. package/dist/src/__tests__/mcp.test.js +0 -1003
  153. package/dist/src/__tests__/mcp.test.js.map +0 -1
  154. package/dist/src/__tests__/mime.test.d.ts +0 -2
  155. package/dist/src/__tests__/mime.test.d.ts.map +0 -1
  156. package/dist/src/__tests__/mime.test.js +0 -83
  157. package/dist/src/__tests__/mime.test.js.map +0 -1
  158. package/dist/src/__tests__/state-store.test.d.ts +0 -2
  159. package/dist/src/__tests__/state-store.test.d.ts.map +0 -1
  160. package/dist/src/__tests__/state-store.test.js +0 -285
  161. package/dist/src/__tests__/state-store.test.js.map +0 -1
  162. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +0 -2
  163. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +0 -1
  164. package/dist/src/a2a/__tests__/a2a-agent.test.js +0 -383
  165. package/dist/src/a2a/__tests__/a2a-agent.test.js.map +0 -1
  166. package/dist/src/a2a/__tests__/adapters.test.d.ts +0 -2
  167. package/dist/src/a2a/__tests__/adapters.test.d.ts.map +0 -1
  168. package/dist/src/a2a/__tests__/adapters.test.js +0 -151
  169. package/dist/src/a2a/__tests__/adapters.test.js.map +0 -1
  170. package/dist/src/a2a/__tests__/async-lock.test.d.ts +0 -2
  171. package/dist/src/a2a/__tests__/async-lock.test.d.ts.map +0 -1
  172. package/dist/src/a2a/__tests__/async-lock.test.js +0 -137
  173. package/dist/src/a2a/__tests__/async-lock.test.js.map +0 -1
  174. package/dist/src/a2a/__tests__/events.test.d.ts +0 -2
  175. package/dist/src/a2a/__tests__/events.test.d.ts.map +0 -1
  176. package/dist/src/a2a/__tests__/events.test.js +0 -68
  177. package/dist/src/a2a/__tests__/events.test.js.map +0 -1
  178. package/dist/src/a2a/__tests__/executor.test.d.ts +0 -2
  179. package/dist/src/a2a/__tests__/executor.test.d.ts.map +0 -1
  180. package/dist/src/a2a/__tests__/executor.test.js +0 -345
  181. package/dist/src/a2a/__tests__/executor.test.js.map +0 -1
  182. package/dist/src/a2a/__tests__/server.test.d.ts +0 -2
  183. package/dist/src/a2a/__tests__/server.test.d.ts.map +0 -1
  184. package/dist/src/a2a/__tests__/server.test.js +0 -71
  185. package/dist/src/a2a/__tests__/server.test.js.map +0 -1
  186. package/dist/src/a2a/__tests__/server.test.node.d.ts +0 -2
  187. package/dist/src/a2a/__tests__/server.test.node.d.ts.map +0 -1
  188. package/dist/src/a2a/__tests__/server.test.node.js +0 -110
  189. package/dist/src/a2a/__tests__/server.test.node.js.map +0 -1
  190. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +0 -2
  191. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +0 -1
  192. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +0 -23
  193. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +0 -1
  194. package/dist/src/agent/__tests__/agent-as-tool.test.d.ts +0 -2
  195. package/dist/src/agent/__tests__/agent-as-tool.test.d.ts.map +0 -1
  196. package/dist/src/agent/__tests__/agent-as-tool.test.js +0 -347
  197. package/dist/src/agent/__tests__/agent-as-tool.test.js.map +0 -1
  198. package/dist/src/agent/__tests__/agent.cancel.test.d.ts +0 -2
  199. package/dist/src/agent/__tests__/agent.cancel.test.d.ts.map +0 -1
  200. package/dist/src/agent/__tests__/agent.cancel.test.js +0 -337
  201. package/dist/src/agent/__tests__/agent.cancel.test.js.map +0 -1
  202. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +0 -2
  203. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +0 -1
  204. package/dist/src/agent/__tests__/agent.concurrent.test.js +0 -488
  205. package/dist/src/agent/__tests__/agent.concurrent.test.js.map +0 -1
  206. package/dist/src/agent/__tests__/agent.context-manager.test.d.ts +0 -2
  207. package/dist/src/agent/__tests__/agent.context-manager.test.d.ts.map +0 -1
  208. package/dist/src/agent/__tests__/agent.context-manager.test.js +0 -106
  209. package/dist/src/agent/__tests__/agent.context-manager.test.js.map +0 -1
  210. package/dist/src/agent/__tests__/agent.hook.test.d.ts +0 -2
  211. package/dist/src/agent/__tests__/agent.hook.test.d.ts.map +0 -1
  212. package/dist/src/agent/__tests__/agent.hook.test.js +0 -1332
  213. package/dist/src/agent/__tests__/agent.hook.test.js.map +0 -1
  214. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +0 -2
  215. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +0 -1
  216. package/dist/src/agent/__tests__/agent.interrupt.test.js +0 -779
  217. package/dist/src/agent/__tests__/agent.interrupt.test.js.map +0 -1
  218. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +0 -2
  219. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +0 -1
  220. package/dist/src/agent/__tests__/agent.invocation-state.test.js +0 -219
  221. package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +0 -1
  222. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +0 -2
  223. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +0 -1
  224. package/dist/src/agent/__tests__/agent.model-retry.test.js +0 -161
  225. package/dist/src/agent/__tests__/agent.model-retry.test.js.map +0 -1
  226. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +0 -2
  227. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +0 -1
  228. package/dist/src/agent/__tests__/agent.stateful-model.test.js +0 -169
  229. package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +0 -1
  230. package/dist/src/agent/__tests__/agent.test.d.ts +0 -2
  231. package/dist/src/agent/__tests__/agent.test.d.ts.map +0 -1
  232. package/dist/src/agent/__tests__/agent.test.js +0 -1624
  233. package/dist/src/agent/__tests__/agent.test.js.map +0 -1
  234. package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts +0 -2
  235. package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts.map +0 -1
  236. package/dist/src/agent/__tests__/agent.tracer.test.node.js +0 -535
  237. package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +0 -1
  238. package/dist/src/agent/__tests__/printer.test.d.ts +0 -2
  239. package/dist/src/agent/__tests__/printer.test.d.ts.map +0 -1
  240. package/dist/src/agent/__tests__/printer.test.js +0 -188
  241. package/dist/src/agent/__tests__/printer.test.js.map +0 -1
  242. package/dist/src/agent/__tests__/snapshot.test.d.ts +0 -2
  243. package/dist/src/agent/__tests__/snapshot.test.d.ts.map +0 -1
  244. package/dist/src/agent/__tests__/snapshot.test.js +0 -442
  245. package/dist/src/agent/__tests__/snapshot.test.js.map +0 -1
  246. package/dist/src/agent/__tests__/tool-caller.test.d.ts +0 -2
  247. package/dist/src/agent/__tests__/tool-caller.test.d.ts.map +0 -1
  248. package/dist/src/agent/__tests__/tool-caller.test.js +0 -459
  249. package/dist/src/agent/__tests__/tool-caller.test.js.map +0 -1
  250. package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts +0 -2
  251. package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts.map +0 -1
  252. package/dist/src/conversation-manager/__tests__/agentic-context.test.js +0 -332
  253. package/dist/src/conversation-manager/__tests__/agentic-context.test.js.map +0 -1
  254. package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts +0 -2
  255. package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts.map +0 -1
  256. package/dist/src/conversation-manager/__tests__/context-compression.test.js +0 -176
  257. package/dist/src/conversation-manager/__tests__/context-compression.test.js.map +0 -1
  258. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +0 -2
  259. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +0 -1
  260. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +0 -321
  261. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +0 -1
  262. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts +0 -2
  263. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts.map +0 -1
  264. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +0 -64
  265. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +0 -1
  266. package/dist/src/conversation-manager/__tests__/pin.test.d.ts +0 -2
  267. package/dist/src/conversation-manager/__tests__/pin.test.d.ts.map +0 -1
  268. package/dist/src/conversation-manager/__tests__/pin.test.js +0 -119
  269. package/dist/src/conversation-manager/__tests__/pin.test.js.map +0 -1
  270. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts +0 -2
  271. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts.map +0 -1
  272. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +0 -1080
  273. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +0 -1
  274. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts +0 -2
  275. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts.map +0 -1
  276. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +0 -400
  277. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +0 -1
  278. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts +0 -2
  279. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts.map +0 -1
  280. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js +0 -138
  281. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js.map +0 -1
  282. package/dist/src/hooks/__tests__/events.test.d.ts +0 -2
  283. package/dist/src/hooks/__tests__/events.test.d.ts.map +0 -1
  284. package/dist/src/hooks/__tests__/events.test.js +0 -1060
  285. package/dist/src/hooks/__tests__/events.test.js.map +0 -1
  286. package/dist/src/hooks/__tests__/registry.test.d.ts +0 -2
  287. package/dist/src/hooks/__tests__/registry.test.d.ts.map +0 -1
  288. package/dist/src/hooks/__tests__/registry.test.js +0 -325
  289. package/dist/src/hooks/__tests__/registry.test.js.map +0 -1
  290. package/dist/src/injection/__tests__/message-injection.test.d.ts +0 -2
  291. package/dist/src/injection/__tests__/message-injection.test.d.ts.map +0 -1
  292. package/dist/src/injection/__tests__/message-injection.test.js +0 -200
  293. package/dist/src/injection/__tests__/message-injection.test.js.map +0 -1
  294. package/dist/src/interventions/__tests__/handler.test.d.ts +0 -2
  295. package/dist/src/interventions/__tests__/handler.test.d.ts.map +0 -1
  296. package/dist/src/interventions/__tests__/handler.test.js +0 -35
  297. package/dist/src/interventions/__tests__/handler.test.js.map +0 -1
  298. package/dist/src/interventions/__tests__/registry.test.d.ts +0 -2
  299. package/dist/src/interventions/__tests__/registry.test.d.ts.map +0 -1
  300. package/dist/src/interventions/__tests__/registry.test.js +0 -692
  301. package/dist/src/interventions/__tests__/registry.test.js.map +0 -1
  302. package/dist/src/logging/__tests__/logger.test.d.ts +0 -2
  303. package/dist/src/logging/__tests__/logger.test.d.ts.map +0 -1
  304. package/dist/src/logging/__tests__/logger.test.js +0 -70
  305. package/dist/src/logging/__tests__/logger.test.js.map +0 -1
  306. package/dist/src/logging/__tests__/warn-once.test.d.ts +0 -2
  307. package/dist/src/logging/__tests__/warn-once.test.d.ts.map +0 -1
  308. package/dist/src/logging/__tests__/warn-once.test.js +0 -30
  309. package/dist/src/logging/__tests__/warn-once.test.js.map +0 -1
  310. package/dist/src/mcp.d.ts.map +0 -1
  311. package/dist/src/mcp.js.map +0 -1
  312. package/dist/src/memory/__tests__/memory-manager.test.d.ts +0 -2
  313. package/dist/src/memory/__tests__/memory-manager.test.d.ts.map +0 -1
  314. package/dist/src/memory/__tests__/memory-manager.test.js +0 -679
  315. package/dist/src/memory/__tests__/memory-manager.test.js.map +0 -1
  316. package/dist/src/memory/__tests__/memory-tracing.test.d.ts +0 -2
  317. package/dist/src/memory/__tests__/memory-tracing.test.d.ts.map +0 -1
  318. package/dist/src/memory/__tests__/memory-tracing.test.js +0 -250
  319. package/dist/src/memory/__tests__/memory-tracing.test.js.map +0 -1
  320. package/dist/src/memory/extraction/__tests__/extraction.test.d.ts +0 -2
  321. package/dist/src/memory/extraction/__tests__/extraction.test.d.ts.map +0 -1
  322. package/dist/src/memory/extraction/__tests__/extraction.test.js +0 -639
  323. package/dist/src/memory/extraction/__tests__/extraction.test.js.map +0 -1
  324. package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts +0 -2
  325. package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts.map +0 -1
  326. package/dist/src/memory/extraction/__tests__/model-extractor.test.js +0 -104
  327. package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +0 -1
  328. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts +0 -2
  329. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts.map +0 -1
  330. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js +0 -81
  331. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js.map +0 -1
  332. package/dist/src/middleware/__tests__/agent-middleware.test.d.ts +0 -2
  333. package/dist/src/middleware/__tests__/agent-middleware.test.d.ts.map +0 -1
  334. package/dist/src/middleware/__tests__/agent-middleware.test.js +0 -1206
  335. package/dist/src/middleware/__tests__/agent-middleware.test.js.map +0 -1
  336. package/dist/src/middleware/__tests__/copy-on-input.test.d.ts +0 -2
  337. package/dist/src/middleware/__tests__/copy-on-input.test.d.ts.map +0 -1
  338. package/dist/src/middleware/__tests__/copy-on-input.test.js +0 -379
  339. package/dist/src/middleware/__tests__/copy-on-input.test.js.map +0 -1
  340. package/dist/src/middleware/__tests__/custom-stages.test.d.ts +0 -2
  341. package/dist/src/middleware/__tests__/custom-stages.test.d.ts.map +0 -1
  342. package/dist/src/middleware/__tests__/custom-stages.test.js +0 -97
  343. package/dist/src/middleware/__tests__/custom-stages.test.js.map +0 -1
  344. package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts +0 -2
  345. package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts.map +0 -1
  346. package/dist/src/middleware/__tests__/middleware-interrupts.test.js +0 -267
  347. package/dist/src/middleware/__tests__/middleware-interrupts.test.js.map +0 -1
  348. package/dist/src/middleware/__tests__/registry.test.d.ts +0 -2
  349. package/dist/src/middleware/__tests__/registry.test.d.ts.map +0 -1
  350. package/dist/src/middleware/__tests__/registry.test.js +0 -525
  351. package/dist/src/middleware/__tests__/registry.test.js.map +0 -1
  352. package/dist/src/models/__tests__/anthropic.test.d.ts +0 -2
  353. package/dist/src/models/__tests__/anthropic.test.d.ts.map +0 -1
  354. package/dist/src/models/__tests__/anthropic.test.js +0 -793
  355. package/dist/src/models/__tests__/anthropic.test.js.map +0 -1
  356. package/dist/src/models/__tests__/bedrock.test.d.ts +0 -2
  357. package/dist/src/models/__tests__/bedrock.test.d.ts.map +0 -1
  358. package/dist/src/models/__tests__/bedrock.test.js +0 -3964
  359. package/dist/src/models/__tests__/bedrock.test.js.map +0 -1
  360. package/dist/src/models/__tests__/defaults.test.d.ts +0 -2
  361. package/dist/src/models/__tests__/defaults.test.d.ts.map +0 -1
  362. package/dist/src/models/__tests__/defaults.test.js +0 -36
  363. package/dist/src/models/__tests__/defaults.test.js.map +0 -1
  364. package/dist/src/models/__tests__/google.test.d.ts +0 -2
  365. package/dist/src/models/__tests__/google.test.d.ts.map +0 -1
  366. package/dist/src/models/__tests__/google.test.js +0 -1145
  367. package/dist/src/models/__tests__/google.test.js.map +0 -1
  368. package/dist/src/models/__tests__/model.test.d.ts +0 -2
  369. package/dist/src/models/__tests__/model.test.d.ts.map +0 -1
  370. package/dist/src/models/__tests__/model.test.js +0 -921
  371. package/dist/src/models/__tests__/model.test.js.map +0 -1
  372. package/dist/src/models/__tests__/streaming.test.d.ts +0 -2
  373. package/dist/src/models/__tests__/streaming.test.d.ts.map +0 -1
  374. package/dist/src/models/__tests__/streaming.test.js +0 -50
  375. package/dist/src/models/__tests__/streaming.test.js.map +0 -1
  376. package/dist/src/models/__tests__/test-utils.d.ts +0 -10
  377. package/dist/src/models/__tests__/test-utils.d.ts.map +0 -1
  378. package/dist/src/models/__tests__/test-utils.js +0 -17
  379. package/dist/src/models/__tests__/test-utils.js.map +0 -1
  380. package/dist/src/models/__tests__/vercel.test.d.ts +0 -2
  381. package/dist/src/models/__tests__/vercel.test.d.ts.map +0 -1
  382. package/dist/src/models/__tests__/vercel.test.js +0 -740
  383. package/dist/src/models/__tests__/vercel.test.js.map +0 -1
  384. package/dist/src/models/openai/__tests__/chat.test.d.ts +0 -2
  385. package/dist/src/models/openai/__tests__/chat.test.d.ts.map +0 -1
  386. package/dist/src/models/openai/__tests__/chat.test.js +0 -1586
  387. package/dist/src/models/openai/__tests__/chat.test.js.map +0 -1
  388. package/dist/src/models/openai/__tests__/errors.test.d.ts +0 -2
  389. package/dist/src/models/openai/__tests__/errors.test.d.ts.map +0 -1
  390. package/dist/src/models/openai/__tests__/errors.test.js +0 -39
  391. package/dist/src/models/openai/__tests__/errors.test.js.map +0 -1
  392. package/dist/src/models/openai/__tests__/mantle.test.d.ts +0 -2
  393. package/dist/src/models/openai/__tests__/mantle.test.d.ts.map +0 -1
  394. package/dist/src/models/openai/__tests__/mantle.test.js +0 -189
  395. package/dist/src/models/openai/__tests__/mantle.test.js.map +0 -1
  396. package/dist/src/models/openai/__tests__/responses.test.d.ts +0 -2
  397. package/dist/src/models/openai/__tests__/responses.test.d.ts.map +0 -1
  398. package/dist/src/models/openai/__tests__/responses.test.js +0 -709
  399. package/dist/src/models/openai/__tests__/responses.test.js.map +0 -1
  400. package/dist/src/multiagent/__tests__/events.test.d.ts +0 -2
  401. package/dist/src/multiagent/__tests__/events.test.d.ts.map +0 -1
  402. package/dist/src/multiagent/__tests__/events.test.js +0 -493
  403. package/dist/src/multiagent/__tests__/events.test.js.map +0 -1
  404. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +0 -2
  405. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +0 -1
  406. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +0 -95
  407. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +0 -1
  408. package/dist/src/multiagent/__tests__/graph.test.d.ts +0 -2
  409. package/dist/src/multiagent/__tests__/graph.test.d.ts.map +0 -1
  410. package/dist/src/multiagent/__tests__/graph.test.js +0 -698
  411. package/dist/src/multiagent/__tests__/graph.test.js.map +0 -1
  412. package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts +0 -2
  413. package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts.map +0 -1
  414. package/dist/src/multiagent/__tests__/graph.tracer.test.js +0 -218
  415. package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +0 -1
  416. package/dist/src/multiagent/__tests__/interrupts.test.d.ts +0 -2
  417. package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +0 -1
  418. package/dist/src/multiagent/__tests__/interrupts.test.js +0 -390
  419. package/dist/src/multiagent/__tests__/interrupts.test.js.map +0 -1
  420. package/dist/src/multiagent/__tests__/nodes.test.d.ts +0 -2
  421. package/dist/src/multiagent/__tests__/nodes.test.d.ts.map +0 -1
  422. package/dist/src/multiagent/__tests__/nodes.test.js +0 -321
  423. package/dist/src/multiagent/__tests__/nodes.test.js.map +0 -1
  424. package/dist/src/multiagent/__tests__/queue.test.d.ts +0 -2
  425. package/dist/src/multiagent/__tests__/queue.test.d.ts.map +0 -1
  426. package/dist/src/multiagent/__tests__/queue.test.js +0 -118
  427. package/dist/src/multiagent/__tests__/queue.test.js.map +0 -1
  428. package/dist/src/multiagent/__tests__/snapshot.test.d.ts +0 -2
  429. package/dist/src/multiagent/__tests__/snapshot.test.d.ts.map +0 -1
  430. package/dist/src/multiagent/__tests__/snapshot.test.js +0 -161
  431. package/dist/src/multiagent/__tests__/snapshot.test.js.map +0 -1
  432. package/dist/src/multiagent/__tests__/state.test.d.ts +0 -2
  433. package/dist/src/multiagent/__tests__/state.test.d.ts.map +0 -1
  434. package/dist/src/multiagent/__tests__/state.test.js +0 -526
  435. package/dist/src/multiagent/__tests__/state.test.js.map +0 -1
  436. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +0 -2
  437. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +0 -1
  438. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +0 -56
  439. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +0 -1
  440. package/dist/src/multiagent/__tests__/swarm.test.d.ts +0 -2
  441. package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +0 -1
  442. package/dist/src/multiagent/__tests__/swarm.test.js +0 -477
  443. package/dist/src/multiagent/__tests__/swarm.test.js.map +0 -1
  444. package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts +0 -2
  445. package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts.map +0 -1
  446. package/dist/src/multiagent/__tests__/swarm.tracer.test.js +0 -235
  447. package/dist/src/multiagent/__tests__/swarm.tracer.test.js.map +0 -1
  448. package/dist/src/plugins/__tests__/plugin.test.d.ts +0 -2
  449. package/dist/src/plugins/__tests__/plugin.test.d.ts.map +0 -1
  450. package/dist/src/plugins/__tests__/plugin.test.js +0 -114
  451. package/dist/src/plugins/__tests__/plugin.test.js.map +0 -1
  452. package/dist/src/plugins/__tests__/registry.test.d.ts +0 -2
  453. package/dist/src/plugins/__tests__/registry.test.d.ts.map +0 -1
  454. package/dist/src/plugins/__tests__/registry.test.js +0 -147
  455. package/dist/src/plugins/__tests__/registry.test.js.map +0 -1
  456. package/dist/src/registry/__tests__/tool-registry.test.d.ts +0 -2
  457. package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +0 -1
  458. package/dist/src/registry/__tests__/tool-registry.test.js +0 -210
  459. package/dist/src/registry/__tests__/tool-registry.test.js.map +0 -1
  460. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +0 -2
  461. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +0 -1
  462. package/dist/src/retry/__tests__/backoff-strategy.test.js +0 -116
  463. package/dist/src/retry/__tests__/backoff-strategy.test.js.map +0 -1
  464. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +0 -2
  465. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +0 -1
  466. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +0 -225
  467. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +0 -1
  468. package/dist/src/sandbox/__tests__/default.test.browser.d.ts +0 -2
  469. package/dist/src/sandbox/__tests__/default.test.browser.d.ts.map +0 -1
  470. package/dist/src/sandbox/__tests__/default.test.browser.js +0 -11
  471. package/dist/src/sandbox/__tests__/default.test.browser.js.map +0 -1
  472. package/dist/src/sandbox/__tests__/default.test.node.d.ts +0 -2
  473. package/dist/src/sandbox/__tests__/default.test.node.d.ts.map +0 -1
  474. package/dist/src/sandbox/__tests__/default.test.node.js +0 -23
  475. package/dist/src/sandbox/__tests__/default.test.node.js.map +0 -1
  476. package/dist/src/sandbox/__tests__/docker.test.node.d.ts +0 -2
  477. package/dist/src/sandbox/__tests__/docker.test.node.d.ts.map +0 -1
  478. package/dist/src/sandbox/__tests__/docker.test.node.js +0 -89
  479. package/dist/src/sandbox/__tests__/docker.test.node.js.map +0 -1
  480. package/dist/src/sandbox/__tests__/errors.test.node.d.ts +0 -2
  481. package/dist/src/sandbox/__tests__/errors.test.node.d.ts.map +0 -1
  482. package/dist/src/sandbox/__tests__/errors.test.node.js +0 -33
  483. package/dist/src/sandbox/__tests__/errors.test.node.js.map +0 -1
  484. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts +0 -2
  485. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts.map +0 -1
  486. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js +0 -124
  487. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js.map +0 -1
  488. package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts +0 -2
  489. package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts.map +0 -1
  490. package/dist/src/sandbox/__tests__/posix-shell.test.node.js +0 -298
  491. package/dist/src/sandbox/__tests__/posix-shell.test.node.js.map +0 -1
  492. package/dist/src/sandbox/__tests__/ssh.test.node.d.ts +0 -2
  493. package/dist/src/sandbox/__tests__/ssh.test.node.d.ts.map +0 -1
  494. package/dist/src/sandbox/__tests__/ssh.test.node.js +0 -262
  495. package/dist/src/sandbox/__tests__/ssh.test.node.js.map +0 -1
  496. package/dist/src/session/__tests__/file-storage.test.node.d.ts +0 -2
  497. package/dist/src/session/__tests__/file-storage.test.node.d.ts.map +0 -1
  498. package/dist/src/session/__tests__/file-storage.test.node.js +0 -278
  499. package/dist/src/session/__tests__/file-storage.test.node.js.map +0 -1
  500. package/dist/src/session/__tests__/s3-storage.test.d.ts +0 -2
  501. package/dist/src/session/__tests__/s3-storage.test.d.ts.map +0 -1
  502. package/dist/src/session/__tests__/s3-storage.test.js +0 -461
  503. package/dist/src/session/__tests__/s3-storage.test.js.map +0 -1
  504. package/dist/src/session/__tests__/session-manager.test.d.ts +0 -2
  505. package/dist/src/session/__tests__/session-manager.test.d.ts.map +0 -1
  506. package/dist/src/session/__tests__/session-manager.test.js +0 -832
  507. package/dist/src/session/__tests__/session-manager.test.js.map +0 -1
  508. package/dist/src/session/__tests__/validation.test.d.ts +0 -2
  509. package/dist/src/session/__tests__/validation.test.d.ts.map +0 -1
  510. package/dist/src/session/__tests__/validation.test.js +0 -47
  511. package/dist/src/session/__tests__/validation.test.js.map +0 -1
  512. package/dist/src/telemetry/__tests__/config.test.d.ts +0 -2
  513. package/dist/src/telemetry/__tests__/config.test.d.ts.map +0 -1
  514. package/dist/src/telemetry/__tests__/config.test.js +0 -64
  515. package/dist/src/telemetry/__tests__/config.test.js.map +0 -1
  516. package/dist/src/telemetry/__tests__/config.test.node.d.ts +0 -2
  517. package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +0 -1
  518. package/dist/src/telemetry/__tests__/config.test.node.js +0 -164
  519. package/dist/src/telemetry/__tests__/config.test.node.js.map +0 -1
  520. package/dist/src/telemetry/__tests__/json.test.d.ts +0 -2
  521. package/dist/src/telemetry/__tests__/json.test.d.ts.map +0 -1
  522. package/dist/src/telemetry/__tests__/json.test.js +0 -89
  523. package/dist/src/telemetry/__tests__/json.test.js.map +0 -1
  524. package/dist/src/telemetry/__tests__/local-trace.test.d.ts +0 -2
  525. package/dist/src/telemetry/__tests__/local-trace.test.d.ts.map +0 -1
  526. package/dist/src/telemetry/__tests__/local-trace.test.js +0 -158
  527. package/dist/src/telemetry/__tests__/local-trace.test.js.map +0 -1
  528. package/dist/src/telemetry/__tests__/meter.test.d.ts +0 -2
  529. package/dist/src/telemetry/__tests__/meter.test.d.ts.map +0 -1
  530. package/dist/src/telemetry/__tests__/meter.test.js +0 -695
  531. package/dist/src/telemetry/__tests__/meter.test.js.map +0 -1
  532. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +0 -2
  533. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +0 -1
  534. package/dist/src/telemetry/__tests__/tracer.test.node.js +0 -958
  535. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +0 -1
  536. package/dist/src/tools/__tests__/structured-output-tool.test.d.ts +0 -2
  537. package/dist/src/tools/__tests__/structured-output-tool.test.d.ts.map +0 -1
  538. package/dist/src/tools/__tests__/structured-output-tool.test.js +0 -84
  539. package/dist/src/tools/__tests__/structured-output-tool.test.js.map +0 -1
  540. package/dist/src/tools/__tests__/tool-factory.test.d.ts +0 -2
  541. package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +0 -1
  542. package/dist/src/tools/__tests__/tool-factory.test.js +0 -98
  543. package/dist/src/tools/__tests__/tool-factory.test.js.map +0 -1
  544. package/dist/src/tools/__tests__/tool.test.d.ts +0 -2
  545. package/dist/src/tools/__tests__/tool.test.d.ts.map +0 -1
  546. package/dist/src/tools/__tests__/tool.test.js +0 -1043
  547. package/dist/src/tools/__tests__/tool.test.js.map +0 -1
  548. package/dist/src/tools/__tests__/zod-tool.test-d.d.ts +0 -2
  549. package/dist/src/tools/__tests__/zod-tool.test-d.d.ts.map +0 -1
  550. package/dist/src/tools/__tests__/zod-tool.test-d.js +0 -227
  551. package/dist/src/tools/__tests__/zod-tool.test-d.js.map +0 -1
  552. package/dist/src/tools/__tests__/zod-tool.test.d.ts +0 -2
  553. package/dist/src/tools/__tests__/zod-tool.test.d.ts.map +0 -1
  554. package/dist/src/tools/__tests__/zod-tool.test.js +0 -563
  555. package/dist/src/tools/__tests__/zod-tool.test.js.map +0 -1
  556. package/dist/src/types/__tests__/agent.test.d.ts +0 -2
  557. package/dist/src/types/__tests__/agent.test.d.ts.map +0 -1
  558. package/dist/src/types/__tests__/agent.test.js +0 -476
  559. package/dist/src/types/__tests__/agent.test.js.map +0 -1
  560. package/dist/src/types/__tests__/citations.test.d.ts +0 -2
  561. package/dist/src/types/__tests__/citations.test.d.ts.map +0 -1
  562. package/dist/src/types/__tests__/citations.test.js +0 -104
  563. package/dist/src/types/__tests__/citations.test.js.map +0 -1
  564. package/dist/src/types/__tests__/json.test.d.ts +0 -2
  565. package/dist/src/types/__tests__/json.test.d.ts.map +0 -1
  566. package/dist/src/types/__tests__/json.test.js +0 -298
  567. package/dist/src/types/__tests__/json.test.js.map +0 -1
  568. package/dist/src/types/__tests__/media.test.d.ts +0 -2
  569. package/dist/src/types/__tests__/media.test.d.ts.map +0 -1
  570. package/dist/src/types/__tests__/media.test.js +0 -478
  571. package/dist/src/types/__tests__/media.test.js.map +0 -1
  572. package/dist/src/types/__tests__/messages.test.d.ts +0 -2
  573. package/dist/src/types/__tests__/messages.test.d.ts.map +0 -1
  574. package/dist/src/types/__tests__/messages.test.js +0 -681
  575. package/dist/src/types/__tests__/messages.test.js.map +0 -1
  576. package/dist/src/types/__tests__/validation.test.d.ts +0 -2
  577. package/dist/src/types/__tests__/validation.test.d.ts.map +0 -1
  578. package/dist/src/types/__tests__/validation.test.js +0 -30
  579. package/dist/src/types/__tests__/validation.test.js.map +0 -1
  580. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts +0 -2
  581. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts.map +0 -1
  582. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js +0 -756
  583. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js.map +0 -1
  584. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts +0 -2
  585. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts.map +0 -1
  586. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js +0 -358
  587. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js.map +0 -1
  588. package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts +0 -2
  589. package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts.map +0 -1
  590. package/dist/src/vended-interventions/steering/__tests__/handler.test.js +0 -163
  591. package/dist/src/vended-interventions/steering/__tests__/handler.test.js.map +0 -1
  592. package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts +0 -2
  593. package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts.map +0 -1
  594. package/dist/src/vended-interventions/steering/__tests__/llm.test.js +0 -60
  595. package/dist/src/vended-interventions/steering/__tests__/llm.test.js.map +0 -1
  596. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts +0 -2
  597. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts.map +0 -1
  598. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js +0 -94
  599. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js.map +0 -1
  600. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts +0 -2
  601. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts.map +0 -1
  602. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js +0 -758
  603. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js.map +0 -1
  604. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts +0 -2
  605. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts.map +0 -1
  606. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js +0 -96
  607. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js.map +0 -1
  608. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts +0 -2
  609. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts.map +0 -1
  610. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js +0 -68
  611. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js.map +0 -1
  612. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +0 -2
  613. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +0 -1
  614. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +0 -539
  615. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +0 -1
  616. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts +0 -2
  617. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts.map +0 -1
  618. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +0 -97
  619. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +0 -1
  620. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts +0 -2
  621. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts.map +0 -1
  622. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js +0 -149
  623. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js.map +0 -1
  624. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +0 -2
  625. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +0 -1
  626. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +0 -216
  627. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +0 -1
  628. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +0 -2
  629. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +0 -1
  630. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +0 -78
  631. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +0 -1
  632. package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts +0 -2
  633. package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts.map +0 -1
  634. package/dist/src/vended-plugins/goal/__tests__/plugin.test.js +0 -736
  635. package/dist/src/vended-plugins/goal/__tests__/plugin.test.js.map +0 -1
  636. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts +0 -2
  637. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts.map +0 -1
  638. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +0 -482
  639. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +0 -1
  640. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts +0 -2
  641. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts.map +0 -1
  642. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js +0 -476
  643. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js.map +0 -1
  644. package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts +0 -2
  645. package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts.map +0 -1
  646. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +0 -390
  647. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +0 -1
  648. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts +0 -2
  649. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +0 -1
  650. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +0 -452
  651. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +0 -1
  652. package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts +0 -2
  653. package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +0 -1
  654. package/dist/src/vended-tools/http-request/__tests__/http-request.test.js +0 -189
  655. package/dist/src/vended-tools/http-request/__tests__/http-request.test.js.map +0 -1
  656. package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts +0 -2
  657. package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts.map +0 -1
  658. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +0 -388
  659. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js.map +0 -1
@@ -1,958 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi } from 'vitest';
2
- import { SpanStatusCode, trace, context } from '@opentelemetry/api';
3
- import { Tracer } from '../tracer.js';
4
- import { Message, TextBlock, ToolResultBlock, ToolUseBlock, CachePointBlock } from '../../types/messages.js';
5
- import { MockSpan, eventAttr } from '../../__fixtures__/mock-span.js';
6
- import { textMessage } from '../../__fixtures__/agent-helpers.js';
7
- // Partial mock: keep real SpanStatusCode, isSpanContextValid, etc., replace context and trace
8
- vi.mock('@opentelemetry/api', async (importOriginal) => {
9
- const actual = (await importOriginal());
10
- return {
11
- ...actual,
12
- context: { active: vi.fn(() => ({})), with: vi.fn((_ctx, fn) => fn()) },
13
- trace: {
14
- getTracer: vi.fn(),
15
- setSpan: vi.fn(),
16
- getActiveSpan: vi.fn(),
17
- },
18
- };
19
- });
20
- describe('Tracer', () => {
21
- let mockSpan;
22
- let mockStartSpan;
23
- beforeEach(() => {
24
- mockSpan = new MockSpan();
25
- mockStartSpan = vi.fn().mockReturnValue(mockSpan);
26
- vi.mocked(trace.getTracer).mockReturnValue({
27
- startSpan: mockStartSpan,
28
- startActiveSpan: vi.fn(),
29
- });
30
- // Default to stable conventions; tests needing latest override this
31
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', '');
32
- });
33
- /** Get the [spanName, options] from the startSpan call for the span under test. */
34
- function getStartSpanCall() {
35
- return mockStartSpan.mock.calls[0];
36
- }
37
- describe('constructor', () => {
38
- it('reads service name from OTEL_SERVICE_NAME env var', () => {
39
- vi.stubEnv('OTEL_SERVICE_NAME', 'my-custom-service');
40
- new Tracer();
41
- expect(trace.getTracer).toHaveBeenCalledWith('my-custom-service');
42
- });
43
- it('defaults service name to strands-agents', () => {
44
- vi.stubEnv('OTEL_SERVICE_NAME', '');
45
- new Tracer();
46
- expect(trace.getTracer).toHaveBeenCalledWith('strands-agents');
47
- });
48
- });
49
- describe('startAgentSpan', () => {
50
- it('creates span with correct name and standard attributes', () => {
51
- const tracer = new Tracer();
52
- tracer.startAgentSpan({
53
- messages: [textMessage('user', 'Hello')],
54
- agentName: 'test-agent',
55
- modelId: 'model-123',
56
- });
57
- const [spanName, options] = getStartSpanCall();
58
- expect(spanName).toBe('invoke_agent test-agent');
59
- expect(options.attributes).toMatchObject({
60
- 'gen_ai.operation.name': 'invoke_agent',
61
- 'gen_ai.system': expect.any(String),
62
- 'gen_ai.agent.name': 'test-agent',
63
- 'gen_ai.request.model': 'model-123',
64
- name: 'invoke_agent test-agent',
65
- });
66
- });
67
- it('includes agent id when provided', () => {
68
- const tracer = new Tracer();
69
- tracer.startAgentSpan({
70
- messages: [textMessage('user', 'Hello')],
71
- agentName: 'test-agent',
72
- agentId: 'agent-42',
73
- });
74
- const [, options] = getStartSpanCall();
75
- expect(options.attributes['gen_ai.agent.id']).toBe('agent-42');
76
- });
77
- it('serializes tool names into gen_ai.agent.tools', () => {
78
- const tracer = new Tracer();
79
- tracer.startAgentSpan({
80
- messages: [textMessage('user', 'Hello')],
81
- agentName: 'test-agent',
82
- tools: [{ name: 'calculator' }, { name: 'search' }],
83
- });
84
- const [, options] = getStartSpanCall();
85
- expect(options.attributes['gen_ai.agent.tools']).toBe('["calculator","search"]');
86
- });
87
- it('includes tool definitions when gen_ai_tool_definitions opt-in is set', () => {
88
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_tool_definitions');
89
- const tracer = new Tracer();
90
- const toolsConfig = { calc: { name: 'calc', description: 'Calculator' } };
91
- tracer.startAgentSpan({
92
- messages: [textMessage('user', 'Hello')],
93
- agentName: 'test-agent',
94
- toolsConfig,
95
- });
96
- const [, options] = getStartSpanCall();
97
- expect(options.attributes['gen_ai.tool.definitions']).toBe(JSON.stringify(toolsConfig));
98
- });
99
- it('serializes system prompt into attribute', () => {
100
- const tracer = new Tracer();
101
- tracer.startAgentSpan({
102
- messages: [textMessage('user', 'Hello')],
103
- agentName: 'test-agent',
104
- systemPrompt: 'You are a helpful assistant',
105
- });
106
- const [, options] = getStartSpanCall();
107
- expect(options.attributes['system_prompt']).toBe('"You are a helpful assistant"');
108
- });
109
- it('merges constructor-level and call-level trace attributes', () => {
110
- const tracer = new Tracer({ 'global.attr': 'global-val' });
111
- tracer.startAgentSpan({
112
- messages: [textMessage('user', 'Hello')],
113
- agentName: 'test-agent',
114
- traceAttributes: { 'custom.session': 'sess-1' },
115
- });
116
- const [, options] = getStartSpanCall();
117
- expect(options.attributes['global.attr']).toBe('global-val');
118
- expect(options.attributes['custom.session']).toBe('sess-1');
119
- });
120
- it('adds separate stable message events per message', () => {
121
- const tracer = new Tracer();
122
- tracer.startAgentSpan({
123
- messages: [textMessage('user', 'Hello'), textMessage('assistant', 'Hi')],
124
- agentName: 'test-agent',
125
- });
126
- expect(mockSpan.getEvents('gen_ai.user.message')).toHaveLength(1);
127
- expect(mockSpan.getEvents('gen_ai.assistant.message')).toHaveLength(1);
128
- });
129
- it('classifies tool result messages as gen_ai.tool.message', () => {
130
- const tracer = new Tracer();
131
- const toolResultMsg = new Message({
132
- role: 'user',
133
- content: [new ToolResultBlock({ toolUseId: 'tool-1', status: 'success', content: [new TextBlock('done')] })],
134
- });
135
- tracer.startAgentSpan({ messages: [toolResultMsg], agentName: 'test-agent' });
136
- expect(mockSpan.getEvents('gen_ai.tool.message')).toHaveLength(1);
137
- });
138
- it('adds single operation details event with latest conventions', () => {
139
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
140
- const tracer = new Tracer();
141
- tracer.startAgentSpan({
142
- messages: [textMessage('user', 'Hello'), textMessage('assistant', 'Hi')],
143
- agentName: 'test-agent',
144
- });
145
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
146
- expect(detailEvents).toHaveLength(1);
147
- const inputMessages = JSON.parse(eventAttr(detailEvents[0], 'gen_ai.input.messages'));
148
- expect(inputMessages).toStrictEqual([
149
- { role: 'user', parts: [{ type: 'text', content: 'Hello' }] },
150
- { role: 'assistant', parts: [{ type: 'text', content: 'Hi' }] },
151
- ]);
152
- });
153
- it('uses gen_ai.provider.name with latest conventions', () => {
154
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
155
- const tracer = new Tracer();
156
- tracer.startAgentSpan({ messages: [textMessage('user', 'Hello')], agentName: 'test-agent' });
157
- const [, options] = getStartSpanCall();
158
- expect(options.attributes['gen_ai.provider.name']).toBeDefined();
159
- expect(options.attributes['gen_ai.system']).toBeUndefined();
160
- });
161
- it('uses gen_ai.system with stable conventions', () => {
162
- const tracer = new Tracer();
163
- tracer.startAgentSpan({ messages: [textMessage('user', 'Hello')], agentName: 'test-agent' });
164
- const [, options] = getStartSpanCall();
165
- expect(options.attributes['gen_ai.system']).toBeDefined();
166
- expect(options.attributes['gen_ai.provider.name']).toBeUndefined();
167
- });
168
- });
169
- describe('endAgentSpan', () => {
170
- it('sets OK status and ends span on success', () => {
171
- const tracer = new Tracer();
172
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
173
- tracer.endAgentSpan(span);
174
- expect(mockSpan.calls.setStatus).toContainEqual({ status: { code: SpanStatusCode.OK } });
175
- expect(mockSpan.calls.end).toHaveLength(1);
176
- });
177
- it('sets ERROR status and records exception on error', () => {
178
- const tracer = new Tracer();
179
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
180
- const error = new Error('agent failed');
181
- tracer.endAgentSpan(span, { error });
182
- expect(mockSpan.calls.setStatus).toContainEqual({
183
- status: { code: SpanStatusCode.ERROR, message: 'agent failed' },
184
- });
185
- expect(mockSpan.calls.recordException).toContainEqual({ exception: error, time: undefined });
186
- });
187
- it('sets accumulated usage attributes', () => {
188
- const tracer = new Tracer();
189
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
190
- tracer.endAgentSpan(span, {
191
- accumulatedUsage: { inputTokens: 100, outputTokens: 200, totalTokens: 300 },
192
- });
193
- expect(mockSpan.getAttributeValue('gen_ai.usage.input_tokens')).toBe(100);
194
- expect(mockSpan.getAttributeValue('gen_ai.usage.output_tokens')).toBe(200);
195
- expect(mockSpan.getAttributeValue('gen_ai.usage.total_tokens')).toBe(300);
196
- expect(mockSpan.getAttributeValue('gen_ai.usage.prompt_tokens')).toBe(100);
197
- expect(mockSpan.getAttributeValue('gen_ai.usage.completion_tokens')).toBe(200);
198
- });
199
- it('adds response event with stable conventions', () => {
200
- const tracer = new Tracer();
201
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
202
- const response = new Message({ role: 'assistant', content: [new TextBlock('Hello back')] });
203
- tracer.endAgentSpan(span, { response, stopReason: 'end_turn' });
204
- const choiceEvents = mockSpan.getEvents('gen_ai.choice');
205
- expect(choiceEvents).toHaveLength(1);
206
- expect(eventAttr(choiceEvents[0], 'message')).toBe('Hello back');
207
- expect(eventAttr(choiceEvents[0], 'finish_reason')).toBe('end_turn');
208
- });
209
- it('adds response event with latest conventions', () => {
210
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
211
- const tracer = new Tracer();
212
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
213
- const response = new Message({ role: 'assistant', content: [new TextBlock('Hello back')] });
214
- tracer.endAgentSpan(span, { response, stopReason: 'end_turn' });
215
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
216
- const outputEvent = detailEvents.find((e) => eventAttr(e, 'gen_ai.output.messages'));
217
- expect(outputEvent).toBeDefined();
218
- const parsed = JSON.parse(eventAttr(outputEvent, 'gen_ai.output.messages'));
219
- expect(parsed).toStrictEqual([
220
- { role: 'assistant', parts: [{ type: 'text', content: 'Hello back' }], finish_reason: 'end_turn' },
221
- ]);
222
- });
223
- it('handles null span gracefully', () => {
224
- const tracer = new Tracer();
225
- expect(() => tracer.endAgentSpan(null)).not.toThrow();
226
- expect(mockSpan.calls.end).toHaveLength(0);
227
- });
228
- });
229
- describe('startModelInvokeSpan', () => {
230
- it('creates span with chat operation name and model id', () => {
231
- const tracer = new Tracer();
232
- tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hello')], modelId: 'claude-3' });
233
- const [spanName, options] = getStartSpanCall();
234
- expect(spanName).toBe('chat');
235
- expect(options.attributes).toMatchObject({
236
- 'gen_ai.operation.name': 'chat',
237
- 'gen_ai.request.model': 'claude-3',
238
- });
239
- });
240
- it('adds message events to span', () => {
241
- const tracer = new Tracer();
242
- tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hello')] });
243
- expect(mockSpan.getEvents('gen_ai.user.message')).toHaveLength(1);
244
- });
245
- });
246
- describe('endModelInvokeSpan', () => {
247
- it('sets usage and metrics attributes', () => {
248
- const tracer = new Tracer();
249
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')], modelId: 'model-1' });
250
- tracer.endModelInvokeSpan(span, {
251
- usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },
252
- metrics: { latencyMs: 500 },
253
- });
254
- expect(mockSpan.getAttributeValue('gen_ai.usage.input_tokens')).toBe(10);
255
- expect(mockSpan.getAttributeValue('gen_ai.usage.output_tokens')).toBe(20);
256
- expect(mockSpan.getAttributeValue('gen_ai.usage.total_tokens')).toBe(30);
257
- expect(mockSpan.getAttributeValue('gen_ai.server.request.duration')).toBe(500);
258
- });
259
- it('sets cache token attributes when provided', () => {
260
- const tracer = new Tracer();
261
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] });
262
- tracer.endModelInvokeSpan(span, {
263
- usage: {
264
- inputTokens: 100,
265
- outputTokens: 200,
266
- totalTokens: 300,
267
- cacheReadInputTokens: 50,
268
- cacheWriteInputTokens: 25,
269
- },
270
- });
271
- expect(mockSpan.getAttributeValue('gen_ai.usage.cache_read_input_tokens')).toBe(50);
272
- expect(mockSpan.getAttributeValue('gen_ai.usage.cache_write_input_tokens')).toBe(25);
273
- });
274
- it('skips cache token attributes when zero', () => {
275
- const tracer = new Tracer();
276
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] });
277
- tracer.endModelInvokeSpan(span, {
278
- usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30, cacheReadInputTokens: 0 },
279
- });
280
- expect(mockSpan.getAttributeValue('gen_ai.usage.cache_read_input_tokens')).toBeUndefined();
281
- });
282
- it('skips latency attribute when zero', () => {
283
- const tracer = new Tracer();
284
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] });
285
- tracer.endModelInvokeSpan(span, {
286
- usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },
287
- metrics: { latencyMs: 0 },
288
- });
289
- expect(mockSpan.getAttributeValue('gen_ai.server.request.duration')).toBeUndefined();
290
- });
291
- it('adds output event with stable conventions for mixed content', () => {
292
- const tracer = new Tracer();
293
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] });
294
- const output = new Message({
295
- role: 'assistant',
296
- content: [
297
- new TextBlock('The answer is 42'),
298
- new ToolUseBlock({ name: 'calc', toolUseId: 'tool-1', input: { expr: '6*7' } }),
299
- ],
300
- });
301
- tracer.endModelInvokeSpan(span, { output, stopReason: 'tool_use' });
302
- const choiceEvents = mockSpan.getEvents('gen_ai.choice');
303
- expect(choiceEvents).toHaveLength(1);
304
- expect(eventAttr(choiceEvents[0], 'finish_reason')).toBe('tool_use');
305
- const parsed = JSON.parse(eventAttr(choiceEvents[0], 'message'));
306
- expect(parsed).toStrictEqual([
307
- { text: 'The answer is 42' },
308
- { type: 'toolUse', name: 'calc', toolUseId: 'tool-1', input: { expr: '6*7' } },
309
- ]);
310
- });
311
- it('adds output event with latest conventions for mixed content', () => {
312
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
313
- const tracer = new Tracer();
314
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] });
315
- const output = new Message({
316
- role: 'assistant',
317
- content: [
318
- new TextBlock('The answer'),
319
- new ToolUseBlock({ name: 'calc', toolUseId: 'tool-1', input: { x: 1 } }),
320
- ],
321
- });
322
- tracer.endModelInvokeSpan(span, { output, stopReason: 'tool_use' });
323
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
324
- const outputEvent = detailEvents.find((e) => eventAttr(e, 'gen_ai.output.messages'));
325
- expect(outputEvent).toBeDefined();
326
- const parsed = JSON.parse(eventAttr(outputEvent, 'gen_ai.output.messages'));
327
- expect(parsed).toStrictEqual([
328
- {
329
- role: 'assistant',
330
- parts: [
331
- { type: 'text', content: 'The answer' },
332
- { type: 'tool_call', name: 'calc', id: 'tool-1', arguments: { x: 1 } },
333
- ],
334
- finish_reason: 'tool_use',
335
- },
336
- ]);
337
- });
338
- it('records error on model invocation failure', () => {
339
- const tracer = new Tracer();
340
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] });
341
- const error = new Error('model timeout');
342
- tracer.endModelInvokeSpan(span, { error });
343
- expect(mockSpan.calls.setStatus).toContainEqual({
344
- status: { code: SpanStatusCode.ERROR, message: 'model timeout' },
345
- });
346
- expect(mockSpan.calls.recordException).toContainEqual({ exception: error, time: undefined });
347
- });
348
- it('handles null span gracefully', () => {
349
- const tracer = new Tracer();
350
- expect(() => tracer.endModelInvokeSpan(null)).not.toThrow();
351
- });
352
- });
353
- describe('startToolCallSpan', () => {
354
- it('creates span with tool name and call id', () => {
355
- const tracer = new Tracer();
356
- tracer.startToolCallSpan({
357
- tool: { name: 'calculator', toolUseId: 'call-1', input: { expr: '2+2' } },
358
- });
359
- const [spanName, options] = getStartSpanCall();
360
- expect(spanName).toBe('execute_tool calculator');
361
- expect(options.attributes).toMatchObject({
362
- 'gen_ai.operation.name': 'execute_tool',
363
- 'gen_ai.tool.name': 'calculator',
364
- 'gen_ai.tool.call.id': 'call-1',
365
- });
366
- });
367
- it('adds stable tool message event with serialized input', () => {
368
- const tracer = new Tracer();
369
- tracer.startToolCallSpan({
370
- tool: { name: 'search', toolUseId: 'call-2', input: { query: 'test' } },
371
- });
372
- const toolEvents = mockSpan.getEvents('gen_ai.tool.message');
373
- expect(toolEvents).toHaveLength(1);
374
- expect(eventAttr(toolEvents[0], 'role')).toBe('tool');
375
- expect(eventAttr(toolEvents[0], 'content')).toBe('{"query":"test"}');
376
- expect(eventAttr(toolEvents[0], 'id')).toBe('call-2');
377
- });
378
- it('adds latest convention tool input event', () => {
379
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
380
- const tracer = new Tracer();
381
- tracer.startToolCallSpan({
382
- tool: { name: 'search', toolUseId: 'call-2', input: { query: 'test' } },
383
- });
384
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
385
- expect(detailEvents).toHaveLength(1);
386
- const parsed = JSON.parse(eventAttr(detailEvents[0], 'gen_ai.input.messages'));
387
- expect(parsed).toStrictEqual([
388
- {
389
- role: 'tool',
390
- parts: [{ type: 'tool_call', name: 'search', id: 'call-2', arguments: { query: 'test' } }],
391
- },
392
- ]);
393
- });
394
- });
395
- describe('endToolCallSpan', () => {
396
- it('sets tool status attribute and adds stable result event', () => {
397
- const tracer = new Tracer();
398
- const span = tracer.startToolCallSpan({
399
- tool: { name: 'calc', toolUseId: 'call-1', input: {} },
400
- });
401
- const toolResult = new ToolResultBlock({
402
- toolUseId: 'call-1',
403
- status: 'success',
404
- content: [new TextBlock('42')],
405
- });
406
- tracer.endToolCallSpan(span, { toolResult });
407
- expect(mockSpan.getAttributeValue('gen_ai.tool.status')).toBe('success');
408
- const choiceEvents = mockSpan.getEvents('gen_ai.choice');
409
- expect(choiceEvents).toHaveLength(1);
410
- expect(eventAttr(choiceEvents[0], 'id')).toBe('call-1');
411
- });
412
- it('adds latest convention tool result event', () => {
413
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
414
- const tracer = new Tracer();
415
- const span = tracer.startToolCallSpan({
416
- tool: { name: 'calc', toolUseId: 'call-1', input: {} },
417
- });
418
- const toolResult = new ToolResultBlock({
419
- toolUseId: 'call-1',
420
- status: 'success',
421
- content: [new TextBlock('42')],
422
- });
423
- tracer.endToolCallSpan(span, { toolResult });
424
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
425
- const outputEvent = detailEvents.find((e) => eventAttr(e, 'gen_ai.output.messages'));
426
- expect(outputEvent).toBeDefined();
427
- const parsed = JSON.parse(eventAttr(outputEvent, 'gen_ai.output.messages'));
428
- expect(parsed[0].role).toBe('tool');
429
- expect(parsed[0].parts[0].type).toBe('tool_call_response');
430
- expect(parsed[0].parts[0].id).toBe('call-1');
431
- });
432
- it('records error on tool failure', () => {
433
- const tracer = new Tracer();
434
- const span = tracer.startToolCallSpan({
435
- tool: { name: 'calc', toolUseId: 'call-1', input: {} },
436
- });
437
- const error = new Error('tool crashed');
438
- tracer.endToolCallSpan(span, { error });
439
- expect(mockSpan.calls.setStatus).toContainEqual({
440
- status: { code: SpanStatusCode.ERROR, message: 'tool crashed' },
441
- });
442
- expect(mockSpan.calls.recordException).toContainEqual({ exception: error, time: undefined });
443
- });
444
- it('handles null span gracefully', () => {
445
- const tracer = new Tracer();
446
- expect(() => tracer.endToolCallSpan(null)).not.toThrow();
447
- });
448
- });
449
- describe('startAgentLoopSpan', () => {
450
- it('creates span with cycle id attribute', () => {
451
- const tracer = new Tracer();
452
- tracer.startAgentLoopSpan({ cycleId: 'cycle-42', messages: [textMessage('user', 'Hi')] });
453
- const [spanName, options] = getStartSpanCall();
454
- expect(spanName).toBe('execute_agent_loop_cycle');
455
- expect(options.attributes['agent_loop.cycle_id']).toBe('cycle-42');
456
- });
457
- it('adds message events to loop span', () => {
458
- const tracer = new Tracer();
459
- tracer.startAgentLoopSpan({ cycleId: 'cycle-1', messages: [textMessage('user', 'Hello')] });
460
- expect(mockSpan.getEvents('gen_ai.user.message')).toHaveLength(1);
461
- });
462
- it('creates local trace with cycleId in metadata', () => {
463
- const tracer = new Tracer();
464
- tracer.startAgentLoopSpan({ cycleId: 'cycle-123', messages: [] });
465
- const traces = tracer.localTraces;
466
- expect(traces).toEqual([
467
- expect.objectContaining({
468
- name: 'Cycle 1',
469
- metadata: expect.objectContaining({ cycleId: 'cycle-123' }),
470
- }),
471
- ]);
472
- });
473
- it('stores unique cycleIds for multiple cycles', () => {
474
- const tracer = new Tracer();
475
- tracer.startAgentLoopSpan({ cycleId: 'cycle-abc', messages: [] });
476
- tracer.endAgentLoopSpan(mockSpan);
477
- tracer.startAgentLoopSpan({ cycleId: 'cycle-xyz', messages: [] });
478
- const traces = tracer.localTraces;
479
- expect(traces).toEqual([
480
- expect.objectContaining({
481
- name: 'Cycle 1',
482
- metadata: expect.objectContaining({ cycleId: 'cycle-abc' }),
483
- }),
484
- expect.objectContaining({
485
- name: 'Cycle 2',
486
- metadata: expect.objectContaining({ cycleId: 'cycle-xyz' }),
487
- }),
488
- ]);
489
- });
490
- });
491
- describe('endAgentLoopSpan', () => {
492
- it('ends span with OK status', () => {
493
- const tracer = new Tracer();
494
- const span = tracer.startAgentLoopSpan({ cycleId: 'cycle-1', messages: [textMessage('user', 'Hi')] });
495
- tracer.endAgentLoopSpan(span);
496
- expect(mockSpan.calls.setStatus).toContainEqual({ status: { code: SpanStatusCode.OK } });
497
- expect(mockSpan.calls.end).toHaveLength(1);
498
- });
499
- it('records error on loop failure', () => {
500
- const tracer = new Tracer();
501
- const span = tracer.startAgentLoopSpan({ cycleId: 'cycle-1', messages: [textMessage('user', 'Hi')] });
502
- const error = new Error('loop failed');
503
- tracer.endAgentLoopSpan(span, { error });
504
- expect(mockSpan.calls.setStatus).toContainEqual({
505
- status: { code: SpanStatusCode.ERROR, message: 'loop failed' },
506
- });
507
- expect(mockSpan.calls.recordException).toContainEqual({ exception: error, time: undefined });
508
- });
509
- it('handles null span gracefully', () => {
510
- const tracer = new Tracer();
511
- expect(() => tracer.endAgentLoopSpan(null)).not.toThrow();
512
- });
513
- });
514
- describe('withSpanContext', () => {
515
- it('executes callback directly when span is null', () => {
516
- const tracer = new Tracer();
517
- const fn = vi.fn(() => 'result');
518
- const result = tracer.withSpanContext(null, fn);
519
- expect(result).toBe('result');
520
- expect(fn).toHaveBeenCalledOnce();
521
- expect(context.with).not.toHaveBeenCalled();
522
- });
523
- it('executes callback within span context when span is provided', () => {
524
- const tracer = new Tracer();
525
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
526
- const mockContext = { spanContext: true };
527
- vi.mocked(trace.setSpan).mockReturnValue(mockContext);
528
- tracer.withSpanContext(span, () => 'inside');
529
- expect(trace.setSpan).toHaveBeenCalledWith({}, span);
530
- expect(context.with).toHaveBeenCalledWith(mockContext, expect.any(Function));
531
- });
532
- it('propagates return value from callback', () => {
533
- const tracer = new Tracer();
534
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
535
- const result = tracer.withSpanContext(span, () => 42);
536
- expect(result).toBe(42);
537
- });
538
- });
539
- describe('message event formatting', () => {
540
- it('maps tool use blocks to tool_call parts in latest conventions', () => {
541
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
542
- const tracer = new Tracer();
543
- const messages = [
544
- new Message({
545
- role: 'assistant',
546
- content: [new ToolUseBlock({ name: 'search', toolUseId: 'tu-1', input: { q: 'test' } })],
547
- }),
548
- ];
549
- tracer.startAgentSpan({ messages, agentName: 'agent' });
550
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
551
- const parsed = JSON.parse(eventAttr(detailEvents[0], 'gen_ai.input.messages'));
552
- expect(parsed[0].parts[0]).toStrictEqual({
553
- type: 'tool_call',
554
- name: 'search',
555
- id: 'tu-1',
556
- arguments: { q: 'test' },
557
- });
558
- });
559
- it('maps tool result blocks to tool_call_response parts in latest conventions', () => {
560
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
561
- const tracer = new Tracer();
562
- const messages = [
563
- new Message({
564
- role: 'user',
565
- content: [new ToolResultBlock({ toolUseId: 'tu-1', status: 'success', content: [new TextBlock('result')] })],
566
- }),
567
- ];
568
- tracer.startAgentSpan({ messages, agentName: 'agent' });
569
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
570
- const parsed = JSON.parse(eventAttr(detailEvents[0], 'gen_ai.input.messages'));
571
- expect(parsed[0].parts[0].type).toBe('tool_call_response');
572
- expect(parsed[0].parts[0].id).toBe('tu-1');
573
- });
574
- it('serializes text block content in stable convention events', () => {
575
- const tracer = new Tracer();
576
- tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hello world')] });
577
- const userEvents = mockSpan.getEvents('gen_ai.user.message');
578
- const parsed = JSON.parse(eventAttr(userEvents[0], 'content'));
579
- expect(parsed[0].text).toBe('Hello world');
580
- });
581
- });
582
- describe('system prompt on chat spans', () => {
583
- it('emits gen_ai.system.message event with stable conventions', () => {
584
- const tracer = new Tracer();
585
- tracer.startModelInvokeSpan({
586
- messages: [textMessage('user', 'Hello')],
587
- modelId: 'test-model',
588
- systemPrompt: 'You are a helpful assistant',
589
- });
590
- const systemEvents = mockSpan.getEvents('gen_ai.system.message');
591
- expect(systemEvents).toHaveLength(1);
592
- expect(JSON.parse(eventAttr(systemEvents[0], 'content'))).toStrictEqual([
593
- { text: 'You are a helpful assistant' },
594
- ]);
595
- });
596
- it('emits gen_ai.system_instructions with latest conventions', () => {
597
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
598
- const tracer = new Tracer();
599
- tracer.startModelInvokeSpan({
600
- messages: [textMessage('user', 'Hello')],
601
- modelId: 'test-model',
602
- systemPrompt: 'You are a calculator assistant',
603
- });
604
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
605
- const systemEvent = detailEvents.find((e) => eventAttr(e, 'gen_ai.system_instructions'));
606
- expect(systemEvent).toBeDefined();
607
- expect(JSON.parse(eventAttr(systemEvent, 'gen_ai.system_instructions'))).toStrictEqual([
608
- { type: 'text', content: 'You are a calculator assistant' },
609
- ]);
610
- });
611
- it('does not emit system prompt event when systemPrompt is undefined', () => {
612
- const tracer = new Tracer();
613
- tracer.startModelInvokeSpan({
614
- messages: [textMessage('user', 'Hello')],
615
- modelId: 'test-model',
616
- });
617
- const systemEvents = mockSpan.getEvents('gen_ai.system.message');
618
- expect(systemEvents).toHaveLength(0);
619
- });
620
- it('handles SystemContentBlock array with cache points in latest conventions', () => {
621
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental');
622
- const tracer = new Tracer();
623
- tracer.startModelInvokeSpan({
624
- messages: [textMessage('user', 'Hello')],
625
- modelId: 'test-model',
626
- systemPrompt: [new TextBlock('You are helpful'), new CachePointBlock({ cacheType: 'default' })],
627
- });
628
- const detailEvents = mockSpan.getEvents('gen_ai.client.inference.operation.details');
629
- const systemEvent = detailEvents.find((e) => eventAttr(e, 'gen_ai.system_instructions'));
630
- expect(systemEvent).toBeDefined();
631
- expect(JSON.parse(eventAttr(systemEvent, 'gen_ai.system_instructions'))).toStrictEqual([
632
- { type: 'text', content: 'You are helpful' },
633
- { type: 'cache_point', cacheType: 'default' },
634
- ]);
635
- });
636
- it('serializes SystemContentBlock array in stable conventions', () => {
637
- const tracer = new Tracer();
638
- tracer.startModelInvokeSpan({
639
- messages: [textMessage('user', 'Hello')],
640
- modelId: 'test-model',
641
- systemPrompt: [new TextBlock('You are helpful'), new CachePointBlock({ cacheType: 'default' })],
642
- });
643
- const systemEvents = mockSpan.getEvents('gen_ai.system.message');
644
- expect(systemEvents).toHaveLength(1);
645
- const parsed = JSON.parse(eventAttr(systemEvents[0], 'content'));
646
- expect(parsed).toHaveLength(2);
647
- expect(parsed[0]).toStrictEqual({ text: 'You are helpful' });
648
- expect(parsed[1]).toStrictEqual({ cachePoint: { cacheType: 'default' } });
649
- });
650
- });
651
- describe('timeToFirstByteMs', () => {
652
- it('does not set TTFB as span attribute (TTFB is a histogram metric, not a span attribute)', () => {
653
- const tracer = new Tracer();
654
- const span = tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] });
655
- tracer.endModelInvokeSpan(span, {
656
- usage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },
657
- metrics: { latencyMs: 500, timeToFirstByteMs: 150 },
658
- });
659
- expect(mockSpan.getAttributeValue('gen_ai.server.time_to_first_token')).toBeUndefined();
660
- expect(mockSpan.getAttributeValue('gen_ai.server.request.duration')).toBe(500);
661
- });
662
- });
663
- describe('Langfuse detection', () => {
664
- it('sets langfuse.observation.type on agent span when OTEL_EXPORTER_OTLP_ENDPOINT contains langfuse', () => {
665
- vi.stubEnv('OTEL_EXPORTER_OTLP_ENDPOINT', 'https://us.cloud.langfuse.com');
666
- const tracer = new Tracer();
667
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
668
- tracer.endAgentSpan(span, {
669
- accumulatedUsage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },
670
- });
671
- expect(mockSpan.getAttributeValue('langfuse.observation.type')).toBe('span');
672
- });
673
- it('sets langfuse.observation.type when OTEL_EXPORTER_OTLP_TRACES_ENDPOINT contains langfuse', () => {
674
- vi.stubEnv('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', 'https://us.cloud.langfuse.com/api/public/otel/v1/traces');
675
- const tracer = new Tracer();
676
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
677
- tracer.endAgentSpan(span, {
678
- accumulatedUsage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },
679
- });
680
- expect(mockSpan.getAttributeValue('langfuse.observation.type')).toBe('span');
681
- });
682
- it('sets langfuse.observation.type when LANGFUSE_BASE_URL is set', () => {
683
- vi.stubEnv('LANGFUSE_BASE_URL', 'https://self-hosted.example.com');
684
- const tracer = new Tracer();
685
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
686
- tracer.endAgentSpan(span, {
687
- accumulatedUsage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },
688
- });
689
- expect(mockSpan.getAttributeValue('langfuse.observation.type')).toBe('span');
690
- });
691
- it('does not set langfuse.observation.type when no langfuse env vars are set', () => {
692
- vi.stubEnv('OTEL_EXPORTER_OTLP_ENDPOINT', '');
693
- vi.stubEnv('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', '');
694
- vi.stubEnv('LANGFUSE_BASE_URL', '');
695
- const tracer = new Tracer();
696
- const span = tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
697
- tracer.endAgentSpan(span, {
698
- accumulatedUsage: { inputTokens: 10, outputTokens: 20, totalTokens: 30 },
699
- });
700
- expect(mockSpan.getAttributeValue('langfuse.observation.type')).toBeUndefined();
701
- });
702
- });
703
- describe('error resilience', () => {
704
- it.each([
705
- {
706
- method: 'startAgentSpan',
707
- call: (tracer) => tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' }),
708
- },
709
- {
710
- method: 'startModelInvokeSpan',
711
- call: (tracer) => tracer.startModelInvokeSpan({ messages: [textMessage('user', 'Hi')] }),
712
- },
713
- {
714
- method: 'startToolCallSpan',
715
- call: (tracer) => tracer.startToolCallSpan({ tool: { name: 'x', toolUseId: 'y', input: {} } }),
716
- },
717
- {
718
- method: 'startAgentLoopSpan',
719
- call: (tracer) => tracer.startAgentLoopSpan({ cycleId: 'c', messages: [textMessage('user', 'Hi')] }),
720
- },
721
- ])('returns null when $method throws internally', ({ call }) => {
722
- mockStartSpan.mockImplementation(() => {
723
- throw new Error('otel failure');
724
- });
725
- const tracer = new Tracer();
726
- expect(call(tracer)).toBeNull();
727
- });
728
- it('does not throw when ending null spans with errors', () => {
729
- const tracer = new Tracer();
730
- expect(() => {
731
- tracer.endAgentSpan(null, { error: new Error('test') });
732
- tracer.endModelInvokeSpan(null, { error: new Error('test') });
733
- tracer.endToolCallSpan(null, { error: new Error('test') });
734
- tracer.endAgentLoopSpan(null, { error: new Error('test') });
735
- }).not.toThrow();
736
- });
737
- });
738
- describe('semantic convention opt-in parsing', () => {
739
- it('parses multiple comma-separated opt-in values', () => {
740
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', 'gen_ai_latest_experimental,gen_ai_tool_definitions');
741
- const tracer = new Tracer();
742
- const toolsConfig = { calc: { name: 'calc', description: 'Calculator' } };
743
- tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent', toolsConfig });
744
- const [, options] = getStartSpanCall();
745
- expect(options.attributes['gen_ai.provider.name']).toBeDefined();
746
- expect(options.attributes['gen_ai.tool.definitions']).toBe(JSON.stringify(toolsConfig));
747
- });
748
- it('handles whitespace in opt-in values', () => {
749
- vi.stubEnv('OTEL_SEMCONV_STABILITY_OPT_IN', ' gen_ai_latest_experimental , gen_ai_tool_definitions ');
750
- const tracer = new Tracer();
751
- tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
752
- const [, options] = getStartSpanCall();
753
- expect(options.attributes['gen_ai.provider.name']).toBeDefined();
754
- });
755
- it('defaults to stable conventions when env var is empty', () => {
756
- const tracer = new Tracer();
757
- tracer.startAgentSpan({ messages: [textMessage('user', 'Hi')], agentName: 'agent' });
758
- const [, options] = getStartSpanCall();
759
- expect(options.attributes['gen_ai.system']).toBeDefined();
760
- expect(options.attributes['gen_ai.provider.name']).toBeUndefined();
761
- });
762
- });
763
- describe('memory spans', () => {
764
- it('startMemorySearchSpan sets attributes and records the query as an event', () => {
765
- const tracer = new Tracer();
766
- tracer.startMemorySearchSpan({
767
- query: 'dark mode preference',
768
- storeNames: ['personal', 'team'],
769
- maxSearchResults: 5,
770
- });
771
- const [spanName, options] = getStartSpanCall();
772
- expect(spanName).toBe('memory.search');
773
- expect(options.attributes).toMatchObject({
774
- 'gen_ai.operation.name': 'memory.search',
775
- 'memory.store.names': JSON.stringify(['personal', 'team']),
776
- 'memory.store.count': 2,
777
- 'memory.max_search_results': 5,
778
- });
779
- expect(eventAttr(mockSpan.getEvents('memory.query')[0], 'content')).toBe('dark mode preference');
780
- });
781
- it('endMemorySearchSpan records result/failure counts and the entries event', () => {
782
- const tracer = new Tracer();
783
- const span = tracer.startMemorySearchSpan({ query: 'q', storeNames: ['personal'] });
784
- tracer.endMemorySearchSpan(span, {
785
- entries: [{ content: 'likes dark mode', storeName: 'personal', metadata: { score: 0.9 } }],
786
- storeFailureCount: 1,
787
- });
788
- expect(mockSpan.calls.setAttributes).toContainEqual({
789
- attributes: {
790
- 'memory.result.count': 1,
791
- 'memory.store.failure_count': 1,
792
- 'gen_ai.event.end_time': expect.any(String),
793
- },
794
- });
795
- expect(mockSpan.getEvents('memory.results')).toHaveLength(1);
796
- expect(mockSpan.calls.setStatus).toContainEqual({ status: { code: SpanStatusCode.OK } });
797
- });
798
- it('endMemorySearchSpan records error and skips the results event', () => {
799
- const tracer = new Tracer();
800
- const span = tracer.startMemorySearchSpan({ query: 'q', storeNames: ['personal'] });
801
- const error = new Error('store missing');
802
- tracer.endMemorySearchSpan(span, { error });
803
- expect(mockSpan.getEvents('memory.results')).toHaveLength(0);
804
- expect(mockSpan.calls.setStatus).toContainEqual({
805
- status: { code: SpanStatusCode.ERROR, message: 'store missing' },
806
- });
807
- expect(mockSpan.calls.recordException).toContainEqual({ exception: error, time: undefined });
808
- });
809
- it('startMemoryAddSpan records content as an event', () => {
810
- const tracer = new Tracer();
811
- tracer.startMemoryAddSpan({ content: 'remember dark mode', storeNames: ['personal'] });
812
- const [spanName, options] = getStartSpanCall();
813
- expect(spanName).toBe('memory.add');
814
- expect(options.attributes).toMatchObject({
815
- 'gen_ai.operation.name': 'memory.add',
816
- 'memory.store.names': JSON.stringify(['personal']),
817
- 'memory.store.count': 1,
818
- });
819
- expect(eventAttr(mockSpan.getEvents('memory.content')[0], 'content')).toBe('remember dark mode');
820
- });
821
- it('endMemoryAddSpan records the store failure count and error', () => {
822
- const tracer = new Tracer();
823
- const span = tracer.startMemoryAddSpan({ content: 'x', storeNames: ['personal'] });
824
- const error = new Error('write failed');
825
- tracer.endMemoryAddSpan(span, { storeFailureCount: 2, error });
826
- expect(mockSpan.calls.setStatus).toContainEqual({
827
- status: { code: SpanStatusCode.ERROR, message: 'write failed' },
828
- });
829
- expect(mockSpan.calls.recordException).toContainEqual({ exception: error, time: undefined });
830
- });
831
- it('memory inject span: start sets max_entries, end records injected and entry count', () => {
832
- const tracer = new Tracer();
833
- const span = tracer.startMemoryInjectSpan({ maxEntries: 5 });
834
- const [spanName, options] = getStartSpanCall();
835
- expect(spanName).toBe('memory.inject');
836
- expect(options.attributes['memory.max_entries']).toBe(5);
837
- tracer.endMemoryInjectSpan(span, { injected: true, entryCount: 3 });
838
- expect(mockSpan.calls.setAttributes).toContainEqual({
839
- attributes: { 'memory.injected': true, 'memory.entry.count': 3, 'gen_ai.event.end_time': expect.any(String) },
840
- });
841
- expect(mockSpan.calls.setStatus).toContainEqual({ status: { code: SpanStatusCode.OK } });
842
- });
843
- it('endMemoryInjectSpan fails open on a format error (OK status, flag set)', () => {
844
- const tracer = new Tracer();
845
- const span = tracer.startMemoryInjectSpan({});
846
- tracer.endMemoryInjectSpan(span, { injected: false, formatError: true });
847
- expect(mockSpan.calls.setAttributes).toContainEqual({
848
- attributes: {
849
- 'memory.injected': false,
850
- 'memory.entry.count': 0,
851
- 'memory.inject.format_error': true,
852
- 'gen_ai.event.end_time': expect.any(String),
853
- },
854
- });
855
- expect(mockSpan.calls.setStatus).toContainEqual({ status: { code: SpanStatusCode.OK } });
856
- expect(mockSpan.calls.recordException).toHaveLength(0);
857
- });
858
- it('startMemoryExtractSpan is a root span (forceRoot, no parent context)', () => {
859
- const tracer = new Tracer();
860
- tracer.startMemoryExtractSpan({
861
- storeName: 'personal',
862
- messageCount: 2,
863
- filteredCount: 1,
864
- extractor: 'ModelExtractor',
865
- });
866
- const [spanName, options] = getStartSpanCall();
867
- expect(spanName).toBe('memory.extract');
868
- expect(options.attributes).toMatchObject({
869
- 'gen_ai.operation.name': 'memory.extract',
870
- 'memory.store.name': 'personal',
871
- 'memory.message.count': 2,
872
- 'memory.message.filtered_count': 1,
873
- 'memory.extractor': 'ModelExtractor',
874
- });
875
- // forceRoot passes ROOT_CONTEXT (no active span) as the third startSpan arg.
876
- const startCtx = mockStartSpan.mock.calls[0][2];
877
- expect(startCtx).toBeDefined();
878
- });
879
- it('startMemoryExtractSpan attaches a valid agent span context as a link', () => {
880
- const tracer = new Tracer();
881
- const agentSpanContext = {
882
- traceId: 'abcdef01234567890abcdef012345678',
883
- spanId: 'abcdef0123456789',
884
- traceFlags: 1,
885
- };
886
- tracer.startMemoryExtractSpan({ storeName: 'personal', messageCount: 1, agentSpanContext });
887
- const options = mockStartSpan.mock.calls[0][1];
888
- expect(options.links).toHaveLength(1);
889
- expect(options.links[0].context).toBe(agentSpanContext);
890
- // The detached root has no OTel parent, so the scheduling run's ids are also recorded as
891
- // plain attributes for backends that don't render span links.
892
- expect(options.attributes).toMatchObject({
893
- 'memory.parent.trace_id': 'abcdef01234567890abcdef012345678',
894
- 'memory.parent.span_id': 'abcdef0123456789',
895
- });
896
- });
897
- it('startMemoryExtractSpan skips the link and parent ids for an invalid agent span context', () => {
898
- const tracer = new Tracer();
899
- const invalid = { traceId: '00000000000000000000000000000000', spanId: '0000000000000000', traceFlags: 0 };
900
- tracer.startMemoryExtractSpan({ storeName: 'personal', messageCount: 1, agentSpanContext: invalid });
901
- const options = mockStartSpan.mock.calls[0][1];
902
- expect(options.links).toBeUndefined();
903
- expect(options.attributes).not.toHaveProperty('memory.parent.trace_id');
904
- expect(options.attributes).not.toHaveProperty('memory.parent.span_id');
905
- });
906
- it('endMemoryExtractSpan records the entry count on success', () => {
907
- const tracer = new Tracer();
908
- const span = tracer.startMemoryExtractSpan({ storeName: 'personal', messageCount: 1 });
909
- tracer.endMemoryExtractSpan(span, { entryCount: 3 });
910
- expect(mockSpan.calls.setAttributes).toContainEqual({
911
- attributes: { 'memory.entry.count': 3, 'gen_ai.event.end_time': expect.any(String) },
912
- });
913
- expect(mockSpan.calls.setStatus).toContainEqual({ status: { code: SpanStatusCode.OK } });
914
- });
915
- it('endMemoryExtractSpan records error (failures are swallowed by the coordinator)', () => {
916
- const tracer = new Tracer();
917
- const span = tracer.startMemoryExtractSpan({ storeName: 'personal', messageCount: 1 });
918
- const error = new Error('save failed');
919
- tracer.endMemoryExtractSpan(span, { error });
920
- expect(mockSpan.calls.setStatus).toContainEqual({
921
- status: { code: SpanStatusCode.ERROR, message: 'save failed' },
922
- });
923
- expect(mockSpan.calls.recordException).toContainEqual({ exception: error, time: undefined });
924
- });
925
- it('memory span methods handle a null span gracefully', () => {
926
- const tracer = new Tracer();
927
- expect(() => tracer.endMemorySearchSpan(null, { entries: [] })).not.toThrow();
928
- expect(() => tracer.endMemoryAddSpan(null)).not.toThrow();
929
- expect(() => tracer.endMemoryInjectSpan(null, { injected: false })).not.toThrow();
930
- expect(() => tracer.endMemoryExtractSpan(null)).not.toThrow();
931
- });
932
- });
933
- describe('currentSpanContext', () => {
934
- it('returns undefined when no span is active', () => {
935
- vi.mocked(trace.getActiveSpan).mockReturnValue(undefined);
936
- expect(new Tracer().currentSpanContext()).toBeUndefined();
937
- });
938
- it('returns undefined for a non-recording active span', () => {
939
- // A non-recording span (tracing disabled / sampled out) must not be captured for linking.
940
- const span = { isRecording: () => false, spanContext: () => ({ traceId: 't', spanId: 's', traceFlags: 1 }) };
941
- vi.mocked(trace.getActiveSpan).mockReturnValue(span);
942
- expect(new Tracer().currentSpanContext()).toBeUndefined();
943
- });
944
- it('returns undefined for a recording span with an invalid (all-zeros) context', () => {
945
- const invalid = { traceId: '00000000000000000000000000000000', spanId: '0000000000000000', traceFlags: 0 };
946
- const span = { isRecording: () => true, spanContext: () => invalid };
947
- vi.mocked(trace.getActiveSpan).mockReturnValue(span);
948
- expect(new Tracer().currentSpanContext()).toBeUndefined();
949
- });
950
- it('returns the context for a recording span with a valid context', () => {
951
- const valid = { traceId: 'abcdef01234567890abcdef012345678', spanId: 'abcdef0123456789', traceFlags: 1 };
952
- const span = { isRecording: () => true, spanContext: () => valid };
953
- vi.mocked(trace.getActiveSpan).mockReturnValue(span);
954
- expect(new Tracer().currentSpanContext()).toBe(valid);
955
- });
956
- });
957
- });
958
- //# sourceMappingURL=tracer.test.node.js.map