@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,129 +1,115 @@
1
- 'use strict';
2
-
1
+ //#region src/tools/local/bashAst.ts
3
2
  /**
4
- * Categorical-hazard checks layered on top of the existing dangerous-
5
- * command regex set. These match command-shape signatures that
6
- * claude-code's tree-sitter AST validator catches via categorical
7
- * deny-lists (command substitution, zsh-only privileged commands,
8
- * /proc/<pid>/environ access, IFS injection, etc.).
9
- *
10
- * This is *not* a real AST parser. It is a deliberately conservative
11
- * heuristic pass intended for the local engine's `bashAst: 'auto' |
12
- * 'strict'` modes; a future PR can swap in a true tree-sitter-bash
13
- * pass behind the same config field without changing the public API.
14
- *
15
- * `runBashAstChecks` runs on the *quote-stripped* command (so quoted
16
- * strings inside the script don't generate false positives) and
17
- * returns one finding per matched category.
18
- */
3
+ * Categorical-hazard checks layered on top of the existing dangerous-
4
+ * command regex set. These match command-shape signatures that
5
+ * claude-code's tree-sitter AST validator catches via categorical
6
+ * deny-lists (command substitution, zsh-only privileged commands,
7
+ * /proc/<pid>/environ access, IFS injection, etc.).
8
+ *
9
+ * This is *not* a real AST parser. It is a deliberately conservative
10
+ * heuristic pass intended for the local engine's `bashAst: 'auto' |
11
+ * 'strict'` modes; a future PR can swap in a true tree-sitter-bash
12
+ * pass behind the same config field without changing the public API.
13
+ *
14
+ * `runBashAstChecks` runs on the *quote-stripped* command (so quoted
15
+ * strings inside the script don't generate false positives) and
16
+ * returns one finding per matched category.
17
+ */
19
18
  const COMMAND_SUBSTITUTION_PATTERNS = [
20
- { code: 'cmd-subst-dollar-paren', rx: /\$\(/ },
21
- { code: 'cmd-subst-backtick', rx: /`[^`]*`/ },
22
- { code: 'cmd-subst-process-sub', rx: /[<>]\(/ },
23
- { code: 'cmd-subst-zsh-eq', rx: /(?:^|\s)=[A-Za-z_]/ },
19
+ {
20
+ code: "cmd-subst-dollar-paren",
21
+ rx: /\$\(/
22
+ },
23
+ {
24
+ code: "cmd-subst-backtick",
25
+ rx: /`[^`]*`/
26
+ },
27
+ {
28
+ code: "cmd-subst-process-sub",
29
+ rx: /[<>]\(/
30
+ },
31
+ {
32
+ code: "cmd-subst-zsh-eq",
33
+ rx: /(?:^|\s)=[A-Za-z_]/
34
+ }
24
35
  ];
25
36
  const ZSH_DANGEROUS_BUILTINS = [
26
- 'zmodload',
27
- 'emulate',
28
- 'sysopen',
29
- 'sysread',
30
- 'syswrite',
31
- 'ztcp',
32
- 'zsocket',
33
- 'zf_rm',
34
- 'zselect',
35
- ];
36
- const STRICT_DENIED_BUILTINS = [
37
- 'eval',
38
- 'exec',
37
+ "zmodload",
38
+ "emulate",
39
+ "sysopen",
40
+ "sysread",
41
+ "syswrite",
42
+ "ztcp",
43
+ "zsocket",
44
+ "zf_rm",
45
+ "zselect"
39
46
  ];
47
+ const STRICT_DENIED_BUILTINS = ["eval", "exec"];
40
48
  function rxForBuiltin(name) {
41
- return new RegExp(`\\b${name}\\b`);
49
+ return new RegExp(`\\b${name}\\b`);
42
50
  }
43
51
  const PROC_ENVIRON_RX = /\/proc\/(?:\d+|self|\$[A-Za-z_])\/environ\b/;
44
52
  const IFS_INJECTION_RX = /\bIFS\s*=/;
45
53
  const HEX_ESCAPE_OBFUSCATION_RX = /\\x[0-9a-fA-F]{2}/;
46
54
  const SOURCE_FROM_VAR_RX = /(?:^|\s)(?:source|\.)\s+["']?\$[A-Za-z_]/;
47
- function runBashAstChecks(command, mode = 'off') {
48
- if (mode === 'off') {
49
- return [];
50
- }
51
- const findings = [];
52
- const strict = mode === 'strict';
53
- for (const { code, rx } of COMMAND_SUBSTITUTION_PATTERNS) {
54
- if (rx.test(command)) {
55
- findings.push({
56
- code,
57
- message: 'Command substitution can mask intent and exfiltrate variables; not allowed under bashAst.',
58
- severity: strict ? 'deny' : 'warn',
59
- });
60
- }
61
- }
62
- for (const builtin of ZSH_DANGEROUS_BUILTINS) {
63
- if (rxForBuiltin(builtin).test(command)) {
64
- findings.push({
65
- code: `zsh-builtin-${builtin}`,
66
- message: `Zsh privileged builtin "${builtin}" is denied.`,
67
- severity: 'deny',
68
- });
69
- }
70
- }
71
- if (PROC_ENVIRON_RX.test(command)) {
72
- findings.push({
73
- code: 'proc-environ-read',
74
- message: 'Reads from /proc/<pid>/environ are denied — leaks host secrets.',
75
- severity: 'deny',
76
- });
77
- }
78
- if (IFS_INJECTION_RX.test(command)) {
79
- findings.push({
80
- code: 'ifs-injection',
81
- message: 'Inline IFS reassignment is suspicious; review the command.',
82
- severity: strict ? 'deny' : 'warn',
83
- });
84
- }
85
- if (HEX_ESCAPE_OBFUSCATION_RX.test(command)) {
86
- findings.push({
87
- code: 'hex-escape',
88
- message: 'Hex-escaped bytes (\\xNN) often hide intent; review the command.',
89
- severity: strict ? 'deny' : 'warn',
90
- });
91
- }
92
- if (SOURCE_FROM_VAR_RX.test(command)) {
93
- findings.push({
94
- code: 'source-from-variable',
95
- message: 'Sourcing a script from an unbound variable is denied.',
96
- severity: 'deny',
97
- });
98
- }
99
- if (strict) {
100
- for (const builtin of STRICT_DENIED_BUILTINS) {
101
- if (rxForBuiltin(builtin).test(command)) {
102
- findings.push({
103
- code: `strict-${builtin}`,
104
- message: `In strict mode, "${builtin}" is denied.`,
105
- severity: 'deny',
106
- });
107
- }
108
- }
109
- }
110
- return findings;
55
+ function runBashAstChecks(command, mode = "off") {
56
+ if (mode === "off") return [];
57
+ const findings = [];
58
+ const strict = mode === "strict";
59
+ for (const { code, rx } of COMMAND_SUBSTITUTION_PATTERNS) if (rx.test(command)) findings.push({
60
+ code,
61
+ message: "Command substitution can mask intent and exfiltrate variables; not allowed under bashAst.",
62
+ severity: strict ? "deny" : "warn"
63
+ });
64
+ for (const builtin of ZSH_DANGEROUS_BUILTINS) if (rxForBuiltin(builtin).test(command)) findings.push({
65
+ code: `zsh-builtin-${builtin}`,
66
+ message: `Zsh privileged builtin "${builtin}" is denied.`,
67
+ severity: "deny"
68
+ });
69
+ if (PROC_ENVIRON_RX.test(command)) findings.push({
70
+ code: "proc-environ-read",
71
+ message: "Reads from /proc/<pid>/environ are denied — leaks host secrets.",
72
+ severity: "deny"
73
+ });
74
+ if (IFS_INJECTION_RX.test(command)) findings.push({
75
+ code: "ifs-injection",
76
+ message: "Inline IFS reassignment is suspicious; review the command.",
77
+ severity: strict ? "deny" : "warn"
78
+ });
79
+ if (HEX_ESCAPE_OBFUSCATION_RX.test(command)) findings.push({
80
+ code: "hex-escape",
81
+ message: "Hex-escaped bytes (\\xNN) often hide intent; review the command.",
82
+ severity: strict ? "deny" : "warn"
83
+ });
84
+ if (SOURCE_FROM_VAR_RX.test(command)) findings.push({
85
+ code: "source-from-variable",
86
+ message: "Sourcing a script from an unbound variable is denied.",
87
+ severity: "deny"
88
+ });
89
+ if (strict) {
90
+ for (const builtin of STRICT_DENIED_BUILTINS) if (rxForBuiltin(builtin).test(command)) findings.push({
91
+ code: `strict-${builtin}`,
92
+ message: `In strict mode, "${builtin}" is denied.`,
93
+ severity: "deny"
94
+ });
95
+ }
96
+ return findings;
111
97
  }
112
98
  function bashAstFindingsToErrors(findings) {
113
- const errors = [];
114
- const warnings = [];
115
- for (const f of findings) {
116
- const formatted = `[bashAst:${f.code}] ${f.message}`;
117
- if (f.severity === 'deny') {
118
- errors.push(formatted);
119
- }
120
- else {
121
- warnings.push(formatted);
122
- }
123
- }
124
- return { errors, warnings };
99
+ const errors = [];
100
+ const warnings = [];
101
+ for (const f of findings) {
102
+ const formatted = `[bashAst:${f.code}] ${f.message}`;
103
+ if (f.severity === "deny") errors.push(formatted);
104
+ else warnings.push(formatted);
105
+ }
106
+ return {
107
+ errors,
108
+ warnings
109
+ };
125
110
  }
126
-
111
+ //#endregion
127
112
  exports.bashAstFindingsToErrors = bashAstFindingsToErrors;
128
113
  exports.runBashAstChecks = runBashAstChecks;
129
- //# sourceMappingURL=bashAst.cjs.map
114
+
115
+ //# sourceMappingURL=bashAst.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bashAst.cjs","sources":["../../../../src/tools/local/bashAst.ts"],"sourcesContent":["import type * as t from '@/types';\n\nexport type BashAstFinding = {\n code: string;\n message: string;\n severity: 'warn' | 'deny';\n};\n\n/**\n * Categorical-hazard checks layered on top of the existing dangerous-\n * command regex set. These match command-shape signatures that\n * claude-code's tree-sitter AST validator catches via categorical\n * deny-lists (command substitution, zsh-only privileged commands,\n * /proc/<pid>/environ access, IFS injection, etc.).\n *\n * This is *not* a real AST parser. It is a deliberately conservative\n * heuristic pass intended for the local engine's `bashAst: 'auto' |\n * 'strict'` modes; a future PR can swap in a true tree-sitter-bash\n * pass behind the same config field without changing the public API.\n *\n * `runBashAstChecks` runs on the *quote-stripped* command (so quoted\n * strings inside the script don't generate false positives) and\n * returns one finding per matched category.\n */\n\nconst COMMAND_SUBSTITUTION_PATTERNS: { code: string; rx: RegExp }[] = [\n { code: 'cmd-subst-dollar-paren', rx: /\\$\\(/ },\n { code: 'cmd-subst-backtick', rx: /`[^`]*`/ },\n { code: 'cmd-subst-process-sub', rx: /[<>]\\(/ },\n { code: 'cmd-subst-zsh-eq', rx: /(?:^|\\s)=[A-Za-z_]/ },\n];\n\nconst ZSH_DANGEROUS_BUILTINS = [\n 'zmodload',\n 'emulate',\n 'sysopen',\n 'sysread',\n 'syswrite',\n 'ztcp',\n 'zsocket',\n 'zf_rm',\n 'zselect',\n];\n\nconst STRICT_DENIED_BUILTINS = [\n 'eval',\n 'exec',\n];\n\nfunction rxForBuiltin(name: string): RegExp {\n return new RegExp(`\\\\b${name}\\\\b`);\n}\n\nconst PROC_ENVIRON_RX = /\\/proc\\/(?:\\d+|self|\\$[A-Za-z_])\\/environ\\b/;\nconst IFS_INJECTION_RX = /\\bIFS\\s*=/;\nconst HEX_ESCAPE_OBFUSCATION_RX = /\\\\x[0-9a-fA-F]{2}/;\nconst SOURCE_FROM_VAR_RX = /(?:^|\\s)(?:source|\\.)\\s+[\"']?\\$[A-Za-z_]/;\n\nexport function runBashAstChecks(\n command: string,\n mode: t.LocalBashAstMode = 'off'\n): BashAstFinding[] {\n if (mode === 'off') {\n return [];\n }\n const findings: BashAstFinding[] = [];\n const strict = mode === 'strict';\n\n for (const { code, rx } of COMMAND_SUBSTITUTION_PATTERNS) {\n if (rx.test(command)) {\n findings.push({\n code,\n message:\n 'Command substitution can mask intent and exfiltrate variables; not allowed under bashAst.',\n severity: strict ? 'deny' : 'warn',\n });\n }\n }\n\n for (const builtin of ZSH_DANGEROUS_BUILTINS) {\n if (rxForBuiltin(builtin).test(command)) {\n findings.push({\n code: `zsh-builtin-${builtin}`,\n message: `Zsh privileged builtin \"${builtin}\" is denied.`,\n severity: 'deny',\n });\n }\n }\n\n if (PROC_ENVIRON_RX.test(command)) {\n findings.push({\n code: 'proc-environ-read',\n message: 'Reads from /proc/<pid>/environ are denied — leaks host secrets.',\n severity: 'deny',\n });\n }\n\n if (IFS_INJECTION_RX.test(command)) {\n findings.push({\n code: 'ifs-injection',\n message: 'Inline IFS reassignment is suspicious; review the command.',\n severity: strict ? 'deny' : 'warn',\n });\n }\n\n if (HEX_ESCAPE_OBFUSCATION_RX.test(command)) {\n findings.push({\n code: 'hex-escape',\n message: 'Hex-escaped bytes (\\\\xNN) often hide intent; review the command.',\n severity: strict ? 'deny' : 'warn',\n });\n }\n\n if (SOURCE_FROM_VAR_RX.test(command)) {\n findings.push({\n code: 'source-from-variable',\n message: 'Sourcing a script from an unbound variable is denied.',\n severity: 'deny',\n });\n }\n\n if (strict) {\n for (const builtin of STRICT_DENIED_BUILTINS) {\n if (rxForBuiltin(builtin).test(command)) {\n findings.push({\n code: `strict-${builtin}`,\n message: `In strict mode, \"${builtin}\" is denied.`,\n severity: 'deny',\n });\n }\n }\n }\n\n return findings;\n}\n\nexport function bashAstFindingsToErrors(\n findings: BashAstFinding[]\n): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n for (const f of findings) {\n const formatted = `[bashAst:${f.code}] ${f.message}`;\n if (f.severity === 'deny') {\n errors.push(formatted);\n } else {\n warnings.push(formatted);\n }\n }\n return { errors, warnings };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bashAst.cjs","names":[],"sources":["../../../../src/tools/local/bashAst.ts"],"sourcesContent":["import type * as t from '@/types';\n\nexport type BashAstFinding = {\n code: string;\n message: string;\n severity: 'warn' | 'deny';\n};\n\n/**\n * Categorical-hazard checks layered on top of the existing dangerous-\n * command regex set. These match command-shape signatures that\n * claude-code's tree-sitter AST validator catches via categorical\n * deny-lists (command substitution, zsh-only privileged commands,\n * /proc/<pid>/environ access, IFS injection, etc.).\n *\n * This is *not* a real AST parser. It is a deliberately conservative\n * heuristic pass intended for the local engine's `bashAst: 'auto' |\n * 'strict'` modes; a future PR can swap in a true tree-sitter-bash\n * pass behind the same config field without changing the public API.\n *\n * `runBashAstChecks` runs on the *quote-stripped* command (so quoted\n * strings inside the script don't generate false positives) and\n * returns one finding per matched category.\n */\n\nconst COMMAND_SUBSTITUTION_PATTERNS: { code: string; rx: RegExp }[] = [\n { code: 'cmd-subst-dollar-paren', rx: /\\$\\(/ },\n { code: 'cmd-subst-backtick', rx: /`[^`]*`/ },\n { code: 'cmd-subst-process-sub', rx: /[<>]\\(/ },\n { code: 'cmd-subst-zsh-eq', rx: /(?:^|\\s)=[A-Za-z_]/ },\n];\n\nconst ZSH_DANGEROUS_BUILTINS = [\n 'zmodload',\n 'emulate',\n 'sysopen',\n 'sysread',\n 'syswrite',\n 'ztcp',\n 'zsocket',\n 'zf_rm',\n 'zselect',\n];\n\nconst STRICT_DENIED_BUILTINS = [\n 'eval',\n 'exec',\n];\n\nfunction rxForBuiltin(name: string): RegExp {\n return new RegExp(`\\\\b${name}\\\\b`);\n}\n\nconst PROC_ENVIRON_RX = /\\/proc\\/(?:\\d+|self|\\$[A-Za-z_])\\/environ\\b/;\nconst IFS_INJECTION_RX = /\\bIFS\\s*=/;\nconst HEX_ESCAPE_OBFUSCATION_RX = /\\\\x[0-9a-fA-F]{2}/;\nconst SOURCE_FROM_VAR_RX = /(?:^|\\s)(?:source|\\.)\\s+[\"']?\\$[A-Za-z_]/;\n\nexport function runBashAstChecks(\n command: string,\n mode: t.LocalBashAstMode = 'off'\n): BashAstFinding[] {\n if (mode === 'off') {\n return [];\n }\n const findings: BashAstFinding[] = [];\n const strict = mode === 'strict';\n\n for (const { code, rx } of COMMAND_SUBSTITUTION_PATTERNS) {\n if (rx.test(command)) {\n findings.push({\n code,\n message:\n 'Command substitution can mask intent and exfiltrate variables; not allowed under bashAst.',\n severity: strict ? 'deny' : 'warn',\n });\n }\n }\n\n for (const builtin of ZSH_DANGEROUS_BUILTINS) {\n if (rxForBuiltin(builtin).test(command)) {\n findings.push({\n code: `zsh-builtin-${builtin}`,\n message: `Zsh privileged builtin \"${builtin}\" is denied.`,\n severity: 'deny',\n });\n }\n }\n\n if (PROC_ENVIRON_RX.test(command)) {\n findings.push({\n code: 'proc-environ-read',\n message: 'Reads from /proc/<pid>/environ are denied — leaks host secrets.',\n severity: 'deny',\n });\n }\n\n if (IFS_INJECTION_RX.test(command)) {\n findings.push({\n code: 'ifs-injection',\n message: 'Inline IFS reassignment is suspicious; review the command.',\n severity: strict ? 'deny' : 'warn',\n });\n }\n\n if (HEX_ESCAPE_OBFUSCATION_RX.test(command)) {\n findings.push({\n code: 'hex-escape',\n message: 'Hex-escaped bytes (\\\\xNN) often hide intent; review the command.',\n severity: strict ? 'deny' : 'warn',\n });\n }\n\n if (SOURCE_FROM_VAR_RX.test(command)) {\n findings.push({\n code: 'source-from-variable',\n message: 'Sourcing a script from an unbound variable is denied.',\n severity: 'deny',\n });\n }\n\n if (strict) {\n for (const builtin of STRICT_DENIED_BUILTINS) {\n if (rxForBuiltin(builtin).test(command)) {\n findings.push({\n code: `strict-${builtin}`,\n message: `In strict mode, \"${builtin}\" is denied.`,\n severity: 'deny',\n });\n }\n }\n }\n\n return findings;\n}\n\nexport function bashAstFindingsToErrors(\n findings: BashAstFinding[]\n): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n for (const f of findings) {\n const formatted = `[bashAst:${f.code}] ${f.message}`;\n if (f.severity === 'deny') {\n errors.push(formatted);\n } else {\n warnings.push(formatted);\n }\n }\n return { errors, warnings };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyBA,MAAM,gCAAgE;CACpE;EAAE,MAAM;EAA0B,IAAI;CAAO;CAC7C;EAAE,MAAM;EAAsB,IAAI;CAAU;CAC5C;EAAE,MAAM;EAAyB,IAAI;CAAS;CAC9C;EAAE,MAAM;EAAoB,IAAI;CAAqB;AACvD;AAEA,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAM,yBAAyB,CAC7B,QACA,MACF;AAEA,SAAS,aAAa,MAAsB;CAC1C,OAAO,IAAI,OAAO,MAAM,KAAK,IAAI;AACnC;AAEA,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AACzB,MAAM,4BAA4B;AAClC,MAAM,qBAAqB;AAE3B,SAAgB,iBACd,SACA,OAA2B,OACT;CAClB,IAAI,SAAS,OACX,OAAO,CAAC;CAEV,MAAM,WAA6B,CAAC;CACpC,MAAM,SAAS,SAAS;CAExB,KAAK,MAAM,EAAE,MAAM,QAAQ,+BACzB,IAAI,GAAG,KAAK,OAAO,GACjB,SAAS,KAAK;EACZ;EACA,SACE;EACF,UAAU,SAAS,SAAS;CAC9B,CAAC;CAIL,KAAK,MAAM,WAAW,wBACpB,IAAI,aAAa,OAAO,CAAC,CAAC,KAAK,OAAO,GACpC,SAAS,KAAK;EACZ,MAAM,eAAe;EACrB,SAAS,2BAA2B,QAAQ;EAC5C,UAAU;CACZ,CAAC;CAIL,IAAI,gBAAgB,KAAK,OAAO,GAC9B,SAAS,KAAK;EACZ,MAAM;EACN,SAAS;EACT,UAAU;CACZ,CAAC;CAGH,IAAI,iBAAiB,KAAK,OAAO,GAC/B,SAAS,KAAK;EACZ,MAAM;EACN,SAAS;EACT,UAAU,SAAS,SAAS;CAC9B,CAAC;CAGH,IAAI,0BAA0B,KAAK,OAAO,GACxC,SAAS,KAAK;EACZ,MAAM;EACN,SAAS;EACT,UAAU,SAAS,SAAS;CAC9B,CAAC;CAGH,IAAI,mBAAmB,KAAK,OAAO,GACjC,SAAS,KAAK;EACZ,MAAM;EACN,SAAS;EACT,UAAU;CACZ,CAAC;CAGH,IAAI;OACG,MAAM,WAAW,wBACpB,IAAI,aAAa,OAAO,CAAC,CAAC,KAAK,OAAO,GACpC,SAAS,KAAK;GACZ,MAAM,UAAU;GAChB,SAAS,oBAAoB,QAAQ;GACrC,UAAU;EACZ,CAAC;CAAA;CAKP,OAAO;AACT;AAEA,SAAgB,wBACd,UAC0C;CAC1C,MAAM,SAAmB,CAAC;CAC1B,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,KAAK,UAAU;EACxB,MAAM,YAAY,YAAY,EAAE,KAAK,IAAI,EAAE;EAC3C,IAAI,EAAE,aAAa,QACjB,OAAO,KAAK,SAAS;OAErB,SAAS,KAAK,SAAS;CAE3B;CACA,OAAO;EAAE;EAAQ;CAAS;AAC5B"}
@@ -1,188 +1,145 @@
1
- 'use strict';
2
-
3
- /**
4
- * Single-occurrence string-replacement strategies for `edit_file`.
5
- *
6
- * The LLM frequently emits an `oldString` whose whitespace, indentation,
7
- * or escape sequences are slightly off from the on-disk content. Rather
8
- * than failing the call (which forces a re-read + retry round-trip),
9
- * we walk a chain of progressively looser matchers, stopping at the
10
- * first one that locates exactly one match. The matched on-disk slice
11
- * is then literally replaced with `newString` — we never modify
12
- * `newString`, only the search.
13
- *
14
- * Strategies are ordered from strict to lenient so we don't accidentally
15
- * over-match a more specific pattern with a looser one. Inspired by
16
- * opencode's nine-strategy chain (sst/opencode), trimmed to the four
17
- * highest-yield strategies for a first cut. Add more (block-anchor +
18
- * Levenshtein, escape-normalized, etc.) as needed.
19
- */
1
+ //#region src/tools/local/editStrategies.ts
20
2
  const exactStrategy = (source, oldString) => {
21
- if (oldString === '')
22
- return null;
23
- const first = source.indexOf(oldString);
24
- if (first === -1)
25
- return null;
26
- const second = source.indexOf(oldString, first + oldString.length);
27
- if (second !== -1)
28
- return null;
29
- return { strategy: 'exact', start: first, end: first + oldString.length };
3
+ if (oldString === "") return null;
4
+ const first = source.indexOf(oldString);
5
+ if (first === -1) return null;
6
+ if (source.indexOf(oldString, first + oldString.length) !== -1) return null;
7
+ return {
8
+ strategy: "exact",
9
+ start: first,
10
+ end: first + oldString.length
11
+ };
30
12
  };
31
13
  /**
32
- * Match per-line, ignoring trailing whitespace differences. Useful for
33
- * the very common case where the LLM stripped trailing spaces or added
34
- * an extra blank.
35
- */
14
+ * Match per-line, ignoring trailing whitespace differences. Useful for
15
+ * the very common case where the LLM stripped trailing spaces or added
16
+ * an extra blank.
17
+ */
36
18
  const lineTrimmedStrategy = (source, oldString) => {
37
- if (oldString === '')
38
- return null;
39
- const sourceLines = source.split('\n');
40
- const oldLines = oldString.split('\n');
41
- if (oldLines.length === 0 || oldLines.length > sourceLines.length) {
42
- return null;
43
- }
44
- let foundAt = -1;
45
- for (let i = 0; i <= sourceLines.length - oldLines.length; i++) {
46
- let ok = true;
47
- for (let j = 0; j < oldLines.length; j++) {
48
- if (sourceLines[i + j].trimEnd() !== oldLines[j].trimEnd()) {
49
- ok = false;
50
- break;
51
- }
52
- }
53
- if (!ok)
54
- continue;
55
- if (foundAt !== -1)
56
- return null; // multiple matches
57
- foundAt = i;
58
- }
59
- if (foundAt === -1)
60
- return null;
61
- let start = 0;
62
- for (let i = 0; i < foundAt; i++)
63
- start += sourceLines[i].length + 1;
64
- let end = start;
65
- for (let i = 0; i < oldLines.length; i++) {
66
- end += sourceLines[foundAt + i].length;
67
- if (i < oldLines.length - 1)
68
- end += 1;
69
- }
70
- return { strategy: 'line-trimmed', start, end };
19
+ if (oldString === "") return null;
20
+ const sourceLines = source.split("\n");
21
+ const oldLines = oldString.split("\n");
22
+ if (oldLines.length === 0 || oldLines.length > sourceLines.length) return null;
23
+ let foundAt = -1;
24
+ for (let i = 0; i <= sourceLines.length - oldLines.length; i++) {
25
+ let ok = true;
26
+ for (let j = 0; j < oldLines.length; j++) if (sourceLines[i + j].trimEnd() !== oldLines[j].trimEnd()) {
27
+ ok = false;
28
+ break;
29
+ }
30
+ if (!ok) continue;
31
+ if (foundAt !== -1) return null;
32
+ foundAt = i;
33
+ }
34
+ if (foundAt === -1) return null;
35
+ let start = 0;
36
+ for (let i = 0; i < foundAt; i++) start += sourceLines[i].length + 1;
37
+ let end = start;
38
+ for (let i = 0; i < oldLines.length; i++) {
39
+ end += sourceLines[foundAt + i].length;
40
+ if (i < oldLines.length - 1) end += 1;
41
+ }
42
+ return {
43
+ strategy: "line-trimmed",
44
+ start,
45
+ end
46
+ };
71
47
  };
72
48
  /**
73
- * Collapse all runs of whitespace to a single space and match. Catches
74
- * cases where the LLM normalised tabs to spaces or vice-versa.
75
- */
49
+ * Collapse all runs of whitespace to a single space and match. Catches
50
+ * cases where the LLM normalised tabs to spaces or vice-versa.
51
+ */
76
52
  const whitespaceNormalizedStrategy = (source, oldString) => {
77
- if (oldString === '')
78
- return null;
79
- const norm = (s) => s.replace(/\s+/g, ' ').trim();
80
- const normalizedNeedle = norm(oldString);
81
- if (normalizedNeedle === '')
82
- return null;
83
- const sourceLines = source.split('\n');
84
- const needleLines = oldString.split('\n');
85
- if (needleLines.length > sourceLines.length)
86
- return null;
87
- let foundAt = -1;
88
- for (let i = 0; i <= sourceLines.length - needleLines.length; i++) {
89
- const candidate = sourceLines
90
- .slice(i, i + needleLines.length)
91
- .join('\n');
92
- if (norm(candidate) !== normalizedNeedle)
93
- continue;
94
- if (foundAt !== -1)
95
- return null;
96
- foundAt = i;
97
- }
98
- if (foundAt === -1)
99
- return null;
100
- let start = 0;
101
- for (let i = 0; i < foundAt; i++)
102
- start += sourceLines[i].length + 1;
103
- let end = start;
104
- for (let i = 0; i < needleLines.length; i++) {
105
- end += sourceLines[foundAt + i].length;
106
- if (i < needleLines.length - 1)
107
- end += 1;
108
- }
109
- return { strategy: 'whitespace-normalized', start, end };
53
+ if (oldString === "") return null;
54
+ const norm = (s) => s.replace(/\s+/g, " ").trim();
55
+ const normalizedNeedle = norm(oldString);
56
+ if (normalizedNeedle === "") return null;
57
+ const sourceLines = source.split("\n");
58
+ const needleLines = oldString.split("\n");
59
+ if (needleLines.length > sourceLines.length) return null;
60
+ let foundAt = -1;
61
+ for (let i = 0; i <= sourceLines.length - needleLines.length; i++) {
62
+ if (norm(sourceLines.slice(i, i + needleLines.length).join("\n")) !== normalizedNeedle) continue;
63
+ if (foundAt !== -1) return null;
64
+ foundAt = i;
65
+ }
66
+ if (foundAt === -1) return null;
67
+ let start = 0;
68
+ for (let i = 0; i < foundAt; i++) start += sourceLines[i].length + 1;
69
+ let end = start;
70
+ for (let i = 0; i < needleLines.length; i++) {
71
+ end += sourceLines[foundAt + i].length;
72
+ if (i < needleLines.length - 1) end += 1;
73
+ }
74
+ return {
75
+ strategy: "whitespace-normalized",
76
+ start,
77
+ end
78
+ };
110
79
  };
111
80
  /**
112
- * Strip the common leading-indent from each line of the needle and
113
- * each candidate window of the source. Catches the very common case
114
- * where the LLM omitted the indentation it should have copied.
115
- */
81
+ * Strip the common leading-indent from each line of the needle and
82
+ * each candidate window of the source. Catches the very common case
83
+ * where the LLM omitted the indentation it should have copied.
84
+ */
116
85
  const indentationFlexibleStrategy = (source, oldString) => {
117
- if (oldString === '')
118
- return null;
119
- const stripCommonIndent = (block) => {
120
- const lines = block.split('\n');
121
- let common = Number.POSITIVE_INFINITY;
122
- for (const line of lines) {
123
- if (line.trim() === '')
124
- continue;
125
- const m = /^(\s*)/.exec(line);
126
- const indent = m ? m[1].length : 0;
127
- if (indent < common)
128
- common = indent;
129
- if (common === 0)
130
- break;
131
- }
132
- if (!Number.isFinite(common) || common === 0)
133
- return block;
134
- return lines
135
- .map((l) => (l.length >= common ? l.slice(common) : l))
136
- .join('\n');
137
- };
138
- const normalizedNeedle = stripCommonIndent(oldString);
139
- if (normalizedNeedle === '')
140
- return null;
141
- const sourceLines = source.split('\n');
142
- const needleLines = oldString.split('\n');
143
- if (needleLines.length > sourceLines.length)
144
- return null;
145
- let foundAt = -1;
146
- for (let i = 0; i <= sourceLines.length - needleLines.length; i++) {
147
- const window = sourceLines.slice(i, i + needleLines.length).join('\n');
148
- if (stripCommonIndent(window) !== normalizedNeedle)
149
- continue;
150
- if (foundAt !== -1)
151
- return null;
152
- foundAt = i;
153
- }
154
- if (foundAt === -1)
155
- return null;
156
- let start = 0;
157
- for (let i = 0; i < foundAt; i++)
158
- start += sourceLines[i].length + 1;
159
- let end = start;
160
- for (let i = 0; i < needleLines.length; i++) {
161
- end += sourceLines[foundAt + i].length;
162
- if (i < needleLines.length - 1)
163
- end += 1;
164
- }
165
- return { strategy: 'indentation-flexible', start, end };
86
+ if (oldString === "") return null;
87
+ const stripCommonIndent = (block) => {
88
+ const lines = block.split("\n");
89
+ let common = Number.POSITIVE_INFINITY;
90
+ for (const line of lines) {
91
+ if (line.trim() === "") continue;
92
+ const m = /^(\s*)/.exec(line);
93
+ const indent = m ? m[1].length : 0;
94
+ if (indent < common) common = indent;
95
+ if (common === 0) break;
96
+ }
97
+ if (!Number.isFinite(common) || common === 0) return block;
98
+ return lines.map((l) => l.length >= common ? l.slice(common) : l).join("\n");
99
+ };
100
+ const normalizedNeedle = stripCommonIndent(oldString);
101
+ if (normalizedNeedle === "") return null;
102
+ const sourceLines = source.split("\n");
103
+ const needleLines = oldString.split("\n");
104
+ if (needleLines.length > sourceLines.length) return null;
105
+ let foundAt = -1;
106
+ for (let i = 0; i <= sourceLines.length - needleLines.length; i++) {
107
+ if (stripCommonIndent(sourceLines.slice(i, i + needleLines.length).join("\n")) !== normalizedNeedle) continue;
108
+ if (foundAt !== -1) return null;
109
+ foundAt = i;
110
+ }
111
+ if (foundAt === -1) return null;
112
+ let start = 0;
113
+ for (let i = 0; i < foundAt; i++) start += sourceLines[i].length + 1;
114
+ let end = start;
115
+ for (let i = 0; i < needleLines.length; i++) {
116
+ end += sourceLines[foundAt + i].length;
117
+ if (i < needleLines.length - 1) end += 1;
118
+ }
119
+ return {
120
+ strategy: "indentation-flexible",
121
+ start,
122
+ end
123
+ };
166
124
  };
167
125
  const STRATEGY_CHAIN = [
168
- exactStrategy,
169
- lineTrimmedStrategy,
170
- whitespaceNormalizedStrategy,
171
- indentationFlexibleStrategy,
126
+ exactStrategy,
127
+ lineTrimmedStrategy,
128
+ whitespaceNormalizedStrategy,
129
+ indentationFlexibleStrategy
172
130
  ];
173
131
  function locateEdit(source, oldString) {
174
- for (const strategy of STRATEGY_CHAIN) {
175
- const match = strategy(source, oldString);
176
- if (match != null) {
177
- return match;
178
- }
179
- }
180
- return null;
132
+ for (const strategy of STRATEGY_CHAIN) {
133
+ const match = strategy(source, oldString);
134
+ if (match != null) return match;
135
+ }
136
+ return null;
181
137
  }
182
138
  function applyEdit(source, match, newString) {
183
- return source.slice(0, match.start) + newString + source.slice(match.end);
139
+ return source.slice(0, match.start) + newString + source.slice(match.end);
184
140
  }
185
-
141
+ //#endregion
186
142
  exports.applyEdit = applyEdit;
187
143
  exports.locateEdit = locateEdit;
188
- //# sourceMappingURL=editStrategies.cjs.map
144
+
145
+ //# sourceMappingURL=editStrategies.cjs.map