@copilotkit/runtime 1.57.3 → 1.58.0-canary.thread-id-propagation

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 (346) hide show
  1. package/dist/lib/observability.d.cts +1 -1
  2. package/dist/lib/observability.d.cts.map +1 -1
  3. package/dist/lib/observability.d.mts +1 -1
  4. package/dist/lib/observability.d.mts.map +1 -1
  5. package/dist/lib/runtime/copilot-runtime.cjs +2 -0
  6. package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
  7. package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
  8. package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
  9. package/dist/lib/runtime/copilot-runtime.mjs +2 -0
  10. package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
  11. package/dist/package.cjs +5 -8
  12. package/dist/package.mjs +5 -8
  13. package/dist/v2/runtime/core/runtime.cjs +4 -1
  14. package/dist/v2/runtime/core/runtime.cjs.map +1 -1
  15. package/dist/v2/runtime/core/runtime.d.cts.map +1 -1
  16. package/dist/v2/runtime/core/runtime.d.mts.map +1 -1
  17. package/dist/v2/runtime/core/runtime.mjs +4 -1
  18. package/dist/v2/runtime/core/runtime.mjs.map +1 -1
  19. package/dist/v2/runtime/handlers/get-runtime-info.cjs +1 -1
  20. package/dist/v2/runtime/handlers/get-runtime-info.mjs +1 -1
  21. package/dist/v2/runtime/handlers/handle-connect.cjs +1 -1
  22. package/dist/v2/runtime/handlers/handle-connect.mjs +1 -1
  23. package/dist/v2/runtime/handlers/handle-run.cjs +1 -1
  24. package/dist/v2/runtime/handlers/handle-run.mjs +1 -1
  25. package/dist/v2/runtime/handlers/shared/agent-utils.cjs +1 -1
  26. package/dist/v2/runtime/handlers/shared/agent-utils.cjs.map +1 -1
  27. package/dist/v2/runtime/handlers/shared/agent-utils.mjs +1 -1
  28. package/dist/v2/runtime/handlers/shared/agent-utils.mjs.map +1 -1
  29. package/dist/v2/runtime/telemetry/telemetry-client.cjs +22 -6
  30. package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -1
  31. package/dist/v2/runtime/telemetry/telemetry-client.mjs +27 -11
  32. package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -1
  33. package/package.json +9 -19
  34. package/skills/runtime/SKILL.md +98 -0
  35. package/skills/runtime/references/agent-runners-custom.md +161 -0
  36. package/skills/runtime/references/agent-runners-in-memory.md +64 -0
  37. package/skills/runtime/references/agent-runners-sqlite.md +90 -0
  38. package/skills/runtime/references/agent-runners.md +304 -0
  39. package/skills/runtime/references/built-in-agent-factory-modes.md +232 -0
  40. package/skills/runtime/references/built-in-agent-helper-utilities.md +123 -0
  41. package/skills/runtime/references/built-in-agent-model-identifiers.md +59 -0
  42. package/skills/runtime/references/built-in-agent.md +523 -0
  43. package/skills/runtime/references/intelligence-mode.md +336 -0
  44. package/skills/runtime/references/middleware.md +376 -0
  45. package/skills/runtime/references/server-side-tools.md +414 -0
  46. package/skills/runtime/references/setup-endpoint.md +503 -0
  47. package/skills/runtime/references/transcription.md +287 -0
  48. package/skills/runtime/references/wiring-a2a.md +40 -0
  49. package/skills/runtime/references/wiring-adk.md +45 -0
  50. package/skills/runtime/references/wiring-ag2.md +41 -0
  51. package/skills/runtime/references/wiring-agno.md +39 -0
  52. package/skills/runtime/references/wiring-aws-strands.md +59 -0
  53. package/skills/runtime/references/wiring-crewai-crews.md +51 -0
  54. package/skills/runtime/references/wiring-crewai-flows.md +45 -0
  55. package/skills/runtime/references/wiring-external-agents.md +348 -0
  56. package/skills/runtime/references/wiring-langgraph.md +50 -0
  57. package/skills/runtime/references/wiring-llamaindex.md +39 -0
  58. package/skills/runtime/references/wiring-mastra.md +70 -0
  59. package/skills/runtime/references/wiring-mcp-apps-middleware.md +68 -0
  60. package/skills/runtime/references/wiring-ms-agent-framework.md +41 -0
  61. package/skills/runtime/references/wiring-pydantic-ai.md +45 -0
  62. package/CHANGELOG.md +0 -3624
  63. package/__snapshots__/schema/schema.graphql +0 -371
  64. package/dist/v2/runtime/telemetry/scarf-client.cjs +0 -32
  65. package/dist/v2/runtime/telemetry/scarf-client.cjs.map +0 -1
  66. package/dist/v2/runtime/telemetry/scarf-client.mjs +0 -32
  67. package/dist/v2/runtime/telemetry/scarf-client.mjs.map +0 -1
  68. package/scripts/generate-gql-schema.ts +0 -16
  69. package/src/agent/__tests__/agent-test-helpers.ts +0 -476
  70. package/src/agent/__tests__/agent.test.ts +0 -593
  71. package/src/agent/__tests__/ai-sdk-v6-compat.test.ts +0 -116
  72. package/src/agent/__tests__/basic-agent.test.ts +0 -1698
  73. package/src/agent/__tests__/capabilities.test.ts +0 -81
  74. package/src/agent/__tests__/config-tools-execution.test.ts +0 -516
  75. package/src/agent/__tests__/converter-aisdk.test.ts +0 -692
  76. package/src/agent/__tests__/converter-custom.test.ts +0 -319
  77. package/src/agent/__tests__/converter-tanstack-input.test.ts +0 -211
  78. package/src/agent/__tests__/converter-tanstack.test.ts +0 -594
  79. package/src/agent/__tests__/mcp-clients.test.ts +0 -246
  80. package/src/agent/__tests__/mcp-servers-integration.test.ts +0 -373
  81. package/src/agent/__tests__/multimodal-tanstack.test.ts +0 -284
  82. package/src/agent/__tests__/multimodal.test.ts +0 -176
  83. package/src/agent/__tests__/property-overrides.test.ts +0 -598
  84. package/src/agent/__tests__/provider-id-collision.test.ts +0 -195
  85. package/src/agent/__tests__/standard-schema-tools.test.ts +0 -313
  86. package/src/agent/__tests__/standard-schema-types.test.ts +0 -158
  87. package/src/agent/__tests__/state-tools.test.ts +0 -436
  88. package/src/agent/__tests__/test-helpers.ts +0 -197
  89. package/src/agent/__tests__/utils.test.ts +0 -536
  90. package/src/agent/__tests__/zod-regression.test.ts +0 -350
  91. package/src/agent/converters/aisdk.ts +0 -326
  92. package/src/agent/converters/index.ts +0 -7
  93. package/src/agent/converters/tanstack.ts +0 -451
  94. package/src/agent/index.ts +0 -1743
  95. package/src/agents/langgraph/__tests__/event-source.test.ts +0 -256
  96. package/src/agents/langgraph/event-source.ts +0 -365
  97. package/src/agents/langgraph/events.ts +0 -394
  98. package/src/graphql/inputs/action.input.ts +0 -16
  99. package/src/graphql/inputs/agent-session.input.ts +0 -13
  100. package/src/graphql/inputs/agent-state.input.ts +0 -13
  101. package/src/graphql/inputs/cloud-guardrails.input.ts +0 -16
  102. package/src/graphql/inputs/cloud.input.ts +0 -8
  103. package/src/graphql/inputs/context-property.input.ts +0 -10
  104. package/src/graphql/inputs/copilot-context.input.ts +0 -10
  105. package/src/graphql/inputs/custom-property.input.ts +0 -15
  106. package/src/graphql/inputs/extensions.input.ts +0 -21
  107. package/src/graphql/inputs/forwarded-parameters.input.ts +0 -22
  108. package/src/graphql/inputs/frontend.input.ts +0 -14
  109. package/src/graphql/inputs/generate-copilot-response.input.ts +0 -59
  110. package/src/graphql/inputs/load-agent-state.input.ts +0 -10
  111. package/src/graphql/inputs/message.input.ts +0 -110
  112. package/src/graphql/inputs/meta-event.input.ts +0 -18
  113. package/src/graphql/message-conversion/agui-to-gql.test.ts +0 -1384
  114. package/src/graphql/message-conversion/agui-to-gql.ts +0 -384
  115. package/src/graphql/message-conversion/gql-to-agui.test.ts +0 -1653
  116. package/src/graphql/message-conversion/gql-to-agui.ts +0 -297
  117. package/src/graphql/message-conversion/index.ts +0 -2
  118. package/src/graphql/message-conversion/roundtrip-conversion.test.ts +0 -561
  119. package/src/graphql/resolvers/__tests__/resolve-message-id.test.ts +0 -25
  120. package/src/graphql/resolvers/copilot.resolver.ts +0 -785
  121. package/src/graphql/resolvers/resolve-message-id.ts +0 -14
  122. package/src/graphql/resolvers/state.resolver.ts +0 -30
  123. package/src/graphql/types/agents-response.type.ts +0 -19
  124. package/src/graphql/types/base/index.ts +0 -10
  125. package/src/graphql/types/converted/index.ts +0 -183
  126. package/src/graphql/types/copilot-response.type.ts +0 -141
  127. package/src/graphql/types/enums.ts +0 -38
  128. package/src/graphql/types/extensions-response.type.ts +0 -23
  129. package/src/graphql/types/guardrails-result.type.ts +0 -20
  130. package/src/graphql/types/load-agent-state-response.type.ts +0 -17
  131. package/src/graphql/types/message-status.type.ts +0 -48
  132. package/src/graphql/types/meta-events.type.ts +0 -78
  133. package/src/graphql/types/response-status.type.ts +0 -77
  134. package/src/index.ts +0 -3
  135. package/src/langgraph.ts +0 -1
  136. package/src/lib/__tests__/telemetry-disclosure.test.ts +0 -55
  137. package/src/lib/cloud/index.ts +0 -4
  138. package/src/lib/error-messages.ts +0 -211
  139. package/src/lib/index.ts +0 -52
  140. package/src/lib/integrations/index.ts +0 -6
  141. package/src/lib/integrations/nest/index.ts +0 -21
  142. package/src/lib/integrations/nextjs/app-router.ts +0 -47
  143. package/src/lib/integrations/nextjs/pages-router.ts +0 -45
  144. package/src/lib/integrations/node-express/index.ts +0 -21
  145. package/src/lib/integrations/node-http/__tests__/request-duck-type.test.ts +0 -66
  146. package/src/lib/integrations/node-http/index.ts +0 -187
  147. package/src/lib/integrations/node-http/request-handler.ts +0 -128
  148. package/src/lib/integrations/shared.ts +0 -112
  149. package/src/lib/logger.ts +0 -31
  150. package/src/lib/observability.ts +0 -167
  151. package/src/lib/runtime/__tests__/copilot-runtime-error.test.ts +0 -183
  152. package/src/lib/runtime/__tests__/handle-service-adapter.test.ts +0 -108
  153. package/src/lib/runtime/__tests__/mcp-tools-utils.test.ts +0 -499
  154. package/src/lib/runtime/__tests__/on-after-request.test.ts +0 -122
  155. package/src/lib/runtime/__tests__/retry-utils.test.ts +0 -137
  156. package/src/lib/runtime/__tests__/v1-agent-factory.test.ts +0 -109
  157. package/src/lib/runtime/agent-integrations/langgraph/__tests__/dispatch-event-filtering.test.ts +0 -345
  158. package/src/lib/runtime/agent-integrations/langgraph/__tests__/run-message-filtering.test.ts +0 -156
  159. package/src/lib/runtime/agent-integrations/langgraph/agent.ts +0 -263
  160. package/src/lib/runtime/agent-integrations/langgraph/consts.ts +0 -37
  161. package/src/lib/runtime/agent-integrations/langgraph/index.ts +0 -2
  162. package/src/lib/runtime/copilot-runtime.ts +0 -863
  163. package/src/lib/runtime/mcp-tools-utils.ts +0 -313
  164. package/src/lib/runtime/retry-utils.ts +0 -141
  165. package/src/lib/runtime/telemetry-agent-runner.ts +0 -151
  166. package/src/lib/runtime/types.ts +0 -48
  167. package/src/lib/runtime/utils.ts +0 -93
  168. package/src/lib/streaming.ts +0 -220
  169. package/src/lib/telemetry-client.ts +0 -66
  170. package/src/lib/telemetry-disclosure.ts +0 -53
  171. package/src/service-adapters/anthropic/anthropic-adapter.ts +0 -532
  172. package/src/service-adapters/anthropic/utils.ts +0 -219
  173. package/src/service-adapters/bedrock/bedrock-adapter.ts +0 -73
  174. package/src/service-adapters/conversion.test.ts +0 -56
  175. package/src/service-adapters/conversion.ts +0 -69
  176. package/src/service-adapters/empty/empty-adapter.ts +0 -38
  177. package/src/service-adapters/events.ts +0 -337
  178. package/src/service-adapters/experimental/ollama/ollama-adapter.ts +0 -84
  179. package/src/service-adapters/google/google-genai-adapter.test.ts +0 -151
  180. package/src/service-adapters/google/google-genai-adapter.ts +0 -95
  181. package/src/service-adapters/groq/groq-adapter.ts +0 -229
  182. package/src/service-adapters/index.ts +0 -18
  183. package/src/service-adapters/langchain/langchain-adapter.ts +0 -113
  184. package/src/service-adapters/langchain/langserve.ts +0 -88
  185. package/src/service-adapters/langchain/types.ts +0 -20
  186. package/src/service-adapters/langchain/utils.ts +0 -330
  187. package/src/service-adapters/openai/__tests__/openai-v5-compat.test.ts +0 -177
  188. package/src/service-adapters/openai/openai-adapter.ts +0 -324
  189. package/src/service-adapters/openai/openai-assistant-adapter.ts +0 -385
  190. package/src/service-adapters/openai/utils.ts +0 -305
  191. package/src/service-adapters/service-adapter.ts +0 -50
  192. package/src/service-adapters/shared/error-utils.ts +0 -64
  193. package/src/service-adapters/shared/index.ts +0 -2
  194. package/src/service-adapters/shared/sdk-client-utils.ts +0 -19
  195. package/src/service-adapters/unify/unify-adapter.ts +0 -165
  196. package/src/utils/failed-response-status-reasons.ts +0 -70
  197. package/src/utils/index.ts +0 -1
  198. package/src/v2/express.ts +0 -1
  199. package/src/v2/hono.ts +0 -1
  200. package/src/v2/index.ts +0 -5
  201. package/src/v2/node.ts +0 -1
  202. package/src/v2/runtime/__tests__/agents-factory.test.ts +0 -136
  203. package/src/v2/runtime/__tests__/backward-compat.test.ts +0 -261
  204. package/src/v2/runtime/__tests__/code-review-fixes.test.ts +0 -500
  205. package/src/v2/runtime/__tests__/cors-credentials.test.ts +0 -320
  206. package/src/v2/runtime/__tests__/debug-sse-response.test.ts +0 -302
  207. package/src/v2/runtime/__tests__/express-adapter.test.ts +0 -188
  208. package/src/v2/runtime/__tests__/express-body-order.test.ts +0 -76
  209. package/src/v2/runtime/__tests__/express-fetch-bridge.test.ts +0 -344
  210. package/src/v2/runtime/__tests__/express-single-sse.test.ts +0 -122
  211. package/src/v2/runtime/__tests__/express-single-telemetry.integration.test.ts +0 -65
  212. package/src/v2/runtime/__tests__/express-telemetry.integration.test.ts +0 -101
  213. package/src/v2/runtime/__tests__/fetch-cors.test.ts +0 -205
  214. package/src/v2/runtime/__tests__/fetch-handler-validation.test.ts +0 -440
  215. package/src/v2/runtime/__tests__/fetch-handler.test.ts +0 -456
  216. package/src/v2/runtime/__tests__/fetch-router.test.ts +0 -276
  217. package/src/v2/runtime/__tests__/get-runtime-info.test.ts +0 -335
  218. package/src/v2/runtime/__tests__/handle-connect.test.ts +0 -585
  219. package/src/v2/runtime/__tests__/handle-run.test.ts +0 -1388
  220. package/src/v2/runtime/__tests__/handle-threads.test.ts +0 -930
  221. package/src/v2/runtime/__tests__/handle-transcribe.test.ts +0 -301
  222. package/src/v2/runtime/__tests__/header-utils.test.ts +0 -88
  223. package/src/v2/runtime/__tests__/hono-adapter.test.ts +0 -150
  224. package/src/v2/runtime/__tests__/hono-single-telemetry.integration.test.ts +0 -46
  225. package/src/v2/runtime/__tests__/hono-telemetry.integration.test.ts +0 -99
  226. package/src/v2/runtime/__tests__/hooks-edge-cases.test.ts +0 -457
  227. package/src/v2/runtime/__tests__/hooks.test.ts +0 -557
  228. package/src/v2/runtime/__tests__/in-process-agent-runner-messages.test.ts +0 -230
  229. package/src/v2/runtime/__tests__/in-process-agent-runner.test.ts +0 -1030
  230. package/src/v2/runtime/__tests__/integration/bun/bun-servers.integration.test.ts +0 -27
  231. package/src/v2/runtime/__tests__/integration/bun/elysia-multi.ts +0 -32
  232. package/src/v2/runtime/__tests__/integration/bun/elysia-single.ts +0 -33
  233. package/src/v2/runtime/__tests__/integration/bun/hono-bun-multi.ts +0 -25
  234. package/src/v2/runtime/__tests__/integration/bun/hono-bun-single.ts +0 -32
  235. package/src/v2/runtime/__tests__/integration/helpers/create-test-runtime.ts +0 -15
  236. package/src/v2/runtime/__tests__/integration/helpers/sse-reader.ts +0 -45
  237. package/src/v2/runtime/__tests__/integration/helpers/test-agent.ts +0 -58
  238. package/src/v2/runtime/__tests__/integration/node-servers.integration.test.ts +0 -58
  239. package/src/v2/runtime/__tests__/integration/servers/express-multi.ts +0 -35
  240. package/src/v2/runtime/__tests__/integration/servers/express-single.ts +0 -36
  241. package/src/v2/runtime/__tests__/integration/servers/fetch-direct.ts +0 -39
  242. package/src/v2/runtime/__tests__/integration/servers/hono-multi.ts +0 -30
  243. package/src/v2/runtime/__tests__/integration/servers/hono-single.ts +0 -37
  244. package/src/v2/runtime/__tests__/integration/servers/node-multi.ts +0 -45
  245. package/src/v2/runtime/__tests__/integration/servers/node-single.ts +0 -46
  246. package/src/v2/runtime/__tests__/integration/servers/types.ts +0 -18
  247. package/src/v2/runtime/__tests__/integration/suites/debug-events.suite.ts +0 -253
  248. package/src/v2/runtime/__tests__/integration/suites/multi-endpoint.suite.ts +0 -358
  249. package/src/v2/runtime/__tests__/integration/suites/single-endpoint.suite.ts +0 -363
  250. package/src/v2/runtime/__tests__/intelligence-run-telemetry.test.ts +0 -194
  251. package/src/v2/runtime/__tests__/mcp-apps-middleware-integration.test.ts +0 -275
  252. package/src/v2/runtime/__tests__/middleware-express.test.ts +0 -208
  253. package/src/v2/runtime/__tests__/middleware-single-express.test.ts +0 -213
  254. package/src/v2/runtime/__tests__/middleware-single.test.ts +0 -225
  255. package/src/v2/runtime/__tests__/middleware-sse-parser.test.ts +0 -237
  256. package/src/v2/runtime/__tests__/middleware.test.ts +0 -250
  257. package/src/v2/runtime/__tests__/node-fetch-handler.test.ts +0 -157
  258. package/src/v2/runtime/__tests__/open-generative-ui-middleware.e2e.test.ts +0 -728
  259. package/src/v2/runtime/__tests__/router-edge-cases.test.ts +0 -217
  260. package/src/v2/runtime/__tests__/routing-express.test.ts +0 -174
  261. package/src/v2/runtime/__tests__/routing-single-express.test.ts +0 -168
  262. package/src/v2/runtime/__tests__/routing-single.test.ts +0 -193
  263. package/src/v2/runtime/__tests__/routing.test.ts +0 -257
  264. package/src/v2/runtime/__tests__/runtime.test.ts +0 -234
  265. package/src/v2/runtime/__tests__/sse-response-telemetry.test.ts +0 -108
  266. package/src/v2/runtime/__tests__/telemetry.test.ts +0 -167
  267. package/src/v2/runtime/__tests__/thread-names.test.ts +0 -188
  268. package/src/v2/runtime/core/__tests__/debug-event-bus.test.ts +0 -156
  269. package/src/v2/runtime/core/debug-event-bus.ts +0 -45
  270. package/src/v2/runtime/core/fetch-cors.ts +0 -136
  271. package/src/v2/runtime/core/fetch-handler.ts +0 -492
  272. package/src/v2/runtime/core/fetch-router.ts +0 -203
  273. package/src/v2/runtime/core/hooks.ts +0 -160
  274. package/src/v2/runtime/core/middleware-sse-parser.ts +0 -210
  275. package/src/v2/runtime/core/middleware.ts +0 -115
  276. package/src/v2/runtime/core/runtime.ts +0 -432
  277. package/src/v2/runtime/endpoints/express-fetch-bridge.ts +0 -137
  278. package/src/v2/runtime/endpoints/express-single.ts +0 -54
  279. package/src/v2/runtime/endpoints/express.ts +0 -179
  280. package/src/v2/runtime/endpoints/hono-single.ts +0 -60
  281. package/src/v2/runtime/endpoints/hono.ts +0 -89
  282. package/src/v2/runtime/endpoints/index.ts +0 -4
  283. package/src/v2/runtime/endpoints/node-fetch-handler.ts +0 -48
  284. package/src/v2/runtime/endpoints/node.ts +0 -28
  285. package/src/v2/runtime/endpoints/single-route-helpers.ts +0 -125
  286. package/src/v2/runtime/express.ts +0 -2
  287. package/src/v2/runtime/handlers/__tests__/handle-debug-events.test.ts +0 -176
  288. package/src/v2/runtime/handlers/get-runtime-info.ts +0 -101
  289. package/src/v2/runtime/handlers/handle-connect.ts +0 -80
  290. package/src/v2/runtime/handlers/handle-debug-events.ts +0 -52
  291. package/src/v2/runtime/handlers/handle-run.ts +0 -111
  292. package/src/v2/runtime/handlers/handle-stop.ts +0 -77
  293. package/src/v2/runtime/handlers/handle-threads.ts +0 -11
  294. package/src/v2/runtime/handlers/handle-transcribe.ts +0 -269
  295. package/src/v2/runtime/handlers/header-utils.ts +0 -24
  296. package/src/v2/runtime/handlers/intelligence/connect.ts +0 -102
  297. package/src/v2/runtime/handlers/intelligence/run.ts +0 -351
  298. package/src/v2/runtime/handlers/intelligence/thread-names.ts +0 -246
  299. package/src/v2/runtime/handlers/intelligence/threads.ts +0 -420
  300. package/src/v2/runtime/handlers/shared/agent-utils.ts +0 -154
  301. package/src/v2/runtime/handlers/shared/intelligence-utils.ts +0 -41
  302. package/src/v2/runtime/handlers/shared/json-response.ts +0 -9
  303. package/src/v2/runtime/handlers/shared/resolve-intelligence-user.ts +0 -28
  304. package/src/v2/runtime/handlers/shared/sse-response.ts +0 -215
  305. package/src/v2/runtime/handlers/sse/__tests__/sse-connect-agent-id.test.ts +0 -71
  306. package/src/v2/runtime/handlers/sse/connect.ts +0 -30
  307. package/src/v2/runtime/handlers/sse/run.ts +0 -40
  308. package/src/v2/runtime/hono.ts +0 -2
  309. package/src/v2/runtime/index.ts +0 -51
  310. package/src/v2/runtime/intelligence-platform/__tests__/client.test.ts +0 -601
  311. package/src/v2/runtime/intelligence-platform/__tests__/intelligence-mcp-helper.test.ts +0 -246
  312. package/src/v2/runtime/intelligence-platform/client.ts +0 -818
  313. package/src/v2/runtime/intelligence-platform/index.ts +0 -10
  314. package/src/v2/runtime/node.ts +0 -6
  315. package/src/v2/runtime/open-generative-ui-middleware.ts +0 -373
  316. package/src/v2/runtime/runner/__tests__/finalize-events.test.ts +0 -109
  317. package/src/v2/runtime/runner/__tests__/in-memory-runner.e2e.test.ts +0 -775
  318. package/src/v2/runtime/runner/__tests__/in-memory-runner.test.ts +0 -777
  319. package/src/v2/runtime/runner/__tests__/intelligence-runner.test.ts +0 -1039
  320. package/src/v2/runtime/runner/agent-runner.ts +0 -35
  321. package/src/v2/runtime/runner/in-memory.ts +0 -467
  322. package/src/v2/runtime/runner/index.ts +0 -4
  323. package/src/v2/runtime/runner/intelligence.ts +0 -498
  324. package/src/v2/runtime/telemetry/__tests__/instance-created.test.ts +0 -96
  325. package/src/v2/runtime/telemetry/events.ts +0 -35
  326. package/src/v2/runtime/telemetry/index.ts +0 -7
  327. package/src/v2/runtime/telemetry/instance-created.ts +0 -44
  328. package/src/v2/runtime/telemetry/scarf-client.ts +0 -39
  329. package/src/v2/runtime/telemetry/telemetry-client.ts +0 -70
  330. package/src/v2/runtime/transcription-service/transcription-service.ts +0 -11
  331. package/tests/global.d.ts +0 -1
  332. package/tests/service-adapters/anthropic/allowlist-approach.test.ts +0 -259
  333. package/tests/service-adapters/anthropic/anthropic-adapter-language-model.test.ts +0 -101
  334. package/tests/service-adapters/anthropic/anthropic-adapter.test.ts +0 -645
  335. package/tests/service-adapters/anthropic/utils-token-trimming.test.ts +0 -301
  336. package/tests/service-adapters/groq/groq-adapter-language-model.test.ts +0 -102
  337. package/tests/service-adapters/openai/allowlist-approach.test.ts +0 -294
  338. package/tests/service-adapters/openai/openai-adapter-language-model.test.ts +0 -122
  339. package/tests/service-adapters/openai/openai-adapter.test.ts +0 -291
  340. package/tests/service-adapters/shared/sdk-client-utils.test.ts +0 -36
  341. package/tests/setup.vitest.ts +0 -8
  342. package/tests/tsconfig.json +0 -10
  343. package/tsconfig.json +0 -20
  344. package/tsdown.config.ts +0 -45
  345. package/typedoc.json +0 -4
  346. package/vitest.config.mjs +0 -13
@@ -1,246 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
- import { BasicAgent, type MCPClientProvider } from "../index";
3
- import { EventType, type RunAgentInput } from "@ag-ui/client";
4
- import { streamText } from "ai";
5
- import {
6
- mockStreamTextResponse,
7
- textDelta,
8
- finish,
9
- collectEvents,
10
- } from "./test-helpers";
11
-
12
- // Mock the ai module
13
- vi.mock("ai", () => ({
14
- streamText: vi.fn(),
15
- tool: vi.fn((config) => config),
16
- stepCountIs: vi.fn((count: number) => ({ type: "stepCount", count })),
17
- }));
18
-
19
- // Mock the SDK clients
20
- vi.mock("@ai-sdk/openai", () => ({
21
- createOpenAI: vi.fn(() => (modelId: string) => ({
22
- modelId,
23
- provider: "openai",
24
- })),
25
- }));
26
-
27
- // Mock MCP imports so mcpServers code path doesn't fail when tested alongside mcpClients
28
- vi.mock("@ai-sdk/mcp", () => ({
29
- createMCPClient: vi.fn(),
30
- }));
31
-
32
- describe("mcpClients — user-managed MCP clients", () => {
33
- const originalEnv = process.env;
34
-
35
- beforeEach(() => {
36
- vi.clearAllMocks();
37
- process.env = { ...originalEnv };
38
- process.env.OPENAI_API_KEY = "test-key";
39
- });
40
-
41
- afterEach(() => {
42
- process.env = originalEnv;
43
- });
44
-
45
- const baseInput: RunAgentInput = {
46
- threadId: "thread1",
47
- runId: "run1",
48
- messages: [],
49
- tools: [],
50
- context: [],
51
- state: {},
52
- };
53
-
54
- function makeMockProvider(
55
- tools: Record<string, any>,
56
- ): MCPClientProvider & { close: ReturnType<typeof vi.fn> } {
57
- return {
58
- tools: vi.fn().mockResolvedValue(tools),
59
- close: vi.fn(),
60
- };
61
- }
62
-
63
- it("tools from mcpClients are passed to streamText", async () => {
64
- const mockTools = {
65
- listEnvelopes: { description: "List envelopes", execute: vi.fn() },
66
- };
67
- const provider = makeMockProvider(mockTools);
68
-
69
- const agent = new BasicAgent({
70
- model: "openai/gpt-4o",
71
- mcpClients: [provider],
72
- });
73
-
74
- vi.mocked(streamText).mockReturnValue(
75
- mockStreamTextResponse([textDelta("Hello"), finish()]) as any,
76
- );
77
-
78
- await collectEvents(agent["run"](baseInput));
79
-
80
- const callArgs = vi.mocked(streamText).mock.calls[0][0];
81
- expect(callArgs.tools).toHaveProperty("listEnvelopes");
82
- expect(callArgs.tools.listEnvelopes.description).toBe("List envelopes");
83
- expect(provider.tools).toHaveBeenCalledOnce();
84
- });
85
-
86
- it("mcpClients are NOT closed after run completes", async () => {
87
- const provider = makeMockProvider({
88
- myTool: { description: "A tool", execute: vi.fn() },
89
- });
90
-
91
- const agent = new BasicAgent({
92
- model: "openai/gpt-4o",
93
- mcpClients: [provider],
94
- });
95
-
96
- vi.mocked(streamText).mockReturnValue(
97
- mockStreamTextResponse([finish()]) as any,
98
- );
99
-
100
- await collectEvents(agent["run"](baseInput));
101
-
102
- expect(provider.close).not.toHaveBeenCalled();
103
- });
104
-
105
- it("mcpServers tools override mcpClients tools on name collision", async () => {
106
- const clientExecute = vi.fn();
107
- const serverExecute = vi.fn();
108
-
109
- const provider = makeMockProvider({
110
- sharedTool: { description: "from client", execute: clientExecute },
111
- });
112
-
113
- // Mock mcpServers flow: createMCPClient returns a client with tools()
114
- const { createMCPClient } = await import("@ai-sdk/mcp");
115
- vi.mocked(createMCPClient).mockResolvedValue({
116
- tools: vi.fn().mockResolvedValue({
117
- sharedTool: { description: "from server", execute: serverExecute },
118
- }),
119
- close: vi.fn(),
120
- } as any);
121
-
122
- const agent = new BasicAgent({
123
- model: "openai/gpt-4o",
124
- mcpClients: [provider],
125
- mcpServers: [{ type: "http", url: "http://localhost:9999" }],
126
- });
127
-
128
- vi.mocked(streamText).mockReturnValue(
129
- mockStreamTextResponse([finish()]) as any,
130
- );
131
-
132
- await collectEvents(agent["run"](baseInput));
133
-
134
- const callArgs = vi.mocked(streamText).mock.calls[0][0];
135
- // mcpServers runs after mcpClients, so "from server" should win
136
- expect(callArgs.tools.sharedTool.description).toBe("from server");
137
- });
138
-
139
- it("multiple mcpClients merge in order (later overrides earlier)", async () => {
140
- const provider1 = makeMockProvider({
141
- toolA: { description: "from provider 1", execute: vi.fn() },
142
- shared: { description: "from provider 1", execute: vi.fn() },
143
- });
144
- const provider2 = makeMockProvider({
145
- toolB: { description: "from provider 2", execute: vi.fn() },
146
- shared: { description: "from provider 2", execute: vi.fn() },
147
- });
148
-
149
- const agent = new BasicAgent({
150
- model: "openai/gpt-4o",
151
- mcpClients: [provider1, provider2],
152
- });
153
-
154
- vi.mocked(streamText).mockReturnValue(
155
- mockStreamTextResponse([finish()]) as any,
156
- );
157
-
158
- await collectEvents(agent["run"](baseInput));
159
-
160
- const callArgs = vi.mocked(streamText).mock.calls[0][0];
161
- expect(callArgs.tools).toHaveProperty("toolA");
162
- expect(callArgs.tools).toHaveProperty("toolB");
163
- expect(callArgs.tools.shared.description).toBe("from provider 2");
164
- });
165
-
166
- it("empty mcpClients array is a no-op", async () => {
167
- const agent = new BasicAgent({
168
- model: "openai/gpt-4o",
169
- mcpClients: [],
170
- });
171
-
172
- vi.mocked(streamText).mockReturnValue(
173
- mockStreamTextResponse([textDelta("Hi"), finish()]) as any,
174
- );
175
-
176
- const events = await collectEvents(agent["run"](baseInput));
177
-
178
- // Should still work normally
179
- const textEvents = events.filter(
180
- (e: any) => e.type === EventType.TEXT_MESSAGE_CHUNK,
181
- );
182
- expect(textEvents.length).toBeGreaterThan(0);
183
- });
184
-
185
- it("mcpClients .tools() rejection emits RUN_ERROR", async () => {
186
- const failingProvider: MCPClientProvider = {
187
- tools: vi.fn().mockRejectedValue(new Error("MCP connection lost")),
188
- };
189
-
190
- const agent = new BasicAgent({
191
- model: "openai/gpt-4o",
192
- mcpClients: [failingProvider],
193
- });
194
-
195
- vi.mocked(streamText).mockReturnValue(
196
- mockStreamTextResponse([finish()]) as any,
197
- );
198
-
199
- // Collect events manually so we can capture RUN_ERROR before the rejection
200
- const events: any[] = [];
201
- try {
202
- await new Promise((resolve, reject) => {
203
- agent["run"](baseInput).subscribe({
204
- next: (event: any) => events.push(event),
205
- error: (err: any) => reject(err),
206
- complete: () => resolve(events),
207
- });
208
- });
209
- } catch {
210
- // Expected — Observable errors after emitting RUN_ERROR
211
- }
212
-
213
- // streamText should NOT have been called (error before reaching it)
214
- expect(streamText).not.toHaveBeenCalled();
215
- // A RUN_ERROR event should have been emitted
216
- expect(events.some((e) => e.type === EventType.RUN_ERROR)).toBe(true);
217
- });
218
-
219
- it("clone() shares the same mcpClients references", () => {
220
- const provider = makeMockProvider({});
221
-
222
- const agent = new BasicAgent({
223
- model: "openai/gpt-4o",
224
- mcpClients: [provider],
225
- });
226
-
227
- const cloned = agent.clone();
228
-
229
- // Access the config to verify same reference
230
- // Both agents share the same config object (by reference)
231
- expect((cloned as any).config.mcpClients[0]).toBe(provider);
232
- });
233
-
234
- it("type compatibility: @ai-sdk/mcp MCPClient satisfies MCPClientProvider", async () => {
235
- // Compile-time check that `MCPClientProvider` is structurally compatible
236
- // with `@ai-sdk/mcp`'s `MCPClient`. After the refactor `MCPClientProvider`
237
- // is an alias for `Pick<MCPClient, "tools">`, so this is trivially true —
238
- // but keeping the test guards against future divergence.
239
- type MCPClient = Awaited<
240
- ReturnType<typeof import("@ai-sdk/mcp").createMCPClient>
241
- >;
242
- const _assignable: MCPClientProvider = {} as MCPClient;
243
- void _assignable;
244
- expect(true).toBe(true);
245
- });
246
- });
@@ -1,373 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
- import { BasicAgent } from "../index";
3
- import { EventType } from "@ag-ui/client";
4
- import { streamText } from "ai";
5
- import { LLMock, MCPMock } from "@copilotkit/aimock";
6
- import {
7
- mockStreamTextResponse,
8
- textDelta,
9
- finish,
10
- collectEvents,
11
- toolCall,
12
- toolResult,
13
- } from "./test-helpers";
14
-
15
- // Mock the ai module — we don't want real LLM calls
16
- vi.mock("ai", () => ({
17
- streamText: vi.fn(),
18
- tool: vi.fn((config) => config),
19
- stepCountIs: vi.fn((count: number) => ({ type: "stepCount", count })),
20
- }));
21
-
22
- vi.mock("@ai-sdk/openai", () => ({
23
- createOpenAI: vi.fn(() => (modelId: string) => ({
24
- modelId,
25
- provider: "openai",
26
- })),
27
- }));
28
-
29
- // Do NOT mock @ai-sdk/mcp or @modelcontextprotocol/sdk transports —
30
- // we want real HTTP connections to the MCPMock server.
31
-
32
- describe("mcpServers — real MCP server integration", () => {
33
- const originalEnv = process.env;
34
- let llm: LLMock;
35
- let mcpMock: MCPMock;
36
-
37
- beforeEach(() => {
38
- vi.clearAllMocks();
39
- process.env = { ...originalEnv };
40
- process.env.OPENAI_API_KEY = "test-key";
41
- });
42
-
43
- afterEach(async () => {
44
- process.env = originalEnv;
45
- if (llm) {
46
- await llm.stop().catch(() => {});
47
- }
48
- });
49
-
50
- const baseInput = {
51
- threadId: "thread1",
52
- runId: "run1",
53
- messages: [],
54
- tools: [],
55
- context: [],
56
- state: {},
57
- };
58
-
59
- /**
60
- * Start an LLMock with an MCPMock mounted at /mcp.
61
- * Returns the full MCP endpoint URL.
62
- */
63
- async function startMcpServer(
64
- tools: Array<{ name: string; description?: string }>,
65
- ): Promise<{ mcpUrl: string; llm: LLMock; mcpMock: MCPMock }> {
66
- const mock = new MCPMock();
67
- for (const t of tools) {
68
- mock.addTool({
69
- name: t.name,
70
- description: t.description ?? `${t.name} tool`,
71
- inputSchema: {
72
- type: "object",
73
- properties: { query: { type: "string" } },
74
- },
75
- });
76
- mock.onToolCall(t.name, () => `result from ${t.name}`);
77
- }
78
-
79
- const server = new LLMock({ port: 0 });
80
- server.mount("/mcp", mock);
81
- await server.start();
82
-
83
- return {
84
- mcpUrl: `${server.url}/mcp`,
85
- llm: server,
86
- mcpMock: mock,
87
- };
88
- }
89
-
90
- it("HTTP transport fetches tools from MCPMock", async () => {
91
- const result = await startMcpServer([
92
- { name: "get_weather", description: "Get the weather" },
93
- ]);
94
- llm = result.llm;
95
- mcpMock = result.mcpMock;
96
-
97
- const agent = new BasicAgent({
98
- model: "openai/gpt-4o",
99
- mcpServers: [{ type: "http", url: result.mcpUrl }],
100
- });
101
-
102
- vi.mocked(streamText).mockReturnValue(
103
- mockStreamTextResponse([textDelta("Hello"), finish()]) as any,
104
- );
105
-
106
- await collectEvents(agent["run"](baseInput));
107
-
108
- const callArgs = vi.mocked(streamText).mock.calls[0][0];
109
- expect(callArgs.tools).toHaveProperty("get_weather");
110
- });
111
-
112
- it("SSE transport against MCPMock emits RUN_ERROR or completes without crash", async () => {
113
- // MCPMock only supports Streamable HTTP, not SSE.
114
- // The agent should emit RUN_ERROR when SSE connection fails.
115
- const result = await startMcpServer([
116
- { name: "get_weather", description: "Get the weather" },
117
- ]);
118
- llm = result.llm;
119
- mcpMock = result.mcpMock;
120
-
121
- const agent = new BasicAgent({
122
- model: "openai/gpt-4o",
123
- mcpServers: [{ type: "sse", url: result.mcpUrl }],
124
- });
125
-
126
- vi.mocked(streamText).mockReturnValue(
127
- mockStreamTextResponse([finish()]) as any,
128
- );
129
-
130
- // Collect events manually — the Observable may error after emitting RUN_ERROR
131
- const events: any[] = [];
132
- try {
133
- await new Promise((resolve, reject) => {
134
- agent["run"](baseInput).subscribe({
135
- next: (event: any) => events.push(event),
136
- error: (err: any) => reject(err),
137
- complete: () => resolve(events),
138
- });
139
- });
140
- // If it completes without error, that's also acceptable (graceful fallthrough)
141
- } catch {
142
- // Expected — SSE transport failure should emit RUN_ERROR then error
143
- }
144
-
145
- const hasRunError = events.some((e) => e.type === EventType.RUN_ERROR);
146
- // Either we got a RUN_ERROR or streamText was never called (connection failed before tools fetch)
147
- expect(hasRunError || !vi.mocked(streamText).mock.calls.length).toBe(true);
148
- });
149
-
150
- it("tool call round-trip emits TOOL_CALL_START, TOOL_CALL_RESULT, and TEXT_MESSAGE_CHUNK", async () => {
151
- const result = await startMcpServer([
152
- { name: "get_weather", description: "Get the weather" },
153
- ]);
154
- llm = result.llm;
155
- mcpMock = result.mcpMock;
156
-
157
- const agent = new BasicAgent({
158
- model: "openai/gpt-4o",
159
- mcpServers: [{ type: "http", url: result.mcpUrl }],
160
- });
161
-
162
- vi.mocked(streamText).mockReturnValue(
163
- mockStreamTextResponse([
164
- toolCall("tc1", "get_weather", { query: "NYC" }),
165
- toolResult("tc1", "get_weather", "Sunny 72F"),
166
- textDelta("The weather is sunny."),
167
- finish(),
168
- ]) as any,
169
- );
170
-
171
- const events = await collectEvents(agent["run"](baseInput));
172
-
173
- const types = events.map((e: any) => e.type);
174
- expect(types).toContain(EventType.TOOL_CALL_START);
175
- expect(types).toContain(EventType.TOOL_CALL_RESULT);
176
- expect(types).toContain(EventType.TEXT_MESSAGE_CHUNK);
177
-
178
- // Verify the tool call result content
179
- const resultEvent = events.find(
180
- (e: any) => e.type === EventType.TOOL_CALL_RESULT,
181
- ) as any;
182
- expect(resultEvent.toolCallId).toBe("tc1");
183
- expect(resultEvent.content).toContain("Sunny 72F");
184
- });
185
-
186
- it("MCP clients are cleaned up after completion — second run creates fresh connections", async () => {
187
- const result = await startMcpServer([
188
- { name: "get_weather", description: "Get the weather" },
189
- ]);
190
- llm = result.llm;
191
- mcpMock = result.mcpMock;
192
-
193
- const agent = new BasicAgent({
194
- model: "openai/gpt-4o",
195
- mcpServers: [{ type: "http", url: result.mcpUrl }],
196
- });
197
-
198
- // First run
199
- vi.mocked(streamText).mockReturnValue(
200
- mockStreamTextResponse([textDelta("Run 1"), finish()]) as any,
201
- );
202
- const events1 = await collectEvents(agent["run"](baseInput));
203
- expect(events1.some((e: any) => e.type === EventType.RUN_FINISHED)).toBe(
204
- true,
205
- );
206
-
207
- // Second run — should succeed with fresh MCP client connections
208
- vi.mocked(streamText).mockReturnValue(
209
- mockStreamTextResponse([textDelta("Run 2"), finish()]) as any,
210
- );
211
- const events2 = await collectEvents(agent["run"](baseInput));
212
- expect(events2.some((e: any) => e.type === EventType.RUN_FINISHED)).toBe(
213
- true,
214
- );
215
-
216
- // streamText was called twice (once per run), each time with MCP tools
217
- expect(vi.mocked(streamText).mock.calls).toHaveLength(2);
218
- expect(vi.mocked(streamText).mock.calls[0][0].tools).toHaveProperty(
219
- "get_weather",
220
- );
221
- expect(vi.mocked(streamText).mock.calls[1][0].tools).toHaveProperty(
222
- "get_weather",
223
- );
224
- });
225
-
226
- it("unreachable MCP server emits RUN_ERROR", async () => {
227
- const agent = new BasicAgent({
228
- model: "openai/gpt-4o",
229
- mcpServers: [{ type: "http", url: "http://localhost:59999" }],
230
- });
231
-
232
- vi.mocked(streamText).mockReturnValue(
233
- mockStreamTextResponse([finish()]) as any,
234
- );
235
-
236
- const events: any[] = [];
237
- try {
238
- await new Promise((resolve, reject) => {
239
- agent["run"](baseInput).subscribe({
240
- next: (event: any) => events.push(event),
241
- error: (err: any) => reject(err),
242
- complete: () => resolve(events),
243
- });
244
- });
245
- } catch {
246
- // Expected — connection refused should cause an error
247
- }
248
-
249
- expect(events.some((e) => e.type === EventType.RUN_ERROR)).toBe(true);
250
- // streamText should not have been called since MCP init failed
251
- expect(streamText).not.toHaveBeenCalled();
252
- });
253
-
254
- it("MCP clients are cleaned up after streamText error — subsequent run still works", async () => {
255
- const result = await startMcpServer([
256
- { name: "get_weather", description: "Get the weather" },
257
- ]);
258
- llm = result.llm;
259
- mcpMock = result.mcpMock;
260
-
261
- const agent = new BasicAgent({
262
- model: "openai/gpt-4o",
263
- mcpServers: [{ type: "http", url: result.mcpUrl }],
264
- });
265
-
266
- // First run — streamText throws an error
267
- vi.mocked(streamText).mockImplementation(() => {
268
- throw new Error("LLM connection failed");
269
- });
270
-
271
- const events1: any[] = [];
272
- try {
273
- await new Promise((resolve, reject) => {
274
- agent["run"](baseInput).subscribe({
275
- next: (event: any) => events1.push(event),
276
- error: (err: any) => reject(err),
277
- complete: () => resolve(events1),
278
- });
279
- });
280
- } catch {
281
- // Expected — streamText threw
282
- }
283
-
284
- // Should have emitted RUN_ERROR
285
- expect(events1.some((e) => e.type === EventType.RUN_ERROR)).toBe(true);
286
-
287
- // Second run — streamText works normally, proving MCP cleanup happened
288
- vi.mocked(streamText).mockReturnValue(
289
- mockStreamTextResponse([textDelta("Recovery"), finish()]) as any,
290
- );
291
- const events2 = await collectEvents(agent["run"](baseInput));
292
- expect(events2.some((e: any) => e.type === EventType.RUN_FINISHED)).toBe(
293
- true,
294
- );
295
-
296
- // The second run should have MCP tools available
297
- const secondCallArgs = vi.mocked(streamText).mock.calls[1][0];
298
- expect(secondCallArgs.tools).toHaveProperty("get_weather");
299
- });
300
-
301
- it("MCP tool descriptions are passed to streamText tools config", async () => {
302
- const result = await startMcpServer([
303
- { name: "get_weather", description: "Get the weather" },
304
- ]);
305
- llm = result.llm;
306
- mcpMock = result.mcpMock;
307
-
308
- const agent = new BasicAgent({
309
- model: "openai/gpt-4o",
310
- mcpServers: [{ type: "http", url: result.mcpUrl }],
311
- });
312
-
313
- vi.mocked(streamText).mockReturnValue(
314
- mockStreamTextResponse([textDelta("Hello"), finish()]) as any,
315
- );
316
-
317
- await collectEvents(agent["run"](baseInput));
318
-
319
- const callArgs = vi.mocked(streamText).mock.calls[0][0];
320
- expect(callArgs.tools).toHaveProperty("get_weather");
321
- // The MCP tool should include the description from the MCPMock server
322
- expect(callArgs.tools.get_weather.description).toBe("Get the weather");
323
- });
324
-
325
- it("multiple MCP servers merge tools from both", async () => {
326
- // First server with get_weather
327
- const result1 = await startMcpServer([
328
- { name: "get_weather", description: "Get the weather" },
329
- ]);
330
- llm = result1.llm;
331
-
332
- // Second server with search_docs
333
- const mock2 = new MCPMock();
334
- mock2.addTool({
335
- name: "search_docs",
336
- description: "Search documentation",
337
- inputSchema: {
338
- type: "object",
339
- properties: { query: { type: "string" } },
340
- },
341
- });
342
- mock2.onToolCall("search_docs", () => "doc results");
343
-
344
- const llm2 = new LLMock({ port: 0 });
345
- llm2.mount("/mcp", mock2);
346
- await llm2.start();
347
-
348
- try {
349
- const agent = new BasicAgent({
350
- model: "openai/gpt-4o",
351
- mcpServers: [
352
- { type: "http", url: result1.mcpUrl },
353
- { type: "http", url: `${llm2.url}/mcp` },
354
- ],
355
- });
356
-
357
- vi.mocked(streamText).mockReturnValue(
358
- mockStreamTextResponse([
359
- textDelta("Both tools available"),
360
- finish(),
361
- ]) as any,
362
- );
363
-
364
- await collectEvents(agent["run"](baseInput));
365
-
366
- const callArgs = vi.mocked(streamText).mock.calls[0][0];
367
- expect(callArgs.tools).toHaveProperty("get_weather");
368
- expect(callArgs.tools).toHaveProperty("search_docs");
369
- } finally {
370
- await llm2.stop().catch(() => {});
371
- }
372
- });
373
- });