@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,575 +1,482 @@
1
- import { PassThrough } from 'stream';
2
- import { posix } from 'path';
3
- import { EventEmitter } from 'events';
4
- import { validateBashCommand, LOCAL_SPAWN_TIMEOUT_MS } from '../local/LocalExecutionEngine.mjs';
5
-
6
- const DEFAULT_WORKSPACE_ROOT = '/workspace';
7
- const DEFAULT_TIMEOUT_MS = 60000;
8
- const DEFAULT_MAX_OUTPUT_CHARS = 200000;
1
+ import { LOCAL_SPAWN_TIMEOUT_MS, validateBashCommand } from "../local/LocalExecutionEngine.mjs";
2
+ import { posix } from "path";
3
+ import { PassThrough } from "stream";
4
+ import { EventEmitter } from "events";
5
+ //#region src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts
6
+ const DEFAULT_WORKSPACE_ROOT = "/workspace";
7
+ const DEFAULT_TIMEOUT_MS = 6e4;
8
+ const DEFAULT_MAX_OUTPUT_CHARS = 2e5;
9
9
  const PROTECTED_TARGET_ARG_RE = /^(?:\/|~|\$\{?HOME\}?|\.)(?:\/?\.?\*|\/)?$/;
10
10
  const DESTRUCTIVE_OP_IN_COMMAND_RE = /\b(?:rm\s+-[^\s]*[rf]|chmod\s+-R|chown\s+-R)\b/;
11
- const sandboxFactoryCache = new WeakMap();
11
+ const sandboxFactoryCache = /* @__PURE__ */ new WeakMap();
12
12
  function normalizeWorkspaceRoot(workspaceRoot) {
13
- const normalized = posix.normalize(workspaceRoot);
14
- return normalized === '/' ? normalized : normalized.replace(/\/+$/, '');
13
+ const normalized = posix.normalize(workspaceRoot);
14
+ return normalized === "/" ? normalized : normalized.replace(/\/+$/, "");
15
15
  }
16
16
  function getCloudflareWorkspaceRoot(config) {
17
- return normalizeWorkspaceRoot(config?.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT);
17
+ return normalizeWorkspaceRoot(config?.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT);
18
18
  }
19
19
  async function resolveCloudflareSandbox(config) {
20
- const sandbox = config.sandbox;
21
- if (typeof sandbox !== 'function') {
22
- return sandbox;
23
- }
24
- let cached = sandboxFactoryCache.get(config);
25
- if (cached == null) {
26
- cached = Promise.resolve()
27
- .then(() => sandbox())
28
- .catch((error) => {
29
- sandboxFactoryCache.delete(config);
30
- throw error;
31
- });
32
- sandboxFactoryCache.set(config, cached);
33
- }
34
- return cached;
20
+ const sandbox = config.sandbox;
21
+ if (typeof sandbox !== "function") return sandbox;
22
+ let cached = sandboxFactoryCache.get(config);
23
+ if (cached == null) {
24
+ cached = Promise.resolve().then(() => sandbox()).catch((error) => {
25
+ sandboxFactoryCache.delete(config);
26
+ throw error;
27
+ });
28
+ sandboxFactoryCache.set(config, cached);
29
+ }
30
+ return cached;
35
31
  }
36
32
  async function getRuntimeContext(config) {
37
- return {
38
- sandbox: await resolveCloudflareSandbox(config),
39
- workspaceRoot: getCloudflareWorkspaceRoot(config),
40
- env: config.env,
41
- timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,
42
- maxOutputChars: config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS,
43
- shell: config.shell ?? 'bash',
44
- };
33
+ return {
34
+ sandbox: await resolveCloudflareSandbox(config),
35
+ workspaceRoot: getCloudflareWorkspaceRoot(config),
36
+ env: config.env,
37
+ timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,
38
+ maxOutputChars: config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS,
39
+ shell: config.shell ?? "bash"
40
+ };
45
41
  }
46
42
  function toSandboxPath(filePath, workspaceRoot) {
47
- const raw = filePath === '' ? '.' : filePath;
48
- const root = normalizeWorkspaceRoot(workspaceRoot);
49
- const resolved = raw.startsWith('/')
50
- ? posix.normalize(raw)
51
- : posix.resolve(root, raw);
52
- if (root === '/') {
53
- return resolved;
54
- }
55
- if (resolved === root || resolved.startsWith(`${root}/`)) {
56
- return resolved;
57
- }
58
- throw new Error(`Path is outside the Cloudflare sandbox workspace: ${filePath}`);
43
+ const raw = filePath === "" ? "." : filePath;
44
+ const root = normalizeWorkspaceRoot(workspaceRoot);
45
+ const resolved = raw.startsWith("/") ? posix.normalize(raw) : posix.resolve(root, raw);
46
+ if (root === "/") return resolved;
47
+ if (resolved === root || resolved.startsWith(`${root}/`)) return resolved;
48
+ throw new Error(`Path is outside the Cloudflare sandbox workspace: ${filePath}`);
59
49
  }
60
50
  function quote(value) {
61
- if (value === '') {
62
- return '\'\'';
63
- }
64
- if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {
65
- return value;
66
- }
67
- return `'${value.replace(/'/g, '\'\\\'\'')}'`;
51
+ if (value === "") return "''";
52
+ if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) return value;
53
+ return `'${value.replace(/'/g, "'\\''")}'`;
68
54
  }
69
55
  function withInSandboxTimeout(command, timeoutMs) {
70
- const timeoutSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));
71
- return `timeout -k 2s ${timeoutSeconds}s ${command}`;
56
+ return `timeout -k 2s ${Math.max(1, Math.ceil(timeoutMs / 1e3))}s ${command}`;
72
57
  }
73
58
  function outerTimeoutMs(timeoutMs) {
74
- return timeoutMs + 5000;
59
+ return timeoutMs + 5e3;
75
60
  }
76
61
  function isInSandboxTimeoutExit(exitCode) {
77
- return exitCode === 124 || exitCode === 137;
62
+ return exitCode === 124 || exitCode === 137;
78
63
  }
79
64
  function truncateOutput(value, maxChars) {
80
- if (maxChars <= 0 || value.length <= maxChars) {
81
- return value;
82
- }
83
- const head = Math.max(Math.floor(maxChars / 2), 0);
84
- const tail = Math.max(maxChars - head, 0);
85
- return `${value.slice(0, head)}\n...[truncated ${value.length - maxChars} chars]...\n${value.slice(value.length - tail)}`;
65
+ if (maxChars <= 0 || value.length <= maxChars) return value;
66
+ const head = Math.max(Math.floor(maxChars / 2), 0);
67
+ const tail = Math.max(maxChars - head, 0);
68
+ return `${value.slice(0, head)}\n...[truncated ${value.length - maxChars} chars]...\n${value.slice(value.length - tail)}`;
86
69
  }
87
70
  async function readStream(stream) {
88
- const reader = stream.getReader();
89
- const chunks = [];
90
- try {
91
- for (;;) {
92
- const { done, value } = await reader.read();
93
- if (done)
94
- break;
95
- chunks.push(value);
96
- }
97
- }
98
- finally {
99
- reader.releaseLock();
100
- }
101
- return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));
71
+ const reader = stream.getReader();
72
+ const chunks = [];
73
+ try {
74
+ for (;;) {
75
+ const { done, value } = await reader.read();
76
+ if (done) break;
77
+ chunks.push(value);
78
+ }
79
+ } finally {
80
+ reader.releaseLock();
81
+ }
82
+ return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));
102
83
  }
103
84
  async function normalizeReadFileContent(result) {
104
- if (typeof result === 'string') {
105
- return Buffer.from(result, 'utf8');
106
- }
107
- if (Buffer.isBuffer(result)) {
108
- return result;
109
- }
110
- if (result instanceof Uint8Array) {
111
- return Buffer.from(result);
112
- }
113
- const content = result.content;
114
- if (typeof content === 'string') {
115
- if (result.encoding === 'base64') {
116
- return Buffer.from(content, 'base64');
117
- }
118
- return Buffer.from(content, 'utf8');
119
- }
120
- if (Buffer.isBuffer(content)) {
121
- return content;
122
- }
123
- if (content instanceof Uint8Array) {
124
- return Buffer.from(content);
125
- }
126
- return readStream(content);
85
+ if (typeof result === "string") return Buffer.from(result, "utf8");
86
+ if (Buffer.isBuffer(result)) return result;
87
+ if (result instanceof Uint8Array) return Buffer.from(result);
88
+ const content = result.content;
89
+ if (typeof content === "string") {
90
+ if (result.encoding === "base64") return Buffer.from(content, "base64");
91
+ return Buffer.from(content, "utf8");
92
+ }
93
+ if (Buffer.isBuffer(content)) return content;
94
+ if (content instanceof Uint8Array) return Buffer.from(content);
95
+ return readStream(content);
127
96
  }
128
97
  function bytesToStream(bytes) {
129
- return new ReadableStream({
130
- start(controller) {
131
- controller.enqueue(bytes);
132
- controller.close();
133
- },
134
- });
98
+ return new ReadableStream({ start(controller) {
99
+ controller.enqueue(bytes);
100
+ controller.close();
101
+ } });
135
102
  }
136
103
  function normalizeWriteFileContent(content) {
137
- if (typeof content === 'string') {
138
- return { content, options: { encoding: 'utf8' } };
139
- }
140
- return { content: bytesToStream(content) };
104
+ if (typeof content === "string") return {
105
+ content,
106
+ options: { encoding: "utf8" }
107
+ };
108
+ return { content: bytesToStream(content) };
141
109
  }
142
110
  function createStats(info) {
143
- const type = info.type ?? 'file';
144
- const now = new Date();
145
- return {
146
- size: info.size ?? 0,
147
- isFile: () => type === 'file',
148
- isDirectory: () => type === 'directory',
149
- isSymbolicLink: () => type === 'symlink',
150
- isBlockDevice: () => false,
151
- isCharacterDevice: () => false,
152
- isFIFO: () => false,
153
- isSocket: () => false,
154
- dev: 0,
155
- ino: 0,
156
- mode: 0,
157
- nlink: 1,
158
- uid: 0,
159
- gid: 0,
160
- rdev: 0,
161
- blksize: 0,
162
- blocks: 0,
163
- atimeMs: now.getTime(),
164
- mtimeMs: now.getTime(),
165
- ctimeMs: now.getTime(),
166
- birthtimeMs: now.getTime(),
167
- atime: now,
168
- mtime: now,
169
- ctime: now,
170
- birthtime: now,
171
- };
111
+ const type = info.type ?? "file";
112
+ const now = /* @__PURE__ */ new Date();
113
+ return {
114
+ size: info.size ?? 0,
115
+ isFile: () => type === "file",
116
+ isDirectory: () => type === "directory",
117
+ isSymbolicLink: () => type === "symlink",
118
+ isBlockDevice: () => false,
119
+ isCharacterDevice: () => false,
120
+ isFIFO: () => false,
121
+ isSocket: () => false,
122
+ dev: 0,
123
+ ino: 0,
124
+ mode: 0,
125
+ nlink: 1,
126
+ uid: 0,
127
+ gid: 0,
128
+ rdev: 0,
129
+ blksize: 0,
130
+ blocks: 0,
131
+ atimeMs: now.getTime(),
132
+ mtimeMs: now.getTime(),
133
+ ctimeMs: now.getTime(),
134
+ birthtimeMs: now.getTime(),
135
+ atime: now,
136
+ mtime: now,
137
+ ctime: now,
138
+ birthtime: now
139
+ };
172
140
  }
173
141
  function normalizeFileList(result) {
174
- return Array.isArray(result) ? result : result.files;
142
+ return Array.isArray(result) ? result : result.files;
175
143
  }
176
144
  function entryNameFor(info, parentPath) {
177
- if (info.name !== '') {
178
- return info.name.includes('/') ? posix.basename(info.name) : info.name;
179
- }
180
- if (info.absolutePath != null && info.absolutePath !== '') {
181
- return posix.basename(info.absolutePath);
182
- }
183
- if (info.relativePath != null && info.relativePath !== '') {
184
- return posix.basename(info.relativePath);
185
- }
186
- return posix.basename(parentPath);
145
+ if (info.name !== "") return info.name.includes("/") ? posix.basename(info.name) : info.name;
146
+ if (info.absolutePath != null && info.absolutePath !== "") return posix.basename(info.absolutePath);
147
+ if (info.relativePath != null && info.relativePath !== "") return posix.basename(info.relativePath);
148
+ return posix.basename(parentPath);
187
149
  }
188
150
  function entryAbsolutePath(info, parentPath) {
189
- if (info.absolutePath != null && info.absolutePath !== '') {
190
- return posix.normalize(info.absolutePath);
191
- }
192
- if (info.relativePath != null && info.relativePath !== '') {
193
- return posix.resolve(parentPath, info.relativePath);
194
- }
195
- return posix.resolve(parentPath, info.name);
151
+ if (info.absolutePath != null && info.absolutePath !== "") return posix.normalize(info.absolutePath);
152
+ if (info.relativePath != null && info.relativePath !== "") return posix.resolve(parentPath, info.relativePath);
153
+ return posix.resolve(parentPath, info.name);
196
154
  }
197
155
  function createDirent(info) {
198
- return {
199
- name: entryNameFor(info, ''),
200
- isFile: () => (info.type ?? 'file') === 'file',
201
- isDirectory: () => info.type === 'directory',
202
- isSymbolicLink: () => info.type === 'symlink',
203
- };
156
+ return {
157
+ name: entryNameFor(info, ""),
158
+ isFile: () => (info.type ?? "file") === "file",
159
+ isDirectory: () => info.type === "directory",
160
+ isSymbolicLink: () => info.type === "symlink"
161
+ };
204
162
  }
205
163
  async function findChildInfo(sandbox, filePath) {
206
- const parent = posix.dirname(filePath);
207
- const basename = posix.basename(filePath);
208
- const entries = normalizeFileList(await sandbox.listFiles(parent, { includeHidden: true }));
209
- return entries.find((entry) => {
210
- const absolute = entryAbsolutePath(entry, parent);
211
- return absolute === filePath || entryNameFor(entry, parent) === basename;
212
- });
164
+ const parent = posix.dirname(filePath);
165
+ const basename = posix.basename(filePath);
166
+ return normalizeFileList(await sandbox.listFiles(parent, { includeHidden: true })).find((entry) => {
167
+ return entryAbsolutePath(entry, parent) === filePath || entryNameFor(entry, parent) === basename;
168
+ });
213
169
  }
214
170
  function createCloudflareWorkspaceFS(config) {
215
- const workspaceRoot = getCloudflareWorkspaceRoot(config);
216
- const fs = {
217
- readFile: (async (filePath, encoding) => {
218
- const sandbox = await resolveCloudflareSandbox(config);
219
- const resolved = toSandboxPath(filePath, workspaceRoot);
220
- const buffer = await normalizeReadFileContent(await sandbox.readFile(resolved, encoding ? { encoding } : undefined));
221
- return encoding != null ? buffer.toString(encoding) : buffer;
222
- }),
223
- writeFile: async (filePath, content, _options) => {
224
- const sandbox = await resolveCloudflareSandbox(config);
225
- const resolved = toSandboxPath(filePath, workspaceRoot);
226
- const normalized = normalizeWriteFileContent(content);
227
- await sandbox.writeFile(resolved, normalized.content, normalized.options);
228
- },
229
- stat: async (filePath) => {
230
- const sandbox = await resolveCloudflareSandbox(config);
231
- const resolved = toSandboxPath(filePath, workspaceRoot);
232
- if (resolved === workspaceRoot) {
233
- const entries = normalizeFileList(await sandbox.listFiles(resolved, { includeHidden: true }));
234
- return createStats({ size: entries.length, type: 'directory' });
235
- }
236
- const info = await findChildInfo(sandbox, resolved);
237
- if (info != null) {
238
- return createStats({ size: info.size, type: info.type });
239
- }
240
- try {
241
- const entries = normalizeFileList(await sandbox.listFiles(resolved, { includeHidden: true }));
242
- return createStats({ size: entries.length, type: 'directory' });
243
- }
244
- catch {
245
- const buffer = await normalizeReadFileContent(await sandbox.readFile(resolved));
246
- return createStats({ size: buffer.length, type: 'file' });
247
- }
248
- },
249
- readdir: (async (filePath, options) => {
250
- const sandbox = await resolveCloudflareSandbox(config);
251
- const resolved = toSandboxPath(filePath, workspaceRoot);
252
- const entries = normalizeFileList(await sandbox.listFiles(resolved, { includeHidden: true }));
253
- if (options?.withFileTypes === true) {
254
- return entries.map(createDirent);
255
- }
256
- return entries.map((entry) => entryNameFor(entry, resolved));
257
- }),
258
- mkdir: async (filePath, options) => {
259
- const sandbox = await resolveCloudflareSandbox(config);
260
- await sandbox.mkdir(toSandboxPath(filePath, workspaceRoot), {
261
- recursive: options?.recursive,
262
- });
263
- },
264
- realpath: async (filePath) => toSandboxPath(filePath, workspaceRoot),
265
- unlink: async (filePath) => {
266
- const sandbox = await resolveCloudflareSandbox(config);
267
- await sandbox.deleteFile(toSandboxPath(filePath, workspaceRoot));
268
- },
269
- open: async (filePath, _flags) => {
270
- const sandbox = await resolveCloudflareSandbox(config);
271
- const resolved = toSandboxPath(filePath, workspaceRoot);
272
- const buffer = await normalizeReadFileContent(await sandbox.readFile(resolved));
273
- return {
274
- read: async (target, offset, length, position) => {
275
- const start = Math.max(position, 0);
276
- const slice = buffer.subarray(start, start + length);
277
- slice.copy(target, offset);
278
- return { bytesRead: slice.length, buffer: target };
279
- },
280
- close: async () => undefined,
281
- };
282
- },
283
- };
284
- return fs;
171
+ const workspaceRoot = getCloudflareWorkspaceRoot(config);
172
+ return {
173
+ readFile: (async (filePath, encoding) => {
174
+ const sandbox = await resolveCloudflareSandbox(config);
175
+ const resolved = toSandboxPath(filePath, workspaceRoot);
176
+ const buffer = await normalizeReadFileContent(await sandbox.readFile(resolved, encoding ? { encoding } : void 0));
177
+ return encoding != null ? buffer.toString(encoding) : buffer;
178
+ }),
179
+ writeFile: async (filePath, content, _options) => {
180
+ const sandbox = await resolveCloudflareSandbox(config);
181
+ const resolved = toSandboxPath(filePath, workspaceRoot);
182
+ const normalized = normalizeWriteFileContent(content);
183
+ await sandbox.writeFile(resolved, normalized.content, normalized.options);
184
+ },
185
+ stat: async (filePath) => {
186
+ const sandbox = await resolveCloudflareSandbox(config);
187
+ const resolved = toSandboxPath(filePath, workspaceRoot);
188
+ if (resolved === workspaceRoot) return createStats({
189
+ size: normalizeFileList(await sandbox.listFiles(resolved, { includeHidden: true })).length,
190
+ type: "directory"
191
+ });
192
+ const info = await findChildInfo(sandbox, resolved);
193
+ if (info != null) return createStats({
194
+ size: info.size,
195
+ type: info.type
196
+ });
197
+ try {
198
+ return createStats({
199
+ size: normalizeFileList(await sandbox.listFiles(resolved, { includeHidden: true })).length,
200
+ type: "directory"
201
+ });
202
+ } catch {
203
+ return createStats({
204
+ size: (await normalizeReadFileContent(await sandbox.readFile(resolved))).length,
205
+ type: "file"
206
+ });
207
+ }
208
+ },
209
+ readdir: (async (filePath, options) => {
210
+ const sandbox = await resolveCloudflareSandbox(config);
211
+ const resolved = toSandboxPath(filePath, workspaceRoot);
212
+ const entries = normalizeFileList(await sandbox.listFiles(resolved, { includeHidden: true }));
213
+ if (options?.withFileTypes === true) return entries.map(createDirent);
214
+ return entries.map((entry) => entryNameFor(entry, resolved));
215
+ }),
216
+ mkdir: async (filePath, options) => {
217
+ await (await resolveCloudflareSandbox(config)).mkdir(toSandboxPath(filePath, workspaceRoot), { recursive: options?.recursive });
218
+ },
219
+ realpath: async (filePath) => toSandboxPath(filePath, workspaceRoot),
220
+ unlink: async (filePath) => {
221
+ await (await resolveCloudflareSandbox(config)).deleteFile(toSandboxPath(filePath, workspaceRoot));
222
+ },
223
+ open: async (filePath, _flags) => {
224
+ const sandbox = await resolveCloudflareSandbox(config);
225
+ const resolved = toSandboxPath(filePath, workspaceRoot);
226
+ const buffer = await normalizeReadFileContent(await sandbox.readFile(resolved));
227
+ return {
228
+ read: async (target, offset, length, position) => {
229
+ const start = Math.max(position, 0);
230
+ const slice = buffer.subarray(start, start + length);
231
+ slice.copy(target, offset);
232
+ return {
233
+ bytesRead: slice.length,
234
+ buffer: target
235
+ };
236
+ },
237
+ close: async () => void 0
238
+ };
239
+ }
240
+ };
285
241
  }
286
242
  function createCloudflareSpawn(config) {
287
- return (command, args, options) => {
288
- const stdout = new PassThrough();
289
- const stderr = new PassThrough();
290
- const child = new EventEmitter();
291
- const abortController = new AbortController();
292
- const state = { closed: false };
293
- /** Read through a function so concurrent `closeOnce` mutation (via
294
- * `kill()`/abort during an `await`) isn't statically narrowed away. */
295
- const isClosed = () => state.closed;
296
- const closeOnce = (exitCode, signal) => {
297
- if (state.closed) {
298
- return;
299
- }
300
- state.closed = true;
301
- stdout.end();
302
- stderr.end();
303
- Object.assign(child, {
304
- exitCode,
305
- signalCode: signal,
306
- });
307
- child.emit('close', exitCode, signal);
308
- };
309
- Object.assign(child, {
310
- stdout,
311
- stderr,
312
- stdin: new PassThrough(),
313
- stdio: [null, stdout, stderr],
314
- killed: false,
315
- exitCode: null,
316
- signalCode: null,
317
- pid: undefined,
318
- kill: (signal = 'SIGTERM') => {
319
- Object.assign(child, { killed: true, signalCode: signal });
320
- abortController.abort();
321
- closeOnce(null, signal);
322
- return true;
323
- },
324
- });
325
- void (async () => {
326
- const ctx = await getRuntimeContext(config);
327
- const rendered = [command, ...args].map(quote).join(' ');
328
- const spawnTimeoutMs = options[LOCAL_SPAWN_TIMEOUT_MS];
329
- const timeoutMs = typeof spawnTimeoutMs === 'number' && Number.isFinite(spawnTimeoutMs)
330
- ? spawnTimeoutMs
331
- : ctx.timeoutMs;
332
- const timedCommand = withInSandboxTimeout(rendered, timeoutMs);
333
- const cwd = options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();
334
- if (isClosed()) {
335
- return;
336
- }
337
- const execOptions = {
338
- cwd,
339
- env: ctx.env,
340
- timeout: outerTimeoutMs(timeoutMs),
341
- };
342
- if (ctx.sandbox.supportsExecSignal === true) {
343
- execOptions.signal = abortController.signal;
344
- }
345
- try {
346
- const result = await ctx.sandbox.exec(timedCommand, execOptions);
347
- if (isClosed()) {
348
- return;
349
- }
350
- if (result.stdout)
351
- stdout.write(result.stdout);
352
- if (result.stderr)
353
- stderr.write(result.stderr);
354
- closeOnce(result.exitCode, null);
355
- }
356
- catch (error) {
357
- if (isClosed()) {
358
- return;
359
- }
360
- stderr.write(error.message);
361
- closeOnce(1, null);
362
- }
363
- })();
364
- return child;
365
- };
243
+ return (command, args, options) => {
244
+ const stdout = new PassThrough();
245
+ const stderr = new PassThrough();
246
+ const child = new EventEmitter();
247
+ const abortController = new AbortController();
248
+ const state = { closed: false };
249
+ /** Read through a function so concurrent `closeOnce` mutation (via
250
+ * `kill()`/abort during an `await`) isn't statically narrowed away. */
251
+ const isClosed = () => state.closed;
252
+ const closeOnce = (exitCode, signal) => {
253
+ if (state.closed) return;
254
+ state.closed = true;
255
+ stdout.end();
256
+ stderr.end();
257
+ Object.assign(child, {
258
+ exitCode,
259
+ signalCode: signal
260
+ });
261
+ child.emit("close", exitCode, signal);
262
+ };
263
+ Object.assign(child, {
264
+ stdout,
265
+ stderr,
266
+ stdin: new PassThrough(),
267
+ stdio: [
268
+ null,
269
+ stdout,
270
+ stderr
271
+ ],
272
+ killed: false,
273
+ exitCode: null,
274
+ signalCode: null,
275
+ pid: void 0,
276
+ kill: (signal = "SIGTERM") => {
277
+ Object.assign(child, {
278
+ killed: true,
279
+ signalCode: signal
280
+ });
281
+ abortController.abort();
282
+ closeOnce(null, signal);
283
+ return true;
284
+ }
285
+ });
286
+ (async () => {
287
+ const ctx = await getRuntimeContext(config);
288
+ const rendered = [command, ...args].map(quote).join(" ");
289
+ const spawnTimeoutMs = options[LOCAL_SPAWN_TIMEOUT_MS];
290
+ const timeoutMs = typeof spawnTimeoutMs === "number" && Number.isFinite(spawnTimeoutMs) ? spawnTimeoutMs : ctx.timeoutMs;
291
+ const timedCommand = withInSandboxTimeout(rendered, timeoutMs);
292
+ const cwd = options.cwd == null ? ctx.workspaceRoot : options.cwd.toString();
293
+ if (isClosed()) return;
294
+ const execOptions = {
295
+ cwd,
296
+ env: ctx.env,
297
+ timeout: outerTimeoutMs(timeoutMs)
298
+ };
299
+ if (ctx.sandbox.supportsExecSignal === true) execOptions.signal = abortController.signal;
300
+ try {
301
+ const result = await ctx.sandbox.exec(timedCommand, execOptions);
302
+ if (isClosed()) return;
303
+ if (result.stdout) stdout.write(result.stdout);
304
+ if (result.stderr) stderr.write(result.stderr);
305
+ closeOnce(result.exitCode, null);
306
+ } catch (error) {
307
+ if (isClosed()) return;
308
+ stderr.write(error.message);
309
+ closeOnce(1, null);
310
+ }
311
+ })();
312
+ return child;
313
+ };
366
314
  }
367
315
  function createCloudflareLocalExecutionConfig(config) {
368
- const workspaceRoot = getCloudflareWorkspaceRoot(config);
369
- return {
370
- cwd: workspaceRoot,
371
- workspace: { root: workspaceRoot },
372
- exec: {
373
- spawn: createCloudflareSpawn(config),
374
- fs: createCloudflareWorkspaceFS(config),
375
- sandboxed: true,
376
- },
377
- shell: config.shell ?? 'bash',
378
- timeoutMs: config.timeoutMs,
379
- maxOutputChars: config.maxOutputChars,
380
- env: config.env,
381
- includeCodingTools: config.includeCodingTools,
382
- compileCheck: config.compileCheck,
383
- readOnly: config.readOnly,
384
- allowDangerousCommands: config.allowDangerousCommands,
385
- bashAst: config.bashAst,
386
- fileCheckpointing: config.fileCheckpointing,
387
- maxReadBytes: config.maxReadBytes,
388
- attachReadAttachments: config.attachReadAttachments,
389
- maxAttachmentBytes: config.maxAttachmentBytes,
390
- postEditSyntaxCheck: config.postEditSyntaxCheck,
391
- };
316
+ const workspaceRoot = getCloudflareWorkspaceRoot(config);
317
+ return {
318
+ cwd: workspaceRoot,
319
+ workspace: { root: workspaceRoot },
320
+ exec: {
321
+ spawn: createCloudflareSpawn(config),
322
+ fs: createCloudflareWorkspaceFS(config),
323
+ sandboxed: true
324
+ },
325
+ shell: config.shell ?? "bash",
326
+ timeoutMs: config.timeoutMs,
327
+ maxOutputChars: config.maxOutputChars,
328
+ env: config.env,
329
+ includeCodingTools: config.includeCodingTools,
330
+ compileCheck: config.compileCheck,
331
+ readOnly: config.readOnly,
332
+ allowDangerousCommands: config.allowDangerousCommands,
333
+ bashAst: config.bashAst,
334
+ fileCheckpointing: config.fileCheckpointing,
335
+ maxReadBytes: config.maxReadBytes,
336
+ attachReadAttachments: config.attachReadAttachments,
337
+ maxAttachmentBytes: config.maxAttachmentBytes,
338
+ postEditSyntaxCheck: config.postEditSyntaxCheck
339
+ };
392
340
  }
393
341
  async function validateCloudflareBashCommand(command, args, config) {
394
- const localConfig = createCloudflareLocalExecutionConfig(config);
395
- const validation = await validateBashCommand(command, localConfig);
396
- if (!validation.valid) {
397
- throw new Error(validation.errors.join('\n'));
398
- }
399
- if (args.length > 0 &&
400
- config.allowDangerousCommands !== true &&
401
- DESTRUCTIVE_OP_IN_COMMAND_RE.test(command)) {
402
- const offending = args.find((arg) => PROTECTED_TARGET_ARG_RE.test(arg));
403
- if (offending !== undefined) {
404
- throw new Error(`Command matches a destructive command pattern (protected target "${offending}" passed via positional arg).`);
405
- }
406
- }
342
+ const validation = await validateBashCommand(command, createCloudflareLocalExecutionConfig(config));
343
+ if (!validation.valid) throw new Error(validation.errors.join("\n"));
344
+ if (args.length > 0 && config.allowDangerousCommands !== true && DESTRUCTIVE_OP_IN_COMMAND_RE.test(command)) {
345
+ const offending = args.find((arg) => PROTECTED_TARGET_ARG_RE.test(arg));
346
+ if (offending !== void 0) throw new Error(`Command matches a destructive command pattern (protected target "${offending}" passed via positional arg).`);
347
+ }
407
348
  }
408
349
  async function executeCloudflareBash(command, config, args = []) {
409
- await validateCloudflareBashCommand(command, args, config);
410
- const ctx = await getRuntimeContext(config);
411
- const shellCommand = args.length > 0
412
- ? `${ctx.shell} -lc ${quote(command)} -- ${args.map(quote).join(' ')}`
413
- : `${ctx.shell} -lc ${quote(command)}`;
414
- const result = await ctx.sandbox.exec(withInSandboxTimeout(shellCommand, ctx.timeoutMs), {
415
- cwd: ctx.workspaceRoot,
416
- env: ctx.env,
417
- timeout: outerTimeoutMs(ctx.timeoutMs),
418
- });
419
- return {
420
- stdout: truncateOutput(result.stdout, ctx.maxOutputChars),
421
- stderr: truncateOutput(result.stderr, ctx.maxOutputChars),
422
- exitCode: result.exitCode,
423
- timedOut: isInSandboxTimeoutExit(result.exitCode),
424
- };
350
+ await validateCloudflareBashCommand(command, args, config);
351
+ const ctx = await getRuntimeContext(config);
352
+ const shellCommand = args.length > 0 ? `${ctx.shell} -lc ${quote(command)} -- ${args.map(quote).join(" ")}` : `${ctx.shell} -lc ${quote(command)}`;
353
+ const result = await ctx.sandbox.exec(withInSandboxTimeout(shellCommand, ctx.timeoutMs), {
354
+ cwd: ctx.workspaceRoot,
355
+ env: ctx.env,
356
+ timeout: outerTimeoutMs(ctx.timeoutMs)
357
+ });
358
+ return {
359
+ stdout: truncateOutput(result.stdout, ctx.maxOutputChars),
360
+ stderr: truncateOutput(result.stderr, ctx.maxOutputChars),
361
+ exitCode: result.exitCode,
362
+ timedOut: isInSandboxTimeoutExit(result.exitCode)
363
+ };
425
364
  }
426
- function runtimeForCode(lang, tempDir, code, args = [], shell = 'bash') {
427
- const fileFor = (name) => posix.join(tempDir, name);
428
- const argText = args.map(quote).join(' ');
429
- switch (lang) {
430
- case 'py':
431
- case 'python':
432
- return {
433
- fileName: 'main.py',
434
- source: code,
435
- command: `python3 ${quote(fileFor('main.py'))} ${argText}`,
436
- };
437
- case 'js':
438
- case 'javascript':
439
- return {
440
- fileName: 'main.js',
441
- source: code,
442
- command: `node ${quote(fileFor('main.js'))} ${argText}`,
443
- };
444
- case 'ts':
445
- case 'typescript':
446
- return {
447
- fileName: 'main.ts',
448
- source: code,
449
- command: `npx --no-install tsx ${quote(fileFor('main.ts'))} ${argText}`,
450
- };
451
- case 'php':
452
- return {
453
- fileName: 'main.php',
454
- source: code,
455
- command: `php ${quote(fileFor('main.php'))} ${argText}`,
456
- };
457
- case 'go':
458
- return {
459
- fileName: 'main.go',
460
- source: code,
461
- command: `go run ${quote(fileFor('main.go'))} ${argText}`,
462
- };
463
- case 'rs':
464
- return {
465
- fileName: 'main.rs',
466
- source: code,
467
- command: `${shell} -lc ${quote(`rustc ${quote(fileFor('main.rs'))} -o ${quote(fileFor('main-rs'))} && ${quote(fileFor('main-rs'))} ${argText}`)}`,
468
- };
469
- case 'c':
470
- return {
471
- fileName: 'main.c',
472
- source: code,
473
- command: `${shell} -lc ${quote(`cc ${quote(fileFor('main.c'))} -o ${quote(fileFor('main-c'))} && ${quote(fileFor('main-c'))} ${argText}`)}`,
474
- };
475
- case 'cpp':
476
- return {
477
- fileName: 'main.cpp',
478
- source: code,
479
- command: `${shell} -lc ${quote(`c++ ${quote(fileFor('main.cpp'))} -o ${quote(fileFor('main-cpp'))} && ${quote(fileFor('main-cpp'))} ${argText}`)}`,
480
- };
481
- case 'java':
482
- return {
483
- fileName: 'Main.java',
484
- source: code,
485
- command: `${shell} -lc ${quote(`javac ${quote(fileFor('Main.java'))} && java -cp ${quote(tempDir)} Main ${argText}`)}`,
486
- };
487
- case 'r':
488
- return {
489
- fileName: 'main.R',
490
- source: code,
491
- command: `Rscript ${quote(fileFor('main.R'))} ${argText}`,
492
- };
493
- case 'd':
494
- return {
495
- fileName: 'main.d',
496
- source: code,
497
- command: `${shell} -lc ${quote(`dmd ${quote(fileFor('main.d'))} -of=${quote(fileFor('main-d'))} && ${quote(fileFor('main-d'))} ${argText}`)}`,
498
- };
499
- case 'f90':
500
- return {
501
- fileName: 'main.f90',
502
- source: code,
503
- command: `${shell} -lc ${quote(`gfortran ${quote(fileFor('main.f90'))} -o ${quote(fileFor('main-f90'))} && ${quote(fileFor('main-f90'))} ${argText}`)}`,
504
- };
505
- case 'bash':
506
- case 'sh':
507
- return {
508
- fileName: 'main.sh',
509
- source: code,
510
- command: `${shell} -lc ${quote(code)} -- ${argText}`,
511
- };
512
- default:
513
- throw new Error(`Unsupported Cloudflare sandbox runtime: ${lang}`);
514
- }
365
+ function runtimeForCode(lang, tempDir, code, args = [], shell = "bash") {
366
+ const fileFor = (name) => posix.join(tempDir, name);
367
+ const argText = args.map(quote).join(" ");
368
+ switch (lang) {
369
+ case "py":
370
+ case "python": return {
371
+ fileName: "main.py",
372
+ source: code,
373
+ command: `python3 ${quote(fileFor("main.py"))} ${argText}`
374
+ };
375
+ case "js":
376
+ case "javascript": return {
377
+ fileName: "main.js",
378
+ source: code,
379
+ command: `node ${quote(fileFor("main.js"))} ${argText}`
380
+ };
381
+ case "ts":
382
+ case "typescript": return {
383
+ fileName: "main.ts",
384
+ source: code,
385
+ command: `npx --no-install tsx ${quote(fileFor("main.ts"))} ${argText}`
386
+ };
387
+ case "php": return {
388
+ fileName: "main.php",
389
+ source: code,
390
+ command: `php ${quote(fileFor("main.php"))} ${argText}`
391
+ };
392
+ case "go": return {
393
+ fileName: "main.go",
394
+ source: code,
395
+ command: `go run ${quote(fileFor("main.go"))} ${argText}`
396
+ };
397
+ case "rs": return {
398
+ fileName: "main.rs",
399
+ source: code,
400
+ command: `${shell} -lc ${quote(`rustc ${quote(fileFor("main.rs"))} -o ${quote(fileFor("main-rs"))} && ${quote(fileFor("main-rs"))} ${argText}`)}`
401
+ };
402
+ case "c": return {
403
+ fileName: "main.c",
404
+ source: code,
405
+ command: `${shell} -lc ${quote(`cc ${quote(fileFor("main.c"))} -o ${quote(fileFor("main-c"))} && ${quote(fileFor("main-c"))} ${argText}`)}`
406
+ };
407
+ case "cpp": return {
408
+ fileName: "main.cpp",
409
+ source: code,
410
+ command: `${shell} -lc ${quote(`c++ ${quote(fileFor("main.cpp"))} -o ${quote(fileFor("main-cpp"))} && ${quote(fileFor("main-cpp"))} ${argText}`)}`
411
+ };
412
+ case "java": return {
413
+ fileName: "Main.java",
414
+ source: code,
415
+ command: `${shell} -lc ${quote(`javac ${quote(fileFor("Main.java"))} && java -cp ${quote(tempDir)} Main ${argText}`)}`
416
+ };
417
+ case "r": return {
418
+ fileName: "main.R",
419
+ source: code,
420
+ command: `Rscript ${quote(fileFor("main.R"))} ${argText}`
421
+ };
422
+ case "d": return {
423
+ fileName: "main.d",
424
+ source: code,
425
+ command: `${shell} -lc ${quote(`dmd ${quote(fileFor("main.d"))} -of=${quote(fileFor("main-d"))} && ${quote(fileFor("main-d"))} ${argText}`)}`
426
+ };
427
+ case "f90": return {
428
+ fileName: "main.f90",
429
+ source: code,
430
+ command: `${shell} -lc ${quote(`gfortran ${quote(fileFor("main.f90"))} -o ${quote(fileFor("main-f90"))} && ${quote(fileFor("main-f90"))} ${argText}`)}`
431
+ };
432
+ case "bash":
433
+ case "sh": return {
434
+ fileName: "main.sh",
435
+ source: code,
436
+ command: `${shell} -lc ${quote(code)} -- ${argText}`
437
+ };
438
+ default: throw new Error(`Unsupported Cloudflare sandbox runtime: ${lang}`);
439
+ }
515
440
  }
516
441
  async function executeCloudflareCode(input, config) {
517
- if (input.lang === 'bash' || input.lang === 'sh') {
518
- return executeCloudflareBash(input.code, config, input.args ?? []);
519
- }
520
- const ctx = await getRuntimeContext(config);
521
- const id = globalThis.crypto.randomUUID();
522
- const tempDir = posix.join(ctx.workspaceRoot, '.lc-exec', id);
523
- const runtime = runtimeForCode(input.lang, tempDir, input.code, input.args, ctx.shell);
524
- await ctx.sandbox.mkdir(tempDir, { recursive: true });
525
- if (runtime.source != null) {
526
- await ctx.sandbox.writeFile(posix.join(tempDir, runtime.fileName), runtime.source, {
527
- encoding: 'utf8',
528
- });
529
- }
530
- try {
531
- const result = await ctx.sandbox.exec(withInSandboxTimeout(runtime.command, ctx.timeoutMs), {
532
- cwd: ctx.workspaceRoot,
533
- env: ctx.env,
534
- timeout: outerTimeoutMs(ctx.timeoutMs),
535
- });
536
- return {
537
- stdout: truncateOutput(result.stdout, ctx.maxOutputChars),
538
- stderr: truncateOutput(result.stderr, ctx.maxOutputChars),
539
- exitCode: result.exitCode,
540
- timedOut: isInSandboxTimeoutExit(result.exitCode),
541
- };
542
- }
543
- finally {
544
- await ctx.sandbox
545
- .exec(`rm -rf ${quote(tempDir)}`, {
546
- cwd: ctx.workspaceRoot,
547
- env: ctx.env,
548
- timeout: 10000,
549
- })
550
- .catch(() => undefined);
551
- }
442
+ if (input.lang === "bash" || input.lang === "sh") return executeCloudflareBash(input.code, config, input.args ?? []);
443
+ const ctx = await getRuntimeContext(config);
444
+ const id = globalThis.crypto.randomUUID();
445
+ const tempDir = posix.join(ctx.workspaceRoot, ".lc-exec", id);
446
+ const runtime = runtimeForCode(input.lang, tempDir, input.code, input.args, ctx.shell);
447
+ await ctx.sandbox.mkdir(tempDir, { recursive: true });
448
+ if (runtime.source != null) await ctx.sandbox.writeFile(posix.join(tempDir, runtime.fileName), runtime.source, { encoding: "utf8" });
449
+ try {
450
+ const result = await ctx.sandbox.exec(withInSandboxTimeout(runtime.command, ctx.timeoutMs), {
451
+ cwd: ctx.workspaceRoot,
452
+ env: ctx.env,
453
+ timeout: outerTimeoutMs(ctx.timeoutMs)
454
+ });
455
+ return {
456
+ stdout: truncateOutput(result.stdout, ctx.maxOutputChars),
457
+ stderr: truncateOutput(result.stderr, ctx.maxOutputChars),
458
+ exitCode: result.exitCode,
459
+ timedOut: isInSandboxTimeoutExit(result.exitCode)
460
+ };
461
+ } finally {
462
+ await ctx.sandbox.exec(`rm -rf ${quote(tempDir)}`, {
463
+ cwd: ctx.workspaceRoot,
464
+ env: ctx.env,
465
+ timeout: 1e4
466
+ }).catch(() => void 0);
467
+ }
552
468
  }
553
469
  function formatCloudflareOutput(result, cwd) {
554
- let formatted = '';
555
- if (result.stdout !== '') {
556
- formatted += `stdout:\n${result.stdout}\n`;
557
- }
558
- else {
559
- formatted += 'stdout: Empty. Ensure you\'re writing output explicitly.\n';
560
- }
561
- if (result.stderr !== '') {
562
- formatted += `stderr:\n${result.stderr}\n`;
563
- }
564
- if (result.exitCode != null && result.exitCode !== 0) {
565
- formatted += `exit_code: ${result.exitCode}\n`;
566
- }
567
- if (result.timedOut) {
568
- formatted += 'timed_out: true\n';
569
- }
570
- formatted += `working_directory: ${cwd}`;
571
- return formatted.trim();
470
+ let formatted = "";
471
+ if (result.stdout !== "") formatted += `stdout:\n${result.stdout}\n`;
472
+ else formatted += "stdout: Empty. Ensure you're writing output explicitly.\n";
473
+ if (result.stderr !== "") formatted += `stderr:\n${result.stderr}\n`;
474
+ if (result.exitCode != null && result.exitCode !== 0) formatted += `exit_code: ${result.exitCode}\n`;
475
+ if (result.timedOut) formatted += "timed_out: true\n";
476
+ formatted += `working_directory: ${cwd}`;
477
+ return formatted.trim();
572
478
  }
573
-
479
+ //#endregion
574
480
  export { createCloudflareLocalExecutionConfig, createCloudflareWorkspaceFS, executeCloudflareBash, executeCloudflareCode, formatCloudflareOutput, getCloudflareWorkspaceRoot, resolveCloudflareSandbox, validateCloudflareBashCommand };
575
- //# sourceMappingURL=CloudflareSandboxExecutionEngine.mjs.map
481
+
482
+ //# sourceMappingURL=CloudflareSandboxExecutionEngine.mjs.map