@copilotkit/runtime 1.54.1 → 1.55.0-next.8

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 +125 -113
  3. package/dist/_virtual/_rolldown/runtime.mjs +25 -1
  4. package/dist/agent/index.cjs +654 -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 +646 -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 +24 -7
  242. package/src/agent/__tests__/ai-sdk-v6-compat.test.ts +116 -0
  243. package/src/agent/__tests__/basic-agent.test.ts +1698 -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 +193 -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 +1329 -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 @@
1
+ {"version":3,"file":"express-single.cjs","names":["createFetchRequestFromExpress","callBeforeRequestMiddleware","sendFetchResponse","parseMethodCall","expectString","handleRunAgent","createJsonRequest","handleConnectAgent","handleStopAgent","handleGetRuntimeInfo","handleTranscribe"],"sources":["../../../../src/v2/runtime/endpoints/express-single.ts"],"sourcesContent":["import express from \"express\";\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Router,\n} from \"express\";\nimport cors from \"cors\";\n\nimport { CopilotRuntimeLike } from \"../runtime\";\nimport { handleRunAgent } from \"../handlers/handle-run\";\nimport { handleConnectAgent } from \"../handlers/handle-connect\";\nimport { handleStopAgent } from \"../handlers/handle-stop\";\nimport { handleGetRuntimeInfo } from \"../handlers/get-runtime-info\";\nimport { handleTranscribe } from \"../handlers/handle-transcribe\";\nimport { logger } from \"@copilotkit/shared\";\nimport {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"../middleware\";\nimport {\n createFetchRequestFromExpress,\n sendFetchResponse,\n} from \"./express-utils\";\nimport {\n createJsonRequest,\n expectString,\n MethodCall,\n parseMethodCall,\n} from \"./single-route-helpers\";\n\ninterface CopilotSingleRouteExpressParams {\n runtime: CopilotRuntimeLike;\n basePath: string;\n}\n\nexport function createCopilotEndpointSingleRouteExpress({\n runtime,\n basePath,\n}: CopilotSingleRouteExpressParams): Router {\n const router = express.Router();\n const routePath = normalizeSingleRoutePath(basePath);\n\n router.use(\n cors({\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\"*\"],\n }),\n );\n\n router.post(routePath, createSingleRouteHandler(runtime));\n\n router.use((req, res) => {\n res.status(404).json({ error: \"Not found\" });\n });\n\n return router;\n}\n\nfunction createSingleRouteHandler(runtime: CopilotRuntimeLike) {\n return async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction,\n ) => {\n const path = req.originalUrl ?? req.path;\n let request = createFetchRequestFromExpress(req);\n\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n request = maybeModifiedRequest;\n }\n } catch (error) {\n logger.error(\n { err: error, url: request.url, path },\n \"Error running before request middleware\",\n );\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n next(error);\n return;\n }\n\n let methodCall: MethodCall;\n try {\n methodCall = await parseMethodCall(request);\n } catch (error) {\n if (error instanceof Response) {\n logger.warn({ url: request.url }, \"Invalid single-route payload\");\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n logger.warn(\n { err: error, url: request.url },\n \"Invalid single-route payload\",\n );\n res.status(400).json({\n error: \"invalid_request\",\n message:\n error instanceof Error ? error.message : \"Invalid request payload\",\n });\n return;\n }\n\n try {\n let response: Response;\n switch (methodCall.method) {\n case \"agent/run\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleRunAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/connect\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleConnectAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/stop\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const threadId = expectString(methodCall.params, \"threadId\");\n response = await handleStopAgent({\n runtime,\n request,\n agentId,\n threadId,\n });\n break;\n }\n case \"info\": {\n response = await handleGetRuntimeInfo({ runtime, request });\n break;\n }\n case \"transcribe\": {\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleTranscribe({\n runtime,\n request: handlerRequest,\n });\n break;\n }\n default: {\n const exhaustive: never = methodCall.method;\n return exhaustive;\n }\n }\n\n const responseForMiddleware = response.clone();\n await sendFetchResponse(res, response);\n callAfterRequestMiddleware({\n runtime,\n response: responseForMiddleware,\n path,\n }).catch((error) => {\n logger.error(\n { err: error, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n } catch (error) {\n if (error instanceof Response) {\n const errorResponseForMiddleware = error.clone();\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n return;\n }\n callAfterRequestMiddleware({\n runtime,\n response: errorResponseForMiddleware,\n path,\n }).catch((mwError) => {\n logger.error(\n { err: mwError, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n return;\n }\n logger.error(\n { err: error, url: request.url, path },\n \"Error running single-route handler\",\n );\n next(error);\n }\n };\n}\n\nfunction normalizeSingleRoutePath(path: string): string {\n if (!path) {\n throw new Error(\n \"basePath must be provided for Express single-route endpoint\",\n );\n }\n\n if (!path.startsWith(\"/\")) {\n return `/${path}`;\n }\n\n if (path.length > 1 && path.endsWith(\"/\")) {\n return path.slice(0, -1);\n }\n\n return path;\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+
2
+ import { CopilotRuntimeLike } from "../runtime.cjs";
3
+ import { Router } from "express";
4
+
5
+ //#region src/v2/runtime/endpoints/express-single.d.ts
6
+ interface CopilotSingleRouteExpressParams {
7
+ runtime: CopilotRuntimeLike;
8
+ basePath: string;
9
+ }
10
+ declare function createCopilotEndpointSingleRouteExpress({
11
+ runtime,
12
+ basePath
13
+ }: CopilotSingleRouteExpressParams): Router;
14
+ //#endregion
15
+ export { createCopilotEndpointSingleRouteExpress };
16
+ //# sourceMappingURL=express-single.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-single.d.cts","names":[],"sources":["../../../../src/v2/runtime/endpoints/express-single.ts"],"mappings":";;;;;UA+BU,+BAAA;EACR,OAAA,EAAS,kBAAA;EACT,QAAA;AAAA;AAAA,iBAGc,uCAAA,CAAA;EACd,OAAA;EACA;AAAA,GACC,+BAAA,GAAkC,MAAA"}
@@ -0,0 +1,16 @@
1
+ import "reflect-metadata";
2
+ import { CopilotRuntimeLike } from "../runtime.mjs";
3
+ import { Router } from "express";
4
+
5
+ //#region src/v2/runtime/endpoints/express-single.d.ts
6
+ interface CopilotSingleRouteExpressParams {
7
+ runtime: CopilotRuntimeLike;
8
+ basePath: string;
9
+ }
10
+ declare function createCopilotEndpointSingleRouteExpress({
11
+ runtime,
12
+ basePath
13
+ }: CopilotSingleRouteExpressParams): Router;
14
+ //#endregion
15
+ export { createCopilotEndpointSingleRouteExpress };
16
+ //# sourceMappingURL=express-single.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-single.d.mts","names":[],"sources":["../../../../src/v2/runtime/endpoints/express-single.ts"],"mappings":";;;;;UA+BU,+BAAA;EACR,OAAA,EAAS,kBAAA;EACT,QAAA;AAAA;AAAA,iBAGc,uCAAA,CAAA;EACd,OAAA;EACA;AAAA,GACC,+BAAA,GAAkC,MAAA"}
@@ -0,0 +1,187 @@
1
+ import "reflect-metadata";
2
+ import { handleRunAgent } from "../handlers/handle-run.mjs";
3
+ import { handleGetRuntimeInfo } from "../handlers/get-runtime-info.mjs";
4
+ import { handleTranscribe } from "../handlers/handle-transcribe.mjs";
5
+ import { callAfterRequestMiddleware, callBeforeRequestMiddleware } from "../middleware.mjs";
6
+ import { handleConnectAgent } from "../handlers/handle-connect.mjs";
7
+ import { handleStopAgent } from "../handlers/handle-stop.mjs";
8
+ import { createJsonRequest, expectString, parseMethodCall } from "./single-route-helpers.mjs";
9
+ import { createFetchRequestFromExpress, sendFetchResponse } from "./express-utils.mjs";
10
+ import { logger } from "@copilotkit/shared";
11
+ import express from "express";
12
+ import cors from "cors";
13
+
14
+ //#region src/v2/runtime/endpoints/express-single.ts
15
+ function createCopilotEndpointSingleRouteExpress({ runtime, basePath }) {
16
+ const router = express.Router();
17
+ const routePath = normalizeSingleRoutePath(basePath);
18
+ router.use(cors({
19
+ origin: "*",
20
+ methods: [
21
+ "GET",
22
+ "HEAD",
23
+ "PUT",
24
+ "POST",
25
+ "DELETE",
26
+ "PATCH",
27
+ "OPTIONS"
28
+ ],
29
+ allowedHeaders: ["*"]
30
+ }));
31
+ router.post(routePath, createSingleRouteHandler(runtime));
32
+ router.use((req, res) => {
33
+ res.status(404).json({ error: "Not found" });
34
+ });
35
+ return router;
36
+ }
37
+ function createSingleRouteHandler(runtime) {
38
+ return async (req, res, next) => {
39
+ const path = req.originalUrl ?? req.path;
40
+ let request = createFetchRequestFromExpress(req);
41
+ try {
42
+ const maybeModifiedRequest = await callBeforeRequestMiddleware({
43
+ runtime,
44
+ request,
45
+ path
46
+ });
47
+ if (maybeModifiedRequest) request = maybeModifiedRequest;
48
+ } catch (error) {
49
+ logger.error({
50
+ err: error,
51
+ url: request.url,
52
+ path
53
+ }, "Error running before request middleware");
54
+ if (error instanceof Response) {
55
+ try {
56
+ await sendFetchResponse(res, error);
57
+ } catch (streamError) {
58
+ next(streamError);
59
+ }
60
+ return;
61
+ }
62
+ next(error);
63
+ return;
64
+ }
65
+ let methodCall;
66
+ try {
67
+ methodCall = await parseMethodCall(request);
68
+ } catch (error) {
69
+ if (error instanceof Response) {
70
+ logger.warn({ url: request.url }, "Invalid single-route payload");
71
+ try {
72
+ await sendFetchResponse(res, error);
73
+ } catch (streamError) {
74
+ next(streamError);
75
+ }
76
+ return;
77
+ }
78
+ logger.warn({
79
+ err: error,
80
+ url: request.url
81
+ }, "Invalid single-route payload");
82
+ res.status(400).json({
83
+ error: "invalid_request",
84
+ message: error instanceof Error ? error.message : "Invalid request payload"
85
+ });
86
+ return;
87
+ }
88
+ try {
89
+ let response;
90
+ switch (methodCall.method) {
91
+ case "agent/run": {
92
+ const agentId = expectString(methodCall.params, "agentId");
93
+ response = await handleRunAgent({
94
+ runtime,
95
+ request: createJsonRequest(request, methodCall.body),
96
+ agentId
97
+ });
98
+ break;
99
+ }
100
+ case "agent/connect": {
101
+ const agentId = expectString(methodCall.params, "agentId");
102
+ response = await handleConnectAgent({
103
+ runtime,
104
+ request: createJsonRequest(request, methodCall.body),
105
+ agentId
106
+ });
107
+ break;
108
+ }
109
+ case "agent/stop": {
110
+ const agentId = expectString(methodCall.params, "agentId");
111
+ const threadId = expectString(methodCall.params, "threadId");
112
+ response = await handleStopAgent({
113
+ runtime,
114
+ request,
115
+ agentId,
116
+ threadId
117
+ });
118
+ break;
119
+ }
120
+ case "info":
121
+ response = await handleGetRuntimeInfo({
122
+ runtime,
123
+ request
124
+ });
125
+ break;
126
+ case "transcribe":
127
+ response = await handleTranscribe({
128
+ runtime,
129
+ request: createJsonRequest(request, methodCall.body)
130
+ });
131
+ break;
132
+ default: return methodCall.method;
133
+ }
134
+ const responseForMiddleware = response.clone();
135
+ await sendFetchResponse(res, response);
136
+ callAfterRequestMiddleware({
137
+ runtime,
138
+ response: responseForMiddleware,
139
+ path
140
+ }).catch((error) => {
141
+ logger.error({
142
+ err: error,
143
+ url: req.originalUrl ?? req.url,
144
+ path
145
+ }, "Error running after request middleware");
146
+ });
147
+ } catch (error) {
148
+ if (error instanceof Response) {
149
+ const errorResponseForMiddleware = error.clone();
150
+ try {
151
+ await sendFetchResponse(res, error);
152
+ } catch (streamError) {
153
+ next(streamError);
154
+ return;
155
+ }
156
+ callAfterRequestMiddleware({
157
+ runtime,
158
+ response: errorResponseForMiddleware,
159
+ path
160
+ }).catch((mwError) => {
161
+ logger.error({
162
+ err: mwError,
163
+ url: req.originalUrl ?? req.url,
164
+ path
165
+ }, "Error running after request middleware");
166
+ });
167
+ return;
168
+ }
169
+ logger.error({
170
+ err: error,
171
+ url: request.url,
172
+ path
173
+ }, "Error running single-route handler");
174
+ next(error);
175
+ }
176
+ };
177
+ }
178
+ function normalizeSingleRoutePath(path) {
179
+ if (!path) throw new Error("basePath must be provided for Express single-route endpoint");
180
+ if (!path.startsWith("/")) return `/${path}`;
181
+ if (path.length > 1 && path.endsWith("/")) return path.slice(0, -1);
182
+ return path;
183
+ }
184
+
185
+ //#endregion
186
+ export { createCopilotEndpointSingleRouteExpress };
187
+ //# sourceMappingURL=express-single.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-single.mjs","names":[],"sources":["../../../../src/v2/runtime/endpoints/express-single.ts"],"sourcesContent":["import express from \"express\";\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Router,\n} from \"express\";\nimport cors from \"cors\";\n\nimport { CopilotRuntimeLike } from \"../runtime\";\nimport { handleRunAgent } from \"../handlers/handle-run\";\nimport { handleConnectAgent } from \"../handlers/handle-connect\";\nimport { handleStopAgent } from \"../handlers/handle-stop\";\nimport { handleGetRuntimeInfo } from \"../handlers/get-runtime-info\";\nimport { handleTranscribe } from \"../handlers/handle-transcribe\";\nimport { logger } from \"@copilotkit/shared\";\nimport {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"../middleware\";\nimport {\n createFetchRequestFromExpress,\n sendFetchResponse,\n} from \"./express-utils\";\nimport {\n createJsonRequest,\n expectString,\n MethodCall,\n parseMethodCall,\n} from \"./single-route-helpers\";\n\ninterface CopilotSingleRouteExpressParams {\n runtime: CopilotRuntimeLike;\n basePath: string;\n}\n\nexport function createCopilotEndpointSingleRouteExpress({\n runtime,\n basePath,\n}: CopilotSingleRouteExpressParams): Router {\n const router = express.Router();\n const routePath = normalizeSingleRoutePath(basePath);\n\n router.use(\n cors({\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\"*\"],\n }),\n );\n\n router.post(routePath, createSingleRouteHandler(runtime));\n\n router.use((req, res) => {\n res.status(404).json({ error: \"Not found\" });\n });\n\n return router;\n}\n\nfunction createSingleRouteHandler(runtime: CopilotRuntimeLike) {\n return async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction,\n ) => {\n const path = req.originalUrl ?? req.path;\n let request = createFetchRequestFromExpress(req);\n\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n request = maybeModifiedRequest;\n }\n } catch (error) {\n logger.error(\n { err: error, url: request.url, path },\n \"Error running before request middleware\",\n );\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n next(error);\n return;\n }\n\n let methodCall: MethodCall;\n try {\n methodCall = await parseMethodCall(request);\n } catch (error) {\n if (error instanceof Response) {\n logger.warn({ url: request.url }, \"Invalid single-route payload\");\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n logger.warn(\n { err: error, url: request.url },\n \"Invalid single-route payload\",\n );\n res.status(400).json({\n error: \"invalid_request\",\n message:\n error instanceof Error ? error.message : \"Invalid request payload\",\n });\n return;\n }\n\n try {\n let response: Response;\n switch (methodCall.method) {\n case \"agent/run\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleRunAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/connect\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleConnectAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/stop\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const threadId = expectString(methodCall.params, \"threadId\");\n response = await handleStopAgent({\n runtime,\n request,\n agentId,\n threadId,\n });\n break;\n }\n case \"info\": {\n response = await handleGetRuntimeInfo({ runtime, request });\n break;\n }\n case \"transcribe\": {\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleTranscribe({\n runtime,\n request: handlerRequest,\n });\n break;\n }\n default: {\n const exhaustive: never = methodCall.method;\n return exhaustive;\n }\n }\n\n const responseForMiddleware = response.clone();\n await sendFetchResponse(res, response);\n callAfterRequestMiddleware({\n runtime,\n response: responseForMiddleware,\n path,\n }).catch((error) => {\n logger.error(\n { err: error, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n } catch (error) {\n if (error instanceof Response) {\n const errorResponseForMiddleware = error.clone();\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n return;\n }\n callAfterRequestMiddleware({\n runtime,\n response: errorResponseForMiddleware,\n path,\n }).catch((mwError) => {\n logger.error(\n { err: mwError, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n return;\n }\n logger.error(\n { err: error, url: request.url, path },\n \"Error running single-route handler\",\n );\n next(error);\n }\n };\n}\n\nfunction normalizeSingleRoutePath(path: string): string {\n if (!path) {\n throw new Error(\n \"basePath must be provided for Express single-route endpoint\",\n );\n }\n\n if (!path.startsWith(\"/\")) {\n return `/${path}`;\n }\n\n if (path.length > 1 && path.endsWith(\"/\")) {\n return path.slice(0, -1);\n }\n\n return path;\n}\n"],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ require("reflect-metadata");
2
+ const require_runtime = require('../../../_virtual/_rolldown/runtime.cjs');
3
+ let _copilotkit_shared = require("@copilotkit/shared");
4
+ let node_stream = require("node:stream");
5
+ let node_util = require("node:util");
6
+
7
+ //#region src/v2/runtime/endpoints/express-utils.ts
8
+ const streamPipeline = (0, node_util.promisify)(node_stream.pipeline);
9
+ const METHODS_WITHOUT_BODY = new Set(["GET", "HEAD"]);
10
+ function createFetchRequestFromExpress(req) {
11
+ const method = req.method?.toUpperCase() ?? "GET";
12
+ const url = `${buildOrigin(req)}${req.originalUrl ?? req.url ?? ""}`;
13
+ const headers = new Headers();
14
+ for (const [key, value] of Object.entries(req.headers)) {
15
+ if (value === void 0) continue;
16
+ if (Array.isArray(value)) value.forEach((v) => headers.append(key, v));
17
+ else headers.set(key, value);
18
+ }
19
+ const init = {
20
+ method,
21
+ headers
22
+ };
23
+ const hasParsedBody = req.body !== void 0 && req.body !== null;
24
+ const streamConsumed = isStreamConsumed(req, hasParsedBody);
25
+ if (!METHODS_WITHOUT_BODY.has(method)) if (req.readable !== false && !streamConsumed) {
26
+ init.body = node_stream.Readable.toWeb(req);
27
+ init.duplex = "half";
28
+ } else if (hasParsedBody) {
29
+ const { body, contentType } = synthesizeBody(req.body);
30
+ if (contentType) headers.set("content-type", contentType);
31
+ headers.delete("content-length");
32
+ if (body !== void 0) init.body = body;
33
+ _copilotkit_shared.logger.info({
34
+ url,
35
+ method,
36
+ readable: req.readable,
37
+ readableEnded: req.readableEnded,
38
+ complete: req.complete
39
+ }, "Express request stream already consumed; synthesized body from parsed content");
40
+ } else {
41
+ headers.delete("content-length");
42
+ _copilotkit_shared.logger.warn({
43
+ url,
44
+ method
45
+ }, "Request stream already consumed but no body was available; sending empty body");
46
+ }
47
+ const controller = new AbortController();
48
+ const abort = () => controller.abort();
49
+ req.on("aborted", abort);
50
+ req.on("error", abort);
51
+ req.on("close", () => {
52
+ if (req.aborted) abort();
53
+ });
54
+ init.signal = controller.signal;
55
+ try {
56
+ return new Request(url, init);
57
+ } catch (error) {
58
+ if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {
59
+ headers.delete("content-length");
60
+ delete init.duplex;
61
+ if (hasParsedBody) {
62
+ const { body, contentType } = synthesizeBody(req.body);
63
+ if (contentType) headers.set("content-type", contentType);
64
+ init.body = body;
65
+ _copilotkit_shared.logger.info({
66
+ url,
67
+ method
68
+ }, "Request stream disturbed while constructing Request; reused parsed body");
69
+ } else {
70
+ init.body = void 0;
71
+ _copilotkit_shared.logger.warn({
72
+ url,
73
+ method
74
+ }, "Request stream was disturbed; falling back to empty body");
75
+ }
76
+ return new Request(url, init);
77
+ }
78
+ throw error;
79
+ }
80
+ }
81
+ async function sendFetchResponse(res, response) {
82
+ res.status(response.status);
83
+ response.headers.forEach((value, key) => {
84
+ if (key.toLowerCase() === "content-length" && response.body !== null) return;
85
+ res.setHeader(key, value);
86
+ });
87
+ if (!response.body) {
88
+ res.end();
89
+ return;
90
+ }
91
+ const nodeStream = node_stream.Readable.fromWeb(response.body);
92
+ try {
93
+ await streamPipeline(nodeStream, res);
94
+ } catch (error) {
95
+ res.destroy(error);
96
+ throw error;
97
+ }
98
+ }
99
+ function buildOrigin(req) {
100
+ return `${req.protocol || (req.secure ? "https" : "http")}://${req.get("host") ?? "localhost"}`;
101
+ }
102
+ function isStreamConsumed(req, hasParsedBody) {
103
+ const state = req._readableState;
104
+ return Boolean(hasParsedBody || req.readableEnded || req.complete || state?.ended || state?.endEmitted);
105
+ }
106
+ function synthesizeBody(body) {
107
+ if (Buffer.isBuffer(body) || body instanceof Uint8Array) return { body };
108
+ if (typeof body === "string") return { body };
109
+ if (typeof body === "object" && body !== void 0) return {
110
+ body: JSON.stringify(body),
111
+ contentType: "application/json"
112
+ };
113
+ return {};
114
+ }
115
+
116
+ //#endregion
117
+ exports.createFetchRequestFromExpress = createFetchRequestFromExpress;
118
+ exports.sendFetchResponse = sendFetchResponse;
119
+ //# sourceMappingURL=express-utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-utils.cjs","names":["pipeline","Readable"],"sources":["../../../../src/v2/runtime/endpoints/express-utils.ts"],"sourcesContent":["import type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n} from \"express\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@copilotkit/shared\";\n\nconst streamPipeline = promisify(pipeline);\n\nconst METHODS_WITHOUT_BODY = new Set([\"GET\", \"HEAD\"]);\n\nexport function createFetchRequestFromExpress(req: ExpressRequest): Request {\n const method = req.method?.toUpperCase() ?? \"GET\";\n const origin = buildOrigin(req);\n const url = `${origin}${req.originalUrl ?? req.url ?? \"\"}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((v) => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n };\n\n const hasParsedBody = req.body !== undefined && req.body !== null;\n const streamConsumed = isStreamConsumed(req, hasParsedBody);\n\n if (!METHODS_WITHOUT_BODY.has(method)) {\n const canStreamBody = req.readable !== false && !streamConsumed;\n\n if (canStreamBody) {\n init.body = Readable.toWeb(req) as unknown as BodyInit;\n init.duplex = \"half\";\n } else if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n headers.delete(\"content-length\");\n if (body !== undefined) {\n init.body = body;\n }\n logger.info(\n {\n url,\n method,\n readable: req.readable,\n readableEnded: req.readableEnded,\n complete: req.complete,\n },\n \"Express request stream already consumed; synthesized body from parsed content\",\n );\n } else {\n headers.delete(\"content-length\");\n logger.warn(\n { url, method },\n \"Request stream already consumed but no body was available; sending empty body\",\n );\n }\n }\n\n const controller = new AbortController();\n const abort = () => controller.abort();\n req.on(\"aborted\", abort);\n req.on(\"error\", abort);\n req.on(\"close\", () => {\n if (req.aborted) {\n abort();\n }\n });\n init.signal = controller.signal;\n\n try {\n return new Request(url, init);\n } catch (error) {\n if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {\n // Fallback to synthesized/empty body when the stream was already consumed.\n headers.delete(\"content-length\");\n delete init.duplex;\n\n if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n init.body = body;\n logger.info(\n { url, method },\n \"Request stream disturbed while constructing Request; reused parsed body\",\n );\n } else {\n init.body = undefined;\n logger.warn(\n { url, method },\n \"Request stream was disturbed; falling back to empty body\",\n );\n }\n\n return new Request(url, init);\n }\n throw error;\n }\n}\n\nexport async function sendFetchResponse(\n res: ExpressResponse,\n response: Response,\n): Promise<void> {\n res.status(response.status);\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"content-length\" && response.body !== null) {\n return;\n }\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n const nodeStream = Readable.fromWeb(response.body as any);\n try {\n await streamPipeline(nodeStream, res);\n } catch (error) {\n res.destroy(error as Error);\n throw error;\n }\n}\n\nfunction buildOrigin(req: ExpressRequest): string {\n const protocol = req.protocol || (req.secure ? \"https\" : \"http\");\n const host = req.get(\"host\") ?? \"localhost\";\n return `${protocol}://${host}`;\n}\n\nfunction isStreamConsumed(\n req: ExpressRequest,\n hasParsedBody: boolean,\n): boolean {\n const state = (\n req as unknown as {\n _readableState?: { ended?: boolean; endEmitted?: boolean };\n }\n )._readableState;\n return Boolean(\n hasParsedBody ||\n req.readableEnded ||\n req.complete ||\n state?.ended ||\n state?.endEmitted,\n );\n}\n\nfunction synthesizeBody(body: unknown): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (Buffer.isBuffer(body) || body instanceof Uint8Array) {\n return { body };\n }\n\n if (typeof body === \"string\") {\n return { body };\n }\n\n if (typeof body === \"object\" && body !== undefined) {\n return { body: JSON.stringify(body), contentType: \"application/json\" };\n }\n\n return {};\n}\n"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import "reflect-metadata";
2
+ import { logger } from "@copilotkit/shared";
3
+ import { Readable, pipeline } from "node:stream";
4
+ import { promisify } from "node:util";
5
+
6
+ //#region src/v2/runtime/endpoints/express-utils.ts
7
+ const streamPipeline = promisify(pipeline);
8
+ const METHODS_WITHOUT_BODY = new Set(["GET", "HEAD"]);
9
+ function createFetchRequestFromExpress(req) {
10
+ const method = req.method?.toUpperCase() ?? "GET";
11
+ const url = `${buildOrigin(req)}${req.originalUrl ?? req.url ?? ""}`;
12
+ const headers = new Headers();
13
+ for (const [key, value] of Object.entries(req.headers)) {
14
+ if (value === void 0) continue;
15
+ if (Array.isArray(value)) value.forEach((v) => headers.append(key, v));
16
+ else headers.set(key, value);
17
+ }
18
+ const init = {
19
+ method,
20
+ headers
21
+ };
22
+ const hasParsedBody = req.body !== void 0 && req.body !== null;
23
+ const streamConsumed = isStreamConsumed(req, hasParsedBody);
24
+ if (!METHODS_WITHOUT_BODY.has(method)) if (req.readable !== false && !streamConsumed) {
25
+ init.body = Readable.toWeb(req);
26
+ init.duplex = "half";
27
+ } else if (hasParsedBody) {
28
+ const { body, contentType } = synthesizeBody(req.body);
29
+ if (contentType) headers.set("content-type", contentType);
30
+ headers.delete("content-length");
31
+ if (body !== void 0) init.body = body;
32
+ logger.info({
33
+ url,
34
+ method,
35
+ readable: req.readable,
36
+ readableEnded: req.readableEnded,
37
+ complete: req.complete
38
+ }, "Express request stream already consumed; synthesized body from parsed content");
39
+ } else {
40
+ headers.delete("content-length");
41
+ logger.warn({
42
+ url,
43
+ method
44
+ }, "Request stream already consumed but no body was available; sending empty body");
45
+ }
46
+ const controller = new AbortController();
47
+ const abort = () => controller.abort();
48
+ req.on("aborted", abort);
49
+ req.on("error", abort);
50
+ req.on("close", () => {
51
+ if (req.aborted) abort();
52
+ });
53
+ init.signal = controller.signal;
54
+ try {
55
+ return new Request(url, init);
56
+ } catch (error) {
57
+ if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {
58
+ headers.delete("content-length");
59
+ delete init.duplex;
60
+ if (hasParsedBody) {
61
+ const { body, contentType } = synthesizeBody(req.body);
62
+ if (contentType) headers.set("content-type", contentType);
63
+ init.body = body;
64
+ logger.info({
65
+ url,
66
+ method
67
+ }, "Request stream disturbed while constructing Request; reused parsed body");
68
+ } else {
69
+ init.body = void 0;
70
+ logger.warn({
71
+ url,
72
+ method
73
+ }, "Request stream was disturbed; falling back to empty body");
74
+ }
75
+ return new Request(url, init);
76
+ }
77
+ throw error;
78
+ }
79
+ }
80
+ async function sendFetchResponse(res, response) {
81
+ res.status(response.status);
82
+ response.headers.forEach((value, key) => {
83
+ if (key.toLowerCase() === "content-length" && response.body !== null) return;
84
+ res.setHeader(key, value);
85
+ });
86
+ if (!response.body) {
87
+ res.end();
88
+ return;
89
+ }
90
+ const nodeStream = Readable.fromWeb(response.body);
91
+ try {
92
+ await streamPipeline(nodeStream, res);
93
+ } catch (error) {
94
+ res.destroy(error);
95
+ throw error;
96
+ }
97
+ }
98
+ function buildOrigin(req) {
99
+ return `${req.protocol || (req.secure ? "https" : "http")}://${req.get("host") ?? "localhost"}`;
100
+ }
101
+ function isStreamConsumed(req, hasParsedBody) {
102
+ const state = req._readableState;
103
+ return Boolean(hasParsedBody || req.readableEnded || req.complete || state?.ended || state?.endEmitted);
104
+ }
105
+ function synthesizeBody(body) {
106
+ if (Buffer.isBuffer(body) || body instanceof Uint8Array) return { body };
107
+ if (typeof body === "string") return { body };
108
+ if (typeof body === "object" && body !== void 0) return {
109
+ body: JSON.stringify(body),
110
+ contentType: "application/json"
111
+ };
112
+ return {};
113
+ }
114
+
115
+ //#endregion
116
+ export { createFetchRequestFromExpress, sendFetchResponse };
117
+ //# sourceMappingURL=express-utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express-utils.mjs","names":[],"sources":["../../../../src/v2/runtime/endpoints/express-utils.ts"],"sourcesContent":["import type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n} from \"express\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@copilotkit/shared\";\n\nconst streamPipeline = promisify(pipeline);\n\nconst METHODS_WITHOUT_BODY = new Set([\"GET\", \"HEAD\"]);\n\nexport function createFetchRequestFromExpress(req: ExpressRequest): Request {\n const method = req.method?.toUpperCase() ?? \"GET\";\n const origin = buildOrigin(req);\n const url = `${origin}${req.originalUrl ?? req.url ?? \"\"}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((v) => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n };\n\n const hasParsedBody = req.body !== undefined && req.body !== null;\n const streamConsumed = isStreamConsumed(req, hasParsedBody);\n\n if (!METHODS_WITHOUT_BODY.has(method)) {\n const canStreamBody = req.readable !== false && !streamConsumed;\n\n if (canStreamBody) {\n init.body = Readable.toWeb(req) as unknown as BodyInit;\n init.duplex = \"half\";\n } else if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n headers.delete(\"content-length\");\n if (body !== undefined) {\n init.body = body;\n }\n logger.info(\n {\n url,\n method,\n readable: req.readable,\n readableEnded: req.readableEnded,\n complete: req.complete,\n },\n \"Express request stream already consumed; synthesized body from parsed content\",\n );\n } else {\n headers.delete(\"content-length\");\n logger.warn(\n { url, method },\n \"Request stream already consumed but no body was available; sending empty body\",\n );\n }\n }\n\n const controller = new AbortController();\n const abort = () => controller.abort();\n req.on(\"aborted\", abort);\n req.on(\"error\", abort);\n req.on(\"close\", () => {\n if (req.aborted) {\n abort();\n }\n });\n init.signal = controller.signal;\n\n try {\n return new Request(url, init);\n } catch (error) {\n if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {\n // Fallback to synthesized/empty body when the stream was already consumed.\n headers.delete(\"content-length\");\n delete init.duplex;\n\n if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n init.body = body;\n logger.info(\n { url, method },\n \"Request stream disturbed while constructing Request; reused parsed body\",\n );\n } else {\n init.body = undefined;\n logger.warn(\n { url, method },\n \"Request stream was disturbed; falling back to empty body\",\n );\n }\n\n return new Request(url, init);\n }\n throw error;\n }\n}\n\nexport async function sendFetchResponse(\n res: ExpressResponse,\n response: Response,\n): Promise<void> {\n res.status(response.status);\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"content-length\" && response.body !== null) {\n return;\n }\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n const nodeStream = Readable.fromWeb(response.body as any);\n try {\n await streamPipeline(nodeStream, res);\n } catch (error) {\n res.destroy(error as Error);\n throw error;\n }\n}\n\nfunction buildOrigin(req: ExpressRequest): string {\n const protocol = req.protocol || (req.secure ? \"https\" : \"http\");\n const host = req.get(\"host\") ?? \"localhost\";\n return `${protocol}://${host}`;\n}\n\nfunction isStreamConsumed(\n req: ExpressRequest,\n hasParsedBody: boolean,\n): boolean {\n const state = (\n req as unknown as {\n _readableState?: { ended?: boolean; endEmitted?: boolean };\n }\n )._readableState;\n return Boolean(\n hasParsedBody ||\n req.readableEnded ||\n req.complete ||\n state?.ended ||\n state?.endEmitted,\n );\n}\n\nfunction synthesizeBody(body: unknown): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (Buffer.isBuffer(body) || body instanceof Uint8Array) {\n return { body };\n }\n\n if (typeof body === \"string\") {\n return { body };\n }\n\n if (typeof body === \"object\" && body !== undefined) {\n return { body: JSON.stringify(body), contentType: \"application/json\" };\n }\n\n return {};\n}\n"],"mappings":";;;;;;AASA,MAAM,iBAAiB,UAAU,SAAS;AAE1C,MAAM,uBAAuB,IAAI,IAAI,CAAC,OAAO,OAAO,CAAC;AAErD,SAAgB,8BAA8B,KAA8B;CAC1E,MAAM,SAAS,IAAI,QAAQ,aAAa,IAAI;CAE5C,MAAM,MAAM,GADG,YAAY,IAAI,GACP,IAAI,eAAe,IAAI,OAAO;CAEtD,MAAM,UAAU,IAAI,SAAS;AAC7B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,QAAQ,EAAE;AACtD,MAAI,UAAU,OAAW;AACzB,MAAI,MAAM,QAAQ,MAAM,CACtB,OAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC;MAE5C,SAAQ,IAAI,KAAK,MAAM;;CAI3B,MAAM,OAA0C;EAC9C;EACA;EACD;CAED,MAAM,gBAAgB,IAAI,SAAS,UAAa,IAAI,SAAS;CAC7D,MAAM,iBAAiB,iBAAiB,KAAK,cAAc;AAE3D,KAAI,CAAC,qBAAqB,IAAI,OAAO,CAGnC,KAFsB,IAAI,aAAa,SAAS,CAAC,gBAE9B;AACjB,OAAK,OAAO,SAAS,MAAM,IAAI;AAC/B,OAAK,SAAS;YACL,eAAe;EACxB,MAAM,EAAE,MAAM,gBAAgB,eAAe,IAAI,KAAK;AACtD,MAAI,YACF,SAAQ,IAAI,gBAAgB,YAAY;AAE1C,UAAQ,OAAO,iBAAiB;AAChC,MAAI,SAAS,OACX,MAAK,OAAO;AAEd,SAAO,KACL;GACE;GACA;GACA,UAAU,IAAI;GACd,eAAe,IAAI;GACnB,UAAU,IAAI;GACf,EACD,gFACD;QACI;AACL,UAAQ,OAAO,iBAAiB;AAChC,SAAO,KACL;GAAE;GAAK;GAAQ,EACf,gFACD;;CAIL,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,cAAc,WAAW,OAAO;AACtC,KAAI,GAAG,WAAW,MAAM;AACxB,KAAI,GAAG,SAAS,MAAM;AACtB,KAAI,GAAG,eAAe;AACpB,MAAI,IAAI,QACN,QAAO;GAET;AACF,MAAK,SAAS,WAAW;AAEzB,KAAI;AACF,SAAO,IAAI,QAAQ,KAAK,KAAK;UACtB,OAAO;AACd,MAAI,iBAAiB,aAAa,oBAAoB,KAAK,MAAM,QAAQ,EAAE;AAEzE,WAAQ,OAAO,iBAAiB;AAChC,UAAO,KAAK;AAEZ,OAAI,eAAe;IACjB,MAAM,EAAE,MAAM,gBAAgB,eAAe,IAAI,KAAK;AACtD,QAAI,YACF,SAAQ,IAAI,gBAAgB,YAAY;AAE1C,SAAK,OAAO;AACZ,WAAO,KACL;KAAE;KAAK;KAAQ,EACf,0EACD;UACI;AACL,SAAK,OAAO;AACZ,WAAO,KACL;KAAE;KAAK;KAAQ,EACf,2DACD;;AAGH,UAAO,IAAI,QAAQ,KAAK,KAAK;;AAE/B,QAAM;;;AAIV,eAAsB,kBACpB,KACA,UACe;AACf,KAAI,OAAO,SAAS,OAAO;AAE3B,UAAS,QAAQ,SAAS,OAAO,QAAQ;AACvC,MAAI,IAAI,aAAa,KAAK,oBAAoB,SAAS,SAAS,KAC9D;AAEF,MAAI,UAAU,KAAK,MAAM;GACzB;AAEF,KAAI,CAAC,SAAS,MAAM;AAClB,MAAI,KAAK;AACT;;CAGF,MAAM,aAAa,SAAS,QAAQ,SAAS,KAAY;AACzD,KAAI;AACF,QAAM,eAAe,YAAY,IAAI;UAC9B,OAAO;AACd,MAAI,QAAQ,MAAe;AAC3B,QAAM;;;AAIV,SAAS,YAAY,KAA6B;AAGhD,QAAO,GAFU,IAAI,aAAa,IAAI,SAAS,UAAU,QAEtC,KADN,IAAI,IAAI,OAAO,IAAI;;AAIlC,SAAS,iBACP,KACA,eACS;CACT,MAAM,QACJ,IAGA;AACF,QAAO,QACL,iBACA,IAAI,iBACJ,IAAI,YACJ,OAAO,SACP,OAAO,WACR;;AAGH,SAAS,eAAe,MAGtB;AACA,KAAI,OAAO,SAAS,KAAK,IAAI,gBAAgB,WAC3C,QAAO,EAAE,MAAM;AAGjB,KAAI,OAAO,SAAS,SAClB,QAAO,EAAE,MAAM;AAGjB,KAAI,OAAO,SAAS,YAAY,SAAS,OACvC,QAAO;EAAE,MAAM,KAAK,UAAU,KAAK;EAAE,aAAa;EAAoB;AAGxE,QAAO,EAAE"}