@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 +1 @@
1
- {"version":3,"file":"CloudflareBridgeRuntime.mjs","sources":["../../../../src/tools/cloudflare/CloudflareBridgeRuntime.ts"],"sourcesContent":["import { posix as path } from 'path';\nimport type * as t from '@/types';\n\nconst DEFAULT_API_PREFIX = '/v1';\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_SHELL = 'bash';\n\nexport type CloudflareBridgeRuntimeConfig = {\n /** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */\n baseURL: string;\n /** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */\n apiKey?: string;\n /** Existing sandbox id. If omitted, the adapter creates one lazily. */\n sandboxId?: string;\n /** Bridge API route prefix. Defaults to `/v1`. */\n apiRoutePrefix?: string;\n /** Workspace root used for path clamping. Defaults to `/workspace`. */\n workspaceRoot?: string;\n /** Optional bridge session id sent as `Session-Id`. */\n sessionId?: string;\n /** Shell used to run command strings over the bridge exec endpoint. */\n shell?: string;\n /** Optional fetch implementation. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n};\n\nexport type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {\n getSandboxId(): Promise<string>;\n};\n\ntype BridgeSSEEvent = {\n event: string;\n data: string;\n};\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.replace(/\\/+$/, '');\n}\n\nfunction normalizePrefix(prefix: string | undefined): string {\n const raw = prefix ?? DEFAULT_API_PREFIX;\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n return withLeadingSlash.replace(/\\/+$/, '');\n}\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nfunction getFetch(config: CloudflareBridgeRuntimeConfig): typeof fetch {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n return fetchImpl.bind(globalThis) as typeof fetch;\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction encodeBridgePath(filePath: string): string {\n return filePath\n .replace(/^\\/+/, '')\n .split('/')\n .map((part) => encodeURIComponent(part))\n .join('/');\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction typeFromFind(value: string): t.CloudflareSandboxFileInfo['type'] {\n switch (value) {\n case 'd':\n return 'directory';\n case 'l':\n return 'symlink';\n case 'f':\n return 'file';\n default:\n return 'other';\n }\n}\n\nfunction decodeBase64(value: string): string {\n return Buffer.from(value, 'base64').toString('utf8');\n}\n\nasync function readResponseText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n if (response.ok) {\n return;\n }\n const text = await readResponseText(response);\n throw new Error(\n `Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`\n );\n}\n\nfunction createHeaders(\n config: CloudflareBridgeRuntimeConfig,\n extra?: HeadersInit\n): Headers {\n const headers = new Headers(extra);\n if (config.apiKey != null && config.apiKey !== '') {\n headers.set('Authorization', `Bearer ${config.apiKey}`);\n }\n if (config.sessionId != null && config.sessionId !== '') {\n headers.set('Session-Id', config.sessionId);\n }\n return headers;\n}\n\nfunction envScript(env?: Record<string, string | undefined>): string {\n if (env == null) {\n return '';\n }\n return Object.entries(env)\n .filter((entry): entry is [string, string] => entry[1] != null)\n .map(([key, value]) => `export ${key}=${quote(value)}`)\n .join('\\n');\n}\n\nfunction commandWithEnv(\n command: string,\n env?: Record<string, string | undefined>\n): string {\n const exports = envScript(env);\n return exports === '' ? command : `${exports}\\n${command}`;\n}\n\nasync function collectReadableStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function normalizeWriteBody(\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n): Promise<Uint8Array> {\n if (typeof content !== 'string') {\n return collectReadableStream(content);\n }\n if (options?.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');\n}\n\nfunction parseSSEChunk(buffer: string): {\n events: BridgeSSEEvent[];\n remainder: string;\n} {\n const normalized = buffer.replace(/\\r\\n/g, '\\n');\n const parts = normalized.split('\\n\\n');\n const remainder = parts.pop() ?? '';\n const events = parts\n .map((part) => {\n let event = 'message';\n const dataLines: string[] = [];\n for (const line of part.split('\\n')) {\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n return { event, data: dataLines.join('\\n') };\n })\n .filter((event) => event.data !== '' || event.event !== 'message');\n return { events, remainder };\n}\n\nfunction parseExitCode(data: string): number {\n try {\n const parsed = JSON.parse(data) as { exit_code?: number };\n return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;\n } catch {\n return 1;\n }\n}\n\nfunction parseBridgeError(data: string): string {\n try {\n const parsed = JSON.parse(data) as { error?: string };\n return parsed.error ?? data;\n } catch {\n return data;\n }\n}\n\nexport function createCloudflareBridgeRuntime(\n config: CloudflareBridgeRuntimeConfig\n): CloudflareBridgeRuntime {\n const baseURL = normalizeBaseURL(config.baseURL);\n const apiPrefix = normalizePrefix(config.apiRoutePrefix);\n const workspaceRoot = normalizeWorkspaceRoot(\n config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n const shell = config.shell ?? DEFAULT_SHELL;\n const fetchImpl = getFetch(config);\n let sandboxIdPromise: Promise<string> | undefined =\n config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;\n\n function bridgeURL(suffix: string): string {\n return `${baseURL}${apiPrefix}${suffix}`;\n }\n\n async function getSandboxId(): Promise<string> {\n if (sandboxIdPromise == null) {\n sandboxIdPromise = (async (): Promise<string> => {\n const response = await fetchImpl(bridgeURL('/sandbox'), {\n method: 'POST',\n headers: createHeaders(config),\n });\n await assertOk(response, 'sandbox create');\n const payload = (await response.json()) as { id?: string };\n if (typeof payload.id !== 'string' || payload.id === '') {\n throw new Error(\n 'Cloudflare sandbox bridge create did not return an id.'\n );\n }\n return payload.id;\n })().catch((error: unknown) => {\n sandboxIdPromise = undefined;\n throw error;\n });\n }\n return sandboxIdPromise;\n }\n\n async function exec(\n command: string,\n options: t.CloudflareSandboxExecOptions = {}\n ): Promise<t.CloudflareSandboxExecResult> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const response = await fetchImpl(\n bridgeURL(`/sandbox/${sandboxPathId}/exec`),\n {\n method: 'POST',\n headers: createHeaders(config, {\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n argv: [shell, '-lc', commandWithEnv(command, options.env)],\n cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),\n timeout_ms: options.timeout,\n }),\n signal: options.signal,\n }\n );\n await assertOk(response, 'exec');\n if (response.body == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec response did not include a body.'\n );\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = '';\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n }\n buffer += decoder.decode();\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (exitCode == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec stream closed before an exit event.'\n );\n }\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n command,\n };\n }\n\n async function readFile(filePath: string): Promise<Buffer> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n headers: createHeaders(config),\n }\n );\n await assertOk(response, 'readFile');\n return Buffer.from(await response.arrayBuffer());\n }\n\n async function writeFile(\n filePath: string,\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n ): Promise<unknown> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const body = await normalizeWriteBody(content, options);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n method: 'PUT',\n headers: createHeaders(config, {\n 'Content-Type': 'application/octet-stream',\n }),\n body,\n }\n );\n await assertOk(response, 'writeFile');\n return response.json().catch(() => ({ ok: true }));\n }\n\n async function mkdir(\n filePath: string,\n options?: { recursive?: boolean }\n ): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n async function listFiles(\n filePath: string,\n options?: t.CloudflareSandboxListFilesOptions\n ): Promise<t.CloudflareSandboxFileInfo[]> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';\n const hiddenFilter =\n options?.includeHidden === true ? '' : ' \\\\( -name \\'.*\\' -prune \\\\) -o';\n const quotedPath = quote(resolvedPath);\n const command =\n `[ -d ${quotedPath} ] || { printf '%s is not a directory\\\\n' ${quotedPath} >&2; exit 20; }; ` +\n `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +\n '-printf \\'%y\\\\t%s\\\\t%p\\\\n\\'';\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);\n }\n return result.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [rawType, rawSize, ...pathParts] = line.split('\\t');\n const absolutePath = pathParts.join('\\t');\n return {\n name: path.basename(absolutePath),\n absolutePath,\n relativePath: path.relative(resolvedPath, absolutePath),\n type: typeFromFind(rawType),\n size: Number.parseInt(rawSize, 10) || 0,\n };\n });\n }\n\n async function deleteFile(filePath: string): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {\n cwd: workspaceRoot,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n return {\n supportsExecSignal: true,\n getSandboxId,\n exec,\n readFile,\n writeFile,\n mkdir,\n listFiles,\n deleteFile,\n };\n}\n"],"names":["path","exports"],"mappings":";;AAGA,MAAM,kBAAkB,GAAG,KAAK;AAChC,MAAM,sBAAsB,GAAG,YAAY;AAC3C,MAAM,aAAa,GAAG,MAAM;AA8B5B,SAAS,gBAAgB,CAAC,OAAe,EAAA;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACpC;AAEA,SAAS,eAAe,CAAC,MAA0B,EAAA;AACjD,IAAA,MAAM,GAAG,GAAG,MAAM,IAAI,kBAAkB;AACxC,IAAA,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE;IAC9D,OAAO,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAC7C;AAEA,SAAS,sBAAsB,CAAC,aAAqB,EAAA;IACnD,MAAM,UAAU,GAAGA,KAAI,CAAC,SAAS,CAAC,aAAa,CAAC;AAChD,IAAA,OAAO,UAAU,KAAK,GAAG,GAAG,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACzE;AAEA,SAAS,QAAQ,CAAC,MAAqC,EAAA;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;AAClD,IAAA,OAAO,SAAS,CAAC,IAAI,CAAC,UAAU,CAAiB;AACnD;AAEA,SAAS,KAAK,CAAC,KAAa,EAAA;AAC1B,IAAA,IAAI,KAAK,KAAK,EAAE,EAAE;AAChB,QAAA,OAAO,MAAM;IACf;AACA,IAAA,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AAC1C,QAAA,OAAO,KAAK;IACd;IACA,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA,CAAA,CAAG;AAC/C;AAEA,SAAS,gBAAgB,CAAC,QAAgB,EAAA;AACxC,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,MAAM,EAAE,EAAE;SAClB,KAAK,CAAC,GAAG;SACT,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI,CAAC;SACtC,IAAI,CAAC,GAAG,CAAC;AACd;AAEA,SAAS,aAAa,CAAC,QAAgB,EAAE,aAAqB,EAAA;AAC5D,IAAA,MAAM,GAAG,GAAG,QAAQ,KAAK,EAAE,GAAG,GAAG,GAAG,QAAQ;AAC5C,IAAA,MAAM,IAAI,GAAG,sBAAsB,CAAC,aAAa,CAAC;AAClD,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG;AACjC,UAAEA,KAAI,CAAC,SAAS,CAAC,GAAG;UAClBA,KAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC3B,IAAA,IAAI,IAAI,KAAK,GAAG,EAAE;AAChB,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,CAAC,EAAE;AACxD,QAAA,OAAO,QAAQ;IACjB;AACA,IAAA,MAAM,IAAI,KAAK,CACb,qDAAqD,QAAQ,CAAA,CAAE,CAChE;AACH;AAEA,SAAS,YAAY,CAAC,KAAa,EAAA;IACjC,QAAQ,KAAK;AACb,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,WAAW;AACpB,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,SAAS;AAClB,QAAA,KAAK,GAAG;AACN,YAAA,OAAO,MAAM;AACf,QAAA;AACE,YAAA,OAAO,OAAO;;AAElB;AAEA,SAAS,YAAY,CAAC,KAAa,EAAA;AACjC,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;AACtD;AAEA,eAAe,gBAAgB,CAAC,QAAkB,EAAA;AAChD,IAAA,IAAI;AACF,QAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;IAC9B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF;AAEA,eAAe,QAAQ,CAAC,QAAkB,EAAE,SAAiB,EAAA;AAC3D,IAAA,IAAI,QAAQ,CAAC,EAAE,EAAE;QACf;IACF;AACA,IAAA,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC;AAC7C,IAAA,MAAM,IAAI,KAAK,CACb,CAAA,0BAAA,EAA6B,SAAS,CAAA,SAAA,EAAY,QAAQ,CAAC,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAC9E;AACH;AAEA,SAAS,aAAa,CACpB,MAAqC,EACrC,KAAmB,EAAA;AAEnB,IAAA,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;AAClC,IAAA,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE;QACjD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,MAAM,CAAC,MAAM,CAAA,CAAE,CAAC;IACzD;AACA,IAAA,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,KAAK,EAAE,EAAE;QACvD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC;IAC7C;AACA,IAAA,OAAO,OAAO;AAChB;AAEA,SAAS,SAAS,CAAC,GAAwC,EAAA;AACzD,IAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG;AACtB,SAAA,MAAM,CAAC,CAAC,KAAK,KAAgC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;AAC7D,SAAA,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAI,KAAK,CAAC,KAAK,CAAC,EAAE;SACrD,IAAI,CAAC,IAAI,CAAC;AACf;AAEA,SAAS,cAAc,CACrB,OAAe,EACf,GAAwC,EAAA;AAExC,IAAA,MAAMC,SAAO,GAAG,SAAS,CAAC,GAAG,CAAC;AAC9B,IAAA,OAAOA,SAAO,KAAK,EAAE,GAAG,OAAO,GAAG,CAAA,EAAGA,SAAO,CAAA,EAAA,EAAK,OAAO,EAAE;AAC5D;AAEA,eAAe,qBAAqB,CAClC,MAAkC,EAAA;AAElC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE;IACjC,MAAM,MAAM,GAAiB,EAAE;IAC/B,IAAI,KAAK,GAAG,CAAC;AACb,IAAA,IAAI;AACF,QAAA,SAAS;YACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAC3C,YAAA,IAAI,IAAI;gBAAE;AACV,YAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,YAAA,KAAK,IAAI,KAAK,CAAC,UAAU;QAC3B;IACF;YAAU;QACR,MAAM,CAAC,WAAW,EAAE;IACtB;AACA,IAAA,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC;AACd,IAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,QAAA,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AACxB,QAAA,MAAM,IAAI,KAAK,CAAC,UAAU;IAC5B;AACA,IAAA,OAAO,KAAK;AACd;AAEA,eAAe,kBAAkB,CAC/B,OAA4C,EAC5C,OAA+B,EAAA;AAE/B,IAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,QAAA,OAAO,qBAAqB,CAAC,OAAO,CAAC;IACvC;AACA,IAAA,IAAI,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAE;QAClC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;IACvC;IACA,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7E;AAEA,SAAS,aAAa,CAAC,MAAc,EAAA;IAInC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;IAChD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;IACtC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;IACnC,MAAM,MAAM,GAAG;AACZ,SAAA,GAAG,CAAC,CAAC,IAAI,KAAI;QACZ,IAAI,KAAK,GAAG,SAAS;QACrB,MAAM,SAAS,GAAa,EAAE;QAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACnC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AAC7B,gBAAA,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;YAC5C;AAAO,iBAAA,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AACnC,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YACxD;QACF;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC9C,IAAA,CAAC;AACA,SAAA,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC;AACpE,IAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE;AAC9B;AAEA,SAAS,aAAa,CAAC,IAAY,EAAA;AACjC,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA2B;AACzD,QAAA,OAAO,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC;IACpE;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,CAAC;IACV;AACF;AAEA,SAAS,gBAAgB,CAAC,IAAY,EAAA;AACpC,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAuB;AACrD,QAAA,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI;IAC7B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,IAAI;IACb;AACF;AAEM,SAAU,6BAA6B,CAC3C,MAAqC,EAAA;IAErC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;IAChD,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC;IACxD,MAAM,aAAa,GAAG,sBAAsB,CAC1C,MAAM,CAAC,aAAa,IAAI,sBAAsB,CAC/C;AACD,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,aAAa;AAC3C,IAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;IAClC,IAAI,gBAAgB,GAClB,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS;IAE1E,SAAS,SAAS,CAAC,MAAc,EAAA;AAC/B,QAAA,OAAO,GAAG,OAAO,CAAA,EAAG,SAAS,CAAA,EAAG,MAAM,EAAE;IAC1C;AAEA,IAAA,eAAe,YAAY,GAAA;AACzB,QAAA,IAAI,gBAAgB,IAAI,IAAI,EAAE;AAC5B,YAAA,gBAAgB,GAAG,CAAC,YAA4B;gBAC9C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;AACtD,oBAAA,MAAM,EAAE,MAAM;AACd,oBAAA,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;AAC/B,iBAAA,CAAC;AACF,gBAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;gBAC1C,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB;AAC1D,gBAAA,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE;AACvD,oBAAA,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD;gBACH;gBACA,OAAO,OAAO,CAAC,EAAE;YACnB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAc,KAAI;gBAC5B,gBAAgB,GAAG,SAAS;AAC5B,gBAAA,MAAM,KAAK;AACb,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,gBAAgB;IACzB;AAEA,IAAA,eAAe,IAAI,CACjB,OAAe,EACf,UAA0C,EAAE,EAAA;AAE5C,QAAA,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,SAAS,CAAC,CAAA,SAAA,EAAY,aAAa,CAAA,KAAA,CAAO,CAAC,EAC3C;AACE,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE;AAC7B,gBAAA,cAAc,EAAE,kBAAkB;aACnC,CAAC;AACF,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;AACnB,gBAAA,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC1D,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,aAAa,EAAE,aAAa,CAAC;gBAC/D,UAAU,EAAE,OAAO,CAAC,OAAO;aAC5B,CAAC;YACF,MAAM,EAAE,OAAO,CAAC,MAAM;AACvB,SAAA,CACF;AACD,QAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;AAChC,QAAA,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE;AACzB,YAAA,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE;QACH;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;QACxC,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,MAAM,GAAG,EAAE;AACf,QAAA,IAAI,QAA4B;AAEhC,QAAA,IAAI;AACF,YAAA,SAAS;gBACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAC3C,gBAAA,IAAI,IAAI;oBAAE;AACV,gBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjD,gBAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;AACpC,gBAAA,MAAM,GAAG,MAAM,CAAC,SAAS;AACzB,gBAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;AACjC,oBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;wBAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;wBACxC,MAAM,IAAI,OAAO;wBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;oBACvC;AAAO,yBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;wBACnC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;wBACxC,MAAM,IAAI,OAAO;wBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;oBACvC;AAAO,yBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE;AACjC,wBAAA,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;oBACtC;AAAO,yBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;wBAClC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC/C;gBACF;YACF;AACA,YAAA,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;AAC1B,YAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;AACpC,YAAA,MAAM,GAAG,MAAM,CAAC,SAAS;AACzB,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;AACjC,gBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;oBAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;oBACxC,MAAM,IAAI,OAAO;oBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;gBACvC;AAAO,qBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE;oBACnC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;oBACxC,MAAM,IAAI,OAAO;oBACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,OAAO,CAAC;gBACvC;AAAO,qBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE;AACjC,oBAAA,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtC;AAAO,qBAAA,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE;oBAClC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC/C;YACF;QACF;gBAAU;YACR,MAAM,CAAC,WAAW,EAAE;QACtB;AAEA,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE;QACH;QAEA,OAAO;YACL,OAAO,EAAE,QAAQ,KAAK,CAAC;YACvB,QAAQ;YACR,MAAM;YACN,MAAM;YACN,OAAO;SACR;IACH;IAEA,eAAe,QAAQ,CAAC,QAAgB,EAAA;AACtC,QAAA,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC;QACnD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC3D,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,SAAS,CACP,CAAA,SAAA,EAAY,aAAa,CAAA,MAAA,EAAS,gBAAgB,CAAC,YAAY,CAAC,CAAA,CAAE,CACnE,EACD;AACE,YAAA,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC;AAC/B,SAAA,CACF;AACD,QAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;IAClD;AAEA,IAAA,eAAe,SAAS,CACtB,QAAgB,EAChB,OAA4C,EAC5C,OAA+B,EAAA;AAE/B,QAAA,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC;QACnD,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;AACvD,QAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,SAAS,CACP,CAAA,SAAA,EAAY,aAAa,CAAA,MAAA,EAAS,gBAAgB,CAAC,YAAY,CAAC,CAAA,CAAE,CACnE,EACD;AACE,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE;AAC7B,gBAAA,cAAc,EAAE,0BAA0B;aAC3C,CAAC;YACF,IAAI;AACL,SAAA,CACF;AACD,QAAA,MAAM,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;AACrC,QAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD;AAEA,IAAA,eAAe,KAAK,CAClB,QAAgB,EAChB,OAAiC,EAAA;QAEjC,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC3D,MAAM,OAAO,GAAG,CAAA,EAAG,OAAO,EAAE,SAAS,KAAK,IAAI,GAAG,UAAU,GAAG,OAAO,CAAA,IAAA,EAAO,KAAK,CAAC,YAAY,CAAC,CAAA,CAAE;AACjG,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;AAC1D,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAA,iBAAA,EAAoB,YAAY,CAAA,CAAE,CAAC;QACtE;AACA,QAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE;IACrB;AAEA,IAAA,eAAe,SAAS,CACtB,QAAgB,EAChB,OAA6C,EAAA;QAE7C,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;AAC3D,QAAA,MAAM,QAAQ,GAAG,OAAO,EAAE,SAAS,KAAK,IAAI,GAAG,EAAE,GAAG,aAAa;AACjE,QAAA,MAAM,YAAY,GAChB,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,EAAE,GAAG,iCAAiC;AAC1E,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC;AACtC,QAAA,MAAM,OAAO,GACX,CAAA,KAAA,EAAQ,UAAU,CAAA,0CAAA,EAA6C,UAAU,CAAA,kBAAA,CAAoB;AAC7F,YAAA,CAAA,KAAA,EAAQ,UAAU,CAAA,aAAA,EAAgB,QAAQ,CAAA,EAAG,YAAY,CAAA,CAAA,CAAG;AAC5D,YAAA,6BAA6B;AAC/B,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC;AAC1D,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAA,qBAAA,EAAwB,YAAY,CAAA,CAAE,CAAC;QAC1E;QACA,OAAO,MAAM,CAAC;aACX,KAAK,CAAC,IAAI;aACV,MAAM,CAAC,OAAO;AACd,aAAA,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,YAAA,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACzD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,OAAO;AACL,gBAAA,IAAI,EAAED,KAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACjC,YAAY;gBACZ,YAAY,EAAEA,KAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;AACvD,gBAAA,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC;gBAC3B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC;aACxC;AACH,QAAA,CAAC,CAAC;IACN;IAEA,eAAe,UAAU,CAAC,QAAgB,EAAA;QACxC,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,CAAA,UAAA,EAAa,KAAK,CAAC,YAAY,CAAC,CAAA,CAAE,EAAE;AAC5D,YAAA,GAAG,EAAE,aAAa;AACnB,SAAA,CAAC;AACF,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAA,sBAAA,EAAyB,YAAY,CAAA,CAAE,CAAC;QAC3E;AACA,QAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE;IACrB;IAEA,OAAO;AACL,QAAA,kBAAkB,EAAE,IAAI;QACxB,YAAY;QACZ,IAAI;QACJ,QAAQ;QACR,SAAS;QACT,KAAK;QACL,SAAS;QACT,UAAU;KACX;AACH;;;;"}
1
+ {"version":3,"file":"CloudflareBridgeRuntime.mjs","names":["path"],"sources":["../../../../src/tools/cloudflare/CloudflareBridgeRuntime.ts"],"sourcesContent":["import { posix as path } from 'path';\nimport type * as t from '@/types';\n\nconst DEFAULT_API_PREFIX = '/v1';\nconst DEFAULT_WORKSPACE_ROOT = '/workspace';\nconst DEFAULT_SHELL = 'bash';\n\nexport type CloudflareBridgeRuntimeConfig = {\n /** Base URL of a Worker using `bridge()` from `@cloudflare/sandbox/bridge`. */\n baseURL: string;\n /** Bearer token stored in the bridge Worker as `SANDBOX_API_KEY`. */\n apiKey?: string;\n /** Existing sandbox id. If omitted, the adapter creates one lazily. */\n sandboxId?: string;\n /** Bridge API route prefix. Defaults to `/v1`. */\n apiRoutePrefix?: string;\n /** Workspace root used for path clamping. Defaults to `/workspace`. */\n workspaceRoot?: string;\n /** Optional bridge session id sent as `Session-Id`. */\n sessionId?: string;\n /** Shell used to run command strings over the bridge exec endpoint. */\n shell?: string;\n /** Optional fetch implementation. Defaults to global `fetch`. */\n fetch?: typeof fetch;\n};\n\nexport type CloudflareBridgeRuntime = t.CloudflareSandboxRuntime & {\n getSandboxId(): Promise<string>;\n};\n\ntype BridgeSSEEvent = {\n event: string;\n data: string;\n};\n\nfunction normalizeBaseURL(baseURL: string): string {\n return baseURL.replace(/\\/+$/, '');\n}\n\nfunction normalizePrefix(prefix: string | undefined): string {\n const raw = prefix ?? DEFAULT_API_PREFIX;\n const withLeadingSlash = raw.startsWith('/') ? raw : `/${raw}`;\n return withLeadingSlash.replace(/\\/+$/, '');\n}\n\nfunction normalizeWorkspaceRoot(workspaceRoot: string): string {\n const normalized = path.normalize(workspaceRoot);\n return normalized === '/' ? normalized : normalized.replace(/\\/+$/, '');\n}\n\nfunction getFetch(config: CloudflareBridgeRuntimeConfig): typeof fetch {\n const fetchImpl = config.fetch ?? globalThis.fetch;\n return fetchImpl.bind(globalThis) as typeof fetch;\n}\n\nfunction quote(value: string): string {\n if (value === '') {\n return '\\'\\'';\n }\n if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n return value;\n }\n return `'${value.replace(/'/g, '\\'\\\\\\'\\'')}'`;\n}\n\nfunction encodeBridgePath(filePath: string): string {\n return filePath\n .replace(/^\\/+/, '')\n .split('/')\n .map((part) => encodeURIComponent(part))\n .join('/');\n}\n\nfunction toSandboxPath(filePath: string, workspaceRoot: string): string {\n const raw = filePath === '' ? '.' : filePath;\n const root = normalizeWorkspaceRoot(workspaceRoot);\n const resolved = raw.startsWith('/')\n ? path.normalize(raw)\n : path.resolve(root, raw);\n if (root === '/') {\n return resolved;\n }\n if (resolved === root || resolved.startsWith(`${root}/`)) {\n return resolved;\n }\n throw new Error(\n `Path is outside the Cloudflare sandbox workspace: ${filePath}`\n );\n}\n\nfunction typeFromFind(value: string): t.CloudflareSandboxFileInfo['type'] {\n switch (value) {\n case 'd':\n return 'directory';\n case 'l':\n return 'symlink';\n case 'f':\n return 'file';\n default:\n return 'other';\n }\n}\n\nfunction decodeBase64(value: string): string {\n return Buffer.from(value, 'base64').toString('utf8');\n}\n\nasync function readResponseText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return '';\n }\n}\n\nasync function assertOk(response: Response, operation: string): Promise<void> {\n if (response.ok) {\n return;\n }\n const text = await readResponseText(response);\n throw new Error(\n `Cloudflare sandbox bridge ${operation} failed (${response.status}): ${text}`\n );\n}\n\nfunction createHeaders(\n config: CloudflareBridgeRuntimeConfig,\n extra?: HeadersInit\n): Headers {\n const headers = new Headers(extra);\n if (config.apiKey != null && config.apiKey !== '') {\n headers.set('Authorization', `Bearer ${config.apiKey}`);\n }\n if (config.sessionId != null && config.sessionId !== '') {\n headers.set('Session-Id', config.sessionId);\n }\n return headers;\n}\n\nfunction envScript(env?: Record<string, string | undefined>): string {\n if (env == null) {\n return '';\n }\n return Object.entries(env)\n .filter((entry): entry is [string, string] => entry[1] != null)\n .map(([key, value]) => `export ${key}=${quote(value)}`)\n .join('\\n');\n}\n\nfunction commandWithEnv(\n command: string,\n env?: Record<string, string | undefined>\n): string {\n const exports = envScript(env);\n return exports === '' ? command : `${exports}\\n${command}`;\n}\n\nasync function collectReadableStream(\n stream: ReadableStream<Uint8Array>\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n total += value.byteLength;\n }\n } finally {\n reader.releaseLock();\n }\n const bytes = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\nasync function normalizeWriteBody(\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n): Promise<Uint8Array> {\n if (typeof content !== 'string') {\n return collectReadableStream(content);\n }\n if (options?.encoding === 'base64') {\n return Buffer.from(content, 'base64');\n }\n return Buffer.from(content, options?.encoding === 'utf8' ? 'utf8' : 'utf8');\n}\n\nfunction parseSSEChunk(buffer: string): {\n events: BridgeSSEEvent[];\n remainder: string;\n} {\n const normalized = buffer.replace(/\\r\\n/g, '\\n');\n const parts = normalized.split('\\n\\n');\n const remainder = parts.pop() ?? '';\n const events = parts\n .map((part) => {\n let event = 'message';\n const dataLines: string[] = [];\n for (const line of part.split('\\n')) {\n if (line.startsWith('event:')) {\n event = line.slice('event:'.length).trim();\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice('data:'.length).trimStart());\n }\n }\n return { event, data: dataLines.join('\\n') };\n })\n .filter((event) => event.data !== '' || event.event !== 'message');\n return { events, remainder };\n}\n\nfunction parseExitCode(data: string): number {\n try {\n const parsed = JSON.parse(data) as { exit_code?: number };\n return typeof parsed.exit_code === 'number' ? parsed.exit_code : 1;\n } catch {\n return 1;\n }\n}\n\nfunction parseBridgeError(data: string): string {\n try {\n const parsed = JSON.parse(data) as { error?: string };\n return parsed.error ?? data;\n } catch {\n return data;\n }\n}\n\nexport function createCloudflareBridgeRuntime(\n config: CloudflareBridgeRuntimeConfig\n): CloudflareBridgeRuntime {\n const baseURL = normalizeBaseURL(config.baseURL);\n const apiPrefix = normalizePrefix(config.apiRoutePrefix);\n const workspaceRoot = normalizeWorkspaceRoot(\n config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT\n );\n const shell = config.shell ?? DEFAULT_SHELL;\n const fetchImpl = getFetch(config);\n let sandboxIdPromise: Promise<string> | undefined =\n config.sandboxId != null ? Promise.resolve(config.sandboxId) : undefined;\n\n function bridgeURL(suffix: string): string {\n return `${baseURL}${apiPrefix}${suffix}`;\n }\n\n async function getSandboxId(): Promise<string> {\n if (sandboxIdPromise == null) {\n sandboxIdPromise = (async (): Promise<string> => {\n const response = await fetchImpl(bridgeURL('/sandbox'), {\n method: 'POST',\n headers: createHeaders(config),\n });\n await assertOk(response, 'sandbox create');\n const payload = (await response.json()) as { id?: string };\n if (typeof payload.id !== 'string' || payload.id === '') {\n throw new Error(\n 'Cloudflare sandbox bridge create did not return an id.'\n );\n }\n return payload.id;\n })().catch((error: unknown) => {\n sandboxIdPromise = undefined;\n throw error;\n });\n }\n return sandboxIdPromise;\n }\n\n async function exec(\n command: string,\n options: t.CloudflareSandboxExecOptions = {}\n ): Promise<t.CloudflareSandboxExecResult> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const response = await fetchImpl(\n bridgeURL(`/sandbox/${sandboxPathId}/exec`),\n {\n method: 'POST',\n headers: createHeaders(config, {\n 'Content-Type': 'application/json',\n }),\n body: JSON.stringify({\n argv: [shell, '-lc', commandWithEnv(command, options.env)],\n cwd: toSandboxPath(options.cwd ?? workspaceRoot, workspaceRoot),\n timeout_ms: options.timeout,\n }),\n signal: options.signal,\n }\n );\n await assertOk(response, 'exec');\n if (response.body == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec response did not include a body.'\n );\n }\n\n const decoder = new TextDecoder();\n const reader = response.body.getReader();\n let buffer = '';\n let stdout = '';\n let stderr = '';\n let exitCode: number | undefined;\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n }\n buffer += decoder.decode();\n const parsed = parseSSEChunk(buffer);\n buffer = parsed.remainder;\n for (const event of parsed.events) {\n if (event.event === 'stdout') {\n const decoded = decodeBase64(event.data);\n stdout += decoded;\n options.onOutput?.('stdout', decoded);\n } else if (event.event === 'stderr') {\n const decoded = decodeBase64(event.data);\n stderr += decoded;\n options.onOutput?.('stderr', decoded);\n } else if (event.event === 'exit') {\n exitCode = parseExitCode(event.data);\n } else if (event.event === 'error') {\n throw new Error(parseBridgeError(event.data));\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (exitCode == null) {\n throw new Error(\n 'Cloudflare sandbox bridge exec stream closed before an exit event.'\n );\n }\n\n return {\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n command,\n };\n }\n\n async function readFile(filePath: string): Promise<Buffer> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n headers: createHeaders(config),\n }\n );\n await assertOk(response, 'readFile');\n return Buffer.from(await response.arrayBuffer());\n }\n\n async function writeFile(\n filePath: string,\n content: string | ReadableStream<Uint8Array>,\n options?: { encoding?: string }\n ): Promise<unknown> {\n const sandboxId = await getSandboxId();\n const sandboxPathId = encodeURIComponent(sandboxId);\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const body = await normalizeWriteBody(content, options);\n const response = await fetchImpl(\n bridgeURL(\n `/sandbox/${sandboxPathId}/file/${encodeBridgePath(resolvedPath)}`\n ),\n {\n method: 'PUT',\n headers: createHeaders(config, {\n 'Content-Type': 'application/octet-stream',\n }),\n body,\n }\n );\n await assertOk(response, 'writeFile');\n return response.json().catch(() => ({ ok: true }));\n }\n\n async function mkdir(\n filePath: string,\n options?: { recursive?: boolean }\n ): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const command = `${options?.recursive === true ? 'mkdir -p' : 'mkdir'} -- ${quote(resolvedPath)}`;\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `mkdir failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n async function listFiles(\n filePath: string,\n options?: t.CloudflareSandboxListFilesOptions\n ): Promise<t.CloudflareSandboxFileInfo[]> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const maxDepth = options?.recursive === true ? '' : '-maxdepth 1';\n const hiddenFilter =\n options?.includeHidden === true ? '' : ' \\\\( -name \\'.*\\' -prune \\\\) -o';\n const quotedPath = quote(resolvedPath);\n const command =\n `[ -d ${quotedPath} ] || { printf '%s is not a directory\\\\n' ${quotedPath} >&2; exit 20; }; ` +\n `find ${quotedPath} -mindepth 1 ${maxDepth}${hiddenFilter} ` +\n '-printf \\'%y\\\\t%s\\\\t%p\\\\n\\'';\n const result = await exec(command, { cwd: workspaceRoot });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `listFiles failed for ${resolvedPath}`);\n }\n return result.stdout\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const [rawType, rawSize, ...pathParts] = line.split('\\t');\n const absolutePath = pathParts.join('\\t');\n return {\n name: path.basename(absolutePath),\n absolutePath,\n relativePath: path.relative(resolvedPath, absolutePath),\n type: typeFromFind(rawType),\n size: Number.parseInt(rawSize, 10) || 0,\n };\n });\n }\n\n async function deleteFile(filePath: string): Promise<unknown> {\n const resolvedPath = toSandboxPath(filePath, workspaceRoot);\n const result = await exec(`rm -rf -- ${quote(resolvedPath)}`, {\n cwd: workspaceRoot,\n });\n if (result.exitCode !== 0) {\n throw new Error(result.stderr || `deleteFile failed for ${resolvedPath}`);\n }\n return { ok: true };\n }\n\n return {\n supportsExecSignal: true,\n getSandboxId,\n exec,\n readFile,\n writeFile,\n mkdir,\n listFiles,\n deleteFile,\n };\n}\n"],"mappings":"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"}
@@ -1,148 +1,138 @@
1
- import { tool } from '@langchain/core/tools';
2
- import { ProgrammaticToolCallingDescription, ProgrammaticToolCallingName, formatCompletedResponse, ProgrammaticToolCallingSchema, normalizeToPythonIdentifier, filterToolsByUsage } from '../ProgrammaticToolCalling.mjs';
3
- import { BashProgrammaticToolCallingDescription, BashProgrammaticToolCallingSchema, normalizeToBashIdentifier, filterBashToolsByUsage } from '../BashProgrammaticToolCalling.mjs';
4
- import { Constants } from '../../common/enum.mjs';
5
- import { getCloudflareWorkspaceRoot, validateCloudflareBashCommand, executeCloudflareCode, resolveCloudflareSandbox } from './CloudflareSandboxExecutionEngine.mjs';
6
-
7
- const DEFAULT_TIMEOUT = 60000;
8
- const MIN_TIMEOUT = 1000;
9
- const MAX_TIMEOUT = 300000;
10
- const DEFAULT_MAX_OUTPUT_CHARS = 200000;
1
+ import "../../common/enum.mjs";
2
+ import "../../common/index.mjs";
3
+ import { ProgrammaticToolCallingDescription, ProgrammaticToolCallingName, ProgrammaticToolCallingSchema, filterToolsByUsage, formatCompletedResponse, normalizeToPythonIdentifier } from "../ProgrammaticToolCalling.mjs";
4
+ import { BashProgrammaticToolCallingDescription, BashProgrammaticToolCallingSchema, filterBashToolsByUsage, normalizeToBashIdentifier } from "../BashProgrammaticToolCalling.mjs";
5
+ import { executeCloudflareCode, getCloudflareWorkspaceRoot, resolveCloudflareSandbox, validateCloudflareBashCommand } from "./CloudflareSandboxExecutionEngine.mjs";
6
+ import { tool } from "@langchain/core/tools";
7
+ //#region src/tools/cloudflare/CloudflareProgrammaticToolCalling.ts
8
+ const DEFAULT_TIMEOUT = 6e4;
9
+ const MIN_TIMEOUT = 1e3;
10
+ const MAX_TIMEOUT = 3e5;
11
+ const DEFAULT_MAX_OUTPUT_CHARS = 2e5;
11
12
  const NATIVE_TOOL_NAMES = new Set([
12
- Constants.READ_FILE,
13
- Constants.WRITE_FILE,
14
- Constants.EDIT_FILE,
15
- Constants.GREP_SEARCH,
16
- Constants.GLOB_SEARCH,
17
- Constants.LIST_DIRECTORY,
18
- Constants.COMPILE_CHECK,
19
- Constants.BASH_TOOL,
20
- Constants.EXECUTE_CODE,
13
+ "read_file",
14
+ "write_file",
15
+ "edit_file",
16
+ "grep_search",
17
+ "glob_search",
18
+ "list_directory",
19
+ "compile_check",
20
+ "bash_tool",
21
+ "execute_code"
21
22
  ]);
22
23
  function normalizeTimeout(timeoutMs) {
23
- if (timeoutMs == null || !Number.isFinite(timeoutMs)) {
24
- return DEFAULT_TIMEOUT;
25
- }
26
- return Math.max(MIN_TIMEOUT, Math.floor(timeoutMs));
24
+ if (timeoutMs == null || !Number.isFinite(timeoutMs)) return DEFAULT_TIMEOUT;
25
+ return Math.max(MIN_TIMEOUT, Math.floor(timeoutMs));
27
26
  }
28
27
  function formatTimeout(timeoutMs) {
29
- return timeoutMs % 1000 === 0
30
- ? `${timeoutMs / 1000} seconds`
31
- : `${timeoutMs} milliseconds`;
28
+ return timeoutMs % 1e3 === 0 ? `${timeoutMs / 1e3} seconds` : `${timeoutMs} milliseconds`;
32
29
  }
33
30
  function createTimeoutSchema(timeoutMs) {
34
- const defaultTimeout = normalizeTimeout(timeoutMs);
35
- const maxTimeout = Math.max(MAX_TIMEOUT, defaultTimeout);
36
- return {
37
- type: 'integer',
38
- minimum: MIN_TIMEOUT,
39
- maximum: maxTimeout,
40
- default: defaultTimeout,
41
- description: 'Maximum Cloudflare Sandbox execution time in milliseconds. ' +
42
- `Default: ${formatTimeout(defaultTimeout)}. Max: ${formatTimeout(maxTimeout)}.`,
43
- };
31
+ const defaultTimeout = normalizeTimeout(timeoutMs);
32
+ const maxTimeout = Math.max(MAX_TIMEOUT, defaultTimeout);
33
+ return {
34
+ type: "integer",
35
+ minimum: MIN_TIMEOUT,
36
+ maximum: maxTimeout,
37
+ default: defaultTimeout,
38
+ description: `Maximum Cloudflare Sandbox execution time in milliseconds. Default: ${formatTimeout(defaultTimeout)}. Max: ${formatTimeout(maxTimeout)}.`
39
+ };
44
40
  }
45
41
  function clampExecutionTimeout(requestedTimeoutMs, configuredTimeoutMs) {
46
- const defaultTimeout = normalizeTimeout(configuredTimeoutMs);
47
- const maxTimeout = Math.max(MAX_TIMEOUT, defaultTimeout);
48
- if (requestedTimeoutMs == null || !Number.isFinite(requestedTimeoutMs)) {
49
- return defaultTimeout;
50
- }
51
- return Math.min(Math.max(MIN_TIMEOUT, Math.floor(requestedTimeoutMs)), maxTimeout);
42
+ const defaultTimeout = normalizeTimeout(configuredTimeoutMs);
43
+ const maxTimeout = Math.max(MAX_TIMEOUT, defaultTimeout);
44
+ if (requestedTimeoutMs == null || !Number.isFinite(requestedTimeoutMs)) return defaultTimeout;
45
+ return Math.min(Math.max(MIN_TIMEOUT, Math.floor(requestedTimeoutMs)), maxTimeout);
52
46
  }
53
47
  function quoteShell(value) {
54
- if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {
55
- return value;
56
- }
57
- const escapedQuote = String.raw `'\''`;
58
- return `'${value.replace(/'/g, escapedQuote)}'`;
48
+ if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) return value;
49
+ const escapedQuote = String.raw`'\''`;
50
+ return `'${value.replace(/'/g, escapedQuote)}'`;
59
51
  }
60
52
  function truncateOutput(value, maxChars = DEFAULT_MAX_OUTPUT_CHARS) {
61
- if (value.length <= maxChars) {
62
- return value;
63
- }
64
- const head = Math.floor(maxChars * 0.6);
65
- const tail = maxChars - head;
66
- const omitted = value.length - maxChars;
67
- return `${value.slice(0, head)}\n\n[... ${omitted} characters truncated ...]\n\n${value.slice(value.length - tail)}`;
53
+ if (value.length <= maxChars) return value;
54
+ const head = Math.floor(maxChars * .6);
55
+ const tail = maxChars - head;
56
+ const omitted = value.length - maxChars;
57
+ return `${value.slice(0, head)}\n\n[... ${omitted} characters truncated ...]\n\n${value.slice(value.length - tail)}`;
68
58
  }
69
59
  function withInSandboxTimeout(command, timeoutMs) {
70
- const timeoutSeconds = Math.max(1, Math.ceil(timeoutMs / 1000));
71
- return `timeout -k 2s ${timeoutSeconds}s ${command}`;
60
+ return `timeout -k 2s ${Math.max(1, Math.ceil(timeoutMs / 1e3))}s ${command}`;
72
61
  }
73
62
  function outerTimeoutMs(timeoutMs) {
74
- return timeoutMs + 5000;
63
+ return timeoutMs + 5e3;
75
64
  }
76
65
  function isInSandboxTimeoutExit(exitCode) {
77
- return exitCode === 124 || exitCode === 137;
66
+ return exitCode === 124 || exitCode === 137;
78
67
  }
79
68
  async function executeGeneratedCloudflareBash(command, config) {
80
- const sandbox = await resolveCloudflareSandbox(config);
81
- const workspaceRoot = getCloudflareWorkspaceRoot(config);
82
- const shell = config.shell ?? 'bash';
83
- const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT;
84
- const result = await sandbox.exec(withInSandboxTimeout(`${shell} -lc ${quoteShell(command)}`, timeoutMs), {
85
- cwd: workspaceRoot,
86
- env: config.env,
87
- timeout: outerTimeoutMs(timeoutMs),
88
- });
89
- const maxOutputChars = config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;
90
- return {
91
- stdout: truncateOutput(result.stdout, maxOutputChars),
92
- stderr: truncateOutput(result.stderr, maxOutputChars),
93
- exitCode: result.exitCode,
94
- timedOut: isInSandboxTimeoutExit(result.exitCode),
95
- };
69
+ const sandbox = await resolveCloudflareSandbox(config);
70
+ const workspaceRoot = getCloudflareWorkspaceRoot(config);
71
+ const shell = config.shell ?? "bash";
72
+ const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT;
73
+ const result = await sandbox.exec(withInSandboxTimeout(`${shell} -lc ${quoteShell(command)}`, timeoutMs), {
74
+ cwd: workspaceRoot,
75
+ env: config.env,
76
+ timeout: outerTimeoutMs(timeoutMs)
77
+ });
78
+ const maxOutputChars = config.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;
79
+ return {
80
+ stdout: truncateOutput(result.stdout, maxOutputChars),
81
+ stderr: truncateOutput(result.stderr, maxOutputChars),
82
+ exitCode: result.exitCode,
83
+ timedOut: isInSandboxTimeoutExit(result.exitCode)
84
+ };
96
85
  }
97
86
  function createCloudflareProgrammaticToolCallingSchema(config) {
98
- return {
99
- ...ProgrammaticToolCallingSchema,
100
- properties: {
101
- ...ProgrammaticToolCallingSchema.properties,
102
- timeout: createTimeoutSchema(config.timeoutMs),
103
- lang: {
104
- type: 'string',
105
- enum: ['py', 'python', 'bash', 'sh'],
106
- default: 'bash',
107
- description: 'Cloudflare Sandbox runtime for orchestration code. Defaults to bash; use py/python for Python orchestration.',
108
- },
109
- },
110
- };
87
+ return {
88
+ ...ProgrammaticToolCallingSchema,
89
+ properties: {
90
+ ...ProgrammaticToolCallingSchema.properties,
91
+ timeout: createTimeoutSchema(config.timeoutMs),
92
+ lang: {
93
+ type: "string",
94
+ enum: [
95
+ "py",
96
+ "python",
97
+ "bash",
98
+ "sh"
99
+ ],
100
+ default: "bash",
101
+ description: "Cloudflare Sandbox runtime for orchestration code. Defaults to bash; use py/python for Python orchestration."
102
+ }
103
+ }
104
+ };
111
105
  }
112
106
  function createCloudflareBashProgrammaticToolCallingSchema(config) {
113
- return {
114
- ...BashProgrammaticToolCallingSchema,
115
- properties: {
116
- ...BashProgrammaticToolCallingSchema.properties,
117
- timeout: createTimeoutSchema(config.timeoutMs),
118
- },
119
- };
107
+ return {
108
+ ...BashProgrammaticToolCallingSchema,
109
+ properties: {
110
+ ...BashProgrammaticToolCallingSchema.properties,
111
+ timeout: createTimeoutSchema(config.timeoutMs)
112
+ }
113
+ };
120
114
  }
121
115
  function resolveRuntime(params) {
122
- const raw = params.lang ?? params.runtime ?? params.language ?? 'bash';
123
- return raw === 'py' || raw === 'python' ? 'python' : 'bash';
116
+ const raw = params.lang ?? params.runtime ?? params.language ?? "bash";
117
+ return raw === "py" || raw === "python" ? "python" : "bash";
124
118
  }
125
119
  function filterNativeTools(toolDefs, code, runtime) {
126
- const nativeDefs = toolDefs.filter((def) => NATIVE_TOOL_NAMES.has(def.name));
127
- const filter = runtime === 'bash' ? filterBashToolsByUsage : filterToolsByUsage;
128
- return filter(nativeDefs, code);
120
+ const nativeDefs = toolDefs.filter((def) => NATIVE_TOOL_NAMES.has(def.name));
121
+ return (runtime === "bash" ? filterBashToolsByUsage : filterToolsByUsage)(nativeDefs, code);
129
122
  }
130
123
  function indent(code, spaces = 4) {
131
- const prefix = ' '.repeat(spaces);
132
- return code
133
- .split('\n')
134
- .map((line) => (line === '' ? line : prefix + line))
135
- .join('\n');
124
+ const prefix = " ".repeat(spaces);
125
+ return code.split("\n").map((line) => line === "" ? line : prefix + line).join("\n");
136
126
  }
137
127
  function pythonBoolean(value) {
138
- return value === true ? 'True' : 'False';
128
+ return value === true ? "True" : "False";
139
129
  }
140
130
  function createPythonNativeToolSource(config, workspaceRoot) {
141
- return `
131
+ return `
142
132
  import asyncio, fnmatch, glob, json, os, pathlib, re, shlex, shutil, subprocess, sys, tempfile
143
133
 
144
134
  WORKSPACE = ${JSON.stringify(workspaceRoot)}
145
- SHELL = ${JSON.stringify(config.shell ?? 'bash')}
135
+ SHELL = ${JSON.stringify(config.shell ?? "bash")}
146
136
  READ_ONLY = ${pythonBoolean(config.readOnly)}
147
137
  ALLOW_DANGEROUS_COMMANDS = ${pythonBoolean(config.allowDangerousCommands)}
148
138
  DESTRUCTIVE_TARGET = r"(?:/|~|\\$\\{?HOME\\}?|\\.)(?:/?\\.?\\*|/)?"
@@ -452,14 +442,14 @@ glob_module = glob
452
442
  `.trim();
453
443
  }
454
444
  function createNodeNativeToolSource(config, workspaceRoot) {
455
- return `
445
+ return `
456
446
  const fs = require("fs");
457
447
  const fsp = fs.promises;
458
448
  const path = require("path");
459
449
  const cp = require("child_process");
460
450
 
461
451
  const WORKSPACE = ${JSON.stringify(workspaceRoot)};
462
- const SHELL = ${JSON.stringify(config.shell ?? 'bash')};
452
+ const SHELL = ${JSON.stringify(config.shell ?? "bash")};
463
453
  const READ_ONLY = ${JSON.stringify(config.readOnly === true)};
464
454
  const ALLOW_DANGEROUS_COMMANDS = ${JSON.stringify(config.allowDangerousCommands === true)};
465
455
  const DESTRUCTIVE_TARGET = "(?:\\\\/|~|\\\\$\\\\{?HOME\\\\}?|\\\\.)(?:\\\\/?\\\\.?\\\\*|\\\\/)?";
@@ -882,16 +872,11 @@ main().catch((error) => {
882
872
  `.trim();
883
873
  }
884
874
  function createPythonProgram(userCode, toolDefs, config, workspaceRoot) {
885
- const aliases = toolDefs
886
- .map((def) => {
887
- const pythonName = normalizeToPythonIdentifier(def.name);
888
- return NATIVE_TOOL_NAMES.has(def.name) && pythonName !== def.name
889
- ? `${pythonName} = globals()[${JSON.stringify(def.name)}]`
890
- : '';
891
- })
892
- .filter(Boolean)
893
- .join('\n');
894
- return `${createPythonNativeToolSource(config, workspaceRoot)}
875
+ const aliases = toolDefs.map((def) => {
876
+ const pythonName = normalizeToPythonIdentifier(def.name);
877
+ return NATIVE_TOOL_NAMES.has(def.name) && pythonName !== def.name ? `${pythonName} = globals()[${JSON.stringify(def.name)}]` : "";
878
+ }).filter(Boolean).join("\n");
879
+ return `${createPythonNativeToolSource(config, workspaceRoot)}
895
880
  ${aliases}
896
881
 
897
882
  async def __lc_user_main__():
@@ -901,94 +886,84 @@ asyncio.run(__lc_user_main__())
901
886
  `;
902
887
  }
903
888
  function createBashProgram(userCode, toolDefs, config, workspaceRoot) {
904
- const helper = createNodeNativeToolSource(config, workspaceRoot);
905
- const functions = toolDefs
906
- .map((def) => {
907
- const bashName = normalizeToBashIdentifier(def.name);
908
- if (!NATIVE_TOOL_NAMES.has(def.name)) {
909
- return '';
910
- }
911
- return `${bashName}() { node "$__LC_TOOL_HELPER" ${JSON.stringify(def.name)} "$1"; }`;
912
- })
913
- .filter(Boolean)
914
- .join('\n');
915
- return `
889
+ return `
916
890
  set -euo pipefail
917
891
  command -v node >/dev/null 2>&1 || { echo "Cloudflare programmatic tool calling requires node in the sandbox image." >&2; exit 127; }
918
892
  __LC_TOOL_HELPER="$(mktemp /tmp/lc-tools.XXXXXX.js)"
919
893
  cat > "$__LC_TOOL_HELPER" <<'JS'
920
- ${helper}
894
+ ${createNodeNativeToolSource(config, workspaceRoot)}
921
895
  JS
922
896
  trap 'rm -f "$__LC_TOOL_HELPER"' EXIT
923
- ${functions}
897
+ ${toolDefs.map((def) => {
898
+ const bashName = normalizeToBashIdentifier(def.name);
899
+ if (!NATIVE_TOOL_NAMES.has(def.name)) return "";
900
+ return `${bashName}() { node "$__LC_TOOL_HELPER" ${JSON.stringify(def.name)} "$1"; }`;
901
+ }).filter(Boolean).join("\n")}
924
902
  ${userCode}
925
903
  `.trim();
926
904
  }
927
905
  async function runProgrammatic(args) {
928
- const toolCall = (args.config?.toolCall ??
929
- {});
930
- const toolDefs = toolCall.toolDefs ?? [];
931
- const effectiveTools = filterNativeTools(toolDefs, args.params.code, args.runtime);
932
- const timeoutMs = clampExecutionTimeout(args.params.timeout, args.cloudflareConfig.timeoutMs);
933
- const workspaceRoot = getCloudflareWorkspaceRoot(args.cloudflareConfig);
934
- let result;
935
- if (args.runtime === 'bash') {
936
- await validateCloudflareBashCommand(args.params.code, [], {
937
- ...args.cloudflareConfig,
938
- timeoutMs,
939
- });
940
- result = await executeGeneratedCloudflareBash(createBashProgram(args.params.code, effectiveTools, args.cloudflareConfig, workspaceRoot), { ...args.cloudflareConfig, timeoutMs });
941
- }
942
- else {
943
- result = await executeCloudflareCode({
944
- lang: 'py',
945
- code: createPythonProgram(args.params.code, effectiveTools, args.cloudflareConfig, workspaceRoot),
946
- }, { ...args.cloudflareConfig, timeoutMs });
947
- }
948
- if (result.exitCode !== 0 || result.timedOut) {
949
- throw new Error(result.stderr !== ''
950
- ? result.stderr
951
- : `Cloudflare ${args.runtime} programmatic execution exited with code ${result.exitCode ?? 'unknown'}`);
952
- }
953
- return formatCompletedResponse({
954
- session_id: 'cloudflare-sandbox',
955
- stdout: result.stdout,
956
- stderr: result.stderr,
957
- files: [],
958
- });
906
+ const effectiveTools = filterNativeTools((args.config?.toolCall ?? {}).toolDefs ?? [], args.params.code, args.runtime);
907
+ const timeoutMs = clampExecutionTimeout(args.params.timeout, args.cloudflareConfig.timeoutMs);
908
+ const workspaceRoot = getCloudflareWorkspaceRoot(args.cloudflareConfig);
909
+ let result;
910
+ if (args.runtime === "bash") {
911
+ await validateCloudflareBashCommand(args.params.code, [], {
912
+ ...args.cloudflareConfig,
913
+ timeoutMs
914
+ });
915
+ result = await executeGeneratedCloudflareBash(createBashProgram(args.params.code, effectiveTools, args.cloudflareConfig, workspaceRoot), {
916
+ ...args.cloudflareConfig,
917
+ timeoutMs
918
+ });
919
+ } else result = await executeCloudflareCode({
920
+ lang: "py",
921
+ code: createPythonProgram(args.params.code, effectiveTools, args.cloudflareConfig, workspaceRoot)
922
+ }, {
923
+ ...args.cloudflareConfig,
924
+ timeoutMs
925
+ });
926
+ if (result.exitCode !== 0 || result.timedOut) throw new Error(result.stderr !== "" ? result.stderr : `Cloudflare ${args.runtime} programmatic execution exited with code ${result.exitCode ?? "unknown"}`);
927
+ return formatCompletedResponse({
928
+ status: "completed",
929
+ session_id: "cloudflare-sandbox",
930
+ stdout: result.stdout,
931
+ stderr: result.stderr,
932
+ files: []
933
+ });
959
934
  }
960
935
  function createCloudflareProgrammaticToolCallingTool(cloudflareConfig) {
961
- return tool(async (rawParams, config) => {
962
- const params = rawParams;
963
- return runProgrammatic({
964
- params,
965
- config,
966
- cloudflareConfig,
967
- runtime: resolveRuntime(params),
968
- });
969
- }, {
970
- name: ProgrammaticToolCallingName,
971
- description: `${ProgrammaticToolCallingDescription}\n\nCloudflare Sandbox engine: exposes the built-in coding tools inside the sandbox process. Non-coding host tools are not callable from this in-sandbox programmatic runner.`,
972
- schema: createCloudflareProgrammaticToolCallingSchema(cloudflareConfig),
973
- responseFormat: Constants.CONTENT_AND_ARTIFACT,
974
- });
936
+ return tool(async (rawParams, config) => {
937
+ const params = rawParams;
938
+ return runProgrammatic({
939
+ params,
940
+ config,
941
+ cloudflareConfig,
942
+ runtime: resolveRuntime(params)
943
+ });
944
+ }, {
945
+ name: ProgrammaticToolCallingName,
946
+ description: `${ProgrammaticToolCallingDescription}\n\nCloudflare Sandbox engine: exposes the built-in coding tools inside the sandbox process. Non-coding host tools are not callable from this in-sandbox programmatic runner.`,
947
+ schema: createCloudflareProgrammaticToolCallingSchema(cloudflareConfig),
948
+ responseFormat: "content_and_artifact"
949
+ });
975
950
  }
976
951
  function createCloudflareBashProgrammaticToolCallingTool(cloudflareConfig) {
977
- return tool(async (rawParams, config) => {
978
- const params = rawParams;
979
- return runProgrammatic({
980
- params,
981
- config,
982
- cloudflareConfig,
983
- runtime: 'bash',
984
- });
985
- }, {
986
- name: Constants.BASH_PROGRAMMATIC_TOOL_CALLING,
987
- description: `${BashProgrammaticToolCallingDescription}\n\nCloudflare Sandbox engine: exposes the built-in coding tools as bash functions inside the sandbox process. Non-coding host tools are not callable from this in-sandbox programmatic runner.`,
988
- schema: createCloudflareBashProgrammaticToolCallingSchema(cloudflareConfig),
989
- responseFormat: Constants.CONTENT_AND_ARTIFACT,
990
- });
991
- }
992
-
952
+ return tool(async (rawParams, config) => {
953
+ return runProgrammatic({
954
+ params: rawParams,
955
+ config,
956
+ cloudflareConfig,
957
+ runtime: "bash"
958
+ });
959
+ }, {
960
+ name: "run_tools_with_bash",
961
+ description: `${BashProgrammaticToolCallingDescription}\n\nCloudflare Sandbox engine: exposes the built-in coding tools as bash functions inside the sandbox process. Non-coding host tools are not callable from this in-sandbox programmatic runner.`,
962
+ schema: createCloudflareBashProgrammaticToolCallingSchema(cloudflareConfig),
963
+ responseFormat: "content_and_artifact"
964
+ });
965
+ }
966
+ //#endregion
993
967
  export { createCloudflareBashProgrammaticToolCallingTool, createCloudflareProgrammaticToolCallingTool };
994
- //# sourceMappingURL=CloudflareProgrammaticToolCalling.mjs.map
968
+
969
+ //# sourceMappingURL=CloudflareProgrammaticToolCalling.mjs.map