@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,246 @@
1
+ import { AbstractAgent, Message, RunAgentInput } from "@ag-ui/client";
2
+ import { logger } from "@copilotkit/shared";
3
+ import { randomUUID } from "node:crypto";
4
+ import { CopilotIntelligenceRuntimeLike } from "../../runtime";
5
+ import {
6
+ cloneAgentForRequest,
7
+ configureAgentForRequest,
8
+ } from "../shared/agent-utils";
9
+ import { ThreadSummary } from "../../intelligence-platform";
10
+ import { isHandlerResponse } from "../shared/json-response";
11
+
12
+ const THREAD_NAME_SYSTEM_PROMPT = [
13
+ "You generate short, specific conversation titles.",
14
+ 'Return JSON only in this exact shape: {"title":"..."}',
15
+ "The title must be 2 to 5 words.",
16
+ "Use sentence case.",
17
+ "No quotes.",
18
+ "No emoji.",
19
+ "No markdown characters or formatting.",
20
+ "Do not use *, _, #, `, [, ], (, ), !, ~, >, or |.",
21
+ "No trailing punctuation.",
22
+ "No explanations.",
23
+ "Do not call tools.",
24
+ ].join("\n");
25
+
26
+ const MAX_TITLE_LENGTH = 80;
27
+ const MAX_TITLE_WORDS = 8;
28
+ const MAX_TRANSCRIPT_MESSAGES = 8;
29
+ const MAX_TITLE_GENERATION_ATTEMPTS = 3;
30
+ const FALLBACK_THREAD_TITLE = "Untitled";
31
+
32
+ interface GenerateThreadNameParams {
33
+ runtime: CopilotIntelligenceRuntimeLike;
34
+ request: Request;
35
+ agentId: string;
36
+ sourceInput: RunAgentInput;
37
+ thread: ThreadSummary;
38
+ userId: string;
39
+ }
40
+
41
+ export async function generateThreadNameForNewThread({
42
+ runtime,
43
+ request,
44
+ agentId,
45
+ sourceInput,
46
+ thread,
47
+ userId,
48
+ }: GenerateThreadNameParams): Promise<void> {
49
+ if (!runtime.generateThreadNames || hasThreadName(thread.name)) {
50
+ return;
51
+ }
52
+
53
+ const prompt = buildThreadTitlePrompt(sourceInput.messages);
54
+ if (!prompt) {
55
+ return;
56
+ }
57
+
58
+ let generatedTitle: string | null = null;
59
+
60
+ for (let attempt = 1; attempt <= MAX_TITLE_GENERATION_ATTEMPTS; attempt++) {
61
+ try {
62
+ generatedTitle = await runTitleGenerationAttempt({
63
+ runtime,
64
+ request,
65
+ agentId,
66
+ threadId: thread.id,
67
+ prompt,
68
+ });
69
+
70
+ if (generatedTitle) {
71
+ break;
72
+ }
73
+
74
+ logger.warn(
75
+ { agentId, attempt, threadId: thread.id },
76
+ "Thread name generation returned an empty or invalid title",
77
+ );
78
+ } catch (error) {
79
+ logger.warn(
80
+ { err: error, agentId, attempt, threadId: thread.id },
81
+ "Thread name generation attempt failed",
82
+ );
83
+ }
84
+ }
85
+
86
+ await runtime.intelligence.updateThread({
87
+ threadId: thread.id,
88
+ userId,
89
+ agentId,
90
+ updates: { name: generatedTitle ?? FALLBACK_THREAD_TITLE },
91
+ });
92
+ }
93
+
94
+ async function runTitleGenerationAttempt(params: {
95
+ runtime: CopilotIntelligenceRuntimeLike;
96
+ request: Request;
97
+ agentId: string;
98
+ threadId: string;
99
+ prompt: string;
100
+ }): Promise<string | null> {
101
+ const { runtime, request, agentId, threadId, prompt } = params;
102
+ const agent = await cloneAgentForRequest(runtime, agentId);
103
+ if (isHandlerResponse(agent)) {
104
+ logger.warn(
105
+ { agentId, threadId },
106
+ "Skipping thread naming because the agent could not be cloned",
107
+ );
108
+ return null;
109
+ }
110
+
111
+ configureAgentForRequest({
112
+ runtime,
113
+ request,
114
+ agentId,
115
+ agent,
116
+ });
117
+
118
+ const messages: Message[] = [
119
+ {
120
+ id: randomUUID(),
121
+ role: "system",
122
+ content: THREAD_NAME_SYSTEM_PROMPT,
123
+ },
124
+ {
125
+ id: randomUUID(),
126
+ role: "user",
127
+ content: prompt,
128
+ },
129
+ ];
130
+
131
+ agent.setMessages(messages);
132
+ agent.setState({});
133
+ agent.threadId = `thread-name:${threadId}:${randomUUID()}`;
134
+ const { newMessages } = await agent.runAgent({
135
+ messages,
136
+ state: {},
137
+ tools: [],
138
+ context: [],
139
+ forwardedProps: {},
140
+ });
141
+
142
+ const lastMessage = newMessages.at(-1);
143
+ const titleContent = lastMessage
144
+ ? stringifyMessageContent(lastMessage.content)
145
+ : "";
146
+
147
+ return normalizeGeneratedTitle(titleContent);
148
+ }
149
+
150
+ function buildThreadTitlePrompt(
151
+ messages: Message[] | undefined,
152
+ ): string | null {
153
+ const transcript = (messages ?? [])
154
+ .filter((message) =>
155
+ ["user", "assistant", "system", "developer"].includes(message.role),
156
+ )
157
+ .map((message) => {
158
+ const content = stringifyMessageContent(message.content);
159
+ if (!content) {
160
+ return null;
161
+ }
162
+
163
+ return `${message.role}: ${content}`;
164
+ })
165
+ .filter((message): message is string => !!message)
166
+ .slice(-MAX_TRANSCRIPT_MESSAGES);
167
+
168
+ if (transcript.length === 0) {
169
+ return null;
170
+ }
171
+
172
+ return [
173
+ "Generate a short title for this conversation.",
174
+ "Conversation:",
175
+ transcript.join("\n"),
176
+ ].join("\n\n");
177
+ }
178
+
179
+ function stringifyMessageContent(content: Message["content"]): string {
180
+ if (typeof content === "string") {
181
+ return content.trim();
182
+ }
183
+
184
+ if (content == null) {
185
+ return "";
186
+ }
187
+
188
+ try {
189
+ return JSON.stringify(content).trim();
190
+ } catch {
191
+ return "";
192
+ }
193
+ }
194
+
195
+ function normalizeGeneratedTitle(rawTitle: string): string | null {
196
+ let candidate = rawTitle.trim();
197
+ if (!candidate) {
198
+ return null;
199
+ }
200
+
201
+ candidate = candidate
202
+ .replace(/^```(?:json)?\s*/i, "")
203
+ .replace(/\s*```$/, "")
204
+ .trim();
205
+
206
+ try {
207
+ const parsed = JSON.parse(candidate) as { title?: unknown };
208
+ if (typeof parsed.title === "string") {
209
+ candidate = parsed.title;
210
+ }
211
+ } catch {
212
+ // Fall back to using the raw text.
213
+ }
214
+
215
+ candidate = candidate
216
+ .replace(/^["'`]+|["'`]+$/g, "")
217
+ .replace(/[*_#[\]()!~>|]+/g, "")
218
+ .replace(/[.!?,;:]+$/g, "")
219
+ .replace(/\s+/g, " ")
220
+ .trim();
221
+
222
+ if (!candidate) {
223
+ return null;
224
+ }
225
+
226
+ if (candidate.length > MAX_TITLE_LENGTH) {
227
+ candidate = candidate.slice(0, MAX_TITLE_LENGTH).trim();
228
+ }
229
+
230
+ if (candidate.split(/\s+/).length > MAX_TITLE_WORDS) {
231
+ return null;
232
+ }
233
+
234
+ return candidate;
235
+ }
236
+
237
+ function hasThreadName(name: string | null | undefined): boolean {
238
+ return typeof name === "string" && name.trim().length > 0;
239
+ }
240
+
241
+ /** @internal Exported for testing only. */
242
+ export const ɵnormalizeGeneratedTitle = normalizeGeneratedTitle;
243
+ /** @internal Exported for testing only. */
244
+ export const ɵbuildThreadTitlePrompt = buildThreadTitlePrompt;
245
+ /** @internal Exported for testing only. */
246
+ export const ɵhasThreadName = hasThreadName;
@@ -0,0 +1,233 @@
1
+ import {
2
+ CopilotIntelligenceRuntimeLike,
3
+ CopilotRuntimeLike,
4
+ isIntelligenceRuntime,
5
+ } from "../../runtime";
6
+ import { logger } from "@copilotkit/shared";
7
+ import { errorResponse, isHandlerResponse } from "../shared/json-response";
8
+ import { isValidIdentifier } from "../shared/intelligence-utils";
9
+ import { resolveIntelligenceUser } from "../shared/resolve-intelligence-user";
10
+
11
+ interface ThreadsHandlerParams {
12
+ runtime: CopilotRuntimeLike;
13
+ request: Request;
14
+ }
15
+
16
+ interface ThreadMutationParams extends ThreadsHandlerParams {
17
+ threadId: string;
18
+ }
19
+
20
+ interface ThreadMutationContext {
21
+ userId: string;
22
+ agentId: string;
23
+ body: Record<string, unknown>;
24
+ }
25
+
26
+ async function parseJsonBody(
27
+ request: Request,
28
+ ): Promise<Record<string, unknown> | Response> {
29
+ try {
30
+ return (await request.json()) as Record<string, unknown>;
31
+ } catch (error) {
32
+ logger.error({ err: error }, "Malformed JSON in request body");
33
+ return errorResponse("Invalid request body", 400);
34
+ }
35
+ }
36
+
37
+ function requireIntelligenceRuntime(
38
+ runtime: CopilotRuntimeLike,
39
+ ): CopilotIntelligenceRuntimeLike | Response {
40
+ if (!isIntelligenceRuntime(runtime)) {
41
+ return errorResponse(
42
+ "Missing CopilotKitIntelligence configuration. Thread operations require a CopilotKitIntelligence instance to be provided in CopilotRuntime options.",
43
+ 422,
44
+ );
45
+ }
46
+
47
+ return runtime;
48
+ }
49
+
50
+ async function resolveThreadMutationContext(
51
+ runtime: CopilotIntelligenceRuntimeLike,
52
+ request: Request,
53
+ ): Promise<ThreadMutationContext | Response> {
54
+ const body = await parseJsonBody(request);
55
+ if (isHandlerResponse(body)) return body;
56
+
57
+ const user = await resolveIntelligenceUser({ runtime, request });
58
+ if (isHandlerResponse(user)) return user;
59
+
60
+ const agentId = body.agentId;
61
+ if (!isValidIdentifier(agentId)) {
62
+ return errorResponse("Valid agentId is required", 400);
63
+ }
64
+
65
+ return {
66
+ body,
67
+ userId: user.id,
68
+ agentId,
69
+ };
70
+ }
71
+
72
+ export async function handleListThreads({
73
+ runtime,
74
+ request,
75
+ }: ThreadsHandlerParams): Promise<Response> {
76
+ const intelligenceRuntime = requireIntelligenceRuntime(runtime);
77
+ if (isHandlerResponse(intelligenceRuntime)) {
78
+ return intelligenceRuntime;
79
+ }
80
+
81
+ try {
82
+ const url = new URL(request.url);
83
+ const agentId = url.searchParams.get("agentId");
84
+ const includeArchived = url.searchParams.get("includeArchived") === "true";
85
+ const limitParam = url.searchParams.get("limit");
86
+ const cursor = url.searchParams.get("cursor");
87
+ const user = await resolveIntelligenceUser({
88
+ runtime: intelligenceRuntime,
89
+ request,
90
+ });
91
+ if (isHandlerResponse(user)) return user;
92
+
93
+ if (!isValidIdentifier(agentId)) {
94
+ return errorResponse("Valid agentId query param is required", 400);
95
+ }
96
+
97
+ const data = await intelligenceRuntime.intelligence.listThreads({
98
+ userId: user.id,
99
+ agentId,
100
+ ...(includeArchived ? { includeArchived: true } : {}),
101
+ ...(limitParam ? { limit: Number(limitParam) } : {}),
102
+ ...(cursor ? { cursor } : {}),
103
+ });
104
+
105
+ return Response.json(data);
106
+ } catch (error) {
107
+ logger.error({ err: error }, "Error listing threads");
108
+ return errorResponse("Failed to list threads", 500);
109
+ }
110
+ }
111
+
112
+ export async function handleUpdateThread({
113
+ runtime,
114
+ request,
115
+ threadId,
116
+ }: ThreadMutationParams): Promise<Response> {
117
+ const intelligenceRuntime = requireIntelligenceRuntime(runtime);
118
+ if (isHandlerResponse(intelligenceRuntime)) {
119
+ return intelligenceRuntime;
120
+ }
121
+
122
+ try {
123
+ const mutation = await resolveThreadMutationContext(
124
+ intelligenceRuntime,
125
+ request,
126
+ );
127
+ if (isHandlerResponse(mutation)) return mutation;
128
+
129
+ const updates = { ...mutation.body };
130
+ delete updates.agentId;
131
+ delete updates.userId;
132
+
133
+ const thread = await intelligenceRuntime.intelligence.updateThread({
134
+ threadId,
135
+ userId: mutation.userId,
136
+ agentId: mutation.agentId,
137
+ updates,
138
+ });
139
+
140
+ return Response.json(thread);
141
+ } catch (error) {
142
+ logger.error({ err: error, threadId }, "Error updating thread");
143
+ return errorResponse("Failed to update thread", 500);
144
+ }
145
+ }
146
+
147
+ export async function handleSubscribeToThreads({
148
+ runtime,
149
+ request,
150
+ }: ThreadsHandlerParams): Promise<Response> {
151
+ const intelligenceRuntime = requireIntelligenceRuntime(runtime);
152
+ if (isHandlerResponse(intelligenceRuntime)) {
153
+ return intelligenceRuntime;
154
+ }
155
+
156
+ try {
157
+ const user = await resolveIntelligenceUser({
158
+ runtime: intelligenceRuntime,
159
+ request,
160
+ });
161
+ if (isHandlerResponse(user)) return user;
162
+
163
+ const credentials =
164
+ await intelligenceRuntime.intelligence.ɵsubscribeToThreads({
165
+ userId: user.id,
166
+ });
167
+
168
+ return Response.json({ joinToken: credentials.joinToken });
169
+ } catch (error) {
170
+ logger.error({ err: error }, "Error subscribing to threads");
171
+ return errorResponse("Failed to subscribe to threads", 500);
172
+ }
173
+ }
174
+
175
+ export async function handleArchiveThread({
176
+ runtime,
177
+ request,
178
+ threadId,
179
+ }: ThreadMutationParams): Promise<Response> {
180
+ const intelligenceRuntime = requireIntelligenceRuntime(runtime);
181
+ if (isHandlerResponse(intelligenceRuntime)) {
182
+ return intelligenceRuntime;
183
+ }
184
+
185
+ try {
186
+ const mutation = await resolveThreadMutationContext(
187
+ intelligenceRuntime,
188
+ request,
189
+ );
190
+ if (isHandlerResponse(mutation)) return mutation;
191
+
192
+ await intelligenceRuntime.intelligence.archiveThread({
193
+ threadId,
194
+ userId: mutation.userId,
195
+ agentId: mutation.agentId,
196
+ });
197
+
198
+ return Response.json({ threadId, archived: true });
199
+ } catch (error) {
200
+ logger.error({ err: error, threadId }, "Error archiving thread");
201
+ return errorResponse("Failed to archive thread", 500);
202
+ }
203
+ }
204
+
205
+ export async function handleDeleteThread({
206
+ runtime,
207
+ request,
208
+ threadId,
209
+ }: ThreadMutationParams): Promise<Response> {
210
+ const intelligenceRuntime = requireIntelligenceRuntime(runtime);
211
+ if (isHandlerResponse(intelligenceRuntime)) {
212
+ return intelligenceRuntime;
213
+ }
214
+
215
+ try {
216
+ const mutation = await resolveThreadMutationContext(
217
+ intelligenceRuntime,
218
+ request,
219
+ );
220
+ if (isHandlerResponse(mutation)) return mutation;
221
+
222
+ await intelligenceRuntime.intelligence.deleteThread({
223
+ threadId,
224
+ userId: mutation.userId,
225
+ agentId: mutation.agentId,
226
+ });
227
+
228
+ return Response.json({ threadId, deleted: true });
229
+ } catch (error) {
230
+ logger.error({ err: error, threadId }, "Error deleting thread");
231
+ return errorResponse("Failed to delete thread", 500);
232
+ }
233
+ }
@@ -0,0 +1,136 @@
1
+ import {
2
+ AbstractAgent,
3
+ RunAgentInput,
4
+ RunAgentInputSchema,
5
+ } from "@ag-ui/client";
6
+ import { A2UIMiddleware } from "@ag-ui/a2ui-middleware";
7
+ import { MCPAppsMiddleware } from "@ag-ui/mcp-apps-middleware";
8
+ import { CopilotRuntimeLike } from "../../runtime";
9
+ import { extractForwardableHeaders } from "../header-utils";
10
+ import { logger } from "@copilotkit/shared";
11
+
12
+ type MiddlewareCapableAgent = AbstractAgent & {
13
+ use?: (middleware: unknown) => void;
14
+ headers?: Record<string, string>;
15
+ };
16
+
17
+ export interface RunAgentParameters {
18
+ request: Request;
19
+ runtime: CopilotRuntimeLike;
20
+ agentId: string;
21
+ }
22
+
23
+ export interface ConnectRequestBody extends RunAgentInput {
24
+ lastSeenEventId?: string | null;
25
+ }
26
+
27
+ export async function cloneAgentForRequest(
28
+ runtime: CopilotRuntimeLike,
29
+ agentId: string,
30
+ ): Promise<AbstractAgent | Response> {
31
+ const agents = await runtime.agents;
32
+
33
+ if (!agents[agentId]) {
34
+ return Response.json(
35
+ {
36
+ error: "Agent not found",
37
+ message: `Agent '${agentId}' does not exist`,
38
+ },
39
+ { status: 404 },
40
+ );
41
+ }
42
+
43
+ return (agents[agentId] as AbstractAgent).clone() as AbstractAgent;
44
+ }
45
+
46
+ export function configureAgentForRequest(params: {
47
+ runtime: CopilotRuntimeLike;
48
+ request: Request;
49
+ agentId: string;
50
+ agent: AbstractAgent;
51
+ }): void {
52
+ const { runtime, request, agentId } = params;
53
+ const agent = params.agent as MiddlewareCapableAgent;
54
+
55
+ if (runtime.a2ui) {
56
+ const { agents: targetAgents, ...a2uiOptions } = runtime.a2ui;
57
+ const shouldApply = !targetAgents || targetAgents.includes(agentId);
58
+ if (shouldApply && typeof agent.use === "function") {
59
+ agent.use(new A2UIMiddleware(a2uiOptions));
60
+ }
61
+ }
62
+
63
+ if (runtime.mcpApps?.servers?.length) {
64
+ const mcpServers = runtime.mcpApps.servers
65
+ .filter((server) => !server.agentId || server.agentId === agentId)
66
+ .map((server) => {
67
+ const mcpServer = { ...server };
68
+ delete mcpServer.agentId;
69
+ return mcpServer;
70
+ });
71
+
72
+ if (mcpServers.length > 0 && typeof agent.use === "function") {
73
+ agent.use(new MCPAppsMiddleware({ mcpServers }));
74
+ }
75
+ }
76
+
77
+ if (agent.headers) {
78
+ agent.headers = {
79
+ ...agent.headers,
80
+ ...extractForwardableHeaders(request),
81
+ };
82
+ }
83
+ }
84
+
85
+ export async function parseRunRequest(
86
+ request: Request,
87
+ ): Promise<RunAgentInput | Response> {
88
+ try {
89
+ const requestBody = await request.json();
90
+ return RunAgentInputSchema.parse(requestBody);
91
+ } catch (error) {
92
+ logger.error("Invalid run request body:", error);
93
+ return Response.json(
94
+ {
95
+ error: "Invalid request body",
96
+ details: error instanceof Error ? error.message : String(error),
97
+ },
98
+ { status: 400 },
99
+ );
100
+ }
101
+ }
102
+
103
+ export async function parseConnectRequest(request: Request): Promise<
104
+ | Response
105
+ | {
106
+ input: RunAgentInput;
107
+ lastSeenEventId: string | null;
108
+ }
109
+ > {
110
+ try {
111
+ const requestBody = await request.json();
112
+ const input = RunAgentInputSchema.parse(requestBody);
113
+ let lastSeenEventId: string | null = null;
114
+
115
+ if (
116
+ "lastSeenEventId" in (requestBody as Record<string, unknown>) &&
117
+ (typeof (requestBody as Record<string, unknown>).lastSeenEventId ===
118
+ "string" ||
119
+ (requestBody as Record<string, unknown>).lastSeenEventId === null)
120
+ ) {
121
+ lastSeenEventId =
122
+ (requestBody as ConnectRequestBody).lastSeenEventId ?? null;
123
+ }
124
+
125
+ return { input, lastSeenEventId };
126
+ } catch (error) {
127
+ logger.error("Invalid connect request body:", error);
128
+ return Response.json(
129
+ {
130
+ error: "Invalid request body",
131
+ details: error instanceof Error ? error.message : String(error),
132
+ },
133
+ { status: 400 },
134
+ );
135
+ }
136
+ }
@@ -0,0 +1,21 @@
1
+ import { PlatformRequestError } from "../../intelligence-platform/client";
2
+
3
+ export function isPlatformNotFoundError(error: unknown): boolean {
4
+ return error instanceof PlatformRequestError && error.status === 404;
5
+ }
6
+
7
+ const MAX_ID_LENGTH = 128;
8
+ const SAFE_ID_PATTERN = /^[\w.@:=-]+$/;
9
+
10
+ /**
11
+ * Validates that a string identifier (userId, agentId) is safe to pass through.
12
+ * Returns `true` if valid, `false` otherwise.
13
+ */
14
+ export function isValidIdentifier(value: unknown): value is string {
15
+ return (
16
+ typeof value === "string" &&
17
+ value.length > 0 &&
18
+ value.length <= MAX_ID_LENGTH &&
19
+ SAFE_ID_PATTERN.test(value)
20
+ );
21
+ }
@@ -0,0 +1,6 @@
1
+ export const errorResponse = (message: string, status: number) =>
2
+ Response.json({ error: message }, { status });
3
+
4
+ export function isHandlerResponse(value: unknown): value is Response {
5
+ return value instanceof Response;
6
+ }
@@ -0,0 +1,25 @@
1
+ import {
2
+ CopilotIntelligenceRuntimeLike,
3
+ CopilotRuntimeUser,
4
+ } from "../../runtime";
5
+ import { errorResponse } from "./json-response";
6
+ import { isValidIdentifier } from "./intelligence-utils";
7
+
8
+ export async function resolveIntelligenceUser(params: {
9
+ runtime: CopilotIntelligenceRuntimeLike;
10
+ request: Request;
11
+ }): Promise<CopilotRuntimeUser | Response> {
12
+ const { runtime, request } = params;
13
+
14
+ try {
15
+ const user = await runtime.identifyUser(request);
16
+ if (!isValidIdentifier(user?.id)) {
17
+ return errorResponse("identifyUser must return a valid user id", 400);
18
+ }
19
+
20
+ return { id: user.id };
21
+ } catch (error) {
22
+ console.error("Error identifying intelligence user:", error);
23
+ return errorResponse("Failed to identify user", 500);
24
+ }
25
+ }