illuma-agents 1.0.2

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 (437) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/common/enum.cjs +163 -0
  3. package/dist/cjs/common/enum.cjs.map +1 -0
  4. package/dist/cjs/events.cjs +143 -0
  5. package/dist/cjs/events.cjs.map +1 -0
  6. package/dist/cjs/graphs/Graph.cjs +581 -0
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -0
  8. package/dist/cjs/instrumentation.cjs +21 -0
  9. package/dist/cjs/instrumentation.cjs.map +1 -0
  10. package/dist/cjs/llm/anthropic/index.cjs +292 -0
  11. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  12. package/dist/cjs/llm/anthropic/types.cjs +50 -0
  13. package/dist/cjs/llm/anthropic/types.cjs.map +1 -0
  14. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +553 -0
  15. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -0
  16. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +218 -0
  17. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -0
  18. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  19. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  20. package/dist/cjs/llm/fake.cjs +97 -0
  21. package/dist/cjs/llm/fake.cjs.map +1 -0
  22. package/dist/cjs/llm/google/index.cjs +147 -0
  23. package/dist/cjs/llm/google/index.cjs.map +1 -0
  24. package/dist/cjs/llm/google/utils/common.cjs +490 -0
  25. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  26. package/dist/cjs/llm/ollama/index.cjs +70 -0
  27. package/dist/cjs/llm/ollama/index.cjs.map +1 -0
  28. package/dist/cjs/llm/ollama/utils.cjs +158 -0
  29. package/dist/cjs/llm/ollama/utils.cjs.map +1 -0
  30. package/dist/cjs/llm/openai/index.cjs +613 -0
  31. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  32. package/dist/cjs/llm/openai/utils/index.cjs +677 -0
  33. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  34. package/dist/cjs/llm/openrouter/index.cjs +29 -0
  35. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  36. package/dist/cjs/llm/providers.cjs +47 -0
  37. package/dist/cjs/llm/providers.cjs.map +1 -0
  38. package/dist/cjs/llm/text.cjs +69 -0
  39. package/dist/cjs/llm/text.cjs.map +1 -0
  40. package/dist/cjs/llm/vertexai/index.cjs +330 -0
  41. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  42. package/dist/cjs/main.cjs +127 -0
  43. package/dist/cjs/main.cjs.map +1 -0
  44. package/dist/cjs/messages/core.cjs +359 -0
  45. package/dist/cjs/messages/core.cjs.map +1 -0
  46. package/dist/cjs/messages/format.cjs +455 -0
  47. package/dist/cjs/messages/format.cjs.map +1 -0
  48. package/dist/cjs/messages/ids.cjs +23 -0
  49. package/dist/cjs/messages/ids.cjs.map +1 -0
  50. package/dist/cjs/messages/prune.cjs +398 -0
  51. package/dist/cjs/messages/prune.cjs.map +1 -0
  52. package/dist/cjs/run.cjs +264 -0
  53. package/dist/cjs/run.cjs.map +1 -0
  54. package/dist/cjs/splitStream.cjs +210 -0
  55. package/dist/cjs/splitStream.cjs.map +1 -0
  56. package/dist/cjs/stream.cjs +504 -0
  57. package/dist/cjs/stream.cjs.map +1 -0
  58. package/dist/cjs/tools/CodeExecutor.cjs +192 -0
  59. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -0
  60. package/dist/cjs/tools/ToolNode.cjs +125 -0
  61. package/dist/cjs/tools/ToolNode.cjs.map +1 -0
  62. package/dist/cjs/tools/handlers.cjs +250 -0
  63. package/dist/cjs/tools/handlers.cjs.map +1 -0
  64. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  65. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  66. package/dist/cjs/tools/search/content.cjs +140 -0
  67. package/dist/cjs/tools/search/content.cjs.map +1 -0
  68. package/dist/cjs/tools/search/firecrawl.cjs +179 -0
  69. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -0
  70. package/dist/cjs/tools/search/format.cjs +203 -0
  71. package/dist/cjs/tools/search/format.cjs.map +1 -0
  72. package/dist/cjs/tools/search/highlights.cjs +245 -0
  73. package/dist/cjs/tools/search/highlights.cjs.map +1 -0
  74. package/dist/cjs/tools/search/rerankers.cjs +174 -0
  75. package/dist/cjs/tools/search/rerankers.cjs.map +1 -0
  76. package/dist/cjs/tools/search/schema.cjs +70 -0
  77. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  78. package/dist/cjs/tools/search/search.cjs +561 -0
  79. package/dist/cjs/tools/search/search.cjs.map +1 -0
  80. package/dist/cjs/tools/search/serper-scraper.cjs +132 -0
  81. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -0
  82. package/dist/cjs/tools/search/tool.cjs +331 -0
  83. package/dist/cjs/tools/search/tool.cjs.map +1 -0
  84. package/dist/cjs/tools/search/utils.cjs +66 -0
  85. package/dist/cjs/tools/search/utils.cjs.map +1 -0
  86. package/dist/cjs/utils/graph.cjs +16 -0
  87. package/dist/cjs/utils/graph.cjs.map +1 -0
  88. package/dist/cjs/utils/llm.cjs +28 -0
  89. package/dist/cjs/utils/llm.cjs.map +1 -0
  90. package/dist/cjs/utils/misc.cjs +56 -0
  91. package/dist/cjs/utils/misc.cjs.map +1 -0
  92. package/dist/cjs/utils/run.cjs +69 -0
  93. package/dist/cjs/utils/run.cjs.map +1 -0
  94. package/dist/cjs/utils/title.cjs +111 -0
  95. package/dist/cjs/utils/title.cjs.map +1 -0
  96. package/dist/cjs/utils/tokens.cjs +65 -0
  97. package/dist/cjs/utils/tokens.cjs.map +1 -0
  98. package/dist/esm/common/enum.mjs +163 -0
  99. package/dist/esm/common/enum.mjs.map +1 -0
  100. package/dist/esm/events.mjs +135 -0
  101. package/dist/esm/events.mjs.map +1 -0
  102. package/dist/esm/graphs/Graph.mjs +578 -0
  103. package/dist/esm/graphs/Graph.mjs.map +1 -0
  104. package/dist/esm/instrumentation.mjs +19 -0
  105. package/dist/esm/instrumentation.mjs.map +1 -0
  106. package/dist/esm/llm/anthropic/index.mjs +290 -0
  107. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  108. package/dist/esm/llm/anthropic/types.mjs +48 -0
  109. package/dist/esm/llm/anthropic/types.mjs.map +1 -0
  110. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +550 -0
  111. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -0
  112. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +216 -0
  113. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -0
  114. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  115. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  116. package/dist/esm/llm/fake.mjs +94 -0
  117. package/dist/esm/llm/fake.mjs.map +1 -0
  118. package/dist/esm/llm/google/index.mjs +145 -0
  119. package/dist/esm/llm/google/index.mjs.map +1 -0
  120. package/dist/esm/llm/google/utils/common.mjs +484 -0
  121. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  122. package/dist/esm/llm/ollama/index.mjs +68 -0
  123. package/dist/esm/llm/ollama/index.mjs.map +1 -0
  124. package/dist/esm/llm/ollama/utils.mjs +155 -0
  125. package/dist/esm/llm/ollama/utils.mjs.map +1 -0
  126. package/dist/esm/llm/openai/index.mjs +604 -0
  127. package/dist/esm/llm/openai/index.mjs.map +1 -0
  128. package/dist/esm/llm/openai/utils/index.mjs +671 -0
  129. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  130. package/dist/esm/llm/openrouter/index.mjs +27 -0
  131. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  132. package/dist/esm/llm/providers.mjs +43 -0
  133. package/dist/esm/llm/providers.mjs.map +1 -0
  134. package/dist/esm/llm/text.mjs +67 -0
  135. package/dist/esm/llm/text.mjs.map +1 -0
  136. package/dist/esm/llm/vertexai/index.mjs +328 -0
  137. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  138. package/dist/esm/main.mjs +20 -0
  139. package/dist/esm/main.mjs.map +1 -0
  140. package/dist/esm/messages/core.mjs +351 -0
  141. package/dist/esm/messages/core.mjs.map +1 -0
  142. package/dist/esm/messages/format.mjs +447 -0
  143. package/dist/esm/messages/format.mjs.map +1 -0
  144. package/dist/esm/messages/ids.mjs +21 -0
  145. package/dist/esm/messages/ids.mjs.map +1 -0
  146. package/dist/esm/messages/prune.mjs +393 -0
  147. package/dist/esm/messages/prune.mjs.map +1 -0
  148. package/dist/esm/run.mjs +261 -0
  149. package/dist/esm/run.mjs.map +1 -0
  150. package/dist/esm/splitStream.mjs +207 -0
  151. package/dist/esm/splitStream.mjs.map +1 -0
  152. package/dist/esm/stream.mjs +500 -0
  153. package/dist/esm/stream.mjs.map +1 -0
  154. package/dist/esm/tools/CodeExecutor.mjs +188 -0
  155. package/dist/esm/tools/CodeExecutor.mjs.map +1 -0
  156. package/dist/esm/tools/ToolNode.mjs +122 -0
  157. package/dist/esm/tools/ToolNode.mjs.map +1 -0
  158. package/dist/esm/tools/handlers.mjs +245 -0
  159. package/dist/esm/tools/handlers.mjs.map +1 -0
  160. package/dist/esm/tools/search/anthropic.mjs +37 -0
  161. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  162. package/dist/esm/tools/search/content.mjs +119 -0
  163. package/dist/esm/tools/search/content.mjs.map +1 -0
  164. package/dist/esm/tools/search/firecrawl.mjs +176 -0
  165. package/dist/esm/tools/search/firecrawl.mjs.map +1 -0
  166. package/dist/esm/tools/search/format.mjs +201 -0
  167. package/dist/esm/tools/search/format.mjs.map +1 -0
  168. package/dist/esm/tools/search/highlights.mjs +243 -0
  169. package/dist/esm/tools/search/highlights.mjs.map +1 -0
  170. package/dist/esm/tools/search/rerankers.mjs +168 -0
  171. package/dist/esm/tools/search/rerankers.mjs.map +1 -0
  172. package/dist/esm/tools/search/schema.mjs +61 -0
  173. package/dist/esm/tools/search/schema.mjs.map +1 -0
  174. package/dist/esm/tools/search/search.mjs +558 -0
  175. package/dist/esm/tools/search/search.mjs.map +1 -0
  176. package/dist/esm/tools/search/serper-scraper.mjs +129 -0
  177. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -0
  178. package/dist/esm/tools/search/tool.mjs +329 -0
  179. package/dist/esm/tools/search/tool.mjs.map +1 -0
  180. package/dist/esm/tools/search/utils.mjs +61 -0
  181. package/dist/esm/tools/search/utils.mjs.map +1 -0
  182. package/dist/esm/utils/graph.mjs +13 -0
  183. package/dist/esm/utils/graph.mjs.map +1 -0
  184. package/dist/esm/utils/llm.mjs +25 -0
  185. package/dist/esm/utils/llm.mjs.map +1 -0
  186. package/dist/esm/utils/misc.mjs +53 -0
  187. package/dist/esm/utils/misc.mjs.map +1 -0
  188. package/dist/esm/utils/run.mjs +66 -0
  189. package/dist/esm/utils/run.mjs.map +1 -0
  190. package/dist/esm/utils/title.mjs +108 -0
  191. package/dist/esm/utils/title.mjs.map +1 -0
  192. package/dist/esm/utils/tokens.mjs +62 -0
  193. package/dist/esm/utils/tokens.mjs.map +1 -0
  194. package/dist/types/common/enum.d.ts +128 -0
  195. package/dist/types/common/index.d.ts +1 -0
  196. package/dist/types/events.d.ts +29 -0
  197. package/dist/types/graphs/Graph.d.ts +122 -0
  198. package/dist/types/graphs/index.d.ts +1 -0
  199. package/dist/types/index.d.ts +13 -0
  200. package/dist/types/instrumentation.d.ts +1 -0
  201. package/dist/types/llm/anthropic/index.d.ts +39 -0
  202. package/dist/types/llm/anthropic/types.d.ts +37 -0
  203. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +14 -0
  204. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +14 -0
  205. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +22 -0
  206. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  207. package/dist/types/llm/fake.d.ts +31 -0
  208. package/dist/types/llm/google/index.d.ts +14 -0
  209. package/dist/types/llm/google/types.d.ts +32 -0
  210. package/dist/types/llm/google/utils/common.d.ts +19 -0
  211. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  212. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  213. package/dist/types/llm/ollama/index.d.ts +8 -0
  214. package/dist/types/llm/ollama/utils.d.ts +7 -0
  215. package/dist/types/llm/openai/index.d.ts +103 -0
  216. package/dist/types/llm/openai/types.d.ts +10 -0
  217. package/dist/types/llm/openai/utils/index.d.ts +20 -0
  218. package/dist/types/llm/openrouter/index.d.ts +12 -0
  219. package/dist/types/llm/providers.d.ts +5 -0
  220. package/dist/types/llm/text.d.ts +21 -0
  221. package/dist/types/llm/vertexai/index.d.ts +293 -0
  222. package/dist/types/messages/core.d.ts +14 -0
  223. package/dist/types/messages/format.d.ts +113 -0
  224. package/dist/types/messages/ids.d.ts +3 -0
  225. package/dist/types/messages/index.d.ts +4 -0
  226. package/dist/types/messages/prune.d.ts +51 -0
  227. package/dist/types/mockStream.d.ts +32 -0
  228. package/dist/types/prompts/collab.d.ts +1 -0
  229. package/dist/types/prompts/index.d.ts +2 -0
  230. package/dist/types/prompts/taskmanager.d.ts +41 -0
  231. package/dist/types/run.d.ts +30 -0
  232. package/dist/types/scripts/abort.d.ts +1 -0
  233. package/dist/types/scripts/ant_web_search.d.ts +1 -0
  234. package/dist/types/scripts/args.d.ts +7 -0
  235. package/dist/types/scripts/caching.d.ts +1 -0
  236. package/dist/types/scripts/cli.d.ts +1 -0
  237. package/dist/types/scripts/cli2.d.ts +1 -0
  238. package/dist/types/scripts/cli3.d.ts +1 -0
  239. package/dist/types/scripts/cli4.d.ts +1 -0
  240. package/dist/types/scripts/cli5.d.ts +1 -0
  241. package/dist/types/scripts/code_exec.d.ts +1 -0
  242. package/dist/types/scripts/code_exec_files.d.ts +1 -0
  243. package/dist/types/scripts/code_exec_simple.d.ts +1 -0
  244. package/dist/types/scripts/content.d.ts +1 -0
  245. package/dist/types/scripts/empty_input.d.ts +1 -0
  246. package/dist/types/scripts/image.d.ts +1 -0
  247. package/dist/types/scripts/memory.d.ts +1 -0
  248. package/dist/types/scripts/search.d.ts +1 -0
  249. package/dist/types/scripts/simple.d.ts +1 -0
  250. package/dist/types/scripts/stream.d.ts +1 -0
  251. package/dist/types/scripts/thinking.d.ts +1 -0
  252. package/dist/types/scripts/tools.d.ts +1 -0
  253. package/dist/types/specs/spec.utils.d.ts +1 -0
  254. package/dist/types/splitStream.d.ts +37 -0
  255. package/dist/types/stream.d.ts +14 -0
  256. package/dist/types/tools/CodeExecutor.d.ts +23 -0
  257. package/dist/types/tools/ToolNode.d.ts +22 -0
  258. package/dist/types/tools/example.d.ts +78 -0
  259. package/dist/types/tools/handlers.d.ts +19 -0
  260. package/dist/types/tools/search/anthropic.d.ts +16 -0
  261. package/dist/types/tools/search/content.d.ts +4 -0
  262. package/dist/types/tools/search/firecrawl.d.ts +54 -0
  263. package/dist/types/tools/search/format.d.ts +5 -0
  264. package/dist/types/tools/search/highlights.d.ts +13 -0
  265. package/dist/types/tools/search/index.d.ts +2 -0
  266. package/dist/types/tools/search/rerankers.d.ts +38 -0
  267. package/dist/types/tools/search/schema.d.ts +16 -0
  268. package/dist/types/tools/search/search.d.ts +8 -0
  269. package/dist/types/tools/search/serper-scraper.d.ts +59 -0
  270. package/dist/types/tools/search/test.d.ts +1 -0
  271. package/dist/types/tools/search/tool.d.ts +54 -0
  272. package/dist/types/tools/search/types.d.ts +591 -0
  273. package/dist/types/tools/search/utils.d.ts +10 -0
  274. package/dist/types/types/graph.d.ts +138 -0
  275. package/dist/types/types/index.d.ts +5 -0
  276. package/dist/types/types/llm.d.ts +102 -0
  277. package/dist/types/types/run.d.ts +74 -0
  278. package/dist/types/types/stream.d.ts +293 -0
  279. package/dist/types/types/tools.d.ts +61 -0
  280. package/dist/types/utils/graph.d.ts +2 -0
  281. package/dist/types/utils/index.d.ts +5 -0
  282. package/dist/types/utils/llm.d.ts +3 -0
  283. package/dist/types/utils/llmConfig.d.ts +3 -0
  284. package/dist/types/utils/logging.d.ts +1 -0
  285. package/dist/types/utils/misc.d.ts +7 -0
  286. package/dist/types/utils/run.d.ts +27 -0
  287. package/dist/types/utils/title.d.ts +4 -0
  288. package/dist/types/utils/tokens.d.ts +3 -0
  289. package/package.json +145 -0
  290. package/src/common/enum.ts +176 -0
  291. package/src/common/index.ts +2 -0
  292. package/src/events.ts +191 -0
  293. package/src/graphs/Graph.ts +846 -0
  294. package/src/graphs/index.ts +1 -0
  295. package/src/index.ts +24 -0
  296. package/src/instrumentation.ts +22 -0
  297. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  298. package/src/llm/anthropic/index.ts +413 -0
  299. package/src/llm/anthropic/llm.spec.ts +1442 -0
  300. package/src/llm/anthropic/types.ts +140 -0
  301. package/src/llm/anthropic/utils/message_inputs.ts +660 -0
  302. package/src/llm/anthropic/utils/message_outputs.ts +289 -0
  303. package/src/llm/anthropic/utils/output_parsers.ts +133 -0
  304. package/src/llm/anthropic/utils/tools.ts +29 -0
  305. package/src/llm/fake.ts +133 -0
  306. package/src/llm/google/index.ts +222 -0
  307. package/src/llm/google/types.ts +43 -0
  308. package/src/llm/google/utils/common.ts +660 -0
  309. package/src/llm/google/utils/tools.ts +160 -0
  310. package/src/llm/google/utils/zod_to_genai_parameters.ts +88 -0
  311. package/src/llm/ollama/index.ts +92 -0
  312. package/src/llm/ollama/utils.ts +193 -0
  313. package/src/llm/openai/index.ts +853 -0
  314. package/src/llm/openai/types.ts +24 -0
  315. package/src/llm/openai/utils/index.ts +918 -0
  316. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  317. package/src/llm/openrouter/index.ts +60 -0
  318. package/src/llm/providers.ts +57 -0
  319. package/src/llm/text.ts +94 -0
  320. package/src/llm/vertexai/index.ts +360 -0
  321. package/src/messages/core.ts +463 -0
  322. package/src/messages/format.ts +625 -0
  323. package/src/messages/formatAgentMessages.test.ts +917 -0
  324. package/src/messages/formatAgentMessages.tools.test.ts +400 -0
  325. package/src/messages/formatMessage.test.ts +693 -0
  326. package/src/messages/ids.ts +26 -0
  327. package/src/messages/index.ts +4 -0
  328. package/src/messages/prune.ts +567 -0
  329. package/src/messages/shiftIndexTokenCountMap.test.ts +81 -0
  330. package/src/mockStream.ts +99 -0
  331. package/src/prompts/collab.ts +6 -0
  332. package/src/prompts/index.ts +2 -0
  333. package/src/prompts/taskmanager.ts +61 -0
  334. package/src/proto/CollabGraph.ts +269 -0
  335. package/src/proto/TaskManager.ts +243 -0
  336. package/src/proto/collab.ts +200 -0
  337. package/src/proto/collab_design.ts +184 -0
  338. package/src/proto/collab_design_v2.ts +224 -0
  339. package/src/proto/collab_design_v3.ts +255 -0
  340. package/src/proto/collab_design_v4.ts +220 -0
  341. package/src/proto/collab_design_v5.ts +251 -0
  342. package/src/proto/collab_graph.ts +181 -0
  343. package/src/proto/collab_original.ts +123 -0
  344. package/src/proto/example.ts +93 -0
  345. package/src/proto/example_new.ts +68 -0
  346. package/src/proto/example_old.ts +201 -0
  347. package/src/proto/example_test.ts +152 -0
  348. package/src/proto/example_test_anthropic.ts +100 -0
  349. package/src/proto/log_stream.ts +202 -0
  350. package/src/proto/main_collab_community_event.ts +133 -0
  351. package/src/proto/main_collab_design_v2.ts +96 -0
  352. package/src/proto/main_collab_design_v4.ts +100 -0
  353. package/src/proto/main_collab_design_v5.ts +135 -0
  354. package/src/proto/main_collab_global_analysis.ts +122 -0
  355. package/src/proto/main_collab_hackathon_event.ts +153 -0
  356. package/src/proto/main_collab_space_mission.ts +153 -0
  357. package/src/proto/main_philosophy.ts +210 -0
  358. package/src/proto/original_script.ts +126 -0
  359. package/src/proto/standard.ts +100 -0
  360. package/src/proto/stream.ts +56 -0
  361. package/src/proto/tasks.ts +118 -0
  362. package/src/proto/tools/global_analysis_tools.ts +86 -0
  363. package/src/proto/tools/space_mission_tools.ts +60 -0
  364. package/src/proto/vertexai.ts +54 -0
  365. package/src/run.ts +381 -0
  366. package/src/scripts/abort.ts +138 -0
  367. package/src/scripts/ant_web_search.ts +158 -0
  368. package/src/scripts/args.ts +48 -0
  369. package/src/scripts/caching.ts +124 -0
  370. package/src/scripts/cli.ts +167 -0
  371. package/src/scripts/cli2.ts +125 -0
  372. package/src/scripts/cli3.ts +178 -0
  373. package/src/scripts/cli4.ts +184 -0
  374. package/src/scripts/cli5.ts +184 -0
  375. package/src/scripts/code_exec.ts +214 -0
  376. package/src/scripts/code_exec_files.ts +193 -0
  377. package/src/scripts/code_exec_simple.ts +129 -0
  378. package/src/scripts/content.ts +120 -0
  379. package/src/scripts/empty_input.ts +137 -0
  380. package/src/scripts/image.ts +178 -0
  381. package/src/scripts/memory.ts +97 -0
  382. package/src/scripts/search.ts +150 -0
  383. package/src/scripts/simple.ts +225 -0
  384. package/src/scripts/stream.ts +122 -0
  385. package/src/scripts/thinking.ts +150 -0
  386. package/src/scripts/tools.ts +155 -0
  387. package/src/specs/anthropic.simple.test.ts +317 -0
  388. package/src/specs/azure.simple.test.ts +316 -0
  389. package/src/specs/openai.simple.test.ts +316 -0
  390. package/src/specs/prune.test.ts +763 -0
  391. package/src/specs/reasoning.test.ts +165 -0
  392. package/src/specs/spec.utils.ts +3 -0
  393. package/src/specs/thinking-prune.test.ts +703 -0
  394. package/src/specs/token-distribution-edge-case.test.ts +316 -0
  395. package/src/specs/tool-error.test.ts +193 -0
  396. package/src/splitStream.test.ts +691 -0
  397. package/src/splitStream.ts +234 -0
  398. package/src/stream.test.ts +94 -0
  399. package/src/stream.ts +651 -0
  400. package/src/tools/CodeExecutor.ts +220 -0
  401. package/src/tools/ToolNode.ts +170 -0
  402. package/src/tools/example.ts +129 -0
  403. package/src/tools/handlers.ts +336 -0
  404. package/src/tools/search/anthropic.ts +51 -0
  405. package/src/tools/search/content.test.ts +173 -0
  406. package/src/tools/search/content.ts +147 -0
  407. package/src/tools/search/firecrawl.ts +210 -0
  408. package/src/tools/search/format.ts +250 -0
  409. package/src/tools/search/highlights.ts +320 -0
  410. package/src/tools/search/index.ts +2 -0
  411. package/src/tools/search/jina-reranker.test.ts +126 -0
  412. package/src/tools/search/output.md +2775 -0
  413. package/src/tools/search/rerankers.ts +242 -0
  414. package/src/tools/search/schema.ts +63 -0
  415. package/src/tools/search/search.ts +759 -0
  416. package/src/tools/search/serper-scraper.ts +155 -0
  417. package/src/tools/search/test.html +884 -0
  418. package/src/tools/search/test.md +643 -0
  419. package/src/tools/search/test.ts +159 -0
  420. package/src/tools/search/tool.ts +471 -0
  421. package/src/tools/search/types.ts +687 -0
  422. package/src/tools/search/utils.ts +79 -0
  423. package/src/types/graph.ts +185 -0
  424. package/src/types/index.ts +6 -0
  425. package/src/types/llm.ts +140 -0
  426. package/src/types/run.ts +89 -0
  427. package/src/types/stream.ts +400 -0
  428. package/src/types/tools.ts +80 -0
  429. package/src/utils/graph.ts +11 -0
  430. package/src/utils/index.ts +5 -0
  431. package/src/utils/llm.ts +27 -0
  432. package/src/utils/llmConfig.ts +183 -0
  433. package/src/utils/logging.ts +48 -0
  434. package/src/utils/misc.ts +57 -0
  435. package/src/utils/run.ts +101 -0
  436. package/src/utils/title.ts +165 -0
  437. package/src/utils/tokens.ts +70 -0
package/src/stream.ts ADDED
@@ -0,0 +1,651 @@
1
+ // src/stream.ts
2
+ import type { ChatOpenAIReasoningSummary } from '@langchain/openai';
3
+ import type { AIMessageChunk } from '@langchain/core/messages';
4
+ import type { ToolCall } from '@langchain/core/messages/tool';
5
+ import type { Graph } from '@/graphs';
6
+ import type * as t from '@/types';
7
+ import {
8
+ ToolCallTypes,
9
+ ContentTypes,
10
+ GraphEvents,
11
+ StepTypes,
12
+ Providers,
13
+ } from '@/common';
14
+ import {
15
+ handleServerToolResult,
16
+ handleToolCallChunks,
17
+ handleToolCalls,
18
+ } from '@/tools/handlers';
19
+ import { getMessageId } from '@/messages';
20
+
21
+ /**
22
+ * Parses content to extract thinking sections enclosed in <think> tags using string operations
23
+ * @param content The content to parse
24
+ * @returns An object with separated text and thinking content
25
+ */
26
+ function parseThinkingContent(content: string): {
27
+ text: string;
28
+ thinking: string;
29
+ } {
30
+ // If no think tags, return the original content as text
31
+ if (!content.includes('<think>')) {
32
+ return { text: content, thinking: '' };
33
+ }
34
+
35
+ let textResult = '';
36
+ const thinkingResult: string[] = [];
37
+ let position = 0;
38
+
39
+ while (position < content.length) {
40
+ const thinkStart = content.indexOf('<think>', position);
41
+
42
+ if (thinkStart === -1) {
43
+ // No more think tags, add the rest and break
44
+ textResult += content.slice(position);
45
+ break;
46
+ }
47
+
48
+ // Add text before the think tag
49
+ textResult += content.slice(position, thinkStart);
50
+
51
+ const thinkEnd = content.indexOf('</think>', thinkStart);
52
+ if (thinkEnd === -1) {
53
+ // Malformed input, no closing tag
54
+ textResult += content.slice(thinkStart);
55
+ break;
56
+ }
57
+
58
+ // Add the thinking content
59
+ const thinkContent = content.slice(thinkStart + 7, thinkEnd);
60
+ thinkingResult.push(thinkContent);
61
+
62
+ // Move position to after the think tag
63
+ position = thinkEnd + 8; // 8 is the length of '</think>'
64
+ }
65
+
66
+ return {
67
+ text: textResult.trim(),
68
+ thinking: thinkingResult.join('\n').trim(),
69
+ };
70
+ }
71
+
72
+ function getNonEmptyValue(possibleValues: string[]): string | undefined {
73
+ for (const value of possibleValues) {
74
+ if (value && value.trim() !== '') {
75
+ return value;
76
+ }
77
+ }
78
+ return undefined;
79
+ }
80
+
81
+ export function getChunkContent({
82
+ chunk,
83
+ provider,
84
+ reasoningKey,
85
+ }: {
86
+ chunk?: Partial<AIMessageChunk>;
87
+ provider?: Providers;
88
+ reasoningKey: 'reasoning_content' | 'reasoning';
89
+ }): string | t.MessageContentComplex[] | undefined {
90
+ if (
91
+ (provider === Providers.OPENAI || provider === Providers.AZURE) &&
92
+ (
93
+ chunk?.additional_kwargs?.reasoning as
94
+ | Partial<ChatOpenAIReasoningSummary>
95
+ | undefined
96
+ )?.summary?.[0]?.text != null &&
97
+ ((
98
+ chunk?.additional_kwargs?.reasoning as
99
+ | Partial<ChatOpenAIReasoningSummary>
100
+ | undefined
101
+ )?.summary?.[0]?.text?.length ?? 0) > 0
102
+ ) {
103
+ return (
104
+ chunk?.additional_kwargs?.reasoning as
105
+ | Partial<ChatOpenAIReasoningSummary>
106
+ | undefined
107
+ )?.summary?.[0]?.text;
108
+ }
109
+ return (
110
+ ((chunk?.additional_kwargs?.[reasoningKey] as string | undefined) ?? '') ||
111
+ chunk?.content
112
+ );
113
+ }
114
+
115
+ export class ChatModelStreamHandler implements t.EventHandler {
116
+ handle(
117
+ event: string,
118
+ data: t.StreamEventData,
119
+ metadata?: Record<string, unknown>,
120
+ graph?: Graph
121
+ ): void {
122
+ if (!graph) {
123
+ throw new Error('Graph not found');
124
+ }
125
+ if (!graph.config) {
126
+ throw new Error('Config not found in graph');
127
+ }
128
+ if (!data.chunk) {
129
+ console.warn(`No chunk found in ${event} event`);
130
+ return;
131
+ }
132
+
133
+ const chunk = data.chunk as Partial<AIMessageChunk>;
134
+ const content = getChunkContent({
135
+ chunk,
136
+ reasoningKey: graph.reasoningKey,
137
+ provider: metadata?.provider as Providers,
138
+ });
139
+ const skipHandling = handleServerToolResult({
140
+ content,
141
+ metadata,
142
+ graph,
143
+ });
144
+ if (skipHandling) {
145
+ return;
146
+ }
147
+ this.handleReasoning(chunk, graph, metadata?.provider as Providers);
148
+ let hasToolCalls = false;
149
+ if (
150
+ chunk.tool_calls &&
151
+ chunk.tool_calls.length > 0 &&
152
+ chunk.tool_calls.every((tc) => tc.id != null && tc.id !== '')
153
+ ) {
154
+ hasToolCalls = true;
155
+ handleToolCalls(chunk.tool_calls, metadata, graph);
156
+ }
157
+
158
+ const hasToolCallChunks =
159
+ (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;
160
+ const isEmptyContent =
161
+ typeof content === 'undefined' ||
162
+ !content.length ||
163
+ (typeof content === 'string' && !content);
164
+ const isEmptyChunk = isEmptyContent && !hasToolCallChunks;
165
+ const chunkId = chunk.id ?? '';
166
+ if (isEmptyChunk && chunkId && chunkId.startsWith('msg')) {
167
+ if (graph.messageIdsByStepKey.has(chunkId)) {
168
+ return;
169
+ } else if (graph.prelimMessageIdsByStepKey.has(chunkId)) {
170
+ return;
171
+ }
172
+
173
+ const stepKey = graph.getStepKey(metadata);
174
+ graph.prelimMessageIdsByStepKey.set(stepKey, chunkId);
175
+ return;
176
+ } else if (isEmptyChunk) {
177
+ return;
178
+ }
179
+
180
+ const stepKey = graph.getStepKey(metadata);
181
+
182
+ if (
183
+ hasToolCallChunks &&
184
+ chunk.tool_call_chunks &&
185
+ chunk.tool_call_chunks.length &&
186
+ typeof chunk.tool_call_chunks[0]?.index === 'number'
187
+ ) {
188
+ handleToolCallChunks({
189
+ graph,
190
+ stepKey,
191
+ toolCallChunks: chunk.tool_call_chunks,
192
+ });
193
+ }
194
+
195
+ if (isEmptyContent) {
196
+ return;
197
+ }
198
+
199
+ const message_id = getMessageId(stepKey, graph) ?? '';
200
+ if (message_id) {
201
+ graph.dispatchRunStep(stepKey, {
202
+ type: StepTypes.MESSAGE_CREATION,
203
+ message_creation: {
204
+ message_id,
205
+ },
206
+ });
207
+ }
208
+
209
+ const stepId = graph.getStepIdByKey(stepKey);
210
+ const runStep = graph.getRunStep(stepId);
211
+ if (!runStep) {
212
+ console.warn(`\n
213
+ ==============================================================
214
+
215
+
216
+ Run step for ${stepId} does not exist, cannot dispatch delta event.
217
+
218
+ event: ${event}
219
+ stepId: ${stepId}
220
+ stepKey: ${stepKey}
221
+ message_id: ${message_id}
222
+ hasToolCalls: ${hasToolCalls}
223
+ hasToolCallChunks: ${hasToolCallChunks}
224
+
225
+ ==============================================================
226
+ \n`);
227
+ return;
228
+ }
229
+
230
+ /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */
231
+ if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {
232
+ return;
233
+ } else if (
234
+ hasToolCallChunks &&
235
+ (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)
236
+ ) {
237
+ return;
238
+ } else if (typeof content === 'string') {
239
+ if (graph.currentTokenType === ContentTypes.TEXT) {
240
+ graph.dispatchMessageDelta(stepId, {
241
+ content: [
242
+ {
243
+ type: ContentTypes.TEXT,
244
+ text: content,
245
+ },
246
+ ],
247
+ });
248
+ } else if (graph.currentTokenType === 'think_and_text') {
249
+ const { text, thinking } = parseThinkingContent(content);
250
+ if (thinking) {
251
+ graph.dispatchReasoningDelta(stepId, {
252
+ content: [
253
+ {
254
+ type: ContentTypes.THINK,
255
+ think: thinking,
256
+ },
257
+ ],
258
+ });
259
+ }
260
+ if (text) {
261
+ graph.currentTokenType = ContentTypes.TEXT;
262
+ graph.tokenTypeSwitch = 'content';
263
+ const newStepKey = graph.getStepKey(metadata);
264
+ const message_id = getMessageId(newStepKey, graph) ?? '';
265
+ graph.dispatchRunStep(newStepKey, {
266
+ type: StepTypes.MESSAGE_CREATION,
267
+ message_creation: {
268
+ message_id,
269
+ },
270
+ });
271
+
272
+ const newStepId = graph.getStepIdByKey(newStepKey);
273
+ graph.dispatchMessageDelta(newStepId, {
274
+ content: [
275
+ {
276
+ type: ContentTypes.TEXT,
277
+ text: text,
278
+ },
279
+ ],
280
+ });
281
+ }
282
+ } else {
283
+ graph.dispatchReasoningDelta(stepId, {
284
+ content: [
285
+ {
286
+ type: ContentTypes.THINK,
287
+ think: content,
288
+ },
289
+ ],
290
+ });
291
+ }
292
+ } else if (
293
+ content.every((c) => c.type?.startsWith(ContentTypes.TEXT) ?? false)
294
+ ) {
295
+ graph.dispatchMessageDelta(stepId, {
296
+ content,
297
+ });
298
+ } else if (
299
+ content.every(
300
+ (c) =>
301
+ (c.type?.startsWith(ContentTypes.THINKING) ?? false) ||
302
+ (c.type?.startsWith(ContentTypes.REASONING) ?? false) ||
303
+ (c.type?.startsWith(ContentTypes.REASONING_CONTENT) ?? false)
304
+ )
305
+ ) {
306
+ graph.dispatchReasoningDelta(stepId, {
307
+ content: content.map((c) => ({
308
+ type: ContentTypes.THINK,
309
+ think:
310
+ (c as t.ThinkingContentText).thinking ??
311
+ (c as Partial<t.GoogleReasoningContentText>).reasoning ??
312
+ (c as Partial<t.BedrockReasoningContentText>).reasoningText?.text ??
313
+ '',
314
+ })),
315
+ });
316
+ }
317
+ }
318
+ handleReasoning(
319
+ chunk: Partial<AIMessageChunk>,
320
+ graph: Graph,
321
+ provider?: Providers
322
+ ): void {
323
+ let reasoning_content = chunk.additional_kwargs?.[graph.reasoningKey] as
324
+ | string
325
+ | Partial<ChatOpenAIReasoningSummary>
326
+ | undefined;
327
+ if (
328
+ Array.isArray(chunk.content) &&
329
+ (chunk.content[0]?.type === ContentTypes.THINKING ||
330
+ chunk.content[0]?.type === ContentTypes.REASONING ||
331
+ chunk.content[0]?.type === ContentTypes.REASONING_CONTENT)
332
+ ) {
333
+ reasoning_content = 'valid';
334
+ } else if (
335
+ (provider === Providers.OPENAI || provider === Providers.AZURE) &&
336
+ reasoning_content != null &&
337
+ typeof reasoning_content !== 'string' &&
338
+ reasoning_content.summary?.[0]?.text != null &&
339
+ reasoning_content.summary[0].text
340
+ ) {
341
+ reasoning_content = 'valid';
342
+ }
343
+ if (
344
+ reasoning_content != null &&
345
+ reasoning_content !== '' &&
346
+ (chunk.content == null ||
347
+ chunk.content === '' ||
348
+ reasoning_content === 'valid')
349
+ ) {
350
+ graph.currentTokenType = ContentTypes.THINK;
351
+ graph.tokenTypeSwitch = 'reasoning';
352
+ return;
353
+ } else if (
354
+ graph.tokenTypeSwitch === 'reasoning' &&
355
+ graph.currentTokenType !== ContentTypes.TEXT &&
356
+ ((chunk.content != null && chunk.content !== '') ||
357
+ (chunk.tool_calls?.length ?? 0) > 0)
358
+ ) {
359
+ graph.currentTokenType = ContentTypes.TEXT;
360
+ graph.tokenTypeSwitch = 'content';
361
+ } else if (
362
+ chunk.content != null &&
363
+ typeof chunk.content === 'string' &&
364
+ chunk.content.includes('<think>') &&
365
+ chunk.content.includes('</think>')
366
+ ) {
367
+ graph.currentTokenType = 'think_and_text';
368
+ graph.tokenTypeSwitch = 'content';
369
+ } else if (
370
+ chunk.content != null &&
371
+ typeof chunk.content === 'string' &&
372
+ chunk.content.includes('<think>')
373
+ ) {
374
+ graph.currentTokenType = ContentTypes.THINK;
375
+ graph.tokenTypeSwitch = 'content';
376
+ } else if (
377
+ graph.lastToken != null &&
378
+ graph.lastToken.includes('</think>')
379
+ ) {
380
+ graph.currentTokenType = ContentTypes.TEXT;
381
+ graph.tokenTypeSwitch = 'content';
382
+ }
383
+ if (typeof chunk.content !== 'string') {
384
+ return;
385
+ }
386
+ graph.lastToken = chunk.content;
387
+ }
388
+ }
389
+
390
+ export function createContentAggregator(): t.ContentAggregatorResult {
391
+ const contentParts: Array<t.MessageContentComplex | undefined> = [];
392
+ const stepMap = new Map<string, t.RunStep>();
393
+ const toolCallIdMap = new Map<string, string>();
394
+
395
+ const updateContent = (
396
+ index: number,
397
+ contentPart?: t.MessageContentComplex,
398
+ finalUpdate = false
399
+ ): void => {
400
+ if (!contentPart) {
401
+ console.warn('No content part found in \'updateContent\'');
402
+ return;
403
+ }
404
+ const partType = contentPart.type ?? '';
405
+ if (!partType) {
406
+ console.warn('No content type found in content part');
407
+ return;
408
+ }
409
+
410
+ if (!contentParts[index]) {
411
+ contentParts[index] = { type: partType };
412
+ }
413
+
414
+ if (!partType.startsWith(contentParts[index]?.type ?? '')) {
415
+ console.warn('Content type mismatch');
416
+ return;
417
+ }
418
+
419
+ if (
420
+ partType.startsWith(ContentTypes.TEXT) &&
421
+ ContentTypes.TEXT in contentPart &&
422
+ typeof contentPart.text === 'string'
423
+ ) {
424
+ // TODO: update this!!
425
+ const currentContent = contentParts[index] as t.MessageDeltaUpdate;
426
+ const update: t.MessageDeltaUpdate = {
427
+ type: ContentTypes.TEXT,
428
+ text: (currentContent.text || '') + contentPart.text,
429
+ };
430
+
431
+ if (contentPart.tool_call_ids) {
432
+ update.tool_call_ids = contentPart.tool_call_ids;
433
+ }
434
+ contentParts[index] = update;
435
+ } else if (
436
+ partType.startsWith(ContentTypes.THINK) &&
437
+ ContentTypes.THINK in contentPart &&
438
+ typeof contentPart.think === 'string'
439
+ ) {
440
+ const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;
441
+ const update: t.ReasoningDeltaUpdate = {
442
+ type: ContentTypes.THINK,
443
+ think: (currentContent.think || '') + contentPart.think,
444
+ };
445
+ contentParts[index] = update;
446
+ } else if (
447
+ partType.startsWith(ContentTypes.AGENT_UPDATE) &&
448
+ ContentTypes.AGENT_UPDATE in contentPart &&
449
+ contentPart.agent_update != null
450
+ ) {
451
+ const update: t.AgentUpdate = {
452
+ type: ContentTypes.AGENT_UPDATE,
453
+ agent_update: contentPart.agent_update,
454
+ };
455
+
456
+ contentParts[index] = update;
457
+ } else if (
458
+ partType === ContentTypes.IMAGE_URL &&
459
+ 'image_url' in contentPart
460
+ ) {
461
+ const currentContent = contentParts[index] as {
462
+ type: 'image_url';
463
+ image_url: string;
464
+ };
465
+ contentParts[index] = {
466
+ ...currentContent,
467
+ };
468
+ } else if (
469
+ partType === ContentTypes.TOOL_CALL &&
470
+ 'tool_call' in contentPart
471
+ ) {
472
+ const existingContent = contentParts[index] as
473
+ | (Omit<t.ToolCallContent, 'tool_call'> & {
474
+ tool_call?: t.ToolCallPart;
475
+ })
476
+ | undefined;
477
+
478
+ const toolCallArgs = (contentPart.tool_call as t.ToolCallPart).args;
479
+ /** When args are a valid object, they are likely already invoked */
480
+ let args =
481
+ finalUpdate ||
482
+ typeof existingContent?.tool_call?.args === 'object' ||
483
+ typeof toolCallArgs === 'object'
484
+ ? contentPart.tool_call.args
485
+ : (existingContent?.tool_call?.args ?? '') + (toolCallArgs ?? '');
486
+ if (
487
+ finalUpdate &&
488
+ args == null &&
489
+ existingContent?.tool_call?.args != null
490
+ ) {
491
+ args = existingContent.tool_call.args;
492
+ }
493
+
494
+ const id =
495
+ getNonEmptyValue([
496
+ contentPart.tool_call.id,
497
+ existingContent?.tool_call?.id,
498
+ ]) ?? '';
499
+ const name =
500
+ getNonEmptyValue([
501
+ contentPart.tool_call.name,
502
+ existingContent?.tool_call?.name,
503
+ ]) ?? '';
504
+
505
+ const newToolCall: ToolCall & t.PartMetadata = {
506
+ id,
507
+ name,
508
+ args,
509
+ type: ToolCallTypes.TOOL_CALL,
510
+ };
511
+
512
+ if (finalUpdate) {
513
+ newToolCall.progress = 1;
514
+ newToolCall.output = contentPart.tool_call.output;
515
+ }
516
+
517
+ contentParts[index] = {
518
+ type: ContentTypes.TOOL_CALL,
519
+ tool_call: newToolCall,
520
+ };
521
+ }
522
+ };
523
+
524
+ const aggregateContent = ({
525
+ event,
526
+ data,
527
+ }: {
528
+ event: GraphEvents;
529
+ data:
530
+ | t.RunStep
531
+ | t.AgentUpdate
532
+ | t.MessageDeltaEvent
533
+ | t.RunStepDeltaEvent
534
+ | { result: t.ToolEndEvent };
535
+ }): void => {
536
+ if (event === GraphEvents.ON_RUN_STEP) {
537
+ const runStep = data as t.RunStep;
538
+ stepMap.set(runStep.id, runStep);
539
+
540
+ // Store tool call IDs if present
541
+ if (
542
+ runStep.stepDetails.type === StepTypes.TOOL_CALLS &&
543
+ runStep.stepDetails.tool_calls
544
+ ) {
545
+ (runStep.stepDetails.tool_calls as ToolCall[]).forEach((toolCall) => {
546
+ const toolCallId = toolCall.id ?? '';
547
+ if ('id' in toolCall && toolCallId) {
548
+ toolCallIdMap.set(runStep.id, toolCallId);
549
+ }
550
+ const contentPart: t.MessageContentComplex = {
551
+ type: ContentTypes.TOOL_CALL,
552
+ tool_call: {
553
+ args: toolCall.args,
554
+ name: toolCall.name,
555
+ id: toolCallId,
556
+ },
557
+ };
558
+
559
+ updateContent(runStep.index, contentPart);
560
+ });
561
+ }
562
+ } else if (event === GraphEvents.ON_MESSAGE_DELTA) {
563
+ const messageDelta = data as t.MessageDeltaEvent;
564
+ const runStep = stepMap.get(messageDelta.id);
565
+ if (!runStep) {
566
+ console.warn('No run step or runId found for message delta event');
567
+ return;
568
+ }
569
+
570
+ if (messageDelta.delta.content) {
571
+ const contentPart = Array.isArray(messageDelta.delta.content)
572
+ ? messageDelta.delta.content[0]
573
+ : messageDelta.delta.content;
574
+
575
+ updateContent(runStep.index, contentPart);
576
+ }
577
+ } else if (
578
+ event === GraphEvents.ON_AGENT_UPDATE &&
579
+ (data as t.AgentUpdate | undefined)?.agent_update
580
+ ) {
581
+ const contentPart = data as t.AgentUpdate | undefined;
582
+ if (!contentPart) {
583
+ return;
584
+ }
585
+ updateContent(contentPart.agent_update.index, contentPart);
586
+ } else if (event === GraphEvents.ON_REASONING_DELTA) {
587
+ const reasoningDelta = data as t.ReasoningDeltaEvent;
588
+ const runStep = stepMap.get(reasoningDelta.id);
589
+ if (!runStep) {
590
+ console.warn('No run step or runId found for reasoning delta event');
591
+ return;
592
+ }
593
+
594
+ if (reasoningDelta.delta.content) {
595
+ const contentPart = Array.isArray(reasoningDelta.delta.content)
596
+ ? reasoningDelta.delta.content[0]
597
+ : reasoningDelta.delta.content;
598
+
599
+ updateContent(runStep.index, contentPart);
600
+ }
601
+ } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {
602
+ const runStepDelta = data as t.RunStepDeltaEvent;
603
+ const runStep = stepMap.get(runStepDelta.id);
604
+ if (!runStep) {
605
+ console.warn('No run step or runId found for run step delta event');
606
+ return;
607
+ }
608
+
609
+ if (
610
+ runStepDelta.delta.type === StepTypes.TOOL_CALLS &&
611
+ runStepDelta.delta.tool_calls
612
+ ) {
613
+ runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {
614
+ const toolCallId = toolCallIdMap.get(runStepDelta.id);
615
+
616
+ const contentPart: t.MessageContentComplex = {
617
+ type: ContentTypes.TOOL_CALL,
618
+ tool_call: {
619
+ args: toolCallDelta.args ?? '',
620
+ name: toolCallDelta.name,
621
+ id: toolCallId,
622
+ },
623
+ };
624
+
625
+ updateContent(runStep.index, contentPart);
626
+ });
627
+ }
628
+ } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {
629
+ const { result } = data as unknown as { result: t.ToolEndEvent };
630
+
631
+ const { id: stepId } = result;
632
+
633
+ const runStep = stepMap.get(stepId);
634
+ if (!runStep) {
635
+ console.warn(
636
+ 'No run step or runId found for completed tool call event'
637
+ );
638
+ return;
639
+ }
640
+
641
+ const contentPart: t.MessageContentComplex = {
642
+ type: ContentTypes.TOOL_CALL,
643
+ tool_call: result.tool_call,
644
+ };
645
+
646
+ updateContent(runStep.index, contentPart, true);
647
+ }
648
+ };
649
+
650
+ return { contentParts, aggregateContent, stepMap };
651
+ }