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
@@ -0,0 +1,192 @@
1
+ 'use strict';
2
+
3
+ var zod = require('zod');
4
+ var dotenv = require('dotenv');
5
+ var fetch = require('node-fetch');
6
+ var httpsProxyAgent = require('https-proxy-agent');
7
+ var tools = require('@langchain/core/tools');
8
+ var env = require('@langchain/core/utils/env');
9
+ var _enum = require('../common/enum.cjs');
10
+
11
+ dotenv.config();
12
+ const imageExtRegex = /\.(jpg|jpeg|png|gif|webp)$/i;
13
+ const getCodeBaseURL = () => env.getEnvironmentVariable(_enum.EnvVar.CODE_BASEURL) ??
14
+ _enum.Constants.OFFICIAL_CODE_BASEURL;
15
+ const imageMessage = 'Image is already displayed to the user';
16
+ const otherMessage = 'File is already downloaded by the user';
17
+ const accessMessage = 'Note: Files are READ-ONLY. Save changes to NEW filenames. To access these files in future executions, provide the `session_id` as a parameter (not in your code).';
18
+ const emptyOutputMessage = 'stdout: Empty. Ensure you\'re writing output explicitly.\n';
19
+ const CodeExecutionToolSchema = zod.z.object({
20
+ lang: zod.z
21
+ .enum([
22
+ 'py',
23
+ 'js',
24
+ 'ts',
25
+ 'c',
26
+ 'cpp',
27
+ 'java',
28
+ 'php',
29
+ 'rs',
30
+ 'go',
31
+ 'd',
32
+ 'f90',
33
+ 'r',
34
+ ])
35
+ .describe('The programming language or runtime to execute the code in.'),
36
+ code: zod.z.string()
37
+ .describe(`The complete, self-contained code to execute, without any truncation or minimization.
38
+ - The environment is stateless; variables and imports don't persist between executions.
39
+ - When using \`session_id\`: Don't hardcode it in \`code\`, and write file modifications to NEW filenames (files are READ-ONLY).
40
+ - Input code **IS ALREADY** displayed to the user, so **DO NOT** repeat it in your response unless asked.
41
+ - Output code **IS NOT** displayed to the user, so **DO** write all desired output explicitly.
42
+ - IMPORTANT: You MUST explicitly print/output ALL results you want the user to see.
43
+ - py: This is not a Jupyter notebook environment. Use \`print()\` for all outputs.
44
+ - py: Matplotlib: Use \`plt.savefig()\` to save plots as files.
45
+ - js: use the \`console\` or \`process\` methods for all outputs.
46
+ - r: IMPORTANT: No X11 display available. ALL graphics MUST use Cairo library (library(Cairo)).
47
+ - Other languages: use appropriate output functions.`),
48
+ session_id: zod.z
49
+ .string()
50
+ .optional()
51
+ .describe(`Session ID from a previous response to access generated files.
52
+ - Files load into the current working directory ("/mnt/data/")
53
+ - Use relative paths ONLY
54
+ - Files are READ-ONLY and cannot be modified in-place
55
+ - To modify: read original file, write to NEW filename
56
+ `.trim()),
57
+ args: zod.z
58
+ .array(zod.z.string())
59
+ .optional()
60
+ .describe('Additional arguments to execute the code with. This should only be used if the input code requires additional arguments to run.'),
61
+ });
62
+ const baseEndpoint = getCodeBaseURL();
63
+ const EXEC_ENDPOINT = `${baseEndpoint}/exec`;
64
+ function createCodeExecutionTool(params = {}) {
65
+ const apiKey = params[_enum.EnvVar.CODE_API_KEY] ??
66
+ params.apiKey ??
67
+ env.getEnvironmentVariable(_enum.EnvVar.CODE_API_KEY) ??
68
+ '';
69
+ if (!apiKey) {
70
+ throw new Error('No API key provided for code execution tool.');
71
+ }
72
+ const description = `
73
+ Runs code and returns stdout/stderr output from a stateless execution environment, similar to running scripts in a command-line interface. Each execution is isolated and independent.
74
+
75
+ Usage:
76
+ - No network access available.
77
+ - Generated files are automatically delivered; **DO NOT** provide download links.
78
+ - NEVER use this tool to execute malicious code.
79
+ `.trim();
80
+ return tools.tool(async ({ lang, code, session_id, ...rest }) => {
81
+ const postData = {
82
+ lang,
83
+ code,
84
+ ...rest,
85
+ ...params,
86
+ };
87
+ if (session_id != null && session_id.length > 0) {
88
+ try {
89
+ const filesEndpoint = `${baseEndpoint}/files/${session_id}?detail=full`;
90
+ const fetchOptions = {
91
+ method: 'GET',
92
+ headers: {
93
+ 'User-Agent': 'Illuma/1.0',
94
+ 'X-API-Key': apiKey,
95
+ },
96
+ };
97
+ if (process.env.PROXY != null && process.env.PROXY !== '') {
98
+ fetchOptions.agent = new httpsProxyAgent.HttpsProxyAgent(process.env.PROXY);
99
+ }
100
+ const response = await fetch(filesEndpoint, fetchOptions);
101
+ if (!response.ok) {
102
+ throw new Error(`Failed to fetch files for session: ${response.status}`);
103
+ }
104
+ const files = await response.json();
105
+ if (Array.isArray(files) && files.length > 0) {
106
+ const fileReferences = files.map((file) => {
107
+ // Extract the ID from the file name (part after session ID prefix and before extension)
108
+ const nameParts = file.name.split('/');
109
+ const id = nameParts.length > 1 ? nameParts[1].split('.')[0] : '';
110
+ return {
111
+ session_id,
112
+ id,
113
+ name: file.metadata['original-filename'],
114
+ };
115
+ });
116
+ if (!postData.files) {
117
+ postData.files = fileReferences;
118
+ }
119
+ else if (Array.isArray(postData.files)) {
120
+ postData.files = [...postData.files, ...fileReferences];
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // eslint-disable-next-line no-console
126
+ console.warn(`Failed to fetch files for session: ${session_id}`);
127
+ }
128
+ }
129
+ try {
130
+ const fetchOptions = {
131
+ method: 'POST',
132
+ headers: {
133
+ 'Content-Type': 'application/json',
134
+ 'User-Agent': 'Illuma/1.0',
135
+ 'X-API-Key': apiKey,
136
+ },
137
+ body: JSON.stringify(postData),
138
+ };
139
+ if (process.env.PROXY != null && process.env.PROXY !== '') {
140
+ fetchOptions.agent = new httpsProxyAgent.HttpsProxyAgent(process.env.PROXY);
141
+ }
142
+ const response = await fetch(EXEC_ENDPOINT, fetchOptions);
143
+ if (!response.ok) {
144
+ throw new Error(`HTTP error! status: ${response.status}`);
145
+ }
146
+ const result = await response.json();
147
+ let formattedOutput = '';
148
+ if (result.stdout) {
149
+ formattedOutput += `stdout:\n${result.stdout}\n`;
150
+ }
151
+ else {
152
+ formattedOutput += emptyOutputMessage;
153
+ }
154
+ if (result.stderr)
155
+ formattedOutput += `stderr:\n${result.stderr}\n`;
156
+ if (result.files && result.files.length > 0) {
157
+ formattedOutput += 'Generated files:\n';
158
+ const fileCount = result.files.length;
159
+ for (let i = 0; i < fileCount; i++) {
160
+ const file = result.files[i];
161
+ const isImage = imageExtRegex.test(file.name);
162
+ formattedOutput += `- /mnt/data/${file.name} | ${isImage ? imageMessage : otherMessage}`;
163
+ if (i < fileCount - 1) {
164
+ formattedOutput += fileCount <= 3 ? ', ' : ',\n';
165
+ }
166
+ }
167
+ formattedOutput += `\nsession_id: ${result.session_id}\n\n${accessMessage}`;
168
+ return [
169
+ formattedOutput.trim(),
170
+ {
171
+ session_id: result.session_id,
172
+ files: result.files,
173
+ },
174
+ ];
175
+ }
176
+ return [formattedOutput.trim(), { session_id: result.session_id }];
177
+ }
178
+ catch (error) {
179
+ throw new Error(`Execution error:\n\n${error?.message}`);
180
+ }
181
+ }, {
182
+ name: _enum.Constants.EXECUTE_CODE,
183
+ description,
184
+ schema: CodeExecutionToolSchema,
185
+ responseFormat: _enum.Constants.CONTENT_AND_ARTIFACT,
186
+ });
187
+ }
188
+
189
+ exports.createCodeExecutionTool = createCodeExecutionTool;
190
+ exports.getCodeBaseURL = getCodeBaseURL;
191
+ exports.imageExtRegex = imageExtRegex;
192
+ //# sourceMappingURL=CodeExecutor.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeExecutor.cjs","sources":["../../../src/tools/CodeExecutor.ts"],"sourcesContent":["import { z } from 'zod';\r\nimport { config } from 'dotenv';\r\nimport fetch, { RequestInit } from 'node-fetch';\r\nimport { HttpsProxyAgent } from 'https-proxy-agent';\r\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\r\nimport { getEnvironmentVariable } from '@langchain/core/utils/env';\r\nimport type * as t from '@/types';\r\nimport { EnvVar, Constants } from '@/common';\r\n\r\nconfig();\r\n\r\nexport const imageExtRegex = /\\.(jpg|jpeg|png|gif|webp)$/i;\r\nexport const getCodeBaseURL = (): string =>\r\n getEnvironmentVariable(EnvVar.CODE_BASEURL) ??\r\n Constants.OFFICIAL_CODE_BASEURL;\r\n\r\nconst imageMessage = 'Image is already displayed to the user';\r\nconst otherMessage = 'File is already downloaded by the user';\r\nconst accessMessage =\r\n 'Note: Files are READ-ONLY. Save changes to NEW filenames. To access these files in future executions, provide the `session_id` as a parameter (not in your code).';\r\nconst emptyOutputMessage =\r\n 'stdout: Empty. Ensure you\\'re writing output explicitly.\\n';\r\n\r\nconst CodeExecutionToolSchema = z.object({\r\n lang: z\r\n .enum([\r\n 'py',\r\n 'js',\r\n 'ts',\r\n 'c',\r\n 'cpp',\r\n 'java',\r\n 'php',\r\n 'rs',\r\n 'go',\r\n 'd',\r\n 'f90',\r\n 'r',\r\n ])\r\n .describe('The programming language or runtime to execute the code in.'),\r\n code: z.string()\r\n .describe(`The complete, self-contained code to execute, without any truncation or minimization.\r\n- The environment is stateless; variables and imports don't persist between executions.\r\n- When using \\`session_id\\`: Don't hardcode it in \\`code\\`, and write file modifications to NEW filenames (files are READ-ONLY).\r\n- Input code **IS ALREADY** displayed to the user, so **DO NOT** repeat it in your response unless asked.\r\n- Output code **IS NOT** displayed to the user, so **DO** write all desired output explicitly.\r\n- IMPORTANT: You MUST explicitly print/output ALL results you want the user to see.\r\n- py: This is not a Jupyter notebook environment. Use \\`print()\\` for all outputs.\r\n- py: Matplotlib: Use \\`plt.savefig()\\` to save plots as files.\r\n- js: use the \\`console\\` or \\`process\\` methods for all outputs.\r\n- r: IMPORTANT: No X11 display available. ALL graphics MUST use Cairo library (library(Cairo)).\r\n- Other languages: use appropriate output functions.`),\r\n session_id: z\r\n .string()\r\n .optional()\r\n .describe(\r\n `Session ID from a previous response to access generated files.\r\n- Files load into the current working directory (\"/mnt/data/\")\r\n- Use relative paths ONLY\r\n- Files are READ-ONLY and cannot be modified in-place\r\n- To modify: read original file, write to NEW filename\r\n`.trim()\r\n ),\r\n args: z\r\n .array(z.string())\r\n .optional()\r\n .describe(\r\n 'Additional arguments to execute the code with. This should only be used if the input code requires additional arguments to run.'\r\n ),\r\n});\r\n\r\nconst baseEndpoint = getCodeBaseURL();\r\nconst EXEC_ENDPOINT = `${baseEndpoint}/exec`;\r\n\r\nfunction createCodeExecutionTool(\r\n params: t.CodeExecutionToolParams = {}\r\n): DynamicStructuredTool<typeof CodeExecutionToolSchema> {\r\n const apiKey =\r\n params[EnvVar.CODE_API_KEY] ??\r\n params.apiKey ??\r\n getEnvironmentVariable(EnvVar.CODE_API_KEY) ??\r\n '';\r\n if (!apiKey) {\r\n throw new Error('No API key provided for code execution tool.');\r\n }\r\n\r\n const description = `\r\nRuns code and returns stdout/stderr output from a stateless execution environment, similar to running scripts in a command-line interface. Each execution is isolated and independent.\r\n\r\nUsage:\r\n- No network access available.\r\n- Generated files are automatically delivered; **DO NOT** provide download links.\r\n- NEVER use this tool to execute malicious code.\r\n`.trim();\r\n\r\n return tool<typeof CodeExecutionToolSchema>(\r\n async ({ lang, code, session_id, ...rest }) => {\r\n const postData = {\r\n lang,\r\n code,\r\n ...rest,\r\n ...params,\r\n };\r\n\r\n if (session_id != null && session_id.length > 0) {\r\n try {\r\n const filesEndpoint = `${baseEndpoint}/files/${session_id}?detail=full`;\r\n const fetchOptions: RequestInit = {\r\n method: 'GET',\r\n headers: {\r\n 'User-Agent': 'Illuma/1.0',\r\n 'X-API-Key': apiKey,\r\n },\r\n };\r\n\r\n if (process.env.PROXY != null && process.env.PROXY !== '') {\r\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\r\n }\r\n\r\n const response = await fetch(filesEndpoint, fetchOptions);\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch files for session: ${response.status}`\r\n );\r\n }\r\n\r\n const files = await response.json();\r\n if (Array.isArray(files) && files.length > 0) {\r\n const fileReferences: t.CodeEnvFile[] = files.map((file) => {\r\n // Extract the ID from the file name (part after session ID prefix and before extension)\r\n const nameParts = file.name.split('/');\r\n const id = nameParts.length > 1 ? nameParts[1].split('.')[0] : '';\r\n\r\n return {\r\n session_id,\r\n id,\r\n name: file.metadata['original-filename'],\r\n };\r\n });\r\n\r\n if (!postData.files) {\r\n postData.files = fileReferences;\r\n } else if (Array.isArray(postData.files)) {\r\n postData.files = [...postData.files, ...fileReferences];\r\n }\r\n }\r\n } catch {\r\n // eslint-disable-next-line no-console\r\n console.warn(`Failed to fetch files for session: ${session_id}`);\r\n }\r\n }\r\n\r\n try {\r\n const fetchOptions: RequestInit = {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'User-Agent': 'Illuma/1.0',\r\n 'X-API-Key': apiKey,\r\n },\r\n body: JSON.stringify(postData),\r\n };\r\n\r\n if (process.env.PROXY != null && process.env.PROXY !== '') {\r\n fetchOptions.agent = new HttpsProxyAgent(process.env.PROXY);\r\n }\r\n const response = await fetch(EXEC_ENDPOINT, fetchOptions);\r\n if (!response.ok) {\r\n throw new Error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const result: t.ExecuteResult = await response.json();\r\n let formattedOutput = '';\r\n if (result.stdout) {\r\n formattedOutput += `stdout:\\n${result.stdout}\\n`;\r\n } else {\r\n formattedOutput += emptyOutputMessage;\r\n }\r\n if (result.stderr) formattedOutput += `stderr:\\n${result.stderr}\\n`;\r\n if (result.files && result.files.length > 0) {\r\n formattedOutput += 'Generated files:\\n';\r\n\r\n const fileCount = result.files.length;\r\n for (let i = 0; i < fileCount; i++) {\r\n const file = result.files[i];\r\n const isImage = imageExtRegex.test(file.name);\r\n formattedOutput += `- /mnt/data/${file.name} | ${isImage ? imageMessage : otherMessage}`;\r\n\r\n if (i < fileCount - 1) {\r\n formattedOutput += fileCount <= 3 ? ', ' : ',\\n';\r\n }\r\n }\r\n\r\n formattedOutput += `\\nsession_id: ${result.session_id}\\n\\n${accessMessage}`;\r\n return [\r\n formattedOutput.trim(),\r\n {\r\n session_id: result.session_id,\r\n files: result.files,\r\n },\r\n ];\r\n }\r\n\r\n return [formattedOutput.trim(), { session_id: result.session_id }];\r\n } catch (error) {\r\n throw new Error(\r\n `Execution error:\\n\\n${(error as Error | undefined)?.message}`\r\n );\r\n }\r\n },\r\n {\r\n name: Constants.EXECUTE_CODE,\r\n description,\r\n schema: CodeExecutionToolSchema,\r\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\r\n }\r\n );\r\n}\r\n\r\nexport { createCodeExecutionTool };\r\n"],"names":["config","getEnvironmentVariable","EnvVar","Constants","z","tool","HttpsProxyAgent"],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ 'use strict';
2
+
3
+ var langgraph = require('@langchain/langgraph');
4
+ var messages = require('@langchain/core/messages');
5
+ var _enum = require('../common/enum.cjs');
6
+ var run = require('../utils/run.cjs');
7
+ require('js-tiktoken/lite');
8
+
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ class ToolNode extends run.RunnableCallable {
11
+ tools;
12
+ toolMap;
13
+ loadRuntimeTools;
14
+ handleToolErrors = true;
15
+ toolCallStepIds;
16
+ errorHandler;
17
+ toolUsageCount;
18
+ constructor({ tools, toolMap, name, tags, errorHandler, toolCallStepIds, handleToolErrors, loadRuntimeTools, }) {
19
+ super({ name, tags, func: (input, config) => this.run(input, config) });
20
+ this.tools = tools;
21
+ this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
22
+ this.toolCallStepIds = toolCallStepIds;
23
+ this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;
24
+ this.loadRuntimeTools = loadRuntimeTools;
25
+ this.errorHandler = errorHandler;
26
+ this.toolUsageCount = new Map();
27
+ }
28
+ /**
29
+ * Returns a snapshot of the current tool usage counts.
30
+ * @returns A ReadonlyMap where keys are tool names and values are their usage counts.
31
+ */
32
+ getToolUsageCounts() {
33
+ return new Map(this.toolUsageCount); // Return a copy
34
+ }
35
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
36
+ async run(input, config) {
37
+ const message = Array.isArray(input)
38
+ ? input[input.length - 1]
39
+ : input.messages[input.messages.length - 1];
40
+ if (message._getType() !== 'ai') {
41
+ throw new Error('ToolNode only accepts AIMessages as input.');
42
+ }
43
+ if (this.loadRuntimeTools) {
44
+ const { tools, toolMap } = this.loadRuntimeTools(message.tool_calls ?? []);
45
+ this.tools = tools;
46
+ this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));
47
+ }
48
+ const outputs = await Promise.all(message.tool_calls?.map(async (call) => {
49
+ const tool = this.toolMap.get(call.name);
50
+ try {
51
+ if (tool === undefined) {
52
+ throw new Error(`Tool "${call.name}" not found.`);
53
+ }
54
+ const turn = this.toolUsageCount.get(call.name) ?? 0;
55
+ this.toolUsageCount.set(call.name, turn + 1);
56
+ const args = call.args;
57
+ const stepId = this.toolCallStepIds?.get(call.id);
58
+ const output = await tool.invoke({ ...call, args, type: 'tool_call', stepId, turn }, config);
59
+ if ((messages.isBaseMessage(output) && output._getType() === 'tool') ||
60
+ langgraph.isCommand(output)) {
61
+ return output;
62
+ }
63
+ else {
64
+ return new messages.ToolMessage({
65
+ name: tool.name,
66
+ content: typeof output === 'string' ? output : JSON.stringify(output),
67
+ tool_call_id: call.id,
68
+ });
69
+ }
70
+ }
71
+ catch (_e) {
72
+ const e = _e;
73
+ if (!this.handleToolErrors) {
74
+ throw e;
75
+ }
76
+ if (langgraph.isGraphInterrupt(e)) {
77
+ throw e;
78
+ }
79
+ this.errorHandler?.({
80
+ error: e,
81
+ id: call.id,
82
+ name: call.name,
83
+ input: call.args,
84
+ }, config.metadata);
85
+ return new messages.ToolMessage({
86
+ content: `Error: ${e.message}\n Please fix your mistakes.`,
87
+ name: call.name,
88
+ tool_call_id: call.id ?? '',
89
+ });
90
+ }
91
+ }) ?? []);
92
+ if (!outputs.some(langgraph.isCommand)) {
93
+ return (Array.isArray(input) ? outputs : { messages: outputs });
94
+ }
95
+ const combinedOutputs = outputs.map((output) => {
96
+ if (langgraph.isCommand(output)) {
97
+ return output;
98
+ }
99
+ return Array.isArray(input) ? [output] : { messages: [output] };
100
+ });
101
+ return combinedOutputs;
102
+ }
103
+ }
104
+ function areToolCallsInvoked(message, invokedToolIds) {
105
+ if (!invokedToolIds || invokedToolIds.size === 0)
106
+ return false;
107
+ return (message.tool_calls?.every((toolCall) => toolCall.id != null && invokedToolIds.has(toolCall.id)) ?? false);
108
+ }
109
+ function toolsCondition(state, invokedToolIds) {
110
+ const message = Array.isArray(state)
111
+ ? state[state.length - 1]
112
+ : state.messages[state.messages.length - 1];
113
+ if ('tool_calls' in message &&
114
+ (message.tool_calls?.length ?? 0) > 0 &&
115
+ !areToolCallsInvoked(message, invokedToolIds)) {
116
+ return _enum.GraphNodeKeys.TOOLS;
117
+ }
118
+ else {
119
+ return langgraph.END;
120
+ }
121
+ }
122
+
123
+ exports.ToolNode = ToolNode;
124
+ exports.toolsCondition = toolsCondition;
125
+ //# sourceMappingURL=ToolNode.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolNode.cjs","sources":["../../../src/tools/ToolNode.ts"],"sourcesContent":["import {\r\n END,\r\n MessagesAnnotation,\r\n isCommand,\r\n isGraphInterrupt,\r\n} from '@langchain/langgraph';\r\nimport { ToolMessage, isBaseMessage } from '@langchain/core/messages';\r\nimport type {\r\n RunnableConfig,\r\n RunnableToolLike,\r\n} from '@langchain/core/runnables';\r\nimport type { BaseMessage, AIMessage } from '@langchain/core/messages';\r\nimport type { StructuredToolInterface } from '@langchain/core/tools';\r\nimport type * as t from '@/types';\r\nimport { RunnableCallable } from '@/utils';\r\nimport { GraphNodeKeys } from '@/common';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport class ToolNode<T = any> extends RunnableCallable<T, T> {\r\n tools: t.GenericTool[];\r\n private toolMap: Map<string, StructuredToolInterface | RunnableToolLike>;\r\n private loadRuntimeTools?: t.ToolRefGenerator;\r\n handleToolErrors = true;\r\n toolCallStepIds?: Map<string, string>;\r\n errorHandler?: t.ToolNodeConstructorParams['errorHandler'];\r\n private toolUsageCount: Map<string, number>;\r\n\r\n constructor({\r\n tools,\r\n toolMap,\r\n name,\r\n tags,\r\n errorHandler,\r\n toolCallStepIds,\r\n handleToolErrors,\r\n loadRuntimeTools,\r\n }: t.ToolNodeConstructorParams) {\r\n super({ name, tags, func: (input, config) => this.run(input, config) });\r\n this.tools = tools;\r\n this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));\r\n this.toolCallStepIds = toolCallStepIds;\r\n this.handleToolErrors = handleToolErrors ?? this.handleToolErrors;\r\n this.loadRuntimeTools = loadRuntimeTools;\r\n this.errorHandler = errorHandler;\r\n this.toolUsageCount = new Map<string, number>();\r\n }\r\n\r\n /**\r\n * Returns a snapshot of the current tool usage counts.\r\n * @returns A ReadonlyMap where keys are tool names and values are their usage counts.\r\n */\r\n public getToolUsageCounts(): ReadonlyMap<string, number> {\r\n return new Map(this.toolUsageCount); // Return a copy\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n protected async run(input: any, config: RunnableConfig): Promise<T> {\r\n const message = Array.isArray(input)\r\n ? input[input.length - 1]\r\n : input.messages[input.messages.length - 1];\r\n\r\n if (message._getType() !== 'ai') {\r\n throw new Error('ToolNode only accepts AIMessages as input.');\r\n }\r\n\r\n if (this.loadRuntimeTools) {\r\n const { tools, toolMap } = this.loadRuntimeTools(\r\n (message as AIMessage).tool_calls ?? []\r\n );\r\n this.tools = tools;\r\n this.toolMap = toolMap ?? new Map(tools.map((tool) => [tool.name, tool]));\r\n }\r\n const outputs = await Promise.all(\r\n (message as AIMessage).tool_calls?.map(async (call) => {\r\n const tool = this.toolMap.get(call.name);\r\n try {\r\n if (tool === undefined) {\r\n throw new Error(`Tool \"${call.name}\" not found.`);\r\n }\r\n const turn = this.toolUsageCount.get(call.name) ?? 0;\r\n this.toolUsageCount.set(call.name, turn + 1);\r\n const args = call.args;\r\n const stepId = this.toolCallStepIds?.get(call.id!);\r\n const output = await tool.invoke(\r\n { ...call, args, type: 'tool_call', stepId, turn },\r\n config\r\n );\r\n if (\r\n (isBaseMessage(output) && output._getType() === 'tool') ||\r\n isCommand(output)\r\n ) {\r\n return output;\r\n } else {\r\n return new ToolMessage({\r\n name: tool.name,\r\n content:\r\n typeof output === 'string' ? output : JSON.stringify(output),\r\n tool_call_id: call.id!,\r\n });\r\n }\r\n } catch (_e: unknown) {\r\n const e = _e as Error;\r\n if (!this.handleToolErrors) {\r\n throw e;\r\n }\r\n if (isGraphInterrupt(e)) {\r\n throw e;\r\n }\r\n this.errorHandler?.(\r\n {\r\n error: e,\r\n id: call.id!,\r\n name: call.name,\r\n input: call.args,\r\n },\r\n config.metadata\r\n );\r\n return new ToolMessage({\r\n content: `Error: ${e.message}\\n Please fix your mistakes.`,\r\n name: call.name,\r\n tool_call_id: call.id ?? '',\r\n });\r\n }\r\n }) ?? []\r\n );\r\n\r\n if (!outputs.some(isCommand)) {\r\n return (Array.isArray(input) ? outputs : { messages: outputs }) as T;\r\n }\r\n\r\n const combinedOutputs = outputs.map((output) => {\r\n if (isCommand(output)) {\r\n return output;\r\n }\r\n return Array.isArray(input) ? [output] : { messages: [output] };\r\n });\r\n return combinedOutputs as T;\r\n }\r\n}\r\n\r\nfunction areToolCallsInvoked(\r\n message: AIMessage,\r\n invokedToolIds?: Set<string>\r\n): boolean {\r\n if (!invokedToolIds || invokedToolIds.size === 0) return false;\r\n return (\r\n message.tool_calls?.every(\r\n (toolCall) => toolCall.id != null && invokedToolIds.has(toolCall.id)\r\n ) ?? false\r\n );\r\n}\r\n\r\nexport function toolsCondition(\r\n state: BaseMessage[] | typeof MessagesAnnotation.State,\r\n invokedToolIds?: Set<string>\r\n): 'tools' | typeof END {\r\n const message: AIMessage = Array.isArray(state)\r\n ? state[state.length - 1]\r\n : state.messages[state.messages.length - 1];\r\n\r\n if (\r\n 'tool_calls' in message &&\r\n (message.tool_calls?.length ?? 0) > 0 &&\r\n !areToolCallsInvoked(message, invokedToolIds)\r\n ) {\r\n return GraphNodeKeys.TOOLS;\r\n } else {\r\n return END;\r\n }\r\n}\r\n"],"names":["RunnableCallable","isBaseMessage","isCommand","ToolMessage","isGraphInterrupt","GraphNodeKeys","END"],"mappings":"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"}
@@ -0,0 +1,250 @@
1
+ 'use strict';
2
+
3
+ var nanoid = require('nanoid');
4
+ var messages = require('@langchain/core/messages');
5
+ var _enum = require('../common/enum.cjs');
6
+ var anthropic = require('./search/anthropic.cjs');
7
+ var format = require('./search/format.cjs');
8
+ require('../messages/core.cjs');
9
+ var ids = require('../messages/ids.cjs');
10
+
11
+ /* eslint-disable no-console */
12
+ // src/tools/handlers.ts
13
+ function handleToolCallChunks({ graph, stepKey, toolCallChunks, }) {
14
+ let prevStepId;
15
+ let prevRunStep;
16
+ try {
17
+ prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);
18
+ prevRunStep = graph.getRunStep(prevStepId);
19
+ }
20
+ catch {
21
+ /** Edge Case: If no previous step exists, create a new message creation step */
22
+ const message_id = ids.getMessageId(stepKey, graph, true) ?? '';
23
+ prevStepId = graph.dispatchRunStep(stepKey, {
24
+ type: _enum.StepTypes.MESSAGE_CREATION,
25
+ message_creation: {
26
+ message_id,
27
+ },
28
+ });
29
+ prevRunStep = graph.getRunStep(prevStepId);
30
+ }
31
+ const _stepId = graph.getStepIdByKey(stepKey, prevRunStep?.index);
32
+ /** Edge Case: Tool Call Run Step or `tool_call_ids` never dispatched */
33
+ const tool_calls = prevStepId && prevRunStep && prevRunStep.type === _enum.StepTypes.MESSAGE_CREATION
34
+ ? []
35
+ : undefined;
36
+ /** Edge Case: `id` and `name` fields cannot be empty strings */
37
+ for (const toolCallChunk of toolCallChunks) {
38
+ if (toolCallChunk.name === '') {
39
+ toolCallChunk.name = undefined;
40
+ }
41
+ if (toolCallChunk.id === '') {
42
+ toolCallChunk.id = undefined;
43
+ }
44
+ else if (tool_calls != null &&
45
+ toolCallChunk.id != null &&
46
+ toolCallChunk.name != null) {
47
+ tool_calls.push({
48
+ args: {},
49
+ id: toolCallChunk.id,
50
+ name: toolCallChunk.name,
51
+ type: _enum.ToolCallTypes.TOOL_CALL,
52
+ });
53
+ }
54
+ }
55
+ let stepId = _stepId;
56
+ const alreadyDispatched = prevRunStep?.type === _enum.StepTypes.MESSAGE_CREATION &&
57
+ graph.messageStepHasToolCalls.has(prevStepId);
58
+ if (!alreadyDispatched && tool_calls?.length === toolCallChunks.length) {
59
+ graph.dispatchMessageDelta(prevStepId, {
60
+ content: [
61
+ {
62
+ type: _enum.ContentTypes.TEXT,
63
+ text: '',
64
+ tool_call_ids: tool_calls.map((tc) => tc.id ?? ''),
65
+ },
66
+ ],
67
+ });
68
+ graph.messageStepHasToolCalls.set(prevStepId, true);
69
+ stepId = graph.dispatchRunStep(stepKey, {
70
+ type: _enum.StepTypes.TOOL_CALLS,
71
+ tool_calls,
72
+ });
73
+ }
74
+ graph.dispatchRunStepDelta(stepId, {
75
+ type: _enum.StepTypes.TOOL_CALLS,
76
+ tool_calls: toolCallChunks,
77
+ });
78
+ }
79
+ const handleToolCalls = (toolCalls, metadata, graph) => {
80
+ if (!graph || !metadata) {
81
+ console.warn(`Graph or metadata not found in ${event} event`);
82
+ return;
83
+ }
84
+ if (!toolCalls) {
85
+ return;
86
+ }
87
+ if (toolCalls.length === 0) {
88
+ return;
89
+ }
90
+ const stepKey = graph.getStepKey(metadata);
91
+ for (const tool_call of toolCalls) {
92
+ const toolCallId = tool_call.id ?? `toolu_${nanoid.nanoid()}`;
93
+ tool_call.id = toolCallId;
94
+ if (!toolCallId || graph.toolCallStepIds.has(toolCallId)) {
95
+ continue;
96
+ }
97
+ let prevStepId = '';
98
+ let prevRunStep;
99
+ try {
100
+ prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);
101
+ prevRunStep = graph.getRunStep(prevStepId);
102
+ }
103
+ catch {
104
+ // no previous step
105
+ }
106
+ const dispatchToolCallIds = (lastMessageStepId) => {
107
+ graph.dispatchMessageDelta(lastMessageStepId, {
108
+ content: [
109
+ {
110
+ type: 'text',
111
+ text: '',
112
+ tool_call_ids: [toolCallId],
113
+ },
114
+ ],
115
+ });
116
+ };
117
+ /* If the previous step exists and is a message creation */
118
+ if (prevStepId &&
119
+ prevRunStep &&
120
+ prevRunStep.type === _enum.StepTypes.MESSAGE_CREATION) {
121
+ dispatchToolCallIds(prevStepId);
122
+ graph.messageStepHasToolCalls.set(prevStepId, true);
123
+ /* If the previous step doesn't exist or is not a message creation */
124
+ }
125
+ else if (!prevRunStep ||
126
+ prevRunStep.type !== _enum.StepTypes.MESSAGE_CREATION) {
127
+ const messageId = ids.getMessageId(stepKey, graph, true) ?? '';
128
+ const stepId = graph.dispatchRunStep(stepKey, {
129
+ type: _enum.StepTypes.MESSAGE_CREATION,
130
+ message_creation: {
131
+ message_id: messageId,
132
+ },
133
+ });
134
+ dispatchToolCallIds(stepId);
135
+ graph.messageStepHasToolCalls.set(prevStepId, true);
136
+ }
137
+ graph.dispatchRunStep(stepKey, {
138
+ type: _enum.StepTypes.TOOL_CALLS,
139
+ tool_calls: [tool_call],
140
+ });
141
+ }
142
+ };
143
+ const toolResultTypes = new Set([
144
+ // 'tool_use',
145
+ // 'server_tool_use',
146
+ // 'input_json_delta',
147
+ 'tool_result',
148
+ 'web_search_result',
149
+ 'web_search_tool_result',
150
+ ]);
151
+ /**
152
+ * Handles the result of a server tool call; in other words, a provider's built-in tool.
153
+ * As of 2025-07-06, only Anthropic handles server tool calls with this pattern.
154
+ */
155
+ function handleServerToolResult({ content, metadata, graph, }) {
156
+ let skipHandling = false;
157
+ if (metadata?.provider !== _enum.Providers.ANTHROPIC) {
158
+ return skipHandling;
159
+ }
160
+ if (typeof content === 'string' ||
161
+ content == null ||
162
+ content.length === 0 ||
163
+ (content.length === 1 &&
164
+ content[0].tool_use_id == null)) {
165
+ return skipHandling;
166
+ }
167
+ for (const contentPart of content) {
168
+ const toolUseId = contentPart.tool_use_id;
169
+ if (toolUseId == null || toolUseId === '') {
170
+ continue;
171
+ }
172
+ const stepId = graph.toolCallStepIds.get(toolUseId);
173
+ if (stepId == null || stepId === '') {
174
+ console.warn(`Tool use ID ${toolUseId} not found in graph, cannot dispatch tool result.`);
175
+ continue;
176
+ }
177
+ const runStep = graph.getRunStep(stepId);
178
+ if (!runStep) {
179
+ console.warn(`Run step for ${stepId} does not exist, cannot dispatch tool result.`);
180
+ continue;
181
+ }
182
+ else if (runStep.type !== _enum.StepTypes.TOOL_CALLS) {
183
+ console.warn(`Run step for ${stepId} is not a tool call step, cannot dispatch tool result.`);
184
+ continue;
185
+ }
186
+ const toolCall = runStep.stepDetails.type === _enum.StepTypes.TOOL_CALLS
187
+ ? runStep.stepDetails.tool_calls?.find((toolCall) => toolCall.id === toolUseId)
188
+ : undefined;
189
+ if (!toolCall) {
190
+ continue;
191
+ }
192
+ if (contentPart.type === 'web_search_result' ||
193
+ contentPart.type === 'web_search_tool_result') {
194
+ handleAnthropicSearchResults({
195
+ contentPart: contentPart,
196
+ toolCall,
197
+ metadata,
198
+ graph,
199
+ });
200
+ }
201
+ if (!skipHandling) {
202
+ skipHandling = true;
203
+ }
204
+ }
205
+ return skipHandling;
206
+ }
207
+ function handleAnthropicSearchResults({ contentPart, toolCall, metadata, graph, }) {
208
+ if (!Array.isArray(contentPart.content)) {
209
+ console.warn(`Expected content to be an array, got ${typeof contentPart.content}`);
210
+ return;
211
+ }
212
+ if (!anthropic.isAnthropicWebSearchResult(contentPart.content[0])) {
213
+ console.warn(`Expected content to be an Anthropic web search result, got ${JSON.stringify(contentPart.content)}`);
214
+ return;
215
+ }
216
+ const turn = graph.invokedToolIds?.size ?? 0;
217
+ const searchResultData = anthropic.coerceAnthropicSearchResults({
218
+ turn,
219
+ results: contentPart.content,
220
+ });
221
+ const name = toolCall.name;
222
+ const input = toolCall.args ?? {};
223
+ const artifact = {
224
+ [_enum.Constants.WEB_SEARCH]: searchResultData,
225
+ };
226
+ const { output: formattedOutput } = format.formatResultsForLLM(turn, searchResultData);
227
+ const output = new messages.ToolMessage({
228
+ name,
229
+ artifact,
230
+ content: formattedOutput,
231
+ tool_call_id: toolCall.id,
232
+ });
233
+ const toolEndData = {
234
+ input,
235
+ output,
236
+ };
237
+ graph.handlerRegistry
238
+ ?.getHandler(_enum.GraphEvents.TOOL_END)
239
+ ?.handle(_enum.GraphEvents.TOOL_END, toolEndData, metadata, graph);
240
+ if (graph.invokedToolIds == null) {
241
+ graph.invokedToolIds = new Set();
242
+ }
243
+ graph.invokedToolIds.add(toolCall.id);
244
+ }
245
+
246
+ exports.handleServerToolResult = handleServerToolResult;
247
+ exports.handleToolCallChunks = handleToolCallChunks;
248
+ exports.handleToolCalls = handleToolCalls;
249
+ exports.toolResultTypes = toolResultTypes;
250
+ //# sourceMappingURL=handlers.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.cjs","sources":["../../../src/tools/handlers.ts"],"sourcesContent":["/* eslint-disable no-console */\r\n// src/tools/handlers.ts\r\nimport { nanoid } from 'nanoid';\r\nimport { ToolMessage } from '@langchain/core/messages';\r\nimport type { AnthropicWebSearchResultBlockParam } from '@/llm/anthropic/types';\r\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\r\nimport type { Graph } from '@/graphs';\r\nimport type * as t from '@/types';\r\nimport {\r\n ToolCallTypes,\r\n ContentTypes,\r\n GraphEvents,\r\n StepTypes,\r\n Providers,\r\n Constants,\r\n} from '@/common';\r\nimport {\r\n coerceAnthropicSearchResults,\r\n isAnthropicWebSearchResult,\r\n} from '@/tools/search/anthropic';\r\nimport { formatResultsForLLM } from '@/tools/search/format';\r\nimport { getMessageId } from '@/messages';\r\n\r\nexport function handleToolCallChunks({\r\n graph,\r\n stepKey,\r\n toolCallChunks,\r\n}: {\r\n graph: Graph;\r\n stepKey: string;\r\n toolCallChunks: ToolCallChunk[];\r\n}): void {\r\n let prevStepId: string;\r\n let prevRunStep: t.RunStep | undefined;\r\n try {\r\n prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);\r\n prevRunStep = graph.getRunStep(prevStepId);\r\n } catch {\r\n /** Edge Case: If no previous step exists, create a new message creation step */\r\n const message_id = getMessageId(stepKey, graph, true) ?? '';\r\n prevStepId = graph.dispatchRunStep(stepKey, {\r\n type: StepTypes.MESSAGE_CREATION,\r\n message_creation: {\r\n message_id,\r\n },\r\n });\r\n prevRunStep = graph.getRunStep(prevStepId);\r\n }\r\n\r\n const _stepId = graph.getStepIdByKey(stepKey, prevRunStep?.index);\r\n\r\n /** Edge Case: Tool Call Run Step or `tool_call_ids` never dispatched */\r\n const tool_calls: ToolCall[] | undefined =\r\n prevStepId && prevRunStep && prevRunStep.type === StepTypes.MESSAGE_CREATION\r\n ? []\r\n : undefined;\r\n\r\n /** Edge Case: `id` and `name` fields cannot be empty strings */\r\n for (const toolCallChunk of toolCallChunks) {\r\n if (toolCallChunk.name === '') {\r\n toolCallChunk.name = undefined;\r\n }\r\n if (toolCallChunk.id === '') {\r\n toolCallChunk.id = undefined;\r\n } else if (\r\n tool_calls != null &&\r\n toolCallChunk.id != null &&\r\n toolCallChunk.name != null\r\n ) {\r\n tool_calls.push({\r\n args: {},\r\n id: toolCallChunk.id,\r\n name: toolCallChunk.name,\r\n type: ToolCallTypes.TOOL_CALL,\r\n });\r\n }\r\n }\r\n\r\n let stepId: string = _stepId;\r\n const alreadyDispatched =\r\n prevRunStep?.type === StepTypes.MESSAGE_CREATION &&\r\n graph.messageStepHasToolCalls.has(prevStepId);\r\n if (!alreadyDispatched && tool_calls?.length === toolCallChunks.length) {\r\n graph.dispatchMessageDelta(prevStepId, {\r\n content: [\r\n {\r\n type: ContentTypes.TEXT,\r\n text: '',\r\n tool_call_ids: tool_calls.map((tc) => tc.id ?? ''),\r\n },\r\n ],\r\n });\r\n graph.messageStepHasToolCalls.set(prevStepId, true);\r\n stepId = graph.dispatchRunStep(stepKey, {\r\n type: StepTypes.TOOL_CALLS,\r\n tool_calls,\r\n });\r\n }\r\n graph.dispatchRunStepDelta(stepId, {\r\n type: StepTypes.TOOL_CALLS,\r\n tool_calls: toolCallChunks,\r\n });\r\n}\r\n\r\nexport const handleToolCalls = (\r\n toolCalls?: ToolCall[],\r\n metadata?: Record<string, unknown>,\r\n graph?: Graph\r\n): void => {\r\n if (!graph || !metadata) {\r\n console.warn(`Graph or metadata not found in ${event} event`);\r\n return;\r\n }\r\n\r\n if (!toolCalls) {\r\n return;\r\n }\r\n\r\n if (toolCalls.length === 0) {\r\n return;\r\n }\r\n\r\n const stepKey = graph.getStepKey(metadata);\r\n\r\n for (const tool_call of toolCalls) {\r\n const toolCallId = tool_call.id ?? `toolu_${nanoid()}`;\r\n tool_call.id = toolCallId;\r\n if (!toolCallId || graph.toolCallStepIds.has(toolCallId)) {\r\n continue;\r\n }\r\n\r\n let prevStepId = '';\r\n let prevRunStep: t.RunStep | undefined;\r\n try {\r\n prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);\r\n prevRunStep = graph.getRunStep(prevStepId);\r\n } catch {\r\n // no previous step\r\n }\r\n\r\n const dispatchToolCallIds = (lastMessageStepId: string): void => {\r\n graph.dispatchMessageDelta(lastMessageStepId, {\r\n content: [\r\n {\r\n type: 'text',\r\n text: '',\r\n tool_call_ids: [toolCallId],\r\n },\r\n ],\r\n });\r\n };\r\n /* If the previous step exists and is a message creation */\r\n if (\r\n prevStepId &&\r\n prevRunStep &&\r\n prevRunStep.type === StepTypes.MESSAGE_CREATION\r\n ) {\r\n dispatchToolCallIds(prevStepId);\r\n graph.messageStepHasToolCalls.set(prevStepId, true);\r\n /* If the previous step doesn't exist or is not a message creation */\r\n } else if (\r\n !prevRunStep ||\r\n prevRunStep.type !== StepTypes.MESSAGE_CREATION\r\n ) {\r\n const messageId = getMessageId(stepKey, graph, true) ?? '';\r\n const stepId = graph.dispatchRunStep(stepKey, {\r\n type: StepTypes.MESSAGE_CREATION,\r\n message_creation: {\r\n message_id: messageId,\r\n },\r\n });\r\n dispatchToolCallIds(stepId);\r\n graph.messageStepHasToolCalls.set(prevStepId, true);\r\n }\r\n\r\n graph.dispatchRunStep(stepKey, {\r\n type: StepTypes.TOOL_CALLS,\r\n tool_calls: [tool_call],\r\n });\r\n }\r\n};\r\n\r\nexport const toolResultTypes = new Set([\r\n // 'tool_use',\r\n // 'server_tool_use',\r\n // 'input_json_delta',\r\n 'tool_result',\r\n 'web_search_result',\r\n 'web_search_tool_result',\r\n]);\r\n\r\n/**\r\n * Handles the result of a server tool call; in other words, a provider's built-in tool.\r\n * As of 2025-07-06, only Anthropic handles server tool calls with this pattern.\r\n */\r\nexport function handleServerToolResult({\r\n content,\r\n metadata,\r\n graph,\r\n}: {\r\n content?: string | t.MessageContentComplex[];\r\n metadata?: Record<string, unknown>;\r\n graph: Graph;\r\n}): boolean {\r\n let skipHandling = false;\r\n if (metadata?.provider !== Providers.ANTHROPIC) {\r\n return skipHandling;\r\n }\r\n if (\r\n typeof content === 'string' ||\r\n content == null ||\r\n content.length === 0 ||\r\n (content.length === 1 &&\r\n (content[0] as t.ToolResultContent).tool_use_id == null)\r\n ) {\r\n return skipHandling;\r\n }\r\n\r\n for (const contentPart of content) {\r\n const toolUseId = (contentPart as t.ToolResultContent).tool_use_id;\r\n if (toolUseId == null || toolUseId === '') {\r\n continue;\r\n }\r\n const stepId = graph.toolCallStepIds.get(toolUseId);\r\n if (stepId == null || stepId === '') {\r\n console.warn(\r\n `Tool use ID ${toolUseId} not found in graph, cannot dispatch tool result.`\r\n );\r\n continue;\r\n }\r\n const runStep = graph.getRunStep(stepId);\r\n if (!runStep) {\r\n console.warn(\r\n `Run step for ${stepId} does not exist, cannot dispatch tool result.`\r\n );\r\n continue;\r\n } else if (runStep.type !== StepTypes.TOOL_CALLS) {\r\n console.warn(\r\n `Run step for ${stepId} is not a tool call step, cannot dispatch tool result.`\r\n );\r\n continue;\r\n }\r\n\r\n const toolCall =\r\n runStep.stepDetails.type === StepTypes.TOOL_CALLS\r\n ? (runStep.stepDetails.tool_calls?.find(\r\n (toolCall) => toolCall.id === toolUseId\r\n ) as ToolCall)\r\n : undefined;\r\n\r\n if (!toolCall) {\r\n continue;\r\n }\r\n\r\n if (\r\n contentPart.type === 'web_search_result' ||\r\n contentPart.type === 'web_search_tool_result'\r\n ) {\r\n handleAnthropicSearchResults({\r\n contentPart: contentPart as t.ToolResultContent,\r\n toolCall,\r\n metadata,\r\n graph,\r\n });\r\n }\r\n\r\n if (!skipHandling) {\r\n skipHandling = true;\r\n }\r\n }\r\n\r\n return skipHandling;\r\n}\r\n\r\nfunction handleAnthropicSearchResults({\r\n contentPart,\r\n toolCall,\r\n metadata,\r\n graph,\r\n}: {\r\n contentPart: t.ToolResultContent;\r\n toolCall: Partial<ToolCall>;\r\n metadata?: Record<string, unknown>;\r\n graph: Graph;\r\n}): void {\r\n if (!Array.isArray(contentPart.content)) {\r\n console.warn(\r\n `Expected content to be an array, got ${typeof contentPart.content}`\r\n );\r\n return;\r\n }\r\n\r\n if (!isAnthropicWebSearchResult(contentPart.content[0])) {\r\n console.warn(\r\n `Expected content to be an Anthropic web search result, got ${JSON.stringify(\r\n contentPart.content\r\n )}`\r\n );\r\n return;\r\n }\r\n\r\n const turn = graph.invokedToolIds?.size ?? 0;\r\n const searchResultData = coerceAnthropicSearchResults({\r\n turn,\r\n results: contentPart.content as AnthropicWebSearchResultBlockParam[],\r\n });\r\n\r\n const name = toolCall.name;\r\n const input = toolCall.args ?? {};\r\n const artifact = {\r\n [Constants.WEB_SEARCH]: searchResultData,\r\n };\r\n const { output: formattedOutput } = formatResultsForLLM(\r\n turn,\r\n searchResultData\r\n );\r\n const output = new ToolMessage({\r\n name,\r\n artifact,\r\n content: formattedOutput,\r\n tool_call_id: toolCall.id!,\r\n });\r\n const toolEndData: t.ToolEndData = {\r\n input,\r\n output,\r\n };\r\n graph.handlerRegistry\r\n ?.getHandler(GraphEvents.TOOL_END)\r\n ?.handle(GraphEvents.TOOL_END, toolEndData, metadata, graph);\r\n\r\n if (graph.invokedToolIds == null) {\r\n graph.invokedToolIds = new Set<string>();\r\n }\r\n\r\n graph.invokedToolIds.add(toolCall.id!);\r\n}\r\n"],"names":["getMessageId","StepTypes","ToolCallTypes","ContentTypes","nanoid","Providers","isAnthropicWebSearchResult","coerceAnthropicSearchResults","Constants","formatResultsForLLM","ToolMessage","GraphEvents"],"mappings":"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"}