@strands-agents/sdk 1.7.0 → 1.9.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 (686) hide show
  1. package/dist/src/agent/agent.d.ts +32 -2
  2. package/dist/src/agent/agent.d.ts.map +1 -1
  3. package/dist/src/agent/agent.js +92 -4
  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/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  8. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +2 -0
  9. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  10. package/dist/src/errors.d.ts +7 -0
  11. package/dist/src/errors.d.ts.map +1 -1
  12. package/dist/src/errors.js +10 -0
  13. package/dist/src/errors.js.map +1 -1
  14. package/dist/src/experimental/checkpoint.d.ts +118 -0
  15. package/dist/src/experimental/checkpoint.d.ts.map +1 -0
  16. package/dist/src/experimental/checkpoint.js +108 -0
  17. package/dist/src/experimental/checkpoint.js.map +1 -0
  18. package/dist/src/experimental/index.d.ts +10 -0
  19. package/dist/src/experimental/index.d.ts.map +1 -0
  20. package/dist/src/experimental/index.js +9 -0
  21. package/dist/src/experimental/index.js.map +1 -0
  22. package/dist/src/index.d.ts +1 -1
  23. package/dist/src/index.d.ts.map +1 -1
  24. package/dist/src/index.js +1 -1
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/index.node.d.ts.map +1 -1
  27. package/dist/src/index.node.js +3 -0
  28. package/dist/src/index.node.js.map +1 -1
  29. package/dist/src/injection/message-injection.d.ts.map +1 -1
  30. package/dist/src/injection/message-injection.js +2 -0
  31. package/dist/src/injection/message-injection.js.map +1 -1
  32. package/dist/src/interventions/actions.d.ts.map +1 -1
  33. package/dist/src/interventions/actions.js.map +1 -1
  34. package/dist/src/{mcp.d.ts → mcp/client.d.ts} +13 -4
  35. package/dist/src/mcp/client.d.ts.map +1 -0
  36. package/dist/src/{mcp.js → mcp/client.js} +15 -3
  37. package/dist/src/mcp/client.js.map +1 -0
  38. package/dist/src/mcp/config.d.ts +52 -0
  39. package/dist/src/mcp/config.d.ts.map +1 -0
  40. package/dist/src/mcp/config.js +12 -0
  41. package/dist/src/mcp/config.js.map +1 -0
  42. package/dist/src/mcp/config.node.d.ts +16 -0
  43. package/dist/src/mcp/config.node.d.ts.map +1 -0
  44. package/dist/src/mcp/config.node.js +145 -0
  45. package/dist/src/mcp/config.node.js.map +1 -0
  46. package/dist/src/mcp/index.d.ts +3 -0
  47. package/dist/src/mcp/index.d.ts.map +1 -0
  48. package/dist/src/mcp/index.js +2 -0
  49. package/dist/src/mcp/index.js.map +1 -0
  50. package/dist/src/models/model.d.ts.map +1 -1
  51. package/dist/src/models/model.js +2 -1
  52. package/dist/src/models/model.js.map +1 -1
  53. package/dist/src/multiagent/graph.d.ts +7 -0
  54. package/dist/src/multiagent/graph.d.ts.map +1 -1
  55. package/dist/src/multiagent/graph.js +22 -1
  56. package/dist/src/multiagent/graph.js.map +1 -1
  57. package/dist/src/multiagent/multiagent.d.ts +2 -1
  58. package/dist/src/multiagent/multiagent.d.ts.map +1 -1
  59. package/dist/src/multiagent/multiagent.js.map +1 -1
  60. package/dist/src/multiagent/nodes.d.ts +5 -0
  61. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  62. package/dist/src/multiagent/nodes.js +15 -0
  63. package/dist/src/multiagent/nodes.js.map +1 -1
  64. package/dist/src/multiagent/state.d.ts.map +1 -1
  65. package/dist/src/multiagent/state.js.map +1 -1
  66. package/dist/src/tools/function-tool.d.ts +1 -1
  67. package/dist/src/tools/function-tool.d.ts.map +1 -1
  68. package/dist/src/tools/function-tool.js +4 -12
  69. package/dist/src/tools/function-tool.js.map +1 -1
  70. package/dist/src/tools/mcp-tool.d.ts +2 -1
  71. package/dist/src/tools/mcp-tool.d.ts.map +1 -1
  72. package/dist/src/tools/mcp-tool.js +1 -0
  73. package/dist/src/tools/mcp-tool.js.map +1 -1
  74. package/dist/src/tools/tool-factory.d.ts +1 -1
  75. package/dist/src/tools/tool-factory.d.ts.map +1 -1
  76. package/dist/src/tools/types.d.ts +4 -0
  77. package/dist/src/tools/types.d.ts.map +1 -1
  78. package/dist/src/tools/zod-tool.d.ts +4 -2
  79. package/dist/src/tools/zod-tool.d.ts.map +1 -1
  80. package/dist/src/tools/zod-tool.js.map +1 -1
  81. package/dist/src/tsconfig.tsbuildinfo +1 -1
  82. package/dist/src/types/agent.d.ts +18 -1
  83. package/dist/src/types/agent.d.ts.map +1 -1
  84. package/dist/src/types/agent.js +12 -0
  85. package/dist/src/types/agent.js.map +1 -1
  86. package/dist/src/types/media.d.ts.map +1 -1
  87. package/dist/src/types/media.js.map +1 -1
  88. package/dist/src/types/messages.d.ts +22 -1
  89. package/dist/src/types/messages.d.ts.map +1 -1
  90. package/dist/src/types/messages.js +22 -0
  91. package/dist/src/types/messages.js.map +1 -1
  92. package/dist/src/vended-memory-stores/test-memory-store/index.d.ts +2 -0
  93. package/dist/src/vended-memory-stores/test-memory-store/index.d.ts.map +1 -0
  94. package/dist/src/vended-memory-stores/test-memory-store/index.js +2 -0
  95. package/dist/src/vended-memory-stores/test-memory-store/index.js.map +1 -0
  96. package/dist/src/vended-memory-stores/test-memory-store/store.d.ts +122 -0
  97. package/dist/src/vended-memory-stores/test-memory-store/store.d.ts.map +1 -0
  98. package/dist/src/vended-memory-stores/test-memory-store/store.js +281 -0
  99. package/dist/src/vended-memory-stores/test-memory-store/store.js.map +1 -0
  100. package/dist/src/vended-plugins/context-offloader/search.d.ts.map +1 -1
  101. package/dist/src/vended-plugins/context-offloader/search.js +4 -2
  102. package/dist/src/vended-plugins/context-offloader/search.js.map +1 -1
  103. package/dist/src/vended-plugins/context-offloader/storage.js +1 -1
  104. package/dist/src/vended-plugins/context-offloader/storage.js.map +1 -1
  105. package/dist/src/vended-plugins/skills/skill.d.ts.map +1 -1
  106. package/dist/src/vended-plugins/skills/skill.js.map +1 -1
  107. package/dist/src/vended-tools/notebook/notebook.d.ts +1 -1
  108. package/package.json +41 -30
  109. package/dist/src/__fixtures__/agent-helpers.d.ts +0 -136
  110. package/dist/src/__fixtures__/agent-helpers.d.ts.map +0 -1
  111. package/dist/src/__fixtures__/agent-helpers.js +0 -156
  112. package/dist/src/__fixtures__/agent-helpers.js.map +0 -1
  113. package/dist/src/__fixtures__/environment.d.ts +0 -12
  114. package/dist/src/__fixtures__/environment.d.ts.map +0 -1
  115. package/dist/src/__fixtures__/environment.js +0 -12
  116. package/dist/src/__fixtures__/environment.js.map +0 -1
  117. package/dist/src/__fixtures__/metrics-helpers.d.ts +0 -55
  118. package/dist/src/__fixtures__/metrics-helpers.d.ts.map +0 -1
  119. package/dist/src/__fixtures__/metrics-helpers.js +0 -57
  120. package/dist/src/__fixtures__/metrics-helpers.js.map +0 -1
  121. package/dist/src/__fixtures__/mock-message-model.d.ts +0 -103
  122. package/dist/src/__fixtures__/mock-message-model.d.ts.map +0 -1
  123. package/dist/src/__fixtures__/mock-message-model.js +0 -245
  124. package/dist/src/__fixtures__/mock-message-model.js.map +0 -1
  125. package/dist/src/__fixtures__/mock-meter.d.ts +0 -32
  126. package/dist/src/__fixtures__/mock-meter.d.ts.map +0 -1
  127. package/dist/src/__fixtures__/mock-meter.js +0 -47
  128. package/dist/src/__fixtures__/mock-meter.js.map +0 -1
  129. package/dist/src/__fixtures__/mock-plugin.d.ts +0 -13
  130. package/dist/src/__fixtures__/mock-plugin.d.ts.map +0 -1
  131. package/dist/src/__fixtures__/mock-plugin.js +0 -35
  132. package/dist/src/__fixtures__/mock-plugin.js.map +0 -1
  133. package/dist/src/__fixtures__/mock-span.d.ts +0 -78
  134. package/dist/src/__fixtures__/mock-span.d.ts.map +0 -1
  135. package/dist/src/__fixtures__/mock-span.js +0 -93
  136. package/dist/src/__fixtures__/mock-span.js.map +0 -1
  137. package/dist/src/__fixtures__/mock-storage-provider.d.ts +0 -42
  138. package/dist/src/__fixtures__/mock-storage-provider.d.ts.map +0 -1
  139. package/dist/src/__fixtures__/mock-storage-provider.js +0 -122
  140. package/dist/src/__fixtures__/mock-storage-provider.js.map +0 -1
  141. package/dist/src/__fixtures__/model-test-helpers.d.ts +0 -56
  142. package/dist/src/__fixtures__/model-test-helpers.d.ts.map +0 -1
  143. package/dist/src/__fixtures__/model-test-helpers.js +0 -85
  144. package/dist/src/__fixtures__/model-test-helpers.js.map +0 -1
  145. package/dist/src/__fixtures__/register-node-defaults.d.ts +0 -2
  146. package/dist/src/__fixtures__/register-node-defaults.d.ts.map +0 -1
  147. package/dist/src/__fixtures__/register-node-defaults.js +0 -6
  148. package/dist/src/__fixtures__/register-node-defaults.js.map +0 -1
  149. package/dist/src/__fixtures__/slim-types.d.ts +0 -51
  150. package/dist/src/__fixtures__/slim-types.d.ts.map +0 -1
  151. package/dist/src/__fixtures__/slim-types.js +0 -6
  152. package/dist/src/__fixtures__/slim-types.js.map +0 -1
  153. package/dist/src/__fixtures__/test-sandbox.node.d.ts +0 -15
  154. package/dist/src/__fixtures__/test-sandbox.node.d.ts.map +0 -1
  155. package/dist/src/__fixtures__/test-sandbox.node.js +0 -23
  156. package/dist/src/__fixtures__/test-sandbox.node.js.map +0 -1
  157. package/dist/src/__fixtures__/tool-helpers.d.ts +0 -45
  158. package/dist/src/__fixtures__/tool-helpers.d.ts.map +0 -1
  159. package/dist/src/__fixtures__/tool-helpers.js +0 -101
  160. package/dist/src/__fixtures__/tool-helpers.js.map +0 -1
  161. package/dist/src/__tests__/default-slot.test.d.ts +0 -2
  162. package/dist/src/__tests__/default-slot.test.d.ts.map +0 -1
  163. package/dist/src/__tests__/default-slot.test.js +0 -33
  164. package/dist/src/__tests__/default-slot.test.js.map +0 -1
  165. package/dist/src/__tests__/errors.test.d.ts +0 -2
  166. package/dist/src/__tests__/errors.test.d.ts.map +0 -1
  167. package/dist/src/__tests__/errors.test.js +0 -170
  168. package/dist/src/__tests__/errors.test.js.map +0 -1
  169. package/dist/src/__tests__/index.test.d.ts +0 -2
  170. package/dist/src/__tests__/index.test.d.ts.map +0 -1
  171. package/dist/src/__tests__/index.test.js +0 -48
  172. package/dist/src/__tests__/index.test.js.map +0 -1
  173. package/dist/src/__tests__/interrupt.test.d.ts +0 -2
  174. package/dist/src/__tests__/interrupt.test.d.ts.map +0 -1
  175. package/dist/src/__tests__/interrupt.test.js +0 -264
  176. package/dist/src/__tests__/interrupt.test.js.map +0 -1
  177. package/dist/src/__tests__/mcp.test.d.ts +0 -2
  178. package/dist/src/__tests__/mcp.test.d.ts.map +0 -1
  179. package/dist/src/__tests__/mcp.test.js +0 -1003
  180. package/dist/src/__tests__/mcp.test.js.map +0 -1
  181. package/dist/src/__tests__/mime.test.d.ts +0 -2
  182. package/dist/src/__tests__/mime.test.d.ts.map +0 -1
  183. package/dist/src/__tests__/mime.test.js +0 -83
  184. package/dist/src/__tests__/mime.test.js.map +0 -1
  185. package/dist/src/__tests__/state-store.test.d.ts +0 -2
  186. package/dist/src/__tests__/state-store.test.d.ts.map +0 -1
  187. package/dist/src/__tests__/state-store.test.js +0 -285
  188. package/dist/src/__tests__/state-store.test.js.map +0 -1
  189. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts +0 -2
  190. package/dist/src/a2a/__tests__/a2a-agent.test.d.ts.map +0 -1
  191. package/dist/src/a2a/__tests__/a2a-agent.test.js +0 -383
  192. package/dist/src/a2a/__tests__/a2a-agent.test.js.map +0 -1
  193. package/dist/src/a2a/__tests__/adapters.test.d.ts +0 -2
  194. package/dist/src/a2a/__tests__/adapters.test.d.ts.map +0 -1
  195. package/dist/src/a2a/__tests__/adapters.test.js +0 -151
  196. package/dist/src/a2a/__tests__/adapters.test.js.map +0 -1
  197. package/dist/src/a2a/__tests__/async-lock.test.d.ts +0 -2
  198. package/dist/src/a2a/__tests__/async-lock.test.d.ts.map +0 -1
  199. package/dist/src/a2a/__tests__/async-lock.test.js +0 -137
  200. package/dist/src/a2a/__tests__/async-lock.test.js.map +0 -1
  201. package/dist/src/a2a/__tests__/events.test.d.ts +0 -2
  202. package/dist/src/a2a/__tests__/events.test.d.ts.map +0 -1
  203. package/dist/src/a2a/__tests__/events.test.js +0 -68
  204. package/dist/src/a2a/__tests__/events.test.js.map +0 -1
  205. package/dist/src/a2a/__tests__/executor.test.d.ts +0 -2
  206. package/dist/src/a2a/__tests__/executor.test.d.ts.map +0 -1
  207. package/dist/src/a2a/__tests__/executor.test.js +0 -345
  208. package/dist/src/a2a/__tests__/executor.test.js.map +0 -1
  209. package/dist/src/a2a/__tests__/server.test.d.ts +0 -2
  210. package/dist/src/a2a/__tests__/server.test.d.ts.map +0 -1
  211. package/dist/src/a2a/__tests__/server.test.js +0 -71
  212. package/dist/src/a2a/__tests__/server.test.js.map +0 -1
  213. package/dist/src/a2a/__tests__/server.test.node.d.ts +0 -2
  214. package/dist/src/a2a/__tests__/server.test.node.d.ts.map +0 -1
  215. package/dist/src/a2a/__tests__/server.test.node.js +0 -110
  216. package/dist/src/a2a/__tests__/server.test.node.js.map +0 -1
  217. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts +0 -2
  218. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.d.ts.map +0 -1
  219. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js +0 -23
  220. package/dist/src/agent/__tests__/agent-as-tool.invocation-state.test.js.map +0 -1
  221. package/dist/src/agent/__tests__/agent-as-tool.test.d.ts +0 -2
  222. package/dist/src/agent/__tests__/agent-as-tool.test.d.ts.map +0 -1
  223. package/dist/src/agent/__tests__/agent-as-tool.test.js +0 -347
  224. package/dist/src/agent/__tests__/agent-as-tool.test.js.map +0 -1
  225. package/dist/src/agent/__tests__/agent.cancel.test.d.ts +0 -2
  226. package/dist/src/agent/__tests__/agent.cancel.test.d.ts.map +0 -1
  227. package/dist/src/agent/__tests__/agent.cancel.test.js +0 -337
  228. package/dist/src/agent/__tests__/agent.cancel.test.js.map +0 -1
  229. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts +0 -2
  230. package/dist/src/agent/__tests__/agent.concurrent.test.d.ts.map +0 -1
  231. package/dist/src/agent/__tests__/agent.concurrent.test.js +0 -488
  232. package/dist/src/agent/__tests__/agent.concurrent.test.js.map +0 -1
  233. package/dist/src/agent/__tests__/agent.context-manager.test.d.ts +0 -2
  234. package/dist/src/agent/__tests__/agent.context-manager.test.d.ts.map +0 -1
  235. package/dist/src/agent/__tests__/agent.context-manager.test.js +0 -106
  236. package/dist/src/agent/__tests__/agent.context-manager.test.js.map +0 -1
  237. package/dist/src/agent/__tests__/agent.hook.test.d.ts +0 -2
  238. package/dist/src/agent/__tests__/agent.hook.test.d.ts.map +0 -1
  239. package/dist/src/agent/__tests__/agent.hook.test.js +0 -1332
  240. package/dist/src/agent/__tests__/agent.hook.test.js.map +0 -1
  241. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts +0 -2
  242. package/dist/src/agent/__tests__/agent.interrupt.test.d.ts.map +0 -1
  243. package/dist/src/agent/__tests__/agent.interrupt.test.js +0 -779
  244. package/dist/src/agent/__tests__/agent.interrupt.test.js.map +0 -1
  245. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts +0 -2
  246. package/dist/src/agent/__tests__/agent.invocation-state.test.d.ts.map +0 -1
  247. package/dist/src/agent/__tests__/agent.invocation-state.test.js +0 -219
  248. package/dist/src/agent/__tests__/agent.invocation-state.test.js.map +0 -1
  249. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts +0 -2
  250. package/dist/src/agent/__tests__/agent.model-retry.test.d.ts.map +0 -1
  251. package/dist/src/agent/__tests__/agent.model-retry.test.js +0 -161
  252. package/dist/src/agent/__tests__/agent.model-retry.test.js.map +0 -1
  253. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts +0 -2
  254. package/dist/src/agent/__tests__/agent.stateful-model.test.d.ts.map +0 -1
  255. package/dist/src/agent/__tests__/agent.stateful-model.test.js +0 -169
  256. package/dist/src/agent/__tests__/agent.stateful-model.test.js.map +0 -1
  257. package/dist/src/agent/__tests__/agent.test.d.ts +0 -2
  258. package/dist/src/agent/__tests__/agent.test.d.ts.map +0 -1
  259. package/dist/src/agent/__tests__/agent.test.js +0 -1624
  260. package/dist/src/agent/__tests__/agent.test.js.map +0 -1
  261. package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts +0 -2
  262. package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts.map +0 -1
  263. package/dist/src/agent/__tests__/agent.tracer.test.node.js +0 -535
  264. package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +0 -1
  265. package/dist/src/agent/__tests__/printer.test.d.ts +0 -2
  266. package/dist/src/agent/__tests__/printer.test.d.ts.map +0 -1
  267. package/dist/src/agent/__tests__/printer.test.js +0 -188
  268. package/dist/src/agent/__tests__/printer.test.js.map +0 -1
  269. package/dist/src/agent/__tests__/snapshot.test.d.ts +0 -2
  270. package/dist/src/agent/__tests__/snapshot.test.d.ts.map +0 -1
  271. package/dist/src/agent/__tests__/snapshot.test.js +0 -442
  272. package/dist/src/agent/__tests__/snapshot.test.js.map +0 -1
  273. package/dist/src/agent/__tests__/tool-caller.test.d.ts +0 -2
  274. package/dist/src/agent/__tests__/tool-caller.test.d.ts.map +0 -1
  275. package/dist/src/agent/__tests__/tool-caller.test.js +0 -459
  276. package/dist/src/agent/__tests__/tool-caller.test.js.map +0 -1
  277. package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts +0 -2
  278. package/dist/src/conversation-manager/__tests__/agentic-context.test.d.ts.map +0 -1
  279. package/dist/src/conversation-manager/__tests__/agentic-context.test.js +0 -332
  280. package/dist/src/conversation-manager/__tests__/agentic-context.test.js.map +0 -1
  281. package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts +0 -2
  282. package/dist/src/conversation-manager/__tests__/context-compression.test.d.ts.map +0 -1
  283. package/dist/src/conversation-manager/__tests__/context-compression.test.js +0 -176
  284. package/dist/src/conversation-manager/__tests__/context-compression.test.js.map +0 -1
  285. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts +0 -2
  286. package/dist/src/conversation-manager/__tests__/conversation-manager.test.d.ts.map +0 -1
  287. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js +0 -321
  288. package/dist/src/conversation-manager/__tests__/conversation-manager.test.js.map +0 -1
  289. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts +0 -2
  290. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.d.ts.map +0 -1
  291. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js +0 -64
  292. package/dist/src/conversation-manager/__tests__/null-conversation-manager.test.js.map +0 -1
  293. package/dist/src/conversation-manager/__tests__/pin.test.d.ts +0 -2
  294. package/dist/src/conversation-manager/__tests__/pin.test.d.ts.map +0 -1
  295. package/dist/src/conversation-manager/__tests__/pin.test.js +0 -119
  296. package/dist/src/conversation-manager/__tests__/pin.test.js.map +0 -1
  297. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts +0 -2
  298. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.d.ts.map +0 -1
  299. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +0 -1080
  300. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +0 -1
  301. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts +0 -2
  302. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.d.ts.map +0 -1
  303. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js +0 -400
  304. package/dist/src/conversation-manager/__tests__/summarizing-conversation-manager.test.js.map +0 -1
  305. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts +0 -2
  306. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.d.ts.map +0 -1
  307. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js +0 -138
  308. package/dist/src/conversation-manager/__tests__/token-usage-middleware.test.js.map +0 -1
  309. package/dist/src/hooks/__tests__/events.test.d.ts +0 -2
  310. package/dist/src/hooks/__tests__/events.test.d.ts.map +0 -1
  311. package/dist/src/hooks/__tests__/events.test.js +0 -1060
  312. package/dist/src/hooks/__tests__/events.test.js.map +0 -1
  313. package/dist/src/hooks/__tests__/registry.test.d.ts +0 -2
  314. package/dist/src/hooks/__tests__/registry.test.d.ts.map +0 -1
  315. package/dist/src/hooks/__tests__/registry.test.js +0 -325
  316. package/dist/src/hooks/__tests__/registry.test.js.map +0 -1
  317. package/dist/src/injection/__tests__/message-injection.test.d.ts +0 -2
  318. package/dist/src/injection/__tests__/message-injection.test.d.ts.map +0 -1
  319. package/dist/src/injection/__tests__/message-injection.test.js +0 -200
  320. package/dist/src/injection/__tests__/message-injection.test.js.map +0 -1
  321. package/dist/src/interventions/__tests__/handler.test.d.ts +0 -2
  322. package/dist/src/interventions/__tests__/handler.test.d.ts.map +0 -1
  323. package/dist/src/interventions/__tests__/handler.test.js +0 -35
  324. package/dist/src/interventions/__tests__/handler.test.js.map +0 -1
  325. package/dist/src/interventions/__tests__/registry.test.d.ts +0 -2
  326. package/dist/src/interventions/__tests__/registry.test.d.ts.map +0 -1
  327. package/dist/src/interventions/__tests__/registry.test.js +0 -692
  328. package/dist/src/interventions/__tests__/registry.test.js.map +0 -1
  329. package/dist/src/logging/__tests__/logger.test.d.ts +0 -2
  330. package/dist/src/logging/__tests__/logger.test.d.ts.map +0 -1
  331. package/dist/src/logging/__tests__/logger.test.js +0 -70
  332. package/dist/src/logging/__tests__/logger.test.js.map +0 -1
  333. package/dist/src/logging/__tests__/warn-once.test.d.ts +0 -2
  334. package/dist/src/logging/__tests__/warn-once.test.d.ts.map +0 -1
  335. package/dist/src/logging/__tests__/warn-once.test.js +0 -30
  336. package/dist/src/logging/__tests__/warn-once.test.js.map +0 -1
  337. package/dist/src/mcp.d.ts.map +0 -1
  338. package/dist/src/mcp.js.map +0 -1
  339. package/dist/src/memory/__tests__/memory-manager.test.d.ts +0 -2
  340. package/dist/src/memory/__tests__/memory-manager.test.d.ts.map +0 -1
  341. package/dist/src/memory/__tests__/memory-manager.test.js +0 -679
  342. package/dist/src/memory/__tests__/memory-manager.test.js.map +0 -1
  343. package/dist/src/memory/__tests__/memory-tracing.test.d.ts +0 -2
  344. package/dist/src/memory/__tests__/memory-tracing.test.d.ts.map +0 -1
  345. package/dist/src/memory/__tests__/memory-tracing.test.js +0 -250
  346. package/dist/src/memory/__tests__/memory-tracing.test.js.map +0 -1
  347. package/dist/src/memory/extraction/__tests__/extraction.test.d.ts +0 -2
  348. package/dist/src/memory/extraction/__tests__/extraction.test.d.ts.map +0 -1
  349. package/dist/src/memory/extraction/__tests__/extraction.test.js +0 -639
  350. package/dist/src/memory/extraction/__tests__/extraction.test.js.map +0 -1
  351. package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts +0 -2
  352. package/dist/src/memory/extraction/__tests__/model-extractor.test.d.ts.map +0 -1
  353. package/dist/src/memory/extraction/__tests__/model-extractor.test.js +0 -104
  354. package/dist/src/memory/extraction/__tests__/model-extractor.test.js.map +0 -1
  355. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts +0 -2
  356. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.d.ts.map +0 -1
  357. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js +0 -81
  358. package/dist/src/memory/extraction/__tests__/resolve-extraction-config.test.js.map +0 -1
  359. package/dist/src/middleware/__tests__/agent-middleware.test.d.ts +0 -2
  360. package/dist/src/middleware/__tests__/agent-middleware.test.d.ts.map +0 -1
  361. package/dist/src/middleware/__tests__/agent-middleware.test.js +0 -1206
  362. package/dist/src/middleware/__tests__/agent-middleware.test.js.map +0 -1
  363. package/dist/src/middleware/__tests__/copy-on-input.test.d.ts +0 -2
  364. package/dist/src/middleware/__tests__/copy-on-input.test.d.ts.map +0 -1
  365. package/dist/src/middleware/__tests__/copy-on-input.test.js +0 -379
  366. package/dist/src/middleware/__tests__/copy-on-input.test.js.map +0 -1
  367. package/dist/src/middleware/__tests__/custom-stages.test.d.ts +0 -2
  368. package/dist/src/middleware/__tests__/custom-stages.test.d.ts.map +0 -1
  369. package/dist/src/middleware/__tests__/custom-stages.test.js +0 -97
  370. package/dist/src/middleware/__tests__/custom-stages.test.js.map +0 -1
  371. package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts +0 -2
  372. package/dist/src/middleware/__tests__/middleware-interrupts.test.d.ts.map +0 -1
  373. package/dist/src/middleware/__tests__/middleware-interrupts.test.js +0 -267
  374. package/dist/src/middleware/__tests__/middleware-interrupts.test.js.map +0 -1
  375. package/dist/src/middleware/__tests__/registry.test.d.ts +0 -2
  376. package/dist/src/middleware/__tests__/registry.test.d.ts.map +0 -1
  377. package/dist/src/middleware/__tests__/registry.test.js +0 -525
  378. package/dist/src/middleware/__tests__/registry.test.js.map +0 -1
  379. package/dist/src/models/__tests__/anthropic.test.d.ts +0 -2
  380. package/dist/src/models/__tests__/anthropic.test.d.ts.map +0 -1
  381. package/dist/src/models/__tests__/anthropic.test.js +0 -793
  382. package/dist/src/models/__tests__/anthropic.test.js.map +0 -1
  383. package/dist/src/models/__tests__/bedrock.test.d.ts +0 -2
  384. package/dist/src/models/__tests__/bedrock.test.d.ts.map +0 -1
  385. package/dist/src/models/__tests__/bedrock.test.js +0 -3964
  386. package/dist/src/models/__tests__/bedrock.test.js.map +0 -1
  387. package/dist/src/models/__tests__/defaults.test.d.ts +0 -2
  388. package/dist/src/models/__tests__/defaults.test.d.ts.map +0 -1
  389. package/dist/src/models/__tests__/defaults.test.js +0 -36
  390. package/dist/src/models/__tests__/defaults.test.js.map +0 -1
  391. package/dist/src/models/__tests__/google.test.d.ts +0 -2
  392. package/dist/src/models/__tests__/google.test.d.ts.map +0 -1
  393. package/dist/src/models/__tests__/google.test.js +0 -1145
  394. package/dist/src/models/__tests__/google.test.js.map +0 -1
  395. package/dist/src/models/__tests__/model.test.d.ts +0 -2
  396. package/dist/src/models/__tests__/model.test.d.ts.map +0 -1
  397. package/dist/src/models/__tests__/model.test.js +0 -921
  398. package/dist/src/models/__tests__/model.test.js.map +0 -1
  399. package/dist/src/models/__tests__/streaming.test.d.ts +0 -2
  400. package/dist/src/models/__tests__/streaming.test.d.ts.map +0 -1
  401. package/dist/src/models/__tests__/streaming.test.js +0 -50
  402. package/dist/src/models/__tests__/streaming.test.js.map +0 -1
  403. package/dist/src/models/__tests__/test-utils.d.ts +0 -10
  404. package/dist/src/models/__tests__/test-utils.d.ts.map +0 -1
  405. package/dist/src/models/__tests__/test-utils.js +0 -17
  406. package/dist/src/models/__tests__/test-utils.js.map +0 -1
  407. package/dist/src/models/__tests__/vercel.test.d.ts +0 -2
  408. package/dist/src/models/__tests__/vercel.test.d.ts.map +0 -1
  409. package/dist/src/models/__tests__/vercel.test.js +0 -740
  410. package/dist/src/models/__tests__/vercel.test.js.map +0 -1
  411. package/dist/src/models/openai/__tests__/chat.test.d.ts +0 -2
  412. package/dist/src/models/openai/__tests__/chat.test.d.ts.map +0 -1
  413. package/dist/src/models/openai/__tests__/chat.test.js +0 -1586
  414. package/dist/src/models/openai/__tests__/chat.test.js.map +0 -1
  415. package/dist/src/models/openai/__tests__/errors.test.d.ts +0 -2
  416. package/dist/src/models/openai/__tests__/errors.test.d.ts.map +0 -1
  417. package/dist/src/models/openai/__tests__/errors.test.js +0 -39
  418. package/dist/src/models/openai/__tests__/errors.test.js.map +0 -1
  419. package/dist/src/models/openai/__tests__/mantle.test.d.ts +0 -2
  420. package/dist/src/models/openai/__tests__/mantle.test.d.ts.map +0 -1
  421. package/dist/src/models/openai/__tests__/mantle.test.js +0 -189
  422. package/dist/src/models/openai/__tests__/mantle.test.js.map +0 -1
  423. package/dist/src/models/openai/__tests__/responses.test.d.ts +0 -2
  424. package/dist/src/models/openai/__tests__/responses.test.d.ts.map +0 -1
  425. package/dist/src/models/openai/__tests__/responses.test.js +0 -709
  426. package/dist/src/models/openai/__tests__/responses.test.js.map +0 -1
  427. package/dist/src/multiagent/__tests__/events.test.d.ts +0 -2
  428. package/dist/src/multiagent/__tests__/events.test.d.ts.map +0 -1
  429. package/dist/src/multiagent/__tests__/events.test.js +0 -493
  430. package/dist/src/multiagent/__tests__/events.test.js.map +0 -1
  431. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts +0 -2
  432. package/dist/src/multiagent/__tests__/graph.invocation-state.test.d.ts.map +0 -1
  433. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js +0 -95
  434. package/dist/src/multiagent/__tests__/graph.invocation-state.test.js.map +0 -1
  435. package/dist/src/multiagent/__tests__/graph.test.d.ts +0 -2
  436. package/dist/src/multiagent/__tests__/graph.test.d.ts.map +0 -1
  437. package/dist/src/multiagent/__tests__/graph.test.js +0 -698
  438. package/dist/src/multiagent/__tests__/graph.test.js.map +0 -1
  439. package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts +0 -2
  440. package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts.map +0 -1
  441. package/dist/src/multiagent/__tests__/graph.tracer.test.js +0 -218
  442. package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +0 -1
  443. package/dist/src/multiagent/__tests__/interrupts.test.d.ts +0 -2
  444. package/dist/src/multiagent/__tests__/interrupts.test.d.ts.map +0 -1
  445. package/dist/src/multiagent/__tests__/interrupts.test.js +0 -390
  446. package/dist/src/multiagent/__tests__/interrupts.test.js.map +0 -1
  447. package/dist/src/multiagent/__tests__/nodes.test.d.ts +0 -2
  448. package/dist/src/multiagent/__tests__/nodes.test.d.ts.map +0 -1
  449. package/dist/src/multiagent/__tests__/nodes.test.js +0 -321
  450. package/dist/src/multiagent/__tests__/nodes.test.js.map +0 -1
  451. package/dist/src/multiagent/__tests__/queue.test.d.ts +0 -2
  452. package/dist/src/multiagent/__tests__/queue.test.d.ts.map +0 -1
  453. package/dist/src/multiagent/__tests__/queue.test.js +0 -118
  454. package/dist/src/multiagent/__tests__/queue.test.js.map +0 -1
  455. package/dist/src/multiagent/__tests__/snapshot.test.d.ts +0 -2
  456. package/dist/src/multiagent/__tests__/snapshot.test.d.ts.map +0 -1
  457. package/dist/src/multiagent/__tests__/snapshot.test.js +0 -161
  458. package/dist/src/multiagent/__tests__/snapshot.test.js.map +0 -1
  459. package/dist/src/multiagent/__tests__/state.test.d.ts +0 -2
  460. package/dist/src/multiagent/__tests__/state.test.d.ts.map +0 -1
  461. package/dist/src/multiagent/__tests__/state.test.js +0 -526
  462. package/dist/src/multiagent/__tests__/state.test.js.map +0 -1
  463. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts +0 -2
  464. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.d.ts.map +0 -1
  465. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js +0 -56
  466. package/dist/src/multiagent/__tests__/swarm.invocation-state.test.js.map +0 -1
  467. package/dist/src/multiagent/__tests__/swarm.test.d.ts +0 -2
  468. package/dist/src/multiagent/__tests__/swarm.test.d.ts.map +0 -1
  469. package/dist/src/multiagent/__tests__/swarm.test.js +0 -477
  470. package/dist/src/multiagent/__tests__/swarm.test.js.map +0 -1
  471. package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts +0 -2
  472. package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts.map +0 -1
  473. package/dist/src/multiagent/__tests__/swarm.tracer.test.js +0 -235
  474. package/dist/src/multiagent/__tests__/swarm.tracer.test.js.map +0 -1
  475. package/dist/src/plugins/__tests__/plugin.test.d.ts +0 -2
  476. package/dist/src/plugins/__tests__/plugin.test.d.ts.map +0 -1
  477. package/dist/src/plugins/__tests__/plugin.test.js +0 -114
  478. package/dist/src/plugins/__tests__/plugin.test.js.map +0 -1
  479. package/dist/src/plugins/__tests__/registry.test.d.ts +0 -2
  480. package/dist/src/plugins/__tests__/registry.test.d.ts.map +0 -1
  481. package/dist/src/plugins/__tests__/registry.test.js +0 -147
  482. package/dist/src/plugins/__tests__/registry.test.js.map +0 -1
  483. package/dist/src/registry/__tests__/tool-registry.test.d.ts +0 -2
  484. package/dist/src/registry/__tests__/tool-registry.test.d.ts.map +0 -1
  485. package/dist/src/registry/__tests__/tool-registry.test.js +0 -210
  486. package/dist/src/registry/__tests__/tool-registry.test.js.map +0 -1
  487. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts +0 -2
  488. package/dist/src/retry/__tests__/backoff-strategy.test.d.ts.map +0 -1
  489. package/dist/src/retry/__tests__/backoff-strategy.test.js +0 -116
  490. package/dist/src/retry/__tests__/backoff-strategy.test.js.map +0 -1
  491. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts +0 -2
  492. package/dist/src/retry/__tests__/default-model-retry-strategy.test.d.ts.map +0 -1
  493. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js +0 -225
  494. package/dist/src/retry/__tests__/default-model-retry-strategy.test.js.map +0 -1
  495. package/dist/src/sandbox/__tests__/default.test.browser.d.ts +0 -2
  496. package/dist/src/sandbox/__tests__/default.test.browser.d.ts.map +0 -1
  497. package/dist/src/sandbox/__tests__/default.test.browser.js +0 -11
  498. package/dist/src/sandbox/__tests__/default.test.browser.js.map +0 -1
  499. package/dist/src/sandbox/__tests__/default.test.node.d.ts +0 -2
  500. package/dist/src/sandbox/__tests__/default.test.node.d.ts.map +0 -1
  501. package/dist/src/sandbox/__tests__/default.test.node.js +0 -23
  502. package/dist/src/sandbox/__tests__/default.test.node.js.map +0 -1
  503. package/dist/src/sandbox/__tests__/docker.test.node.d.ts +0 -2
  504. package/dist/src/sandbox/__tests__/docker.test.node.d.ts.map +0 -1
  505. package/dist/src/sandbox/__tests__/docker.test.node.js +0 -89
  506. package/dist/src/sandbox/__tests__/docker.test.node.js.map +0 -1
  507. package/dist/src/sandbox/__tests__/errors.test.node.d.ts +0 -2
  508. package/dist/src/sandbox/__tests__/errors.test.node.d.ts.map +0 -1
  509. package/dist/src/sandbox/__tests__/errors.test.node.js +0 -33
  510. package/dist/src/sandbox/__tests__/errors.test.node.js.map +0 -1
  511. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts +0 -2
  512. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.d.ts.map +0 -1
  513. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js +0 -124
  514. package/dist/src/sandbox/__tests__/not-a-sandbox-local-environment.test.node.js.map +0 -1
  515. package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts +0 -2
  516. package/dist/src/sandbox/__tests__/posix-shell.test.node.d.ts.map +0 -1
  517. package/dist/src/sandbox/__tests__/posix-shell.test.node.js +0 -298
  518. package/dist/src/sandbox/__tests__/posix-shell.test.node.js.map +0 -1
  519. package/dist/src/sandbox/__tests__/ssh.test.node.d.ts +0 -2
  520. package/dist/src/sandbox/__tests__/ssh.test.node.d.ts.map +0 -1
  521. package/dist/src/sandbox/__tests__/ssh.test.node.js +0 -262
  522. package/dist/src/sandbox/__tests__/ssh.test.node.js.map +0 -1
  523. package/dist/src/session/__tests__/file-storage.test.node.d.ts +0 -2
  524. package/dist/src/session/__tests__/file-storage.test.node.d.ts.map +0 -1
  525. package/dist/src/session/__tests__/file-storage.test.node.js +0 -278
  526. package/dist/src/session/__tests__/file-storage.test.node.js.map +0 -1
  527. package/dist/src/session/__tests__/s3-storage.test.d.ts +0 -2
  528. package/dist/src/session/__tests__/s3-storage.test.d.ts.map +0 -1
  529. package/dist/src/session/__tests__/s3-storage.test.js +0 -461
  530. package/dist/src/session/__tests__/s3-storage.test.js.map +0 -1
  531. package/dist/src/session/__tests__/session-manager.test.d.ts +0 -2
  532. package/dist/src/session/__tests__/session-manager.test.d.ts.map +0 -1
  533. package/dist/src/session/__tests__/session-manager.test.js +0 -832
  534. package/dist/src/session/__tests__/session-manager.test.js.map +0 -1
  535. package/dist/src/session/__tests__/validation.test.d.ts +0 -2
  536. package/dist/src/session/__tests__/validation.test.d.ts.map +0 -1
  537. package/dist/src/session/__tests__/validation.test.js +0 -47
  538. package/dist/src/session/__tests__/validation.test.js.map +0 -1
  539. package/dist/src/telemetry/__tests__/config.test.d.ts +0 -2
  540. package/dist/src/telemetry/__tests__/config.test.d.ts.map +0 -1
  541. package/dist/src/telemetry/__tests__/config.test.js +0 -64
  542. package/dist/src/telemetry/__tests__/config.test.js.map +0 -1
  543. package/dist/src/telemetry/__tests__/config.test.node.d.ts +0 -2
  544. package/dist/src/telemetry/__tests__/config.test.node.d.ts.map +0 -1
  545. package/dist/src/telemetry/__tests__/config.test.node.js +0 -164
  546. package/dist/src/telemetry/__tests__/config.test.node.js.map +0 -1
  547. package/dist/src/telemetry/__tests__/json.test.d.ts +0 -2
  548. package/dist/src/telemetry/__tests__/json.test.d.ts.map +0 -1
  549. package/dist/src/telemetry/__tests__/json.test.js +0 -89
  550. package/dist/src/telemetry/__tests__/json.test.js.map +0 -1
  551. package/dist/src/telemetry/__tests__/local-trace.test.d.ts +0 -2
  552. package/dist/src/telemetry/__tests__/local-trace.test.d.ts.map +0 -1
  553. package/dist/src/telemetry/__tests__/local-trace.test.js +0 -158
  554. package/dist/src/telemetry/__tests__/local-trace.test.js.map +0 -1
  555. package/dist/src/telemetry/__tests__/meter.test.d.ts +0 -2
  556. package/dist/src/telemetry/__tests__/meter.test.d.ts.map +0 -1
  557. package/dist/src/telemetry/__tests__/meter.test.js +0 -695
  558. package/dist/src/telemetry/__tests__/meter.test.js.map +0 -1
  559. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts +0 -2
  560. package/dist/src/telemetry/__tests__/tracer.test.node.d.ts.map +0 -1
  561. package/dist/src/telemetry/__tests__/tracer.test.node.js +0 -958
  562. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +0 -1
  563. package/dist/src/tools/__tests__/structured-output-tool.test.d.ts +0 -2
  564. package/dist/src/tools/__tests__/structured-output-tool.test.d.ts.map +0 -1
  565. package/dist/src/tools/__tests__/structured-output-tool.test.js +0 -84
  566. package/dist/src/tools/__tests__/structured-output-tool.test.js.map +0 -1
  567. package/dist/src/tools/__tests__/tool-factory.test.d.ts +0 -2
  568. package/dist/src/tools/__tests__/tool-factory.test.d.ts.map +0 -1
  569. package/dist/src/tools/__tests__/tool-factory.test.js +0 -98
  570. package/dist/src/tools/__tests__/tool-factory.test.js.map +0 -1
  571. package/dist/src/tools/__tests__/tool.test.d.ts +0 -2
  572. package/dist/src/tools/__tests__/tool.test.d.ts.map +0 -1
  573. package/dist/src/tools/__tests__/tool.test.js +0 -1043
  574. package/dist/src/tools/__tests__/tool.test.js.map +0 -1
  575. package/dist/src/tools/__tests__/zod-tool.test-d.d.ts +0 -2
  576. package/dist/src/tools/__tests__/zod-tool.test-d.d.ts.map +0 -1
  577. package/dist/src/tools/__tests__/zod-tool.test-d.js +0 -227
  578. package/dist/src/tools/__tests__/zod-tool.test-d.js.map +0 -1
  579. package/dist/src/tools/__tests__/zod-tool.test.d.ts +0 -2
  580. package/dist/src/tools/__tests__/zod-tool.test.d.ts.map +0 -1
  581. package/dist/src/tools/__tests__/zod-tool.test.js +0 -563
  582. package/dist/src/tools/__tests__/zod-tool.test.js.map +0 -1
  583. package/dist/src/types/__tests__/agent.test.d.ts +0 -2
  584. package/dist/src/types/__tests__/agent.test.d.ts.map +0 -1
  585. package/dist/src/types/__tests__/agent.test.js +0 -476
  586. package/dist/src/types/__tests__/agent.test.js.map +0 -1
  587. package/dist/src/types/__tests__/citations.test.d.ts +0 -2
  588. package/dist/src/types/__tests__/citations.test.d.ts.map +0 -1
  589. package/dist/src/types/__tests__/citations.test.js +0 -104
  590. package/dist/src/types/__tests__/citations.test.js.map +0 -1
  591. package/dist/src/types/__tests__/json.test.d.ts +0 -2
  592. package/dist/src/types/__tests__/json.test.d.ts.map +0 -1
  593. package/dist/src/types/__tests__/json.test.js +0 -298
  594. package/dist/src/types/__tests__/json.test.js.map +0 -1
  595. package/dist/src/types/__tests__/media.test.d.ts +0 -2
  596. package/dist/src/types/__tests__/media.test.d.ts.map +0 -1
  597. package/dist/src/types/__tests__/media.test.js +0 -478
  598. package/dist/src/types/__tests__/media.test.js.map +0 -1
  599. package/dist/src/types/__tests__/messages.test.d.ts +0 -2
  600. package/dist/src/types/__tests__/messages.test.d.ts.map +0 -1
  601. package/dist/src/types/__tests__/messages.test.js +0 -681
  602. package/dist/src/types/__tests__/messages.test.js.map +0 -1
  603. package/dist/src/types/__tests__/validation.test.d.ts +0 -2
  604. package/dist/src/types/__tests__/validation.test.d.ts.map +0 -1
  605. package/dist/src/types/__tests__/validation.test.js +0 -30
  606. package/dist/src/types/__tests__/validation.test.js.map +0 -1
  607. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts +0 -2
  608. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.d.ts.map +0 -1
  609. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js +0 -756
  610. package/dist/src/vended-interventions/cedar/__tests__/cedar.test.node.js.map +0 -1
  611. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts +0 -2
  612. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.d.ts.map +0 -1
  613. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js +0 -358
  614. package/dist/src/vended-interventions/hitl/__tests__/hitl.test.js.map +0 -1
  615. package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts +0 -2
  616. package/dist/src/vended-interventions/steering/__tests__/handler.test.d.ts.map +0 -1
  617. package/dist/src/vended-interventions/steering/__tests__/handler.test.js +0 -163
  618. package/dist/src/vended-interventions/steering/__tests__/handler.test.js.map +0 -1
  619. package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts +0 -2
  620. package/dist/src/vended-interventions/steering/__tests__/llm.test.d.ts.map +0 -1
  621. package/dist/src/vended-interventions/steering/__tests__/llm.test.js +0 -60
  622. package/dist/src/vended-interventions/steering/__tests__/llm.test.js.map +0 -1
  623. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts +0 -2
  624. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.d.ts.map +0 -1
  625. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js +0 -94
  626. package/dist/src/vended-interventions/steering/__tests__/tool-ledger.test.js.map +0 -1
  627. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts +0 -2
  628. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.d.ts.map +0 -1
  629. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js +0 -758
  630. package/dist/src/vended-memory-stores/bedrock-knowledge-base/__tests__/bedrock-knowledge-base-store.test.node.js.map +0 -1
  631. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts +0 -2
  632. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.d.ts.map +0 -1
  633. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js +0 -96
  634. package/dist/src/vended-plugins/context-injector/__tests__/plugin.test.js.map +0 -1
  635. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts +0 -2
  636. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.d.ts.map +0 -1
  637. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js +0 -68
  638. package/dist/src/vended-plugins/context-offloader/__tests__/file-storage-sandbox.test.node.js.map +0 -1
  639. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts +0 -2
  640. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.d.ts.map +0 -1
  641. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js +0 -539
  642. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.js.map +0 -1
  643. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts +0 -2
  644. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.d.ts.map +0 -1
  645. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js +0 -97
  646. package/dist/src/vended-plugins/context-offloader/__tests__/plugin.test.node.js.map +0 -1
  647. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts +0 -2
  648. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.d.ts.map +0 -1
  649. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js +0 -149
  650. package/dist/src/vended-plugins/context-offloader/__tests__/search.test.js.map +0 -1
  651. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts +0 -2
  652. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.d.ts.map +0 -1
  653. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js +0 -216
  654. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.js.map +0 -1
  655. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts +0 -2
  656. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.d.ts.map +0 -1
  657. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js +0 -78
  658. package/dist/src/vended-plugins/context-offloader/__tests__/storage.test.node.js.map +0 -1
  659. package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts +0 -2
  660. package/dist/src/vended-plugins/goal/__tests__/plugin.test.d.ts.map +0 -1
  661. package/dist/src/vended-plugins/goal/__tests__/plugin.test.js +0 -736
  662. package/dist/src/vended-plugins/goal/__tests__/plugin.test.js.map +0 -1
  663. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts +0 -2
  664. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.d.ts.map +0 -1
  665. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js +0 -482
  666. package/dist/src/vended-plugins/skills/__tests__/agent-skills.test.node.js.map +0 -1
  667. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts +0 -2
  668. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.d.ts.map +0 -1
  669. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js +0 -476
  670. package/dist/src/vended-plugins/skills/__tests__/skill.test.node.js.map +0 -1
  671. package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts +0 -2
  672. package/dist/src/vended-tools/bash/__tests__/bash.test.node.d.ts.map +0 -1
  673. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +0 -390
  674. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +0 -1
  675. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts +0 -2
  676. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.d.ts.map +0 -1
  677. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js +0 -452
  678. package/dist/src/vended-tools/file-editor/__tests__/file-editor.test.node.js.map +0 -1
  679. package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts +0 -2
  680. package/dist/src/vended-tools/http-request/__tests__/http-request.test.d.ts.map +0 -1
  681. package/dist/src/vended-tools/http-request/__tests__/http-request.test.js +0 -189
  682. package/dist/src/vended-tools/http-request/__tests__/http-request.test.js.map +0 -1
  683. package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts +0 -2
  684. package/dist/src/vended-tools/notebook/__tests__/notebook.test.d.ts.map +0 -1
  685. package/dist/src/vended-tools/notebook/__tests__/notebook.test.js +0 -388
  686. 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