@copilotkit/runtime 1.54.1-next.6 → 1.55.0-next.7

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 (337) hide show
  1. package/.eslintrc.js +4 -4
  2. package/CHANGELOG.md +117 -106
  3. package/dist/_virtual/_rolldown/runtime.mjs +25 -1
  4. package/dist/agent/index.cjs +643 -0
  5. package/dist/agent/index.cjs.map +1 -0
  6. package/dist/agent/index.d.cts +263 -0
  7. package/dist/agent/index.d.cts.map +1 -0
  8. package/dist/agent/index.d.mts +263 -0
  9. package/dist/agent/index.d.mts.map +1 -0
  10. package/dist/agent/index.mjs +635 -0
  11. package/dist/agent/index.mjs.map +1 -0
  12. package/dist/graphql/message-conversion/agui-to-gql.cjs.map +1 -1
  13. package/dist/graphql/message-conversion/agui-to-gql.mjs.map +1 -1
  14. package/dist/lib/integrations/nextjs/app-router.cjs +2 -2
  15. package/dist/lib/integrations/nextjs/app-router.cjs.map +1 -1
  16. package/dist/lib/integrations/nextjs/app-router.mjs +1 -1
  17. package/dist/lib/integrations/nextjs/app-router.mjs.map +1 -1
  18. package/dist/lib/integrations/node-http/index.cjs +2 -3
  19. package/dist/lib/integrations/node-http/index.cjs.map +1 -1
  20. package/dist/lib/integrations/node-http/index.mjs +1 -1
  21. package/dist/lib/integrations/node-http/index.mjs.map +1 -1
  22. package/dist/lib/runtime/agent-integrations/langgraph/agent.cjs +1 -1
  23. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts +2 -2
  24. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts.map +1 -1
  25. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.mts +3 -3
  26. package/dist/lib/runtime/agent-integrations/langgraph/agent.d.mts.map +1 -1
  27. package/dist/lib/runtime/agent-integrations/langgraph/agent.mjs +1 -1
  28. package/dist/lib/runtime/copilot-runtime.cjs +7 -5
  29. package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
  30. package/dist/lib/runtime/copilot-runtime.d.cts +10 -8
  31. package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
  32. package/dist/lib/runtime/copilot-runtime.d.mts +10 -8
  33. package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
  34. package/dist/lib/runtime/copilot-runtime.mjs +7 -5
  35. package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
  36. package/dist/lib/runtime/telemetry-agent-runner.cjs +2 -2
  37. package/dist/lib/runtime/telemetry-agent-runner.cjs.map +1 -1
  38. package/dist/lib/runtime/telemetry-agent-runner.d.cts +2 -1
  39. package/dist/lib/runtime/telemetry-agent-runner.d.cts.map +1 -1
  40. package/dist/lib/runtime/telemetry-agent-runner.d.mts +2 -1
  41. package/dist/lib/runtime/telemetry-agent-runner.d.mts.map +1 -1
  42. package/dist/lib/runtime/telemetry-agent-runner.mjs +1 -1
  43. package/dist/lib/runtime/telemetry-agent-runner.mjs.map +1 -1
  44. package/dist/lib/telemetry-client.cjs +1 -1
  45. package/dist/lib/telemetry-client.mjs +1 -1
  46. package/dist/package.cjs +21 -4
  47. package/dist/package.mjs +21 -4
  48. package/dist/service-adapters/anthropic/anthropic-adapter.d.mts +1 -1
  49. package/dist/v2/index.cjs +41 -15
  50. package/dist/v2/index.d.cts +14 -2
  51. package/dist/v2/index.d.mts +14 -2
  52. package/dist/v2/index.mjs +13 -4
  53. package/dist/v2/runtime/endpoints/express-single.cjs +190 -0
  54. package/dist/v2/runtime/endpoints/express-single.cjs.map +1 -0
  55. package/dist/v2/runtime/endpoints/express-single.d.cts +16 -0
  56. package/dist/v2/runtime/endpoints/express-single.d.cts.map +1 -0
  57. package/dist/v2/runtime/endpoints/express-single.d.mts +16 -0
  58. package/dist/v2/runtime/endpoints/express-single.d.mts.map +1 -0
  59. package/dist/v2/runtime/endpoints/express-single.mjs +187 -0
  60. package/dist/v2/runtime/endpoints/express-single.mjs.map +1 -0
  61. package/dist/v2/runtime/endpoints/express-utils.cjs +119 -0
  62. package/dist/v2/runtime/endpoints/express-utils.cjs.map +1 -0
  63. package/dist/v2/runtime/endpoints/express-utils.mjs +117 -0
  64. package/dist/v2/runtime/endpoints/express-utils.mjs.map +1 -0
  65. package/dist/v2/runtime/endpoints/express.cjs +217 -0
  66. package/dist/v2/runtime/endpoints/express.cjs.map +1 -0
  67. package/dist/v2/runtime/endpoints/express.d.cts +16 -0
  68. package/dist/v2/runtime/endpoints/express.d.cts.map +1 -0
  69. package/dist/v2/runtime/endpoints/express.d.mts +16 -0
  70. package/dist/v2/runtime/endpoints/express.d.mts.map +1 -0
  71. package/dist/v2/runtime/endpoints/express.mjs +214 -0
  72. package/dist/v2/runtime/endpoints/express.mjs.map +1 -0
  73. package/dist/v2/runtime/endpoints/hono-single.cjs +141 -0
  74. package/dist/v2/runtime/endpoints/hono-single.cjs.map +1 -0
  75. package/dist/v2/runtime/endpoints/hono-single.d.cts +41 -0
  76. package/dist/v2/runtime/endpoints/hono-single.d.cts.map +1 -0
  77. package/dist/v2/runtime/endpoints/hono-single.d.mts +41 -0
  78. package/dist/v2/runtime/endpoints/hono-single.d.mts.map +1 -0
  79. package/dist/v2/runtime/endpoints/hono-single.mjs +140 -0
  80. package/dist/v2/runtime/endpoints/hono-single.mjs.map +1 -0
  81. package/dist/v2/runtime/endpoints/hono.cjs +248 -0
  82. package/dist/v2/runtime/endpoints/hono.cjs.map +1 -0
  83. package/dist/v2/runtime/endpoints/hono.d.cts +164 -0
  84. package/dist/v2/runtime/endpoints/hono.d.cts.map +1 -0
  85. package/dist/v2/runtime/endpoints/hono.d.mts +164 -0
  86. package/dist/v2/runtime/endpoints/hono.d.mts.map +1 -0
  87. package/dist/v2/runtime/endpoints/hono.mjs +247 -0
  88. package/dist/v2/runtime/endpoints/hono.mjs.map +1 -0
  89. package/dist/v2/runtime/endpoints/index.d.cts +5 -0
  90. package/dist/v2/runtime/endpoints/index.d.mts +5 -0
  91. package/dist/v2/runtime/endpoints/single-route-helpers.cjs +68 -0
  92. package/dist/v2/runtime/endpoints/single-route-helpers.cjs.map +1 -0
  93. package/dist/v2/runtime/endpoints/single-route-helpers.mjs +65 -0
  94. package/dist/v2/runtime/endpoints/single-route-helpers.mjs.map +1 -0
  95. package/dist/v2/runtime/handlers/get-runtime-info.cjs +51 -0
  96. package/dist/v2/runtime/handlers/get-runtime-info.cjs.map +1 -0
  97. package/dist/v2/runtime/handlers/get-runtime-info.mjs +51 -0
  98. package/dist/v2/runtime/handlers/get-runtime-info.mjs.map +1 -0
  99. package/dist/v2/runtime/handlers/handle-connect.cjs +49 -0
  100. package/dist/v2/runtime/handlers/handle-connect.cjs.map +1 -0
  101. package/dist/v2/runtime/handlers/handle-connect.mjs +49 -0
  102. package/dist/v2/runtime/handlers/handle-connect.mjs.map +1 -0
  103. package/dist/v2/runtime/handlers/handle-run.cjs +61 -0
  104. package/dist/v2/runtime/handlers/handle-run.cjs.map +1 -0
  105. package/dist/v2/runtime/handlers/handle-run.mjs +61 -0
  106. package/dist/v2/runtime/handlers/handle-run.mjs.map +1 -0
  107. package/dist/v2/runtime/handlers/handle-stop.cjs +47 -0
  108. package/dist/v2/runtime/handlers/handle-stop.cjs.map +1 -0
  109. package/dist/v2/runtime/handlers/handle-stop.mjs +46 -0
  110. package/dist/v2/runtime/handlers/handle-stop.mjs.map +1 -0
  111. package/dist/v2/runtime/handlers/handle-transcribe.cjs +112 -0
  112. package/dist/v2/runtime/handlers/handle-transcribe.cjs.map +1 -0
  113. package/dist/v2/runtime/handlers/handle-transcribe.mjs +111 -0
  114. package/dist/v2/runtime/handlers/handle-transcribe.mjs.map +1 -0
  115. package/dist/v2/runtime/handlers/header-utils.cjs +26 -0
  116. package/dist/v2/runtime/handlers/header-utils.cjs.map +1 -0
  117. package/dist/v2/runtime/handlers/header-utils.mjs +25 -0
  118. package/dist/v2/runtime/handlers/header-utils.mjs.map +1 -0
  119. package/dist/v2/runtime/handlers/intelligence/connect.cjs +37 -0
  120. package/dist/v2/runtime/handlers/intelligence/connect.cjs.map +1 -0
  121. package/dist/v2/runtime/handlers/intelligence/connect.mjs +37 -0
  122. package/dist/v2/runtime/handlers/intelligence/connect.mjs.map +1 -0
  123. package/dist/v2/runtime/handlers/intelligence/run.cjs +89 -0
  124. package/dist/v2/runtime/handlers/intelligence/run.cjs.map +1 -0
  125. package/dist/v2/runtime/handlers/intelligence/run.mjs +88 -0
  126. package/dist/v2/runtime/handlers/intelligence/run.mjs.map +1 -0
  127. package/dist/v2/runtime/handlers/intelligence/thread-names.cjs +146 -0
  128. package/dist/v2/runtime/handlers/intelligence/thread-names.cjs.map +1 -0
  129. package/dist/v2/runtime/handlers/intelligence/thread-names.mjs +145 -0
  130. package/dist/v2/runtime/handlers/intelligence/thread-names.mjs.map +1 -0
  131. package/dist/v2/runtime/handlers/intelligence/threads.cjs +159 -0
  132. package/dist/v2/runtime/handlers/intelligence/threads.cjs.map +1 -0
  133. package/dist/v2/runtime/handlers/intelligence/threads.mjs +154 -0
  134. package/dist/v2/runtime/handlers/intelligence/threads.mjs.map +1 -0
  135. package/dist/v2/runtime/handlers/shared/agent-utils.cjs +74 -0
  136. package/dist/v2/runtime/handlers/shared/agent-utils.cjs.map +1 -0
  137. package/dist/v2/runtime/handlers/shared/agent-utils.mjs +70 -0
  138. package/dist/v2/runtime/handlers/shared/agent-utils.mjs.map +1 -0
  139. package/dist/v2/runtime/handlers/shared/intelligence-utils.cjs +21 -0
  140. package/dist/v2/runtime/handlers/shared/intelligence-utils.cjs.map +1 -0
  141. package/dist/v2/runtime/handlers/shared/intelligence-utils.mjs +20 -0
  142. package/dist/v2/runtime/handlers/shared/intelligence-utils.mjs.map +1 -0
  143. package/dist/v2/runtime/handlers/shared/json-response.cjs +12 -0
  144. package/dist/v2/runtime/handlers/shared/json-response.cjs.map +1 -0
  145. package/dist/v2/runtime/handlers/shared/json-response.mjs +10 -0
  146. package/dist/v2/runtime/handlers/shared/json-response.mjs.map +1 -0
  147. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.cjs +20 -0
  148. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.cjs.map +1 -0
  149. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.mjs +20 -0
  150. package/dist/v2/runtime/handlers/shared/resolve-intelligence-user.mjs.map +1 -0
  151. package/dist/v2/runtime/handlers/shared/sse-response.cjs +69 -0
  152. package/dist/v2/runtime/handlers/shared/sse-response.cjs.map +1 -0
  153. package/dist/v2/runtime/handlers/shared/sse-response.mjs +68 -0
  154. package/dist/v2/runtime/handlers/shared/sse-response.mjs.map +1 -0
  155. package/dist/v2/runtime/handlers/sse/connect.cjs +18 -0
  156. package/dist/v2/runtime/handlers/sse/connect.cjs.map +1 -0
  157. package/dist/v2/runtime/handlers/sse/connect.mjs +18 -0
  158. package/dist/v2/runtime/handlers/sse/connect.mjs.map +1 -0
  159. package/dist/v2/runtime/handlers/sse/run.cjs +18 -0
  160. package/dist/v2/runtime/handlers/sse/run.cjs.map +1 -0
  161. package/dist/v2/runtime/handlers/sse/run.mjs +18 -0
  162. package/dist/v2/runtime/handlers/sse/run.mjs.map +1 -0
  163. package/dist/v2/runtime/index.d.cts +13 -0
  164. package/dist/v2/runtime/index.d.mts +14 -0
  165. package/dist/v2/runtime/intelligence-platform/client.cjs +333 -0
  166. package/dist/v2/runtime/intelligence-platform/client.cjs.map +1 -0
  167. package/dist/v2/runtime/intelligence-platform/client.d.cts +336 -0
  168. package/dist/v2/runtime/intelligence-platform/client.d.cts.map +1 -0
  169. package/dist/v2/runtime/intelligence-platform/client.d.mts +336 -0
  170. package/dist/v2/runtime/intelligence-platform/client.d.mts.map +1 -0
  171. package/dist/v2/runtime/intelligence-platform/client.mjs +331 -0
  172. package/dist/v2/runtime/intelligence-platform/client.mjs.map +1 -0
  173. package/dist/v2/runtime/intelligence-platform/index.d.mts +2 -0
  174. package/dist/v2/runtime/middleware-sse-parser.cjs +138 -0
  175. package/dist/v2/runtime/middleware-sse-parser.cjs.map +1 -0
  176. package/dist/v2/runtime/middleware-sse-parser.d.cts +22 -0
  177. package/dist/v2/runtime/middleware-sse-parser.d.cts.map +1 -0
  178. package/dist/v2/runtime/middleware-sse-parser.d.mts +22 -0
  179. package/dist/v2/runtime/middleware-sse-parser.d.mts.map +1 -0
  180. package/dist/v2/runtime/middleware-sse-parser.mjs +137 -0
  181. package/dist/v2/runtime/middleware-sse-parser.mjs.map +1 -0
  182. package/dist/v2/runtime/middleware.cjs +35 -0
  183. package/dist/v2/runtime/middleware.cjs.map +1 -0
  184. package/dist/v2/runtime/middleware.d.cts +32 -0
  185. package/dist/v2/runtime/middleware.d.cts.map +1 -0
  186. package/dist/v2/runtime/middleware.d.mts +32 -0
  187. package/dist/v2/runtime/middleware.d.mts.map +1 -0
  188. package/dist/v2/runtime/middleware.mjs +33 -0
  189. package/dist/v2/runtime/middleware.mjs.map +1 -0
  190. package/dist/v2/runtime/runner/agent-runner.cjs +8 -0
  191. package/dist/v2/runtime/runner/agent-runner.cjs.map +1 -0
  192. package/dist/v2/runtime/runner/agent-runner.d.cts +32 -0
  193. package/dist/v2/runtime/runner/agent-runner.d.cts.map +1 -0
  194. package/dist/v2/runtime/runner/agent-runner.d.mts +32 -0
  195. package/dist/v2/runtime/runner/agent-runner.d.mts.map +1 -0
  196. package/dist/v2/runtime/runner/agent-runner.mjs +7 -0
  197. package/dist/v2/runtime/runner/agent-runner.mjs.map +1 -0
  198. package/dist/v2/runtime/runner/in-memory.cjs +223 -0
  199. package/dist/v2/runtime/runner/in-memory.cjs.map +1 -0
  200. package/dist/v2/runtime/runner/in-memory.d.cts +15 -0
  201. package/dist/v2/runtime/runner/in-memory.d.cts.map +1 -0
  202. package/dist/v2/runtime/runner/in-memory.d.mts +15 -0
  203. package/dist/v2/runtime/runner/in-memory.d.mts.map +1 -0
  204. package/dist/v2/runtime/runner/in-memory.mjs +222 -0
  205. package/dist/v2/runtime/runner/in-memory.mjs.map +1 -0
  206. package/dist/v2/runtime/runner/index.d.cts +6 -0
  207. package/dist/v2/runtime/runner/index.d.mts +6 -0
  208. package/dist/v2/runtime/runner/index.mjs +7 -0
  209. package/dist/v2/runtime/runner/intelligence.cjs +246 -0
  210. package/dist/v2/runtime/runner/intelligence.cjs.map +1 -0
  211. package/dist/v2/runtime/runner/intelligence.d.cts +57 -0
  212. package/dist/v2/runtime/runner/intelligence.d.cts.map +1 -0
  213. package/dist/v2/runtime/runner/intelligence.d.mts +57 -0
  214. package/dist/v2/runtime/runner/intelligence.d.mts.map +1 -0
  215. package/dist/v2/runtime/runner/intelligence.mjs +245 -0
  216. package/dist/v2/runtime/runner/intelligence.mjs.map +1 -0
  217. package/dist/v2/runtime/runtime.cjs +101 -0
  218. package/dist/v2/runtime/runtime.cjs.map +1 -0
  219. package/dist/v2/runtime/runtime.d.cts +132 -0
  220. package/dist/v2/runtime/runtime.d.cts.map +1 -0
  221. package/dist/v2/runtime/runtime.d.mts +133 -0
  222. package/dist/v2/runtime/runtime.d.mts.map +1 -0
  223. package/dist/v2/runtime/runtime.mjs +97 -0
  224. package/dist/v2/runtime/runtime.mjs.map +1 -0
  225. package/dist/v2/runtime/telemetry/scarf-client.cjs +32 -0
  226. package/dist/v2/runtime/telemetry/scarf-client.cjs.map +1 -0
  227. package/dist/v2/runtime/telemetry/scarf-client.mjs +32 -0
  228. package/dist/v2/runtime/telemetry/scarf-client.mjs.map +1 -0
  229. package/dist/v2/runtime/telemetry/telemetry-client.cjs +35 -0
  230. package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -0
  231. package/dist/v2/runtime/telemetry/telemetry-client.mjs +35 -0
  232. package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -0
  233. package/dist/v2/runtime/transcription-service/transcription-service.cjs +8 -0
  234. package/dist/v2/runtime/transcription-service/transcription-service.cjs.map +1 -0
  235. package/dist/v2/runtime/transcription-service/transcription-service.d.cts +15 -0
  236. package/dist/v2/runtime/transcription-service/transcription-service.d.cts.map +1 -0
  237. package/dist/v2/runtime/transcription-service/transcription-service.d.mts +15 -0
  238. package/dist/v2/runtime/transcription-service/transcription-service.d.mts.map +1 -0
  239. package/dist/v2/runtime/transcription-service/transcription-service.mjs +7 -0
  240. package/dist/v2/runtime/transcription-service/transcription-service.mjs.map +1 -0
  241. package/package.json +22 -5
  242. package/src/agent/__tests__/ai-sdk-v6-compat.test.ts +116 -0
  243. package/src/agent/__tests__/basic-agent.test.ts +1248 -0
  244. package/src/agent/__tests__/config-tools-execution.test.ts +516 -0
  245. package/src/agent/__tests__/mcp-clients.test.ts +260 -0
  246. package/src/agent/__tests__/property-overrides.test.ts +598 -0
  247. package/src/agent/__tests__/standard-schema-tools.test.ts +313 -0
  248. package/src/agent/__tests__/standard-schema-types.test.ts +158 -0
  249. package/src/agent/__tests__/state-tools.test.ts +436 -0
  250. package/src/agent/__tests__/test-helpers.ts +178 -0
  251. package/src/agent/__tests__/utils.test.ts +536 -0
  252. package/src/agent/__tests__/zod-regression.test.ts +350 -0
  253. package/src/agent/index.ts +1305 -0
  254. package/src/graphql/message-conversion/agui-to-gql.test.ts +1 -1
  255. package/src/graphql/message-conversion/agui-to-gql.ts +1 -1
  256. package/src/graphql/message-conversion/gql-to-agui.ts +1 -1
  257. package/src/graphql/message-conversion/roundtrip-conversion.test.ts +1 -1
  258. package/src/lib/integrations/nextjs/app-router.ts +2 -2
  259. package/src/lib/integrations/node-http/index.ts +2 -2
  260. package/src/lib/runtime/copilot-runtime.ts +3 -5
  261. package/src/lib/runtime/telemetry-agent-runner.ts +1 -1
  262. package/src/service-adapters/conversion.test.ts +1 -1
  263. package/src/service-adapters/conversion.ts +1 -28
  264. package/src/v2/index.ts +5 -2
  265. package/src/v2/runtime/__tests__/cors-credentials.test.ts +320 -0
  266. package/src/v2/runtime/__tests__/express-abort-signal.test.ts +25 -0
  267. package/src/v2/runtime/__tests__/express-body-order.test.ts +76 -0
  268. package/src/v2/runtime/__tests__/express-single-sse.test.ts +122 -0
  269. package/src/v2/runtime/__tests__/get-runtime-info.test.ts +141 -0
  270. package/src/v2/runtime/__tests__/handle-connect.test.ts +423 -0
  271. package/src/v2/runtime/__tests__/handle-run.test.ts +910 -0
  272. package/src/v2/runtime/__tests__/handle-threads.test.ts +388 -0
  273. package/src/v2/runtime/__tests__/handle-transcribe.test.ts +301 -0
  274. package/src/v2/runtime/__tests__/header-utils.test.ts +88 -0
  275. package/src/v2/runtime/__tests__/in-process-agent-runner-messages.test.ts +230 -0
  276. package/src/v2/runtime/__tests__/in-process-agent-runner.test.ts +1030 -0
  277. package/src/v2/runtime/__tests__/middleware-express.test.ts +206 -0
  278. package/src/v2/runtime/__tests__/middleware-single-express.test.ts +211 -0
  279. package/src/v2/runtime/__tests__/middleware-single.test.ts +225 -0
  280. package/src/v2/runtime/__tests__/middleware-sse-parser.test.ts +187 -0
  281. package/src/v2/runtime/__tests__/middleware.test.ts +251 -0
  282. package/src/v2/runtime/__tests__/routing-express.test.ts +174 -0
  283. package/src/v2/runtime/__tests__/routing-single-express.test.ts +168 -0
  284. package/src/v2/runtime/__tests__/routing-single.test.ts +193 -0
  285. package/src/v2/runtime/__tests__/routing.test.ts +257 -0
  286. package/src/v2/runtime/__tests__/runtime.test.ts +123 -0
  287. package/src/v2/runtime/__tests__/telemetry.test.ts +167 -0
  288. package/src/v2/runtime/__tests__/thread-names.test.ts +188 -0
  289. package/src/v2/runtime/endpoints/express-single.ts +231 -0
  290. package/src/v2/runtime/endpoints/express-utils.ts +182 -0
  291. package/src/v2/runtime/endpoints/express.ts +275 -0
  292. package/src/v2/runtime/endpoints/hono-single.ts +212 -0
  293. package/src/v2/runtime/endpoints/hono.ts +314 -0
  294. package/src/v2/runtime/endpoints/index.ts +4 -0
  295. package/src/v2/runtime/endpoints/single-route-helpers.ts +125 -0
  296. package/src/v2/runtime/express.ts +2 -0
  297. package/src/v2/runtime/handler.ts +3 -0
  298. package/src/v2/runtime/handlers/get-runtime-info.ts +79 -0
  299. package/src/v2/runtime/handlers/handle-connect.ts +76 -0
  300. package/src/v2/runtime/handlers/handle-run.ts +89 -0
  301. package/src/v2/runtime/handlers/handle-stop.ts +76 -0
  302. package/src/v2/runtime/handlers/handle-threads.ts +7 -0
  303. package/src/v2/runtime/handlers/handle-transcribe.ts +256 -0
  304. package/src/v2/runtime/handlers/header-utils.ts +24 -0
  305. package/src/v2/runtime/handlers/intelligence/connect.ts +65 -0
  306. package/src/v2/runtime/handlers/intelligence/run.ts +152 -0
  307. package/src/v2/runtime/handlers/intelligence/thread-names.ts +246 -0
  308. package/src/v2/runtime/handlers/intelligence/threads.ts +233 -0
  309. package/src/v2/runtime/handlers/shared/agent-utils.ts +136 -0
  310. package/src/v2/runtime/handlers/shared/intelligence-utils.ts +21 -0
  311. package/src/v2/runtime/handlers/shared/json-response.ts +6 -0
  312. package/src/v2/runtime/handlers/shared/resolve-intelligence-user.ts +25 -0
  313. package/src/v2/runtime/handlers/shared/sse-response.ts +100 -0
  314. package/src/v2/runtime/handlers/sse/connect.ts +24 -0
  315. package/src/v2/runtime/handlers/sse/run.ts +27 -0
  316. package/src/v2/runtime/index.ts +20 -0
  317. package/src/v2/runtime/intelligence-platform/__tests__/client.test.ts +605 -0
  318. package/src/v2/runtime/intelligence-platform/client.ts +659 -0
  319. package/src/v2/runtime/intelligence-platform/index.ts +10 -0
  320. package/src/v2/runtime/middleware-sse-parser.ts +200 -0
  321. package/src/v2/runtime/middleware.ts +115 -0
  322. package/src/v2/runtime/runner/__tests__/finalize-events.test.ts +109 -0
  323. package/src/v2/runtime/runner/__tests__/in-memory-runner.e2e.test.ts +775 -0
  324. package/src/v2/runtime/runner/__tests__/in-memory-runner.test.ts +363 -0
  325. package/src/v2/runtime/runner/__tests__/intelligence-runner.test.ts +981 -0
  326. package/src/v2/runtime/runner/agent-runner.ts +36 -0
  327. package/src/v2/runtime/runner/in-memory.ts +381 -0
  328. package/src/v2/runtime/runner/index.ts +4 -0
  329. package/src/v2/runtime/runner/intelligence.ts +429 -0
  330. package/src/v2/runtime/runtime.ts +260 -0
  331. package/src/v2/runtime/telemetry/events.ts +35 -0
  332. package/src/v2/runtime/telemetry/index.ts +7 -0
  333. package/src/v2/runtime/telemetry/scarf-client.ts +39 -0
  334. package/src/v2/runtime/telemetry/telemetry-client.ts +70 -0
  335. package/src/v2/runtime/transcription-service/transcription-service.ts +11 -0
  336. package/tsconfig.json +9 -2
  337. package/tsdown.config.ts +1 -0
@@ -0,0 +1,206 @@
1
+ import express from "express";
2
+ import request from "supertest";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import type { AbstractAgent } from "@ag-ui/client";
5
+
6
+ import { createCopilotEndpointExpress } from "../express";
7
+ import { CopilotRuntime } from "../runtime";
8
+ import { logger } from "@copilotkit/shared";
9
+
10
+ const dummyRuntime = (opts: Partial<CopilotRuntime> = {}) => {
11
+ const runtime = new CopilotRuntime({
12
+ agents: { agent: {} as unknown as AbstractAgent },
13
+ ...opts,
14
+ });
15
+ return runtime;
16
+ };
17
+
18
+ describe("CopilotEndpointExpress middleware", () => {
19
+ afterEach(() => {
20
+ vi.restoreAllMocks();
21
+ });
22
+
23
+ const buildApp = (runtime: CopilotRuntime) => {
24
+ const app = express();
25
+ app.use(createCopilotEndpointExpress({ runtime, basePath: "/" }));
26
+ return app;
27
+ };
28
+
29
+ it("processes request through middleware and handler", async () => {
30
+ const modifiedRequest = new Request("https://example.com/info", {
31
+ headers: { "x-modified": "yes" },
32
+ });
33
+
34
+ const before = vi.fn().mockResolvedValue(modifiedRequest);
35
+ const after = vi.fn().mockResolvedValue(undefined);
36
+
37
+ const runtime = dummyRuntime({
38
+ beforeRequestMiddleware: before,
39
+ afterRequestMiddleware: after,
40
+ });
41
+
42
+ const app = buildApp(runtime);
43
+ const response = await request(app).get("/info");
44
+
45
+ expect(before).toHaveBeenCalledWith({
46
+ runtime,
47
+ request: expect.any(Request),
48
+ path: "/info",
49
+ });
50
+
51
+ await new Promise((resolve) => setTimeout(resolve, 20));
52
+
53
+ expect(after).toHaveBeenCalledWith(
54
+ expect.objectContaining({
55
+ runtime,
56
+ response: expect.any(Response),
57
+ path: "/info",
58
+ }),
59
+ );
60
+
61
+ expect(response.status).toBe(200);
62
+ expect(response.body).toHaveProperty("version");
63
+ });
64
+
65
+ it("returns Response from before middleware", async () => {
66
+ const errorResponse = new Response("Error", { status: 400 });
67
+ const before = vi.fn().mockRejectedValue(errorResponse);
68
+ const after = vi.fn();
69
+ const runtime = dummyRuntime({
70
+ beforeRequestMiddleware: before,
71
+ afterRequestMiddleware: after,
72
+ });
73
+ const logSpy = vi
74
+ .spyOn(logger, "error")
75
+ .mockImplementation(() => undefined as unknown as void);
76
+
77
+ const app = buildApp(runtime);
78
+ const response = await request(app).get("/info");
79
+
80
+ expect(response.status).toBe(400);
81
+ expect(logSpy).toHaveBeenCalledWith(
82
+ expect.objectContaining({
83
+ err: errorResponse,
84
+ url: expect.stringContaining("/info"),
85
+ path: "/info",
86
+ }),
87
+ "Error running before request middleware",
88
+ );
89
+ expect(after).not.toHaveBeenCalled();
90
+ });
91
+
92
+ it("logs and returns 500 when before middleware throws", async () => {
93
+ const error = new Error("before");
94
+ const before = vi.fn().mockRejectedValue(error);
95
+ const after = vi.fn();
96
+ const runtime = dummyRuntime({
97
+ beforeRequestMiddleware: before,
98
+ afterRequestMiddleware: after,
99
+ });
100
+ const logSpy = vi
101
+ .spyOn(logger, "error")
102
+ .mockImplementation(() => undefined as unknown as void);
103
+
104
+ const app = buildApp(runtime);
105
+ const response = await request(app).get("/info");
106
+
107
+ expect(response.status).toBe(500);
108
+ expect(logSpy).toHaveBeenCalledWith(
109
+ expect.objectContaining({
110
+ err: error,
111
+ url: expect.stringContaining("/info"),
112
+ path: "/info",
113
+ }),
114
+ "Error running before request middleware",
115
+ );
116
+ expect(after).not.toHaveBeenCalled();
117
+ });
118
+
119
+ it("logs handler error", async () => {
120
+ const before = vi.fn();
121
+ const after = vi.fn();
122
+ const errorAgent = {
123
+ clone: () => {
124
+ throw new Error("Agent error");
125
+ },
126
+ } as unknown as AbstractAgent;
127
+
128
+ const runtime = dummyRuntime({
129
+ beforeRequestMiddleware: before,
130
+ afterRequestMiddleware: after,
131
+ agents: { agent: errorAgent },
132
+ });
133
+ const logSpy = vi
134
+ .spyOn(logger, "error")
135
+ .mockImplementation(() => undefined as unknown as void);
136
+
137
+ const app = buildApp(runtime);
138
+ const response = await request(app)
139
+ .post("/agent/agent/run")
140
+ .set("Content-Type", "application/json")
141
+ .send({});
142
+
143
+ expect(response.status).toBe(500);
144
+ expect(logSpy).toHaveBeenCalled();
145
+ await new Promise((resolve) => setTimeout(resolve, 50));
146
+ expect(after).toHaveBeenCalled();
147
+ });
148
+
149
+ it("passes parsed messages to afterRequestMiddleware", async () => {
150
+ let receivedParams: Record<string, unknown> = {};
151
+ const after = vi.fn().mockImplementation((params) => {
152
+ receivedParams = params;
153
+ });
154
+
155
+ const runtime = dummyRuntime({
156
+ afterRequestMiddleware: after,
157
+ });
158
+
159
+ const app = buildApp(runtime);
160
+ const response = await request(app).get("/info");
161
+
162
+ await new Promise((resolve) => setTimeout(resolve, 50));
163
+
164
+ expect(response.status).toBe(200);
165
+ expect(after).toHaveBeenCalled();
166
+ expect(receivedParams).toHaveProperty("messages");
167
+ expect(receivedParams.messages).toEqual([]);
168
+ });
169
+
170
+ it("logs error from after middleware", async () => {
171
+ const error = new Error("after");
172
+ const before = vi.fn();
173
+ const after = vi.fn().mockRejectedValue(error);
174
+ const runtime = dummyRuntime({
175
+ beforeRequestMiddleware: before,
176
+ afterRequestMiddleware: after,
177
+ });
178
+ const logSpy = vi
179
+ .spyOn(logger, "error")
180
+ .mockImplementation(() => undefined as unknown as void);
181
+
182
+ const app = buildApp(runtime);
183
+ const response = await request(app).get("/info");
184
+
185
+ expect(response.status).toBe(200);
186
+
187
+ await new Promise((resolve) => setTimeout(resolve, 20));
188
+
189
+ expect(after).toHaveBeenCalledWith(
190
+ expect.objectContaining({
191
+ runtime,
192
+ response: expect.any(Response),
193
+ path: "/info",
194
+ }),
195
+ );
196
+
197
+ expect(logSpy).toHaveBeenCalledWith(
198
+ expect.objectContaining({
199
+ err: error,
200
+ url: expect.stringContaining("/info"),
201
+ path: "/info",
202
+ }),
203
+ "Error running after request middleware",
204
+ );
205
+ });
206
+ });
@@ -0,0 +1,211 @@
1
+ import express from "express";
2
+ import request from "supertest";
3
+ import { afterEach, describe, expect, it, vi } from "vitest";
4
+ import type { AbstractAgent } from "@ag-ui/client";
5
+
6
+ import { createCopilotEndpointSingleRouteExpress } from "../express";
7
+ import { CopilotRuntime } from "../runtime";
8
+ import { logger } from "@copilotkit/shared";
9
+
10
+ const dummyRuntime = (opts: Partial<CopilotRuntime> = {}) => {
11
+ const runtime = new CopilotRuntime({
12
+ agents: { agent: {} as unknown as AbstractAgent },
13
+ ...opts,
14
+ });
15
+ return runtime;
16
+ };
17
+
18
+ describe("CopilotEndpointSingleRouteExpress middleware", () => {
19
+ afterEach(() => {
20
+ vi.restoreAllMocks();
21
+ });
22
+
23
+ const buildApp = (runtime: CopilotRuntime) => {
24
+ const app = express();
25
+ app.use(
26
+ createCopilotEndpointSingleRouteExpress({ runtime, basePath: "/rpc" }),
27
+ );
28
+ return app;
29
+ };
30
+
31
+ const rpcRequest = (app: express.Express, body: Record<string, unknown>) =>
32
+ request(app)
33
+ .post("/rpc")
34
+ .set("Content-Type", "application/json")
35
+ .send(body);
36
+
37
+ it("processes middleware and handler", async () => {
38
+ const before = vi.fn().mockResolvedValue(undefined);
39
+ const after = vi.fn().mockResolvedValue(undefined);
40
+
41
+ const runtime = dummyRuntime({
42
+ beforeRequestMiddleware: before,
43
+ afterRequestMiddleware: after,
44
+ });
45
+
46
+ const app = buildApp(runtime);
47
+ const response = await rpcRequest(app, { method: "info" });
48
+
49
+ expect(before).toHaveBeenCalledWith({
50
+ runtime,
51
+ request: expect.any(Request),
52
+ path: "/rpc",
53
+ });
54
+
55
+ await new Promise((resolve) => setTimeout(resolve, 20));
56
+
57
+ expect(after).toHaveBeenCalledWith(
58
+ expect.objectContaining({
59
+ runtime,
60
+ response: expect.any(Response),
61
+ path: "/rpc",
62
+ }),
63
+ );
64
+
65
+ expect(response.status).toBe(200);
66
+ expect(response.body).toHaveProperty("version");
67
+ });
68
+
69
+ it("handles Response error from before middleware", async () => {
70
+ const errorResponse = new Response("Error", { status: 400 });
71
+ const before = vi.fn().mockRejectedValue(errorResponse);
72
+ const after = vi.fn();
73
+ const runtime = dummyRuntime({
74
+ beforeRequestMiddleware: before,
75
+ afterRequestMiddleware: after,
76
+ });
77
+ const logSpy = vi
78
+ .spyOn(logger, "error")
79
+ .mockImplementation(() => undefined as unknown as void);
80
+
81
+ const app = buildApp(runtime);
82
+ const response = await rpcRequest(app, { method: "info" });
83
+
84
+ expect(response.status).toBe(400);
85
+ expect(logSpy).toHaveBeenCalledWith(
86
+ expect.objectContaining({
87
+ err: errorResponse,
88
+ url: expect.stringContaining("/rpc"),
89
+ path: "/rpc",
90
+ }),
91
+ "Error running before request middleware",
92
+ );
93
+ expect(after).not.toHaveBeenCalled();
94
+ });
95
+
96
+ it("logs thrown error from before middleware", async () => {
97
+ const error = new Error("before");
98
+ const before = vi.fn().mockRejectedValue(error);
99
+ const after = vi.fn();
100
+ const runtime = dummyRuntime({
101
+ beforeRequestMiddleware: before,
102
+ afterRequestMiddleware: after,
103
+ });
104
+ const logSpy = vi
105
+ .spyOn(logger, "error")
106
+ .mockImplementation(() => undefined as unknown as void);
107
+
108
+ const app = buildApp(runtime);
109
+ const response = await rpcRequest(app, { method: "info" });
110
+
111
+ expect(response.status).toBe(500);
112
+ expect(logSpy).toHaveBeenCalledWith(
113
+ expect.objectContaining({
114
+ err: error,
115
+ url: expect.stringContaining("/rpc"),
116
+ path: "/rpc",
117
+ }),
118
+ "Error running before request middleware",
119
+ );
120
+ expect(after).not.toHaveBeenCalled();
121
+ });
122
+
123
+ it("logs handler error", async () => {
124
+ const before = vi.fn();
125
+ const after = vi.fn();
126
+ const errorAgent = {
127
+ clone: () => {
128
+ throw new Error("Agent error");
129
+ },
130
+ } as unknown as AbstractAgent;
131
+
132
+ const runtime = dummyRuntime({
133
+ beforeRequestMiddleware: before,
134
+ afterRequestMiddleware: after,
135
+ agents: { agent: errorAgent },
136
+ });
137
+ const logSpy = vi
138
+ .spyOn(logger, "error")
139
+ .mockImplementation(() => undefined as unknown as void);
140
+
141
+ const app = buildApp(runtime);
142
+ const response = await rpcRequest(app, {
143
+ method: "agent/run",
144
+ params: { agentId: "agent" },
145
+ body: {},
146
+ });
147
+
148
+ expect(response.status).toBe(500);
149
+ expect(logSpy).toHaveBeenCalled();
150
+ await new Promise((resolve) => setTimeout(resolve, 50));
151
+ expect(after).toHaveBeenCalled();
152
+ });
153
+
154
+ it("passes parsed messages to afterRequestMiddleware", async () => {
155
+ let receivedParams: Record<string, unknown> = {};
156
+ const after = vi.fn().mockImplementation((params) => {
157
+ receivedParams = params;
158
+ });
159
+
160
+ const runtime = dummyRuntime({
161
+ afterRequestMiddleware: after,
162
+ });
163
+
164
+ const app = buildApp(runtime);
165
+ const response = await rpcRequest(app, { method: "info" });
166
+
167
+ await new Promise((resolve) => setTimeout(resolve, 50));
168
+
169
+ expect(response.status).toBe(200);
170
+ expect(after).toHaveBeenCalled();
171
+ expect(receivedParams).toHaveProperty("messages");
172
+ expect(receivedParams.messages).toEqual([]);
173
+ });
174
+
175
+ it("logs errors from after middleware", async () => {
176
+ const error = new Error("after");
177
+ const before = vi.fn();
178
+ const after = vi.fn().mockRejectedValue(error);
179
+ const runtime = dummyRuntime({
180
+ beforeRequestMiddleware: before,
181
+ afterRequestMiddleware: after,
182
+ });
183
+ const logSpy = vi
184
+ .spyOn(logger, "error")
185
+ .mockImplementation(() => undefined as unknown as void);
186
+
187
+ const app = buildApp(runtime);
188
+ const response = await rpcRequest(app, { method: "info" });
189
+
190
+ expect(response.status).toBe(200);
191
+
192
+ await new Promise((resolve) => setTimeout(resolve, 20));
193
+
194
+ expect(after).toHaveBeenCalledWith(
195
+ expect.objectContaining({
196
+ runtime,
197
+ response: expect.any(Response),
198
+ path: "/rpc",
199
+ }),
200
+ );
201
+
202
+ expect(logSpy).toHaveBeenCalledWith(
203
+ expect.objectContaining({
204
+ err: error,
205
+ url: expect.stringContaining("/rpc"),
206
+ path: "/rpc",
207
+ }),
208
+ "Error running after request middleware",
209
+ );
210
+ });
211
+ });
@@ -0,0 +1,225 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import type { AbstractAgent } from "@ag-ui/client";
3
+
4
+ import { createCopilotEndpointSingleRoute } from "../endpoints";
5
+ import { CopilotRuntime } from "../runtime";
6
+ import { logger } from "@copilotkit/shared";
7
+
8
+ const dummyRuntime = (opts: Partial<CopilotRuntime> = {}) => {
9
+ const runtime = new CopilotRuntime({
10
+ agents: { agent: {} as unknown as AbstractAgent },
11
+ ...opts,
12
+ });
13
+ return runtime;
14
+ };
15
+
16
+ describe("CopilotEndpointSingleRoute middleware", () => {
17
+ afterEach(() => {
18
+ vi.restoreAllMocks();
19
+ });
20
+
21
+ const buildRequest = (body: Record<string, unknown>) =>
22
+ new Request("https://example.com/rpc", {
23
+ method: "POST",
24
+ headers: { "content-type": "application/json" },
25
+ body: JSON.stringify(body),
26
+ });
27
+
28
+ it("processes request through middleware and handler", async () => {
29
+ const originalRequest = buildRequest({ method: "info" });
30
+ const modifiedRequest = buildRequest({ method: "info" });
31
+
32
+ const before = vi.fn().mockResolvedValue(modifiedRequest);
33
+ const after = vi.fn().mockResolvedValue(undefined);
34
+
35
+ const runtime = dummyRuntime({
36
+ beforeRequestMiddleware: before,
37
+ afterRequestMiddleware: after,
38
+ });
39
+
40
+ const endpoint = createCopilotEndpointSingleRoute({
41
+ runtime,
42
+ basePath: "/rpc",
43
+ });
44
+ const response = await endpoint.fetch(originalRequest);
45
+
46
+ expect(before).toHaveBeenCalledWith({
47
+ runtime,
48
+ request: originalRequest,
49
+ path: expect.any(String),
50
+ });
51
+ await new Promise((r) => setImmediate(r));
52
+ expect(after).toHaveBeenCalledWith(
53
+ expect.objectContaining({
54
+ runtime,
55
+ response: expect.any(Response),
56
+ path: expect.any(String),
57
+ }),
58
+ );
59
+ const body = await response.json();
60
+ expect(body).toHaveProperty("version");
61
+ });
62
+
63
+ it("logs and returns Response error from beforeRequestMiddleware", async () => {
64
+ const errorResponse = new Response("Error", { status: 400 });
65
+ const before = vi.fn().mockRejectedValue(errorResponse);
66
+ const after = vi.fn();
67
+ const runtime = dummyRuntime({
68
+ beforeRequestMiddleware: before,
69
+ afterRequestMiddleware: after,
70
+ });
71
+ const logSpy = vi
72
+ .spyOn(logger, "error")
73
+ .mockImplementation(() => undefined as unknown as void);
74
+
75
+ const endpoint = createCopilotEndpointSingleRoute({
76
+ runtime,
77
+ basePath: "/rpc",
78
+ });
79
+ const response = await endpoint.fetch(buildRequest({ method: "info" }));
80
+
81
+ expect(response.status).toBe(400);
82
+ expect(logSpy).toHaveBeenCalledWith(
83
+ expect.objectContaining({
84
+ err: errorResponse,
85
+ url: "https://example.com/rpc",
86
+ path: expect.any(String),
87
+ }),
88
+ "Error running before request middleware",
89
+ );
90
+ expect(after).not.toHaveBeenCalled();
91
+ });
92
+
93
+ it("logs and returns 500 error from beforeRequestMiddleware", async () => {
94
+ const error = new Error("before");
95
+ const before = vi.fn().mockRejectedValue(error);
96
+ const after = vi.fn();
97
+ const runtime = dummyRuntime({
98
+ beforeRequestMiddleware: before,
99
+ afterRequestMiddleware: after,
100
+ });
101
+ const logSpy = vi
102
+ .spyOn(logger, "error")
103
+ .mockImplementation(() => undefined as unknown as void);
104
+
105
+ const endpoint = createCopilotEndpointSingleRoute({
106
+ runtime,
107
+ basePath: "/rpc",
108
+ });
109
+ const response = await endpoint.fetch(buildRequest({ method: "info" }));
110
+
111
+ expect(response.status).toBe(500);
112
+ expect(logSpy).toHaveBeenCalledWith(
113
+ expect.objectContaining({
114
+ err: error,
115
+ url: "https://example.com/rpc",
116
+ path: expect.any(String),
117
+ }),
118
+ "Error running before request middleware",
119
+ );
120
+ expect(after).not.toHaveBeenCalled();
121
+ });
122
+
123
+ it("logs error from handler", async () => {
124
+ const before = vi.fn();
125
+ const after = vi.fn();
126
+ const errorAgent = {
127
+ clone: () => {
128
+ throw new Error("Agent error");
129
+ },
130
+ } as unknown as AbstractAgent;
131
+
132
+ const runtime = dummyRuntime({
133
+ beforeRequestMiddleware: before,
134
+ afterRequestMiddleware: after,
135
+ agents: { agent: errorAgent },
136
+ });
137
+
138
+ const logSpy = vi
139
+ .spyOn(logger, "error")
140
+ .mockImplementation(() => undefined as unknown as void);
141
+
142
+ const endpoint = createCopilotEndpointSingleRoute({
143
+ runtime,
144
+ basePath: "/rpc",
145
+ });
146
+ const response = await endpoint.fetch(
147
+ buildRequest({
148
+ method: "agent/run",
149
+ params: { agentId: "agent" },
150
+ body: {},
151
+ }),
152
+ );
153
+
154
+ expect(response.status).toBe(500);
155
+ expect(logSpy).toHaveBeenCalled();
156
+ await new Promise((r) => setTimeout(r, 50));
157
+ expect(after).toHaveBeenCalled();
158
+ });
159
+
160
+ it("passes parsed messages to afterRequestMiddleware for info endpoint", async () => {
161
+ let receivedParams: Record<string, unknown> = {};
162
+ const after = vi.fn().mockImplementation((params) => {
163
+ receivedParams = params;
164
+ });
165
+
166
+ const runtime = dummyRuntime({
167
+ afterRequestMiddleware: after,
168
+ });
169
+
170
+ const endpoint = createCopilotEndpointSingleRoute({
171
+ runtime,
172
+ basePath: "/rpc",
173
+ });
174
+ await endpoint.fetch(buildRequest({ method: "info" }));
175
+
176
+ // Wait for async middleware (parseSSEResponse introduces a microtask)
177
+ await new Promise((r) => setImmediate(r));
178
+
179
+ expect(after).toHaveBeenCalled();
180
+ // For non-SSE (info) responses, messages should be empty array
181
+ expect(receivedParams).toHaveProperty("messages");
182
+ expect(receivedParams.messages).toEqual([]);
183
+ expect(receivedParams).toHaveProperty("path");
184
+ });
185
+
186
+ it("logs but does not rethrow error from afterRequestMiddleware", async () => {
187
+ const error = new Error("after");
188
+ const before = vi.fn();
189
+ const after = vi.fn().mockRejectedValue(error);
190
+ const runtime = dummyRuntime({
191
+ beforeRequestMiddleware: before,
192
+ afterRequestMiddleware: after,
193
+ });
194
+ const logSpy = vi
195
+ .spyOn(logger, "error")
196
+ .mockImplementation(() => undefined as unknown as void);
197
+
198
+ const endpoint = createCopilotEndpointSingleRoute({
199
+ runtime,
200
+ basePath: "/rpc",
201
+ });
202
+ const response = await endpoint.fetch(buildRequest({ method: "info" }));
203
+
204
+ await new Promise((r) => setImmediate(r));
205
+
206
+ expect(response).toBeInstanceOf(Response);
207
+ expect(after).toHaveBeenCalledWith(
208
+ expect.objectContaining({
209
+ runtime,
210
+ response: expect.any(Response),
211
+ path: expect.any(String),
212
+ }),
213
+ );
214
+
215
+ await new Promise((r) => setImmediate(r));
216
+
217
+ expect(logSpy).toHaveBeenCalledWith(
218
+ expect.objectContaining({
219
+ err: error,
220
+ url: "https://example.com/rpc",
221
+ }),
222
+ "Error running after request middleware",
223
+ );
224
+ });
225
+ });