@librechat/agents 3.2.32 → 3.2.34

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 (597) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/cjs/agents/AgentContext.cjs +844 -1046
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/constants.cjs +13 -13
  5. package/dist/cjs/common/constants.cjs.map +1 -1
  6. package/dist/cjs/common/enum.cjs +233 -240
  7. package/dist/cjs/common/enum.cjs.map +1 -1
  8. package/dist/cjs/common/index.cjs +2 -0
  9. package/dist/cjs/events.cjs +121 -169
  10. package/dist/cjs/events.cjs.map +1 -1
  11. package/dist/cjs/graphs/Graph.cjs +1389 -1807
  12. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  13. package/dist/cjs/graphs/MultiAgentGraph.cjs +713 -945
  14. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  15. package/dist/cjs/graphs/index.cjs +2 -0
  16. package/dist/cjs/hitl/askUserQuestion.cjs +60 -62
  17. package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
  18. package/dist/cjs/hitl/index.cjs +1 -0
  19. package/dist/cjs/hooks/HookRegistry.cjs +176 -202
  20. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  21. package/dist/cjs/hooks/createToolPolicyHook.cjs +71 -101
  22. package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
  23. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +170 -273
  24. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  25. package/dist/cjs/hooks/executeHooks.cjs +227 -282
  26. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  27. package/dist/cjs/hooks/index.cjs +6 -0
  28. package/dist/cjs/hooks/matchers.cjs +196 -230
  29. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  30. package/dist/cjs/hooks/types.cjs +24 -24
  31. package/dist/cjs/hooks/types.cjs.map +1 -1
  32. package/dist/cjs/instrumentation.cjs +110 -137
  33. package/dist/cjs/instrumentation.cjs.map +1 -1
  34. package/dist/cjs/langchain/google-common.cjs +0 -3
  35. package/dist/cjs/langchain/index.cjs +80 -43
  36. package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
  37. package/dist/cjs/langchain/messages/tool.cjs +0 -3
  38. package/dist/cjs/langchain/messages.cjs +35 -18
  39. package/dist/cjs/langchain/openai.cjs +0 -3
  40. package/dist/cjs/langchain/prompts.cjs +5 -8
  41. package/dist/cjs/langchain/runnables.cjs +11 -10
  42. package/dist/cjs/langchain/tools.cjs +14 -11
  43. package/dist/cjs/langchain/utils/env.cjs +5 -8
  44. package/dist/cjs/langfuse.cjs +60 -79
  45. package/dist/cjs/langfuse.cjs.map +1 -1
  46. package/dist/cjs/langfuseToolOutputTracing.cjs +267 -399
  47. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  48. package/dist/cjs/llm/anthropic/index.cjs +432 -562
  49. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  50. package/dist/cjs/llm/anthropic/types.cjs +23 -47
  51. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  52. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +441 -731
  53. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -256
  55. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  56. package/dist/cjs/llm/anthropic/utils/output_parsers.cjs +2 -0
  57. package/dist/cjs/llm/anthropic/utils/tools.cjs +12 -26
  58. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  59. package/dist/cjs/llm/bedrock/index.cjs +214 -240
  60. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  61. package/dist/cjs/llm/bedrock/toolCache.cjs +84 -106
  62. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  63. package/dist/cjs/llm/bedrock/utils/index.cjs +2 -0
  64. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +357 -620
  65. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  66. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +141 -149
  67. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  68. package/dist/cjs/llm/fake.cjs +86 -96
  69. package/dist/cjs/llm/fake.cjs.map +1 -1
  70. package/dist/cjs/llm/google/index.cjs +183 -237
  71. package/dist/cjs/llm/google/index.cjs.map +1 -1
  72. package/dist/cjs/llm/google/utils/common.cjs +404 -674
  73. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  74. package/dist/cjs/llm/google/utils/zod_to_genai_parameters.cjs +2 -0
  75. package/dist/cjs/llm/init.cjs +44 -53
  76. package/dist/cjs/llm/init.cjs.map +1 -1
  77. package/dist/cjs/llm/invoke.cjs +142 -182
  78. package/dist/cjs/llm/invoke.cjs.map +1 -1
  79. package/dist/cjs/llm/openai/index.cjs +1035 -1273
  80. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  81. package/dist/cjs/llm/openai/utils/index.cjs +189 -316
  82. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  83. package/dist/cjs/llm/openrouter/index.cjs +102 -153
  84. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  85. package/dist/cjs/llm/openrouter/toolCache.cjs +35 -44
  86. package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
  87. package/dist/cjs/llm/providers.cjs +29 -37
  88. package/dist/cjs/llm/providers.cjs.map +1 -1
  89. package/dist/cjs/llm/request.cjs +20 -33
  90. package/dist/cjs/llm/request.cjs.map +1 -1
  91. package/dist/cjs/llm/vertexai/index.cjs +446 -453
  92. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  93. package/dist/cjs/main.cjs +547 -528
  94. package/dist/cjs/messages/anthropicToolCache.cjs +68 -119
  95. package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
  96. package/dist/cjs/messages/cache.cjs +305 -418
  97. package/dist/cjs/messages/cache.cjs.map +1 -1
  98. package/dist/cjs/messages/content.cjs +36 -49
  99. package/dist/cjs/messages/content.cjs.map +1 -1
  100. package/dist/cjs/messages/contextPruning.cjs +112 -145
  101. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  102. package/dist/cjs/messages/contextPruningSettings.cjs +36 -46
  103. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
  104. package/dist/cjs/messages/core.cjs +256 -397
  105. package/dist/cjs/messages/core.cjs.map +1 -1
  106. package/dist/cjs/messages/format.cjs +904 -1387
  107. package/dist/cjs/messages/format.cjs.map +1 -1
  108. package/dist/cjs/messages/ids.cjs +16 -20
  109. package/dist/cjs/messages/ids.cjs.map +1 -1
  110. package/dist/cjs/messages/index.cjs +12 -0
  111. package/dist/cjs/messages/langchain.cjs +18 -18
  112. package/dist/cjs/messages/langchain.cjs.map +1 -1
  113. package/dist/cjs/messages/prune.cjs +1054 -1517
  114. package/dist/cjs/messages/prune.cjs.map +1 -1
  115. package/dist/cjs/messages/recency.cjs +77 -95
  116. package/dist/cjs/messages/recency.cjs.map +1 -1
  117. package/dist/cjs/messages/reducer.cjs +63 -78
  118. package/dist/cjs/messages/reducer.cjs.map +1 -1
  119. package/dist/cjs/messages/tools.cjs +51 -79
  120. package/dist/cjs/messages/tools.cjs.map +1 -1
  121. package/dist/cjs/openai/index.cjs +171 -217
  122. package/dist/cjs/openai/index.cjs.map +1 -1
  123. package/dist/cjs/responses/index.cjs +302 -391
  124. package/dist/cjs/responses/index.cjs.map +1 -1
  125. package/dist/cjs/run.cjs +903 -1113
  126. package/dist/cjs/run.cjs.map +1 -1
  127. package/dist/cjs/session/AgentSession.cjs +805 -986
  128. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  129. package/dist/cjs/session/JsonlSessionStore.cjs +327 -410
  130. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  131. package/dist/cjs/session/handlers.cjs +192 -208
  132. package/dist/cjs/session/handlers.cjs.map +1 -1
  133. package/dist/cjs/session/ids.cjs +9 -10
  134. package/dist/cjs/session/ids.cjs.map +1 -1
  135. package/dist/cjs/session/index.cjs +4 -0
  136. package/dist/cjs/session/messageSerialization.cjs +94 -156
  137. package/dist/cjs/session/messageSerialization.cjs.map +1 -1
  138. package/dist/cjs/splitStream.cjs +147 -206
  139. package/dist/cjs/splitStream.cjs.map +1 -1
  140. package/dist/cjs/stream.cjs +874 -1344
  141. package/dist/cjs/stream.cjs.map +1 -1
  142. package/dist/cjs/summarization/index.cjs +57 -101
  143. package/dist/cjs/summarization/index.cjs.map +1 -1
  144. package/dist/cjs/summarization/node.cjs +643 -796
  145. package/dist/cjs/summarization/node.cjs.map +1 -1
  146. package/dist/cjs/tools/BashExecutor.cjs +110 -136
  147. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  148. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +165 -245
  149. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  150. package/dist/cjs/tools/Calculator.cjs +36 -57
  151. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  152. package/dist/cjs/tools/CodeExecutor.cjs +126 -168
  153. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  154. package/dist/cjs/tools/CodeSessionFileSummary.cjs +36 -46
  155. package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
  156. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +459 -649
  157. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  158. package/dist/cjs/tools/ReadFile.cjs +17 -20
  159. package/dist/cjs/tools/ReadFile.cjs.map +1 -1
  160. package/dist/cjs/tools/SkillTool.cjs +26 -27
  161. package/dist/cjs/tools/SkillTool.cjs.map +1 -1
  162. package/dist/cjs/tools/SubagentTool.cjs +59 -61
  163. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  164. package/dist/cjs/tools/ToolNode.cjs +2146 -2686
  165. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  166. package/dist/cjs/tools/ToolSearch.cjs +663 -825
  167. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  168. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +248 -340
  169. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
  170. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +170 -197
  171. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
  172. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +425 -520
  173. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  174. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +91 -124
  175. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  176. package/dist/cjs/tools/cloudflare/index.cjs +4 -0
  177. package/dist/cjs/tools/eagerEventExecution.cjs +75 -99
  178. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
  179. package/dist/cjs/tools/handlers.cjs +200 -262
  180. package/dist/cjs/tools/handlers.cjs.map +1 -1
  181. package/dist/cjs/tools/local/CompileCheckTool.cjs +150 -212
  182. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  183. package/dist/cjs/tools/local/FileCheckpointer.cjs +77 -85
  184. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  185. package/dist/cjs/tools/local/LocalCodingTools.cjs +763 -1022
  186. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  187. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +666 -941
  188. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  189. package/dist/cjs/tools/local/LocalExecutionTools.cjs +49 -92
  190. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  191. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +286 -354
  192. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  193. package/dist/cjs/tools/local/attachments.cjs +108 -165
  194. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  195. package/dist/cjs/tools/local/bashAst.cjs +99 -113
  196. package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
  197. package/dist/cjs/tools/local/editStrategies.cjs +126 -169
  198. package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
  199. package/dist/cjs/tools/local/index.cjs +12 -0
  200. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +136 -218
  201. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  202. package/dist/cjs/tools/local/syntaxCheck.cjs +142 -161
  203. package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
  204. package/dist/cjs/tools/local/textEncoding.cjs +25 -23
  205. package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
  206. package/dist/cjs/tools/local/workspaceFS.cjs +38 -46
  207. package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
  208. package/dist/cjs/tools/ptcTimeout.cjs +27 -47
  209. package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
  210. package/dist/cjs/tools/schema.cjs +24 -23
  211. package/dist/cjs/tools/schema.cjs.map +1 -1
  212. package/dist/cjs/tools/search/anthropic.cjs +24 -33
  213. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  214. package/dist/cjs/tools/search/content.cjs +95 -137
  215. package/dist/cjs/tools/search/content.cjs.map +1 -1
  216. package/dist/cjs/tools/search/firecrawl.cjs +141 -172
  217. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  218. package/dist/cjs/tools/search/format.cjs +128 -196
  219. package/dist/cjs/tools/search/format.cjs.map +1 -1
  220. package/dist/cjs/tools/search/highlights.cjs +165 -232
  221. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  222. package/dist/cjs/tools/search/index.cjs +2 -0
  223. package/dist/cjs/tools/search/rerankers.cjs +151 -174
  224. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  225. package/dist/cjs/tools/search/schema.cjs +40 -39
  226. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  227. package/dist/cjs/tools/search/search.cjs +428 -530
  228. package/dist/cjs/tools/search/search.cjs.map +1 -1
  229. package/dist/cjs/tools/search/serper-scraper.cjs +106 -127
  230. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  231. package/dist/cjs/tools/search/tavily-scraper.cjs +129 -181
  232. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  233. package/dist/cjs/tools/search/tavily-search.cjs +295 -359
  234. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  235. package/dist/cjs/tools/search/tool.cjs +260 -299
  236. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  237. package/dist/cjs/tools/search/utils.cjs +74 -117
  238. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  239. package/dist/cjs/tools/skillCatalog.cjs +54 -72
  240. package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
  241. package/dist/cjs/tools/streamedToolCallSeals.cjs +46 -34
  242. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
  243. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +612 -771
  244. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  245. package/dist/cjs/tools/subagent/index.cjs +1 -0
  246. package/dist/cjs/tools/toolOutputReferences.cjs +523 -630
  247. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  248. package/dist/cjs/utils/callbacks.cjs +11 -21
  249. package/dist/cjs/utils/callbacks.cjs.map +1 -1
  250. package/dist/cjs/utils/errors.cjs +70 -95
  251. package/dist/cjs/utils/errors.cjs.map +1 -1
  252. package/dist/cjs/utils/events.cjs +32 -42
  253. package/dist/cjs/utils/events.cjs.map +1 -1
  254. package/dist/cjs/utils/graph.cjs +8 -12
  255. package/dist/cjs/utils/graph.cjs.map +1 -1
  256. package/dist/cjs/utils/handlers.cjs +60 -82
  257. package/dist/cjs/utils/handlers.cjs.map +1 -1
  258. package/dist/cjs/utils/index.cjs +9 -0
  259. package/dist/cjs/utils/llm.cjs +19 -27
  260. package/dist/cjs/utils/llm.cjs.map +1 -1
  261. package/dist/cjs/utils/misc.cjs +30 -46
  262. package/dist/cjs/utils/misc.cjs.map +1 -1
  263. package/dist/cjs/utils/run.cjs +50 -66
  264. package/dist/cjs/utils/run.cjs.map +1 -1
  265. package/dist/cjs/utils/schema.cjs +11 -19
  266. package/dist/cjs/utils/schema.cjs.map +1 -1
  267. package/dist/cjs/utils/title.cjs +71 -106
  268. package/dist/cjs/utils/title.cjs.map +1 -1
  269. package/dist/cjs/utils/tokens.cjs +186 -283
  270. package/dist/cjs/utils/tokens.cjs.map +1 -1
  271. package/dist/cjs/utils/truncation.cjs +95 -114
  272. package/dist/cjs/utils/truncation.cjs.map +1 -1
  273. package/dist/esm/agents/AgentContext.mjs +844 -1044
  274. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  275. package/dist/esm/common/constants.mjs +13 -11
  276. package/dist/esm/common/constants.mjs.map +1 -1
  277. package/dist/esm/common/enum.mjs +221 -238
  278. package/dist/esm/common/enum.mjs.map +1 -1
  279. package/dist/esm/common/index.mjs +3 -0
  280. package/dist/esm/events.mjs +121 -167
  281. package/dist/esm/events.mjs.map +1 -1
  282. package/dist/esm/graphs/Graph.mjs +1388 -1804
  283. package/dist/esm/graphs/Graph.mjs.map +1 -1
  284. package/dist/esm/graphs/MultiAgentGraph.mjs +713 -943
  285. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  286. package/dist/esm/graphs/index.mjs +3 -0
  287. package/dist/esm/hitl/askUserQuestion.mjs +60 -60
  288. package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
  289. package/dist/esm/hitl/index.mjs +2 -0
  290. package/dist/esm/hooks/HookRegistry.mjs +176 -200
  291. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  292. package/dist/esm/hooks/createToolPolicyHook.mjs +71 -99
  293. package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
  294. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +170 -271
  295. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  296. package/dist/esm/hooks/executeHooks.mjs +227 -280
  297. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  298. package/dist/esm/hooks/index.mjs +7 -0
  299. package/dist/esm/hooks/matchers.mjs +196 -228
  300. package/dist/esm/hooks/matchers.mjs.map +1 -1
  301. package/dist/esm/hooks/types.mjs +24 -22
  302. package/dist/esm/hooks/types.mjs.map +1 -1
  303. package/dist/esm/instrumentation.mjs +109 -132
  304. package/dist/esm/instrumentation.mjs.map +1 -1
  305. package/dist/esm/langchain/google-common.mjs +1 -2
  306. package/dist/esm/langchain/index.mjs +5 -5
  307. package/dist/esm/langchain/language_models/chat_models.mjs +1 -2
  308. package/dist/esm/langchain/messages/tool.mjs +1 -2
  309. package/dist/esm/langchain/messages.mjs +2 -2
  310. package/dist/esm/langchain/openai.mjs +1 -2
  311. package/dist/esm/langchain/prompts.mjs +2 -2
  312. package/dist/esm/langchain/runnables.mjs +2 -2
  313. package/dist/esm/langchain/tools.mjs +2 -2
  314. package/dist/esm/langchain/utils/env.mjs +2 -2
  315. package/dist/esm/langfuse.mjs +60 -76
  316. package/dist/esm/langfuse.mjs.map +1 -1
  317. package/dist/esm/langfuseToolOutputTracing.mjs +267 -395
  318. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  319. package/dist/esm/llm/anthropic/index.mjs +432 -559
  320. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  321. package/dist/esm/llm/anthropic/types.mjs +23 -45
  322. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  323. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +439 -725
  324. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  325. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -253
  326. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  327. package/dist/esm/llm/anthropic/utils/output_parsers.mjs +3 -0
  328. package/dist/esm/llm/anthropic/utils/tools.mjs +12 -24
  329. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  330. package/dist/esm/llm/bedrock/index.mjs +214 -238
  331. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  332. package/dist/esm/llm/bedrock/toolCache.mjs +84 -104
  333. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  334. package/dist/esm/llm/bedrock/utils/index.mjs +3 -0
  335. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +357 -618
  336. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  337. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +140 -147
  338. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  339. package/dist/esm/llm/fake.mjs +86 -94
  340. package/dist/esm/llm/fake.mjs.map +1 -1
  341. package/dist/esm/llm/google/index.mjs +183 -235
  342. package/dist/esm/llm/google/index.mjs.map +1 -1
  343. package/dist/esm/llm/google/utils/common.mjs +403 -666
  344. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  345. package/dist/esm/llm/google/utils/zod_to_genai_parameters.mjs +3 -0
  346. package/dist/esm/llm/init.mjs +44 -51
  347. package/dist/esm/llm/init.mjs.map +1 -1
  348. package/dist/esm/llm/invoke.mjs +142 -180
  349. package/dist/esm/llm/invoke.mjs.map +1 -1
  350. package/dist/esm/llm/openai/index.mjs +1035 -1268
  351. package/dist/esm/llm/openai/index.mjs.map +1 -1
  352. package/dist/esm/llm/openai/utils/index.mjs +188 -312
  353. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  354. package/dist/esm/llm/openrouter/index.mjs +102 -151
  355. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  356. package/dist/esm/llm/openrouter/toolCache.mjs +35 -42
  357. package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
  358. package/dist/esm/llm/providers.mjs +29 -34
  359. package/dist/esm/llm/providers.mjs.map +1 -1
  360. package/dist/esm/llm/request.mjs +20 -31
  361. package/dist/esm/llm/request.mjs.map +1 -1
  362. package/dist/esm/llm/vertexai/index.mjs +446 -449
  363. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  364. package/dist/esm/main.mjs +99 -87
  365. package/dist/esm/messages/anthropicToolCache.mjs +68 -117
  366. package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
  367. package/dist/esm/messages/cache.mjs +305 -416
  368. package/dist/esm/messages/cache.mjs.map +1 -1
  369. package/dist/esm/messages/content.mjs +36 -47
  370. package/dist/esm/messages/content.mjs.map +1 -1
  371. package/dist/esm/messages/contextPruning.mjs +112 -143
  372. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  373. package/dist/esm/messages/contextPruningSettings.mjs +36 -44
  374. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
  375. package/dist/esm/messages/core.mjs +254 -393
  376. package/dist/esm/messages/core.mjs.map +1 -1
  377. package/dist/esm/messages/format.mjs +902 -1383
  378. package/dist/esm/messages/format.mjs.map +1 -1
  379. package/dist/esm/messages/ids.mjs +16 -18
  380. package/dist/esm/messages/ids.mjs.map +1 -1
  381. package/dist/esm/messages/index.mjs +13 -0
  382. package/dist/esm/messages/langchain.mjs +18 -16
  383. package/dist/esm/messages/langchain.mjs.map +1 -1
  384. package/dist/esm/messages/prune.mjs +1053 -1514
  385. package/dist/esm/messages/prune.mjs.map +1 -1
  386. package/dist/esm/messages/recency.mjs +77 -93
  387. package/dist/esm/messages/recency.mjs.map +1 -1
  388. package/dist/esm/messages/reducer.mjs +63 -76
  389. package/dist/esm/messages/reducer.mjs.map +1 -1
  390. package/dist/esm/messages/tools.mjs +49 -75
  391. package/dist/esm/messages/tools.mjs.map +1 -1
  392. package/dist/esm/openai/index.mjs +170 -215
  393. package/dist/esm/openai/index.mjs.map +1 -1
  394. package/dist/esm/responses/index.mjs +301 -389
  395. package/dist/esm/responses/index.mjs.map +1 -1
  396. package/dist/esm/run.mjs +903 -1111
  397. package/dist/esm/run.mjs.map +1 -1
  398. package/dist/esm/session/AgentSession.mjs +806 -985
  399. package/dist/esm/session/AgentSession.mjs.map +1 -1
  400. package/dist/esm/session/JsonlSessionStore.mjs +326 -407
  401. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  402. package/dist/esm/session/handlers.mjs +192 -206
  403. package/dist/esm/session/handlers.mjs.map +1 -1
  404. package/dist/esm/session/ids.mjs +9 -8
  405. package/dist/esm/session/ids.mjs.map +1 -1
  406. package/dist/esm/session/index.mjs +5 -0
  407. package/dist/esm/session/messageSerialization.mjs +94 -154
  408. package/dist/esm/session/messageSerialization.mjs.map +1 -1
  409. package/dist/esm/splitStream.mjs +147 -204
  410. package/dist/esm/splitStream.mjs.map +1 -1
  411. package/dist/esm/stream.mjs +872 -1341
  412. package/dist/esm/stream.mjs.map +1 -1
  413. package/dist/esm/summarization/index.mjs +57 -99
  414. package/dist/esm/summarization/index.mjs.map +1 -1
  415. package/dist/esm/summarization/node.mjs +640 -790
  416. package/dist/esm/summarization/node.mjs.map +1 -1
  417. package/dist/esm/tools/BashExecutor.mjs +103 -129
  418. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  419. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +162 -239
  420. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  421. package/dist/esm/tools/Calculator.mjs +34 -36
  422. package/dist/esm/tools/Calculator.mjs.map +1 -1
  423. package/dist/esm/tools/CodeExecutor.mjs +123 -164
  424. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  425. package/dist/esm/tools/CodeSessionFileSummary.mjs +36 -44
  426. package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
  427. package/dist/esm/tools/ProgrammaticToolCalling.mjs +454 -644
  428. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  429. package/dist/esm/tools/ReadFile.mjs +17 -18
  430. package/dist/esm/tools/ReadFile.mjs.map +1 -1
  431. package/dist/esm/tools/SkillTool.mjs +26 -25
  432. package/dist/esm/tools/SkillTool.mjs.map +1 -1
  433. package/dist/esm/tools/SubagentTool.mjs +59 -59
  434. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  435. package/dist/esm/tools/ToolNode.mjs +2144 -2684
  436. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  437. package/dist/esm/tools/ToolSearch.mjs +659 -804
  438. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  439. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +248 -338
  440. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
  441. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +170 -195
  442. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
  443. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +424 -517
  444. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  445. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +91 -122
  446. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  447. package/dist/esm/tools/cloudflare/index.mjs +5 -0
  448. package/dist/esm/tools/eagerEventExecution.mjs +75 -96
  449. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
  450. package/dist/esm/tools/handlers.mjs +200 -260
  451. package/dist/esm/tools/handlers.mjs.map +1 -1
  452. package/dist/esm/tools/local/CompileCheckTool.mjs +150 -210
  453. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  454. package/dist/esm/tools/local/FileCheckpointer.mjs +77 -83
  455. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  456. package/dist/esm/tools/local/LocalCodingTools.mjs +760 -1017
  457. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  458. package/dist/esm/tools/local/LocalExecutionEngine.mjs +663 -936
  459. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  460. package/dist/esm/tools/local/LocalExecutionTools.mjs +49 -90
  461. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  462. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +283 -349
  463. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  464. package/dist/esm/tools/local/attachments.mjs +108 -163
  465. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  466. package/dist/esm/tools/local/bashAst.mjs +99 -111
  467. package/dist/esm/tools/local/bashAst.mjs.map +1 -1
  468. package/dist/esm/tools/local/editStrategies.mjs +126 -167
  469. package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
  470. package/dist/esm/tools/local/index.mjs +13 -0
  471. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +136 -216
  472. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  473. package/dist/esm/tools/local/syntaxCheck.mjs +138 -155
  474. package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
  475. package/dist/esm/tools/local/textEncoding.mjs +25 -21
  476. package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
  477. package/dist/esm/tools/local/workspaceFS.mjs +38 -44
  478. package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
  479. package/dist/esm/tools/ptcTimeout.mjs +27 -42
  480. package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
  481. package/dist/esm/tools/schema.mjs +24 -21
  482. package/dist/esm/tools/schema.mjs.map +1 -1
  483. package/dist/esm/tools/search/anthropic.mjs +24 -31
  484. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  485. package/dist/esm/tools/search/content.mjs +93 -116
  486. package/dist/esm/tools/search/content.mjs.map +1 -1
  487. package/dist/esm/tools/search/firecrawl.mjs +139 -169
  488. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  489. package/dist/esm/tools/search/format.mjs +128 -194
  490. package/dist/esm/tools/search/format.mjs.map +1 -1
  491. package/dist/esm/tools/search/highlights.mjs +165 -230
  492. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  493. package/dist/esm/tools/search/index.mjs +3 -0
  494. package/dist/esm/tools/search/rerankers.mjs +149 -168
  495. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  496. package/dist/esm/tools/search/schema.mjs +39 -37
  497. package/dist/esm/tools/search/schema.mjs.map +1 -1
  498. package/dist/esm/tools/search/search.mjs +426 -528
  499. package/dist/esm/tools/search/search.mjs.map +1 -1
  500. package/dist/esm/tools/search/serper-scraper.mjs +104 -124
  501. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  502. package/dist/esm/tools/search/tavily-scraper.mjs +127 -178
  503. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  504. package/dist/esm/tools/search/tavily-search.mjs +293 -357
  505. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  506. package/dist/esm/tools/search/tool.mjs +259 -297
  507. package/dist/esm/tools/search/tool.mjs.map +1 -1
  508. package/dist/esm/tools/search/utils.mjs +74 -115
  509. package/dist/esm/tools/search/utils.mjs.map +1 -1
  510. package/dist/esm/tools/skillCatalog.mjs +54 -70
  511. package/dist/esm/tools/skillCatalog.mjs.map +1 -1
  512. package/dist/esm/tools/streamedToolCallSeals.mjs +42 -31
  513. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
  514. package/dist/esm/tools/subagent/SubagentExecutor.mjs +612 -768
  515. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  516. package/dist/esm/tools/subagent/index.mjs +2 -0
  517. package/dist/esm/tools/toolOutputReferences.mjs +523 -624
  518. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  519. package/dist/esm/utils/callbacks.mjs +11 -19
  520. package/dist/esm/utils/callbacks.mjs.map +1 -1
  521. package/dist/esm/utils/errors.mjs +70 -93
  522. package/dist/esm/utils/errors.mjs.map +1 -1
  523. package/dist/esm/utils/events.mjs +32 -40
  524. package/dist/esm/utils/events.mjs.map +1 -1
  525. package/dist/esm/utils/graph.mjs +8 -10
  526. package/dist/esm/utils/graph.mjs.map +1 -1
  527. package/dist/esm/utils/handlers.mjs +60 -80
  528. package/dist/esm/utils/handlers.mjs.map +1 -1
  529. package/dist/esm/utils/index.mjs +10 -0
  530. package/dist/esm/utils/llm.mjs +19 -25
  531. package/dist/esm/utils/llm.mjs.map +1 -1
  532. package/dist/esm/utils/misc.mjs +30 -44
  533. package/dist/esm/utils/misc.mjs.map +1 -1
  534. package/dist/esm/utils/run.mjs +50 -64
  535. package/dist/esm/utils/run.mjs.map +1 -1
  536. package/dist/esm/utils/schema.mjs +11 -17
  537. package/dist/esm/utils/schema.mjs.map +1 -1
  538. package/dist/esm/utils/title.mjs +71 -104
  539. package/dist/esm/utils/title.mjs.map +1 -1
  540. package/dist/esm/utils/tokens.mjs +186 -281
  541. package/dist/esm/utils/tokens.mjs.map +1 -1
  542. package/dist/esm/utils/truncation.mjs +95 -112
  543. package/dist/esm/utils/truncation.mjs.map +1 -1
  544. package/dist/types/llm/bedrock/utils/index.d.ts +1 -1
  545. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +9 -0
  546. package/dist/types/llm/vertexai/index.d.ts +10 -0
  547. package/dist/types/tools/ToolNode.d.ts +8 -0
  548. package/dist/types/tools/search/tool.d.ts +17 -0
  549. package/dist/types/tools/search/types.d.ts +4 -0
  550. package/dist/types/tools/streamedToolCallSeals.d.ts +5 -1
  551. package/dist/types/types/tools.d.ts +10 -0
  552. package/package.json +4 -10
  553. package/src/__tests__/stream.eagerEventExecution.test.ts +703 -0
  554. package/src/llm/bedrock/index.ts +40 -0
  555. package/src/llm/bedrock/streamSealDispatch.test.ts +158 -0
  556. package/src/llm/bedrock/utils/index.ts +1 -0
  557. package/src/llm/bedrock/utils/message_outputs.test.ts +85 -0
  558. package/src/llm/bedrock/utils/message_outputs.ts +43 -0
  559. package/src/llm/google/utils/common.test.ts +64 -0
  560. package/src/llm/google/utils/common.ts +18 -0
  561. package/src/llm/openai/index.ts +95 -1
  562. package/src/llm/openai/sequentialToolCallSeals.test.ts +199 -0
  563. package/src/llm/vertexai/index.ts +31 -0
  564. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +88 -0
  565. package/src/llm/vertexai/streamSealDispatch.test.ts +148 -0
  566. package/src/stream.ts +40 -6
  567. package/src/tools/ToolNode.ts +85 -3
  568. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +368 -0
  569. package/src/tools/search/highlights.ts +9 -1
  570. package/src/tools/search/search.ts +41 -3
  571. package/src/tools/search/source-processing.test.ts +373 -0
  572. package/src/tools/search/tool.ts +22 -2
  573. package/src/tools/search/types.ts +4 -0
  574. package/src/tools/streamedToolCallSeals.ts +37 -9
  575. package/src/types/tools.ts +10 -0
  576. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  577. package/dist/cjs/langchain/index.cjs.map +0 -1
  578. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  579. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  580. package/dist/cjs/langchain/messages.cjs.map +0 -1
  581. package/dist/cjs/langchain/openai.cjs.map +0 -1
  582. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  583. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  584. package/dist/cjs/langchain/tools.cjs.map +0 -1
  585. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  586. package/dist/cjs/main.cjs.map +0 -1
  587. package/dist/esm/langchain/google-common.mjs.map +0 -1
  588. package/dist/esm/langchain/index.mjs.map +0 -1
  589. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  590. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  591. package/dist/esm/langchain/messages.mjs.map +0 -1
  592. package/dist/esm/langchain/openai.mjs.map +0 -1
  593. package/dist/esm/langchain/prompts.mjs.map +0 -1
  594. package/dist/esm/langchain/runnables.mjs.map +0 -1
  595. package/dist/esm/langchain/tools.mjs.map +0 -1
  596. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  597. package/dist/esm/main.mjs.map +0 -1
@@ -1,22 +1,19 @@
1
- 'use strict';
2
-
3
- var dotenv = require('dotenv');
4
- var fetch = require('node-fetch');
5
- var httpsProxyAgent = require('https-proxy-agent');
6
- var tools = require('@langchain/core/tools');
7
- var CodeExecutor = require('./CodeExecutor.cjs');
8
- var ptcTimeout = require('./ptcTimeout.cjs');
9
- var _enum = require('../common/enum.cjs');
10
- var CodeSessionFileSummary = require('./CodeSessionFileSummary.cjs');
11
-
12
- // src/tools/ProgrammaticToolCalling.ts
13
- dotenv.config();
1
+ const require_runtime = require("../_virtual/_rolldown/runtime.cjs");
2
+ require("../common/enum.cjs");
3
+ require("../common/index.cjs");
4
+ const require_CodeSessionFileSummary = require("./CodeSessionFileSummary.cjs");
5
+ const require_CodeExecutor = require("./CodeExecutor.cjs");
6
+ const require_ptcTimeout = require("./ptcTimeout.cjs");
7
+ let _langchain_core_tools = require("@langchain/core/tools");
8
+ let dotenv = require("dotenv");
9
+ let node_fetch = require("node-fetch");
10
+ node_fetch = require_runtime.__toESM(node_fetch, 1);
11
+ let https_proxy_agent = require("https-proxy-agent");
12
+ //#region src/tools/ProgrammaticToolCalling.ts
13
+ (0, dotenv.config)();
14
14
  /** Default max round-trips to prevent infinite loops */
15
15
  const DEFAULT_MAX_ROUND_TRIPS = 20;
16
- const DEFAULT_RUN_TIMEOUT_MS = ptcTimeout.resolveCodeApiRunTimeoutMs();
17
- // ============================================================================
18
- // Description Components (Single Source of Truth)
19
- // ============================================================================
16
+ const DEFAULT_RUN_TIMEOUT_MS = require_ptcTimeout.resolveCodeApiRunTimeoutMs();
20
17
  const STATELESS_WARNING = `CRITICAL - STATELESS EXECUTION:
21
18
  Each call is a fresh Python interpreter. Variables, imports, and data do NOT persist between calls.
22
19
  You MUST complete your entire workflow in ONE code block: query → process → output.
@@ -28,9 +25,9 @@ const CORE_RULES = `Rules:
28
25
  - Call tools with keyword args only (await tool(arg=value), never pass a dict)
29
26
  - Tool results are decoded Python values (dict/list/str)
30
27
  - Only print() output returns to the model
31
- - ${CodeExecutor.CODE_ARTIFACT_PATH_GUIDANCE}
28
+ - ${require_CodeExecutor.CODE_ARTIFACT_PATH_GUIDANCE}
32
29
  - timeout caps one sandbox run/replay iteration, not the total multi-round-trip workflow`;
33
- const ADDITIONAL_RULES = '- Tool names normalized: hyphens→underscores, keywords get `_tool` suffix';
30
+ const ADDITIONAL_RULES = "- Tool names normalized: hyphens→underscores, keywords get `_tool` suffix";
34
31
  const EXAMPLES = `Example (Complete workflow in one call):
35
32
  # Query data
36
33
  data = await query_database(sql="SELECT * FROM users")
@@ -44,9 +41,6 @@ const EXAMPLES = `Example (Complete workflow in one call):
44
41
  Example (Parallel calls):
45
42
  sf, ny = await asyncio.gather(get_weather(city="SF"), get_weather(city="NY"))
46
43
  print(f"SF: {sf}, NY: {ny}")`;
47
- // ============================================================================
48
- // Schema
49
- // ============================================================================
50
44
  const CODE_PARAM_DESCRIPTION = `Python code that calls tools programmatically. Tools are available as async functions.
51
45
 
52
46
  ${STATELESS_WARNING}
@@ -57,21 +51,21 @@ ${EXAMPLES}
57
51
 
58
52
  ${CORE_RULES}`;
59
53
  function createProgrammaticToolCallingSchema(maxRunTimeoutMs = DEFAULT_RUN_TIMEOUT_MS) {
60
- return {
61
- type: 'object',
62
- properties: {
63
- code: {
64
- type: 'string',
65
- minLength: 1,
66
- description: CODE_PARAM_DESCRIPTION,
67
- },
68
- timeout: ptcTimeout.createCodeApiRunTimeoutSchema(maxRunTimeoutMs),
69
- },
70
- required: ['code'],
71
- };
54
+ return {
55
+ type: "object",
56
+ properties: {
57
+ code: {
58
+ type: "string",
59
+ minLength: 1,
60
+ description: CODE_PARAM_DESCRIPTION
61
+ },
62
+ timeout: require_ptcTimeout.createCodeApiRunTimeoutSchema(maxRunTimeoutMs)
63
+ },
64
+ required: ["code"]
65
+ };
72
66
  }
73
67
  const ProgrammaticToolCallingSchema = createProgrammaticToolCallingSchema();
74
- const ProgrammaticToolCallingName = _enum.Constants.PROGRAMMATIC_TOOL_CALLING;
68
+ const ProgrammaticToolCallingName = "run_tools_with_code";
75
69
  const ProgrammaticToolCallingDescription = `
76
70
  Run tools via Python code. Auto-wrapped in async context—just use \`await\` directly.
77
71
 
@@ -85,663 +79,478 @@ When to use: loops, conditionals, parallel (\`asyncio.gather\`), multi-step pipe
85
79
  ${EXAMPLES}
86
80
  `.trim();
87
81
  const ProgrammaticToolCallingDefinition = {
88
- name: ProgrammaticToolCallingName,
89
- description: ProgrammaticToolCallingDescription,
90
- schema: ProgrammaticToolCallingSchema,
82
+ name: ProgrammaticToolCallingName,
83
+ description: ProgrammaticToolCallingDescription,
84
+ schema: ProgrammaticToolCallingSchema
91
85
  };
92
- // ============================================================================
93
- // Helper Functions
94
- // ============================================================================
95
86
  /** Python reserved keywords that get `_tool` suffix in Code API */
96
87
  const PYTHON_KEYWORDS = new Set([
97
- 'False',
98
- 'None',
99
- 'True',
100
- 'and',
101
- 'as',
102
- 'assert',
103
- 'async',
104
- 'await',
105
- 'break',
106
- 'class',
107
- 'continue',
108
- 'def',
109
- 'del',
110
- 'elif',
111
- 'else',
112
- 'except',
113
- 'finally',
114
- 'for',
115
- 'from',
116
- 'global',
117
- 'if',
118
- 'import',
119
- 'in',
120
- 'is',
121
- 'lambda',
122
- 'nonlocal',
123
- 'not',
124
- 'or',
125
- 'pass',
126
- 'raise',
127
- 'return',
128
- 'try',
129
- 'while',
130
- 'with',
131
- 'yield',
88
+ "False",
89
+ "None",
90
+ "True",
91
+ "and",
92
+ "as",
93
+ "assert",
94
+ "async",
95
+ "await",
96
+ "break",
97
+ "class",
98
+ "continue",
99
+ "def",
100
+ "del",
101
+ "elif",
102
+ "else",
103
+ "except",
104
+ "finally",
105
+ "for",
106
+ "from",
107
+ "global",
108
+ "if",
109
+ "import",
110
+ "in",
111
+ "is",
112
+ "lambda",
113
+ "nonlocal",
114
+ "not",
115
+ "or",
116
+ "pass",
117
+ "raise",
118
+ "return",
119
+ "try",
120
+ "while",
121
+ "with",
122
+ "yield"
132
123
  ]);
133
124
  function isFetchSessionFilesScope(value) {
134
- if (value == null || typeof value !== 'object') {
135
- return false;
136
- }
137
- const scope = value;
138
- if ((scope.kind === 'agent' || scope.kind === 'user') &&
139
- typeof scope.id === 'string') {
140
- return true;
141
- }
142
- return (scope.kind === 'skill' &&
143
- typeof scope.id === 'string' &&
144
- typeof scope.version === 'number');
125
+ if (value == null || typeof value !== "object") return false;
126
+ const scope = value;
127
+ if ((scope.kind === "agent" || scope.kind === "user") && typeof scope.id === "string") return true;
128
+ return scope.kind === "skill" && typeof scope.id === "string" && typeof scope.version === "number";
145
129
  }
146
130
  function isCodeApiAuthHeaders(value) {
147
- return value != null && typeof value !== 'string';
131
+ return value != null && typeof value !== "string";
148
132
  }
149
133
  function isCodeApiSessionFileWire(value) {
150
- return value != null && typeof value === 'object';
134
+ return value != null && typeof value === "object";
151
135
  }
152
136
  function isCodeApiSessionFileMetadata(value) {
153
- return value != null && typeof value === 'object';
137
+ return value != null && typeof value === "object";
154
138
  }
155
139
  function normalizeSessionFile(file, sessionId, scope) {
156
- const metadata = isCodeApiSessionFileMetadata(file.metadata)
157
- ? file.metadata
158
- : undefined;
159
- const rawName = typeof file.name === 'string' ? file.name : '';
160
- const nameParts = rawName.split('/');
161
- const fallbackId = nameParts.length > 1 ? nameParts[1].split('.')[0] : '';
162
- const id = typeof file.id === 'string' && file.id !== '' ? file.id : fallbackId;
163
- const originalFilename = metadata?.['original-filename'];
164
- const name = typeof originalFilename === 'string' ? originalFilename : rawName;
165
- const storage_session_id = typeof file.storage_session_id === 'string'
166
- ? file.storage_session_id
167
- : sessionId;
168
- const resource_id = typeof file.resource_id === 'string' && file.resource_id !== ''
169
- ? file.resource_id
170
- : (scope?.id ?? id);
171
- if (scope?.kind === 'skill') {
172
- return {
173
- storage_session_id,
174
- kind: 'skill',
175
- id,
176
- resource_id,
177
- name,
178
- version: scope.version,
179
- };
180
- }
181
- if (scope != null) {
182
- return {
183
- storage_session_id,
184
- kind: scope.kind,
185
- id,
186
- resource_id,
187
- name,
188
- };
189
- }
190
- return {
191
- storage_session_id,
192
- kind: 'user',
193
- id,
194
- resource_id: id,
195
- name,
196
- };
140
+ const metadata = isCodeApiSessionFileMetadata(file.metadata) ? file.metadata : void 0;
141
+ const rawName = typeof file.name === "string" ? file.name : "";
142
+ const nameParts = rawName.split("/");
143
+ const fallbackId = nameParts.length > 1 ? nameParts[1].split(".")[0] : "";
144
+ const id = typeof file.id === "string" && file.id !== "" ? file.id : fallbackId;
145
+ const originalFilename = metadata?.["original-filename"];
146
+ const name = typeof originalFilename === "string" ? originalFilename : rawName;
147
+ const storage_session_id = typeof file.storage_session_id === "string" ? file.storage_session_id : sessionId;
148
+ const resource_id = typeof file.resource_id === "string" && file.resource_id !== "" ? file.resource_id : scope?.id ?? id;
149
+ if (scope?.kind === "skill") return {
150
+ storage_session_id,
151
+ kind: "skill",
152
+ id,
153
+ resource_id,
154
+ name,
155
+ version: scope.version
156
+ };
157
+ if (scope != null) return {
158
+ storage_session_id,
159
+ kind: scope.kind,
160
+ id,
161
+ resource_id,
162
+ name
163
+ };
164
+ return {
165
+ storage_session_id,
166
+ kind: "user",
167
+ id,
168
+ resource_id: id,
169
+ name
170
+ };
197
171
  }
198
172
  /**
199
- * Normalizes a tool name to Python identifier format.
200
- * Must match the Code API's `normalizePythonFunctionName` exactly:
201
- * 1. Replace hyphens and spaces with underscores
202
- * 2. Remove any other invalid characters
203
- * 3. Prefix with underscore if starts with number
204
- * 4. Append `_tool` if it's a Python keyword
205
- * @param name - The tool name to normalize
206
- * @returns Normalized Python-safe identifier
207
- */
173
+ * Normalizes a tool name to Python identifier format.
174
+ * Must match the Code API's `normalizePythonFunctionName` exactly:
175
+ * 1. Replace hyphens and spaces with underscores
176
+ * 2. Remove any other invalid characters
177
+ * 3. Prefix with underscore if starts with number
178
+ * 4. Append `_tool` if it's a Python keyword
179
+ * @param name - The tool name to normalize
180
+ * @returns Normalized Python-safe identifier
181
+ */
208
182
  function normalizeToPythonIdentifier(name) {
209
- let normalized = name.replace(/[-\s]/g, '_');
210
- normalized = normalized.replace(/[^a-zA-Z0-9_]/g, '');
211
- if (/^[0-9]/.test(normalized)) {
212
- normalized = '_' + normalized;
213
- }
214
- if (PYTHON_KEYWORDS.has(normalized)) {
215
- normalized = normalized + '_tool';
216
- }
217
- return normalized;
183
+ let normalized = name.replace(/[-\s]/g, "_");
184
+ normalized = normalized.replace(/[^a-zA-Z0-9_]/g, "");
185
+ if (/^[0-9]/.test(normalized)) normalized = "_" + normalized;
186
+ if (PYTHON_KEYWORDS.has(normalized)) normalized = normalized + "_tool";
187
+ return normalized;
218
188
  }
219
189
  /**
220
- * Extracts tool names that are actually called in the Python code.
221
- * Handles hyphen/underscore conversion since Python identifiers use underscores.
222
- * @param code - The Python code to analyze
223
- * @param toolNameMap - Map from normalized Python name to original tool name
224
- * @returns Set of original tool names found in the code
225
- */
190
+ * Extracts tool names that are actually called in the Python code.
191
+ * Handles hyphen/underscore conversion since Python identifiers use underscores.
192
+ * @param code - The Python code to analyze
193
+ * @param toolNameMap - Map from normalized Python name to original tool name
194
+ * @returns Set of original tool names found in the code
195
+ */
226
196
  function extractUsedToolNames(code, toolNameMap) {
227
- const usedTools = new Set();
228
- for (const [pythonName, originalName] of toolNameMap) {
229
- const escapedName = pythonName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
230
- const pattern = new RegExp(`\\b${escapedName}\\s*\\(`, 'g');
231
- if (pattern.test(code)) {
232
- usedTools.add(originalName);
233
- }
234
- }
235
- return usedTools;
197
+ const usedTools = /* @__PURE__ */ new Set();
198
+ for (const [pythonName, originalName] of toolNameMap) {
199
+ const escapedName = pythonName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
200
+ if (new RegExp(`\\b${escapedName}\\s*\\(`, "g").test(code)) usedTools.add(originalName);
201
+ }
202
+ return usedTools;
236
203
  }
237
204
  /**
238
- * Filters tool definitions to only include tools actually used in the code.
239
- * Handles the hyphen-to-underscore conversion for Python compatibility.
240
- * @param toolDefs - All available tool definitions
241
- * @param code - The Python code to analyze
242
- * @param debug - Enable debug logging
243
- * @returns Filtered array of tool definitions
244
- */
205
+ * Filters tool definitions to only include tools actually used in the code.
206
+ * Handles the hyphen-to-underscore conversion for Python compatibility.
207
+ * @param toolDefs - All available tool definitions
208
+ * @param code - The Python code to analyze
209
+ * @param debug - Enable debug logging
210
+ * @returns Filtered array of tool definitions
211
+ */
245
212
  function filterToolsByUsage(toolDefs, code, debug = false) {
246
- const toolNameMap = new Map();
247
- for (const tool of toolDefs) {
248
- const pythonName = normalizeToPythonIdentifier(tool.name);
249
- toolNameMap.set(pythonName, tool.name);
250
- }
251
- const usedToolNames = extractUsedToolNames(code, toolNameMap);
252
- if (debug) {
253
- // eslint-disable-next-line no-console
254
- console.log(`[PTC Debug] Tool filtering: found ${usedToolNames.size}/${toolDefs.length} tools in code`);
255
- if (usedToolNames.size > 0) {
256
- // eslint-disable-next-line no-console
257
- console.log(`[PTC Debug] Matched tools: ${Array.from(usedToolNames).join(', ')}`);
258
- }
259
- }
260
- if (usedToolNames.size === 0) {
261
- if (debug) {
262
- // eslint-disable-next-line no-console
263
- console.log('[PTC Debug] No tools detected in code - sending all tools as fallback');
264
- }
265
- return toolDefs;
266
- }
267
- return toolDefs.filter((tool) => usedToolNames.has(tool.name));
213
+ const toolNameMap = /* @__PURE__ */ new Map();
214
+ for (const tool of toolDefs) {
215
+ const pythonName = normalizeToPythonIdentifier(tool.name);
216
+ toolNameMap.set(pythonName, tool.name);
217
+ }
218
+ const usedToolNames = extractUsedToolNames(code, toolNameMap);
219
+ if (debug) {
220
+ console.log(`[PTC Debug] Tool filtering: found ${usedToolNames.size}/${toolDefs.length} tools in code`);
221
+ if (usedToolNames.size > 0) console.log(`[PTC Debug] Matched tools: ${Array.from(usedToolNames).join(", ")}`);
222
+ }
223
+ if (usedToolNames.size === 0) {
224
+ if (debug) console.log("[PTC Debug] No tools detected in code - sending all tools as fallback");
225
+ return toolDefs;
226
+ }
227
+ return toolDefs.filter((tool) => usedToolNames.has(tool.name));
268
228
  }
269
229
  async function fetchSessionFiles(baseUrl, sessionId, scopeOrProxy, proxyOrAuthHeaders, scopedAuthHeaders) {
270
- try {
271
- const scope = isFetchSessionFilesScope(scopeOrProxy)
272
- ? scopeOrProxy
273
- : undefined;
274
- let proxy;
275
- let authHeaders;
276
- if (scope == null) {
277
- proxy = typeof scopeOrProxy === 'string' ? scopeOrProxy : undefined;
278
- authHeaders = isCodeApiAuthHeaders(proxyOrAuthHeaders)
279
- ? proxyOrAuthHeaders
280
- : undefined;
281
- }
282
- else if (typeof proxyOrAuthHeaders === 'string') {
283
- proxy = proxyOrAuthHeaders;
284
- authHeaders = scopedAuthHeaders;
285
- }
286
- else {
287
- authHeaders = proxyOrAuthHeaders ?? scopedAuthHeaders;
288
- }
289
- const query = new URLSearchParams({ detail: 'full' });
290
- if (scope != null) {
291
- query.set('kind', scope.kind);
292
- query.set('id', scope.id);
293
- if (scope.kind === 'skill') {
294
- query.set('version', String(scope.version));
295
- }
296
- }
297
- const filesEndpoint = `${baseUrl}/files/${encodeURIComponent(sessionId)}?${query.toString()}`;
298
- const resolvedAuthHeaders = await CodeExecutor.resolveCodeApiAuthHeaders(authHeaders);
299
- const fetchOptions = {
300
- method: 'GET',
301
- headers: {
302
- 'User-Agent': 'LibreChat/1.0',
303
- ...resolvedAuthHeaders,
304
- },
305
- };
306
- if (proxy != null && proxy !== '') {
307
- fetchOptions.agent = new httpsProxyAgent.HttpsProxyAgent(proxy);
308
- }
309
- const response = await fetch(filesEndpoint, fetchOptions);
310
- if (!response.ok) {
311
- throw new Error(await CodeExecutor.buildCodeApiHttpErrorMessage('GET', filesEndpoint, response));
312
- }
313
- const files = await response.json();
314
- if (!Array.isArray(files) || files.length === 0) {
315
- return [];
316
- }
317
- return files
318
- .filter(isCodeApiSessionFileWire)
319
- .map((file) => normalizeSessionFile(file, sessionId, scope));
320
- }
321
- catch (error) {
322
- // eslint-disable-next-line no-console
323
- console.warn(`Failed to fetch files for session: ${sessionId}, ${error.message}`);
324
- return [];
325
- }
230
+ try {
231
+ const scope = isFetchSessionFilesScope(scopeOrProxy) ? scopeOrProxy : void 0;
232
+ let proxy;
233
+ let authHeaders;
234
+ if (scope == null) {
235
+ proxy = typeof scopeOrProxy === "string" ? scopeOrProxy : void 0;
236
+ authHeaders = isCodeApiAuthHeaders(proxyOrAuthHeaders) ? proxyOrAuthHeaders : void 0;
237
+ } else if (typeof proxyOrAuthHeaders === "string") {
238
+ proxy = proxyOrAuthHeaders;
239
+ authHeaders = scopedAuthHeaders;
240
+ } else authHeaders = proxyOrAuthHeaders ?? scopedAuthHeaders;
241
+ const query = new URLSearchParams({ detail: "full" });
242
+ if (scope != null) {
243
+ query.set("kind", scope.kind);
244
+ query.set("id", scope.id);
245
+ if (scope.kind === "skill") query.set("version", String(scope.version));
246
+ }
247
+ const filesEndpoint = `${baseUrl}/files/${encodeURIComponent(sessionId)}?${query.toString()}`;
248
+ const fetchOptions = {
249
+ method: "GET",
250
+ headers: {
251
+ "User-Agent": "LibreChat/1.0",
252
+ ...await require_CodeExecutor.resolveCodeApiAuthHeaders(authHeaders)
253
+ }
254
+ };
255
+ if (proxy != null && proxy !== "") fetchOptions.agent = new https_proxy_agent.HttpsProxyAgent(proxy);
256
+ const response = await (0, node_fetch.default)(filesEndpoint, fetchOptions);
257
+ if (!response.ok) throw new Error(await require_CodeExecutor.buildCodeApiHttpErrorMessage("GET", filesEndpoint, response));
258
+ const files = await response.json();
259
+ if (!Array.isArray(files) || files.length === 0) return [];
260
+ return files.filter(isCodeApiSessionFileWire).map((file) => normalizeSessionFile(file, sessionId, scope));
261
+ } catch (error) {
262
+ console.warn(`Failed to fetch files for session: ${sessionId}, ${error.message}`);
263
+ return [];
264
+ }
326
265
  }
327
266
  /**
328
- * Makes an HTTP request to the Code API.
329
- * @param endpoint - The API endpoint URL
330
- * @param body - The request body
331
- * @param proxy - Optional HTTP proxy URL
332
- * @returns The parsed API response
333
- */
267
+ * Makes an HTTP request to the Code API.
268
+ * @param endpoint - The API endpoint URL
269
+ * @param body - The request body
270
+ * @param proxy - Optional HTTP proxy URL
271
+ * @returns The parsed API response
272
+ */
334
273
  async function makeRequest(endpoint, body, proxy, authHeaders) {
335
- const resolvedAuthHeaders = await CodeExecutor.resolveCodeApiAuthHeaders(authHeaders);
336
- const fetchOptions = {
337
- method: 'POST',
338
- headers: {
339
- 'Content-Type': 'application/json',
340
- 'User-Agent': 'LibreChat/1.0',
341
- ...resolvedAuthHeaders,
342
- },
343
- body: JSON.stringify(body),
344
- };
345
- if (proxy != null && proxy !== '') {
346
- fetchOptions.agent = new httpsProxyAgent.HttpsProxyAgent(proxy);
347
- }
348
- const response = await fetch(endpoint, fetchOptions);
349
- if (!response.ok) {
350
- throw new Error(await CodeExecutor.buildCodeApiHttpErrorMessage('POST', endpoint, response));
351
- }
352
- return (await response.json());
274
+ const fetchOptions = {
275
+ method: "POST",
276
+ headers: {
277
+ "Content-Type": "application/json",
278
+ "User-Agent": "LibreChat/1.0",
279
+ ...await require_CodeExecutor.resolveCodeApiAuthHeaders(authHeaders)
280
+ },
281
+ body: JSON.stringify(body)
282
+ };
283
+ if (proxy != null && proxy !== "") fetchOptions.agent = new https_proxy_agent.HttpsProxyAgent(proxy);
284
+ const response = await (0, node_fetch.default)(endpoint, fetchOptions);
285
+ if (!response.ok) throw new Error(await require_CodeExecutor.buildCodeApiHttpErrorMessage("POST", endpoint, response));
286
+ return await response.json();
353
287
  }
354
288
  /**
355
- * Unwraps tool responses that may be formatted as tuples or content blocks.
356
- * MCP tools return [content, artifacts], we need to extract the raw data.
357
- * @param result - The raw result from tool.invoke()
358
- * @param isMCPTool - Whether this is an MCP tool (has mcp property)
359
- * @returns Unwrapped raw data (string, object, or parsed JSON)
360
- */
289
+ * Unwraps tool responses that may be formatted as tuples or content blocks.
290
+ * MCP tools return [content, artifacts], we need to extract the raw data.
291
+ * @param result - The raw result from tool.invoke()
292
+ * @param isMCPTool - Whether this is an MCP tool (has mcp property)
293
+ * @returns Unwrapped raw data (string, object, or parsed JSON)
294
+ */
361
295
  function unwrapToolResponse(result, isMCPTool) {
362
- // Only unwrap if this is an MCP tool and result is a tuple
363
- if (!isMCPTool) {
364
- return result;
365
- }
366
- /**
367
- * Checks if a value is a content block object (has type and text).
368
- */
369
- const isContentBlock = (value) => {
370
- if (typeof value !== 'object' || value === null || Array.isArray(value)) {
371
- return false;
372
- }
373
- const obj = value;
374
- return typeof obj.type === 'string';
375
- };
376
- /**
377
- * Checks if an array is an array of content blocks.
378
- */
379
- const isContentBlockArray = (arr) => {
380
- return arr.length > 0 && arr.every(isContentBlock);
381
- };
382
- /**
383
- * Extracts text from a single content block object.
384
- * Returns the text if it's a text block, otherwise returns null.
385
- */
386
- const extractTextFromBlock = (block) => {
387
- if (typeof block !== 'object' || block === null)
388
- return null;
389
- const b = block;
390
- if (b.type === 'text' && typeof b.text === 'string') {
391
- return b.text;
392
- }
393
- return null;
394
- };
395
- /**
396
- * Extracts text from content blocks (array or single object).
397
- * Returns combined text or null if no text blocks found.
398
- */
399
- const extractTextFromContent = (content) => {
400
- // Single content block object: { type: 'text', text: '...' }
401
- if (typeof content === 'object' &&
402
- content !== null &&
403
- !Array.isArray(content)) {
404
- const text = extractTextFromBlock(content);
405
- if (text !== null)
406
- return text;
407
- }
408
- // Array of content blocks: [{ type: 'text', text: '...' }, ...]
409
- if (Array.isArray(content) && content.length > 0) {
410
- const texts = content
411
- .map(extractTextFromBlock)
412
- .filter((t) => t !== null);
413
- if (texts.length > 0) {
414
- return texts.join('\n');
415
- }
416
- }
417
- return null;
418
- };
419
- /**
420
- * Tries to parse a string as JSON if it looks like JSON.
421
- */
422
- const maybeParseJSON = (str) => {
423
- const trimmed = str.trim();
424
- if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
425
- try {
426
- return JSON.parse(trimmed);
427
- }
428
- catch {
429
- return str;
430
- }
431
- }
432
- return str;
433
- };
434
- // Handle array of content blocks at top level FIRST
435
- // (before checking for tuple, since both are arrays)
436
- if (Array.isArray(result) && isContentBlockArray(result)) {
437
- const extractedText = extractTextFromContent(result);
438
- if (extractedText !== null) {
439
- return maybeParseJSON(extractedText);
440
- }
441
- }
442
- // Check if result is a tuple/array with [content, artifacts]
443
- if (Array.isArray(result) && result.length >= 1) {
444
- const [content] = result;
445
- // If first element is a string, return it (possibly parsed as JSON)
446
- if (typeof content === 'string') {
447
- return maybeParseJSON(content);
448
- }
449
- // Try to extract text from content blocks
450
- const extractedText = extractTextFromContent(content);
451
- if (extractedText !== null) {
452
- return maybeParseJSON(extractedText);
453
- }
454
- // If first element is an object (but not a text block), return it
455
- if (typeof content === 'object' && content !== null) {
456
- return content;
457
- }
458
- }
459
- // Handle single content block object at top level (not in tuple)
460
- const extractedText = extractTextFromContent(result);
461
- if (extractedText !== null) {
462
- return maybeParseJSON(extractedText);
463
- }
464
- // Not a formatted response, return as-is
465
- return result;
296
+ if (!isMCPTool) return result;
297
+ /**
298
+ * Checks if a value is a content block object (has type and text).
299
+ */
300
+ const isContentBlock = (value) => {
301
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
302
+ return typeof value.type === "string";
303
+ };
304
+ /**
305
+ * Checks if an array is an array of content blocks.
306
+ */
307
+ const isContentBlockArray = (arr) => {
308
+ return arr.length > 0 && arr.every(isContentBlock);
309
+ };
310
+ /**
311
+ * Extracts text from a single content block object.
312
+ * Returns the text if it's a text block, otherwise returns null.
313
+ */
314
+ const extractTextFromBlock = (block) => {
315
+ if (typeof block !== "object" || block === null) return null;
316
+ const b = block;
317
+ if (b.type === "text" && typeof b.text === "string") return b.text;
318
+ return null;
319
+ };
320
+ /**
321
+ * Extracts text from content blocks (array or single object).
322
+ * Returns combined text or null if no text blocks found.
323
+ */
324
+ const extractTextFromContent = (content) => {
325
+ if (typeof content === "object" && content !== null && !Array.isArray(content)) {
326
+ const text = extractTextFromBlock(content);
327
+ if (text !== null) return text;
328
+ }
329
+ if (Array.isArray(content) && content.length > 0) {
330
+ const texts = content.map(extractTextFromBlock).filter((t) => t !== null);
331
+ if (texts.length > 0) return texts.join("\n");
332
+ }
333
+ return null;
334
+ };
335
+ /**
336
+ * Tries to parse a string as JSON if it looks like JSON.
337
+ */
338
+ const maybeParseJSON = (str) => {
339
+ const trimmed = str.trim();
340
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) try {
341
+ return JSON.parse(trimmed);
342
+ } catch {
343
+ return str;
344
+ }
345
+ return str;
346
+ };
347
+ if (Array.isArray(result) && isContentBlockArray(result)) {
348
+ const extractedText = extractTextFromContent(result);
349
+ if (extractedText !== null) return maybeParseJSON(extractedText);
350
+ }
351
+ if (Array.isArray(result) && result.length >= 1) {
352
+ const [content] = result;
353
+ if (typeof content === "string") return maybeParseJSON(content);
354
+ const extractedText = extractTextFromContent(content);
355
+ if (extractedText !== null) return maybeParseJSON(extractedText);
356
+ if (typeof content === "object" && content !== null) return content;
357
+ }
358
+ const extractedText = extractTextFromContent(result);
359
+ if (extractedText !== null) return maybeParseJSON(extractedText);
360
+ return result;
466
361
  }
467
362
  function detectSchemaKind(schema) {
468
- const kind = { object: false, string: false };
469
- if (!schema || typeof schema !== 'object') {
470
- return kind;
471
- }
472
- const jsonSchemaType = schema.type;
473
- if (jsonSchemaType === 'object') {
474
- kind.object = true;
475
- }
476
- else if (jsonSchemaType === 'string') {
477
- kind.string = true;
478
- }
479
- else if (Array.isArray(jsonSchemaType)) {
480
- kind.object = jsonSchemaType.includes('object');
481
- kind.string = jsonSchemaType.includes('string');
482
- }
483
- const zodDef = schema._def;
484
- if (!zodDef || typeof zodDef !== 'object') {
485
- return kind;
486
- }
487
- const zodType = zodDef.type;
488
- const zodTypeName = zodDef
489
- .typeName;
490
- if (zodType === 'object' || zodTypeName === 'ZodObject') {
491
- kind.object = true;
492
- }
493
- else if (zodType === 'string' || zodTypeName === 'ZodString') {
494
- kind.string = true;
495
- }
496
- const innerSchema = zodDef.innerType ?? zodDef.schema;
497
- if (innerSchema) {
498
- const innerKind = detectSchemaKind(innerSchema);
499
- kind.object ||= innerKind.object;
500
- kind.string ||= innerKind.string;
501
- }
502
- const options = zodDef.options;
503
- if (Array.isArray(options)) {
504
- for (const option of options) {
505
- const optionKind = detectSchemaKind(option);
506
- kind.object ||= optionKind.object;
507
- kind.string ||= optionKind.string;
508
- }
509
- }
510
- return kind;
363
+ const kind = {
364
+ object: false,
365
+ string: false
366
+ };
367
+ if (!schema || typeof schema !== "object") return kind;
368
+ const jsonSchemaType = schema.type;
369
+ if (jsonSchemaType === "object") kind.object = true;
370
+ else if (jsonSchemaType === "string") kind.string = true;
371
+ else if (Array.isArray(jsonSchemaType)) {
372
+ kind.object = jsonSchemaType.includes("object");
373
+ kind.string = jsonSchemaType.includes("string");
374
+ }
375
+ const zodDef = schema._def;
376
+ if (!zodDef || typeof zodDef !== "object") return kind;
377
+ const zodType = zodDef.type;
378
+ const zodTypeName = zodDef.typeName;
379
+ if (zodType === "object" || zodTypeName === "ZodObject") kind.object = true;
380
+ else if (zodType === "string" || zodTypeName === "ZodString") kind.string = true;
381
+ const innerSchema = zodDef.innerType ?? zodDef.schema;
382
+ if (innerSchema) {
383
+ const innerKind = detectSchemaKind(innerSchema);
384
+ kind.object ||= innerKind.object;
385
+ kind.string ||= innerKind.string;
386
+ }
387
+ const options = zodDef.options;
388
+ if (Array.isArray(options)) for (const option of options) {
389
+ const optionKind = detectSchemaKind(option);
390
+ kind.object ||= optionKind.object;
391
+ kind.string ||= optionKind.string;
392
+ }
393
+ return kind;
511
394
  }
512
395
  function getToolInputSchemaKind(tool) {
513
- if (tool.constructor.name === 'DynamicTool') {
514
- return { object: false, string: true };
515
- }
516
- const schema = tool.schema;
517
- return detectSchemaKind(schema);
396
+ if (tool.constructor.name === "DynamicTool") return {
397
+ object: false,
398
+ string: true
399
+ };
400
+ const schema = tool.schema;
401
+ return detectSchemaKind(schema);
518
402
  }
519
403
  function normalizeToolInput(input, tool) {
520
- const schemaKind = getToolInputSchemaKind(tool);
521
- if (typeof input !== 'string') {
522
- if (!schemaKind.string || schemaKind.object) {
523
- return input;
524
- }
525
- const inputValue = input.input;
526
- if (typeof inputValue === 'string') {
527
- return input;
528
- }
529
- return JSON.stringify(input);
530
- }
531
- if (!schemaKind.object || schemaKind.string) {
532
- return input;
533
- }
534
- const trimmed = input.trim();
535
- if (!trimmed.startsWith('{')) {
536
- return input;
537
- }
538
- try {
539
- const parsed = JSON.parse(trimmed);
540
- if (typeof parsed === 'object' &&
541
- parsed !== null &&
542
- !Array.isArray(parsed)) {
543
- return parsed;
544
- }
545
- }
546
- catch {
547
- return input;
548
- }
549
- return input;
404
+ const schemaKind = getToolInputSchemaKind(tool);
405
+ if (typeof input !== "string") {
406
+ if (!schemaKind.string || schemaKind.object) return input;
407
+ if (typeof input.input === "string") return input;
408
+ return JSON.stringify(input);
409
+ }
410
+ if (!schemaKind.object || schemaKind.string) return input;
411
+ const trimmed = input.trim();
412
+ if (!trimmed.startsWith("{")) return input;
413
+ try {
414
+ const parsed = JSON.parse(trimmed);
415
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) return parsed;
416
+ } catch {
417
+ return input;
418
+ }
419
+ return input;
550
420
  }
551
421
  /**
552
- * Executes tools in parallel when requested by the API.
553
- * Uses Promise.all for parallel execution, catching individual errors.
554
- * Unwraps formatted responses (e.g., MCP tool tuples) to raw data.
555
- * @param toolCalls - Array of tool calls from the API
556
- * @param toolMap - Map of tool names to executable tools
557
- * @returns Array of tool results
558
- */
559
- async function executeTools(toolCalls, toolMap, programmaticToolName = _enum.Constants.PROGRAMMATIC_TOOL_CALLING) {
560
- const executions = toolCalls.map(async (call) => {
561
- const tool = toolMap.get(call.name);
562
- if (!tool) {
563
- return {
564
- call_id: call.id,
565
- result: null,
566
- is_error: true,
567
- error_message: `Tool '${call.name}' not found. Available tools: ${Array.from(toolMap.keys()).join(', ')}`,
568
- };
569
- }
570
- try {
571
- const result = await tool.invoke(normalizeToolInput(call.input, tool), {
572
- metadata: { [programmaticToolName]: true },
573
- });
574
- const isMCPTool = tool.mcp === true;
575
- const unwrappedResult = unwrapToolResponse(result, isMCPTool);
576
- return {
577
- call_id: call.id,
578
- result: unwrappedResult,
579
- is_error: false,
580
- };
581
- }
582
- catch (error) {
583
- return {
584
- call_id: call.id,
585
- result: null,
586
- is_error: true,
587
- error_message: error.message || 'Tool execution failed',
588
- };
589
- }
590
- });
591
- return await Promise.all(executions);
422
+ * Executes tools in parallel when requested by the API.
423
+ * Uses Promise.all for parallel execution, catching individual errors.
424
+ * Unwraps formatted responses (e.g., MCP tool tuples) to raw data.
425
+ * @param toolCalls - Array of tool calls from the API
426
+ * @param toolMap - Map of tool names to executable tools
427
+ * @returns Array of tool results
428
+ */
429
+ async function executeTools(toolCalls, toolMap, programmaticToolName = "run_tools_with_code") {
430
+ const executions = toolCalls.map(async (call) => {
431
+ const tool = toolMap.get(call.name);
432
+ if (!tool) return {
433
+ call_id: call.id,
434
+ result: null,
435
+ is_error: true,
436
+ error_message: `Tool '${call.name}' not found. Available tools: ${Array.from(toolMap.keys()).join(", ")}`
437
+ };
438
+ try {
439
+ const unwrappedResult = unwrapToolResponse(await tool.invoke(normalizeToolInput(call.input, tool), { metadata: { [programmaticToolName]: true } }), tool.mcp === true);
440
+ return {
441
+ call_id: call.id,
442
+ result: unwrappedResult,
443
+ is_error: false
444
+ };
445
+ } catch (error) {
446
+ return {
447
+ call_id: call.id,
448
+ result: null,
449
+ is_error: true,
450
+ error_message: error.message || "Tool execution failed"
451
+ };
452
+ }
453
+ });
454
+ return await Promise.all(executions);
592
455
  }
593
456
  /**
594
- * Formats the completed response for the agent.
595
- *
596
- * Output includes stdout/stderr plus a compact session-file summary
597
- * when artifacts were persisted. The artifact still carries every
598
- * file so the host's session map stays in sync.
599
- *
600
- * @param response - The completed API response
601
- * @returns Tuple of [formatted string, artifact]
602
- */
603
- function formatCompletedResponse(response, sourceCode = '') {
604
- let formatted = '';
605
- if (response.stdout != null && response.stdout !== '') {
606
- formatted += `stdout:\n${response.stdout}\n`;
607
- }
608
- else {
609
- formatted += CodeExecutor.emptyOutputMessage;
610
- }
611
- if (response.stderr != null && response.stderr !== '') {
612
- formatted += `stderr:\n${response.stderr}\n`;
613
- }
614
- const outputWithReminder = CodeExecutor.appendTmpScratchReminder(formatted, sourceCode);
615
- return [
616
- CodeSessionFileSummary.appendCodeSessionFileSummary(outputWithReminder, response.files),
617
- {
618
- session_id: response.session_id,
619
- files: response.files,
620
- },
621
- ];
457
+ * Formats the completed response for the agent.
458
+ *
459
+ * Output includes stdout/stderr plus a compact session-file summary
460
+ * when artifacts were persisted. The artifact still carries every
461
+ * file so the host's session map stays in sync.
462
+ *
463
+ * @param response - The completed API response
464
+ * @returns Tuple of [formatted string, artifact]
465
+ */
466
+ function formatCompletedResponse(response, sourceCode = "") {
467
+ let formatted = "";
468
+ if (response.stdout != null && response.stdout !== "") formatted += `stdout:\n${response.stdout}\n`;
469
+ else formatted += require_CodeExecutor.emptyOutputMessage;
470
+ if (response.stderr != null && response.stderr !== "") formatted += `stderr:\n${response.stderr}\n`;
471
+ return [require_CodeSessionFileSummary.appendCodeSessionFileSummary(require_CodeExecutor.appendTmpScratchReminder(formatted, sourceCode), response.files), {
472
+ session_id: response.session_id,
473
+ files: response.files
474
+ }];
622
475
  }
623
- // ============================================================================
624
- // Tool Factory
625
- // ============================================================================
626
476
  /**
627
- * Creates a Programmatic Tool Calling tool for complex multi-tool workflows.
628
- *
629
- * This tool enables AI agents to write Python code that orchestrates multiple
630
- * tool calls programmatically, reducing LLM round-trips and token usage.
631
- *
632
- * The tool map must be provided at runtime via config.configurable.toolMap.
633
- *
634
- * @param params - Configuration parameters (baseUrl, maxRoundTrips, proxy)
635
- * @returns A LangChain DynamicStructuredTool for programmatic tool calling
636
- *
637
- * @example
638
- * const ptcTool = createProgrammaticToolCallingTool({ maxRoundTrips: 20 });
639
- *
640
- * const [output, artifact] = await ptcTool.invoke(
641
- * { code, tools },
642
- * { configurable: { toolMap } }
643
- * );
644
- */
477
+ * Creates a Programmatic Tool Calling tool for complex multi-tool workflows.
478
+ *
479
+ * This tool enables AI agents to write Python code that orchestrates multiple
480
+ * tool calls programmatically, reducing LLM round-trips and token usage.
481
+ *
482
+ * The tool map must be provided at runtime via config.configurable.toolMap.
483
+ *
484
+ * @param params - Configuration parameters (baseUrl, maxRoundTrips, proxy)
485
+ * @returns A LangChain DynamicStructuredTool for programmatic tool calling
486
+ *
487
+ * @example
488
+ * const ptcTool = createProgrammaticToolCallingTool({ maxRoundTrips: 20 });
489
+ *
490
+ * const [output, artifact] = await ptcTool.invoke(
491
+ * { code, tools },
492
+ * { configurable: { toolMap } }
493
+ * );
494
+ */
645
495
  function createProgrammaticToolCallingTool(initParams = {}) {
646
- const baseUrl = initParams.baseUrl ?? CodeExecutor.getCodeBaseURL();
647
- const maxRoundTrips = initParams.maxRoundTrips ?? DEFAULT_MAX_ROUND_TRIPS;
648
- const maxRunTimeoutMs = ptcTimeout.resolveCodeApiRunTimeoutMs(initParams.runTimeoutMs);
649
- const proxy = initParams.proxy ?? process.env.PROXY;
650
- const debug = initParams.debug ?? process.env.PTC_DEBUG === 'true';
651
- const EXEC_ENDPOINT = `${baseUrl}/exec/programmatic`;
652
- return tools.tool(async (rawParams, config) => {
653
- const params = rawParams;
654
- const { code } = params;
655
- const timeout = ptcTimeout.clampCodeApiRunTimeoutMs(params.timeout, maxRunTimeoutMs);
656
- // Extra params injected by ToolNode (follows web_search pattern).
657
- const toolCall = (config.toolCall ?? {});
658
- const { toolMap, toolDefs, session_id, _injected_files } = toolCall;
659
- if (toolMap == null || toolMap.size === 0) {
660
- throw new Error('No toolMap provided. ' +
661
- 'ToolNode should inject this from AgentContext when invoked through the graph.');
662
- }
663
- if (toolDefs == null || toolDefs.length === 0) {
664
- throw new Error('No tool definitions provided. ' +
665
- 'Either pass tools in the input or ensure ToolNode injects toolDefs.');
666
- }
667
- let roundTrip = 0;
668
- try {
669
- // ====================================================================
670
- // Phase 1: Filter tools and make initial request
671
- // ====================================================================
672
- const effectiveTools = filterToolsByUsage(toolDefs, code, debug);
673
- if (debug) {
674
- // eslint-disable-next-line no-console
675
- console.log(`[PTC Debug] Sending ${effectiveTools.length} tools to API ` +
676
- `(filtered from ${toolDefs.length})`);
677
- }
678
- /**
679
- * File injection: `_injected_files` from ToolNode session
680
- * context. The legacy `/files/<session_id>` HTTP fallback was
681
- * removed (see `CodeExecutor.ts`) codeapi's sessionAuth now
682
- * requires kind/id query params unavailable at this point.
683
- */
684
- let files;
685
- if (_injected_files && _injected_files.length > 0) {
686
- files = _injected_files;
687
- }
688
- else if (session_id != null && session_id.length > 0) {
689
- // eslint-disable-next-line no-console
690
- console.debug(`[ProgrammaticToolCalling] No injected files for session_id=${session_id} exec will run without input files`);
691
- }
692
- let response = await makeRequest(EXEC_ENDPOINT, {
693
- code,
694
- tools: effectiveTools,
695
- session_id,
696
- timeout,
697
- ...(files && files.length > 0 ? { files } : {}),
698
- }, proxy, initParams.authHeaders);
699
- // ====================================================================
700
- // Phase 2: Handle response loop
701
- // ====================================================================
702
- while (response.status === 'tool_call_required') {
703
- roundTrip++;
704
- if (roundTrip > maxRoundTrips) {
705
- throw new Error(`Exceeded maximum round trips (${maxRoundTrips}). ` +
706
- 'This may indicate an infinite loop, excessive tool calls, ' +
707
- 'or a logic error in your code.');
708
- }
709
- if (debug) {
710
- // eslint-disable-next-line no-console
711
- console.log(`[PTC Debug] Round trip ${roundTrip}: ${response.tool_calls?.length ?? 0} tool(s) to execute`);
712
- }
713
- const toolResults = await executeTools(response.tool_calls ?? [], toolMap);
714
- response = await makeRequest(EXEC_ENDPOINT, {
715
- continuation_token: response.continuation_token,
716
- tool_results: toolResults,
717
- }, proxy, initParams.authHeaders);
718
- }
719
- // ====================================================================
720
- // Phase 3: Handle final state
721
- // ====================================================================
722
- if (response.status === 'completed') {
723
- return formatCompletedResponse(response, code);
724
- }
725
- if (response.status === 'error') {
726
- throw new Error(`Execution error: ${response.error}` +
727
- (response.stderr != null && response.stderr !== ''
728
- ? `\n\nStderr:\n${response.stderr}`
729
- : ''));
730
- }
731
- throw new Error(`Unexpected response status: ${response.status}`);
732
- }
733
- catch (error) {
734
- const messageWithReminder = CodeExecutor.appendFailedExecutionFileReminder(error.message, code);
735
- throw new Error(`Programmatic execution failed: ${messageWithReminder}`);
736
- }
737
- }, {
738
- name: _enum.Constants.PROGRAMMATIC_TOOL_CALLING,
739
- description: ProgrammaticToolCallingDescription,
740
- schema: createProgrammaticToolCallingSchema(maxRunTimeoutMs),
741
- responseFormat: _enum.Constants.CONTENT_AND_ARTIFACT,
742
- });
496
+ const baseUrl = initParams.baseUrl ?? require_CodeExecutor.getCodeBaseURL();
497
+ const maxRoundTrips = initParams.maxRoundTrips ?? DEFAULT_MAX_ROUND_TRIPS;
498
+ const maxRunTimeoutMs = require_ptcTimeout.resolveCodeApiRunTimeoutMs(initParams.runTimeoutMs);
499
+ const proxy = initParams.proxy ?? process.env.PROXY;
500
+ const debug = initParams.debug ?? process.env.PTC_DEBUG === "true";
501
+ const EXEC_ENDPOINT = `${baseUrl}/exec/programmatic`;
502
+ return (0, _langchain_core_tools.tool)(async (rawParams, config) => {
503
+ const params = rawParams;
504
+ const { code } = params;
505
+ const timeout = require_ptcTimeout.clampCodeApiRunTimeoutMs(params.timeout, maxRunTimeoutMs);
506
+ const { toolMap, toolDefs, session_id, _injected_files } = config.toolCall ?? {};
507
+ if (toolMap == null || toolMap.size === 0) throw new Error("No toolMap provided. ToolNode should inject this from AgentContext when invoked through the graph.");
508
+ if (toolDefs == null || toolDefs.length === 0) throw new Error("No tool definitions provided. Either pass tools in the input or ensure ToolNode injects toolDefs.");
509
+ let roundTrip = 0;
510
+ try {
511
+ const effectiveTools = filterToolsByUsage(toolDefs, code, debug);
512
+ if (debug) console.log(`[PTC Debug] Sending ${effectiveTools.length} tools to API (filtered from ${toolDefs.length})`);
513
+ /**
514
+ * File injection: `_injected_files` from ToolNode session
515
+ * context. The legacy `/files/<session_id>` HTTP fallback was
516
+ * removed (see `CodeExecutor.ts`) — codeapi's sessionAuth now
517
+ * requires kind/id query params unavailable at this point.
518
+ */
519
+ let files;
520
+ if (_injected_files && _injected_files.length > 0) files = _injected_files;
521
+ else if (session_id != null && session_id.length > 0) console.debug(`[ProgrammaticToolCalling] No injected files for session_id=${session_id} — exec will run without input files`);
522
+ let response = await makeRequest(EXEC_ENDPOINT, {
523
+ code,
524
+ tools: effectiveTools,
525
+ session_id,
526
+ timeout,
527
+ ...files && files.length > 0 ? { files } : {}
528
+ }, proxy, initParams.authHeaders);
529
+ while (response.status === "tool_call_required") {
530
+ roundTrip++;
531
+ if (roundTrip > maxRoundTrips) throw new Error(`Exceeded maximum round trips (${maxRoundTrips}). This may indicate an infinite loop, excessive tool calls, or a logic error in your code.`);
532
+ if (debug) console.log(`[PTC Debug] Round trip ${roundTrip}: ${response.tool_calls?.length ?? 0} tool(s) to execute`);
533
+ const toolResults = await executeTools(response.tool_calls ?? [], toolMap);
534
+ response = await makeRequest(EXEC_ENDPOINT, {
535
+ continuation_token: response.continuation_token,
536
+ tool_results: toolResults
537
+ }, proxy, initParams.authHeaders);
538
+ }
539
+ if (response.status === "completed") return formatCompletedResponse(response, code);
540
+ if (response.status === "error") throw new Error(`Execution error: ${response.error}` + (response.stderr != null && response.stderr !== "" ? `\n\nStderr:\n${response.stderr}` : ""));
541
+ throw new Error(`Unexpected response status: ${response.status}`);
542
+ } catch (error) {
543
+ const messageWithReminder = require_CodeExecutor.appendFailedExecutionFileReminder(error.message, code);
544
+ throw new Error(`Programmatic execution failed: ${messageWithReminder}`);
545
+ }
546
+ }, {
547
+ name: "run_tools_with_code",
548
+ description: ProgrammaticToolCallingDescription,
549
+ schema: createProgrammaticToolCallingSchema(maxRunTimeoutMs),
550
+ responseFormat: "content_and_artifact"
551
+ });
743
552
  }
744
-
553
+ //#endregion
745
554
  exports.ProgrammaticToolCallingDefinition = ProgrammaticToolCallingDefinition;
746
555
  exports.ProgrammaticToolCallingDescription = ProgrammaticToolCallingDescription;
747
556
  exports.ProgrammaticToolCallingName = ProgrammaticToolCallingName;
@@ -756,4 +565,5 @@ exports.formatCompletedResponse = formatCompletedResponse;
756
565
  exports.makeRequest = makeRequest;
757
566
  exports.normalizeToPythonIdentifier = normalizeToPythonIdentifier;
758
567
  exports.unwrapToolResponse = unwrapToolResponse;
759
- //# sourceMappingURL=ProgrammaticToolCalling.cjs.map
568
+
569
+ //# sourceMappingURL=ProgrammaticToolCalling.cjs.map