@librechat/agents 3.2.31 → 3.2.33

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 (582) 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 -696
  53. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -252
  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 +195 -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 +105 -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 +398 -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 +991 -1276
  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 +427 -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 +308 -401
  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 -1382
  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 +856 -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 +2109 -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 +19 -36
  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 -690
  324. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  325. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -249
  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 +195 -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 +105 -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 +397 -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 +991 -1271
  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 +427 -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 +308 -399
  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 -1378
  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 +854 -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 +2107 -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 +19 -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/messages/format.d.ts +5 -0
  545. package/dist/types/tools/search/tool.d.ts +17 -0
  546. package/dist/types/tools/search/types.d.ts +4 -0
  547. package/package.json +11 -17
  548. package/src/llm/anthropic/llm.spec.ts +36 -0
  549. package/src/llm/anthropic/utils/message_inputs.ts +45 -3
  550. package/src/llm/anthropic/utils/message_outputs.ts +6 -2
  551. package/src/llm/anthropic/utils/streaming-tool-input.test.ts +186 -0
  552. package/src/messages/cache.test.ts +122 -0
  553. package/src/messages/cache.ts +25 -1
  554. package/src/messages/format.ts +9 -0
  555. package/src/messages/formatAgentMessages.skills.test.ts +100 -0
  556. package/src/tools/search/highlights.ts +9 -1
  557. package/src/tools/search/search.ts +41 -3
  558. package/src/tools/search/source-processing.test.ts +373 -0
  559. package/src/tools/search/tool.ts +22 -2
  560. package/src/tools/search/types.ts +4 -0
  561. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  562. package/dist/cjs/langchain/index.cjs.map +0 -1
  563. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  564. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  565. package/dist/cjs/langchain/messages.cjs.map +0 -1
  566. package/dist/cjs/langchain/openai.cjs.map +0 -1
  567. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  568. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  569. package/dist/cjs/langchain/tools.cjs.map +0 -1
  570. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  571. package/dist/cjs/main.cjs.map +0 -1
  572. package/dist/esm/langchain/google-common.mjs.map +0 -1
  573. package/dist/esm/langchain/index.mjs.map +0 -1
  574. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  575. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  576. package/dist/esm/langchain/messages.mjs.map +0 -1
  577. package/dist/esm/langchain/openai.mjs.map +0 -1
  578. package/dist/esm/langchain/prompts.mjs.map +0 -1
  579. package/dist/esm/langchain/runnables.mjs.map +0 -1
  580. package/dist/esm/langchain/tools.mjs.map +0 -1
  581. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  582. package/dist/esm/main.mjs.map +0 -1
@@ -1,223 +1,163 @@
1
- import { resolve } from 'path';
2
- import { tool } from '@langchain/core/tools';
3
- import { getLocalCwd, getWorkspaceFS, validateBashCommand, spawnLocalProcess, truncateLocalOutput } from './LocalExecutionEngine.mjs';
4
- import { Constants } from '../../common/enum.mjs';
5
-
1
+ import "../../common/enum.mjs";
2
+ import "../../common/index.mjs";
3
+ import { getLocalCwd, getWorkspaceFS, spawnLocalProcess, truncateLocalOutput, validateBashCommand } from "./LocalExecutionEngine.mjs";
4
+ import { tool } from "@langchain/core/tools";
5
+ import { resolve } from "path";
6
+ //#region src/tools/local/CompileCheckTool.ts
6
7
  /**
7
- * `compile_check` — a thin LLM-callable wrapper around the project's
8
- * standard typecheck/lint command. Lets the agent answer "did my
9
- * change break anything?" without us shipping a real LSP client.
10
- *
11
- * Auto-detection priority (first hit wins):
12
- *
13
- * 1. `local.compileCheck.command` — explicit override
14
- * 2. `tsconfig.json` → `npx --no-install tsc --noEmit`
15
- * 3. `package.json` with a typescript dep → same as 2
16
- * 4. `pyproject.toml` or `setup.py` / `setup.cfg`
17
- * with a dev dep on mypy → `python3 -m mypy .`
18
- * else → `python3 -m py_compile <every .py>`
19
- * (bounded by find-walk so node_modules
20
- * and `.venv` don't blow up)
21
- * 5. `Cargo.toml` → `cargo check --message-format=short`
22
- * 6. `go.mod` → `go vet ./...`
23
- * 7. otherwise → tells the agent there's
24
- * no detected toolchain.
25
- *
26
- * Output is the spawn process's stdout/stderr passed through
27
- * `truncateLocalOutput` so a 10MB tsc dump can't blow context. The
28
- * exit code is reported.
29
- */
8
+ * `compile_check` — a thin LLM-callable wrapper around the project's
9
+ * standard typecheck/lint command. Lets the agent answer "did my
10
+ * change break anything?" without us shipping a real LSP client.
11
+ *
12
+ * Auto-detection priority (first hit wins):
13
+ *
14
+ * 1. `local.compileCheck.command` — explicit override
15
+ * 2. `tsconfig.json` → `npx --no-install tsc --noEmit`
16
+ * 3. `package.json` with a typescript dep → same as 2
17
+ * 4. `pyproject.toml` or `setup.py` / `setup.cfg`
18
+ * with a dev dep on mypy → `python3 -m mypy .`
19
+ * else → `python3 -m py_compile <every .py>`
20
+ * (bounded by find-walk so node_modules
21
+ * and `.venv` don't blow up)
22
+ * 5. `Cargo.toml` → `cargo check --message-format=short`
23
+ * 6. `go.mod` → `go vet ./...`
24
+ * 7. otherwise → tells the agent there's
25
+ * no detected toolchain.
26
+ *
27
+ * Output is the spawn process's stdout/stderr passed through
28
+ * `truncateLocalOutput` so a 10MB tsc dump can't blow context. The
29
+ * exit code is reported.
30
+ */
30
31
  /** Back-compat alias; canonical name lives on `Constants.COMPILE_CHECK`. */
31
- const CompileCheckToolName = Constants.COMPILE_CHECK;
32
+ const CompileCheckToolName = "compile_check";
32
33
  const CompileCheckSchema = {
33
- type: 'object',
34
- properties: {
35
- command: {
36
- type: 'string',
37
- description: 'Optional explicit command to run instead of the auto-detected one. Runs verbatim from the local engine cwd; honours the standard sandbox/AST gate.',
38
- },
39
- timeout_ms: {
40
- type: 'integer',
41
- description: 'Optional timeout in milliseconds. Defaults to 120000 (2 min).',
42
- },
43
- },
34
+ type: "object",
35
+ properties: {
36
+ command: {
37
+ type: "string",
38
+ description: "Optional explicit command to run instead of the auto-detected one. Runs verbatim from the local engine cwd; honours the standard sandbox/AST gate."
39
+ },
40
+ timeout_ms: {
41
+ type: "integer",
42
+ description: "Optional timeout in milliseconds. Defaults to 120000 (2 min)."
43
+ }
44
+ }
44
45
  };
45
46
  async function pathExists(fs, p) {
46
- try {
47
- await fs.stat(p);
48
- return true;
49
- }
50
- catch {
51
- return false;
52
- }
47
+ try {
48
+ await fs.stat(p);
49
+ return true;
50
+ } catch {
51
+ return false;
52
+ }
53
53
  }
54
- // Probes for project markers via the configured WorkspaceFS so a Run
55
- // with `local.exec.fs` (in-memory or remote engine) detects the right
56
- // toolchain against the actual workspace — not the host filesystem.
57
- // Codex P1 #25.
58
54
  async function detect(cwd, fs) {
59
- if (await pathExists(fs, resolve(cwd, 'tsconfig.json'))) {
60
- return {
61
- kind: 'typescript',
62
- command: 'npx --no-install tsc --noEmit',
63
- reason: 'tsconfig.json present',
64
- };
65
- }
66
- if (await pathExists(fs, resolve(cwd, 'package.json'))) {
67
- const pkgRaw = await fs
68
- .readFile(resolve(cwd, 'package.json'), 'utf8')
69
- .catch(() => '');
70
- if (pkgRaw.includes('"typescript"')) {
71
- return {
72
- kind: 'typescript',
73
- command: 'npx --no-install tsc --noEmit',
74
- reason: 'package.json declares typescript',
75
- };
76
- }
77
- }
78
- if (await pathExists(fs, resolve(cwd, 'Cargo.toml'))) {
79
- return {
80
- kind: 'rust',
81
- command: 'cargo check --message-format=short',
82
- reason: 'Cargo.toml present',
83
- };
84
- }
85
- if (await pathExists(fs, resolve(cwd, 'go.mod'))) {
86
- return {
87
- kind: 'go',
88
- command: 'go vet ./...',
89
- reason: 'go.mod present',
90
- };
91
- }
92
- if ((await pathExists(fs, resolve(cwd, 'pyproject.toml'))) ||
93
- (await pathExists(fs, resolve(cwd, 'setup.py'))) ||
94
- (await pathExists(fs, resolve(cwd, 'setup.cfg')))) {
95
- const pyToml = await fs
96
- .readFile(resolve(cwd, 'pyproject.toml'), 'utf8')
97
- .catch(() => '');
98
- if (pyToml.includes('mypy')) {
99
- return {
100
- kind: 'python-mypy',
101
- command: 'python3 -m mypy .',
102
- reason: 'pyproject.toml declares mypy',
103
- };
104
- }
105
- return {
106
- kind: 'python-compile',
107
- command: 'python3 -c "import compileall, sys; sys.exit(0 if compileall.compile_dir(\'.\', quiet=1, rx=__import__(\'re\').compile(r\'(node_modules|\\.venv|\\.git|build|dist)\')) else 1)"',
108
- reason: 'Python project (no mypy detected)',
109
- };
110
- }
111
- return {
112
- kind: 'unknown',
113
- command: '',
114
- reason: 'no recognised project marker (tsconfig.json, package.json[typescript], Cargo.toml, go.mod, pyproject.toml, setup.py)',
115
- };
55
+ if (await pathExists(fs, resolve(cwd, "tsconfig.json"))) return {
56
+ kind: "typescript",
57
+ command: "npx --no-install tsc --noEmit",
58
+ reason: "tsconfig.json present"
59
+ };
60
+ if (await pathExists(fs, resolve(cwd, "package.json"))) {
61
+ if ((await fs.readFile(resolve(cwd, "package.json"), "utf8").catch(() => "")).includes("\"typescript\"")) return {
62
+ kind: "typescript",
63
+ command: "npx --no-install tsc --noEmit",
64
+ reason: "package.json declares typescript"
65
+ };
66
+ }
67
+ if (await pathExists(fs, resolve(cwd, "Cargo.toml"))) return {
68
+ kind: "rust",
69
+ command: "cargo check --message-format=short",
70
+ reason: "Cargo.toml present"
71
+ };
72
+ if (await pathExists(fs, resolve(cwd, "go.mod"))) return {
73
+ kind: "go",
74
+ command: "go vet ./...",
75
+ reason: "go.mod present"
76
+ };
77
+ if (await pathExists(fs, resolve(cwd, "pyproject.toml")) || await pathExists(fs, resolve(cwd, "setup.py")) || await pathExists(fs, resolve(cwd, "setup.cfg"))) {
78
+ if ((await fs.readFile(resolve(cwd, "pyproject.toml"), "utf8").catch(() => "")).includes("mypy")) return {
79
+ kind: "python-mypy",
80
+ command: "python3 -m mypy .",
81
+ reason: "pyproject.toml declares mypy"
82
+ };
83
+ return {
84
+ kind: "python-compile",
85
+ command: "python3 -c \"import compileall, sys; sys.exit(0 if compileall.compile_dir('.', quiet=1, rx=__import__('re').compile(r'(node_modules|\\.venv|\\.git|build|dist)')) else 1)\"",
86
+ reason: "Python project (no mypy detected)"
87
+ };
88
+ }
89
+ return {
90
+ kind: "unknown",
91
+ command: "",
92
+ reason: "no recognised project marker (tsconfig.json, package.json[typescript], Cargo.toml, go.mod, pyproject.toml, setup.py)"
93
+ };
116
94
  }
117
- const DEFAULT_TIMEOUT_MS = 120_000;
95
+ const DEFAULT_TIMEOUT_MS = 12e4;
118
96
  function createCompileCheckTool(config = {}) {
119
- return tool(async (rawInput) => {
120
- const input = rawInput;
121
- const cwd = getLocalCwd(config);
122
- const fs = getWorkspaceFS(config);
123
- const overrideCommand = input.command ?? config.compileCheck?.command;
124
- let detection;
125
- if (overrideCommand != null && overrideCommand.trim() !== '') {
126
- detection = {
127
- kind: 'unknown',
128
- command: overrideCommand,
129
- reason: 'explicit override',
130
- };
131
- }
132
- else {
133
- detection = await detect(cwd, fs);
134
- }
135
- if (detection.command === '') {
136
- const explainer = `compile_check: ${detection.reason}. Pass an explicit \`command\` (e.g. \`npm run typecheck\`) to override.`;
137
- return [
138
- explainer,
139
- {
140
- kind: detection.kind,
141
- ran: false,
142
- reason: detection.reason,
143
- cwd,
144
- },
145
- ];
146
- }
147
- // Codex P1 #21: route the resolved command through the same
148
- // safety gates the rest of the local engine uses. Without this
149
- // a host with `readOnly: true` (or relying on the destructive-
150
- // command guard) could be bypassed by passing a `command`
151
- // override to compile_check that performs writes/deletes.
152
- // Auto-detected commands (tsc/cargo/etc.) pass these gates
153
- // unchanged the validation is only blocking for genuinely
154
- // mutating overrides.
155
- const validation = await validateBashCommand(detection.command, config);
156
- if (!validation.valid) {
157
- const explainer = `compile_check refused to run \`${detection.command}\`: ${validation.errors.join('; ')}`;
158
- return [
159
- explainer,
160
- {
161
- kind: detection.kind,
162
- ran: false,
163
- reason: validation.errors.join('; '),
164
- cwd,
165
- },
166
- ];
167
- }
168
- const timeoutMs = input.timeout_ms ??
169
- config.compileCheck?.timeoutMs ??
170
- DEFAULT_TIMEOUT_MS;
171
- const result = await spawnLocalProcess(config.shell ?? (process.platform === 'win32' ? 'bash.exe' : 'bash'), ['-lc', detection.command], {
172
- ...config,
173
- timeoutMs,
174
- maxOutputChars: config.maxOutputChars ?? 8000,
175
- });
176
- const passed = result.exitCode === 0 && !result.timedOut;
177
- const headline = passed
178
- ? `compile_check (${detection.kind}) PASSED via \`${detection.command}\``
179
- : `compile_check (${detection.kind}) FAILED via \`${detection.command}\` ` +
180
- `(exit=${result.exitCode ?? 'unknown'}${result.timedOut ? ', timed_out=true' : ''})`;
181
- let body = '';
182
- if (result.stdout !== '') {
183
- body += `\n\nstdout:\n${truncateLocalOutput(result.stdout, 4000)}`;
184
- }
185
- if (result.stderr !== '') {
186
- body += `\n\nstderr:\n${truncateLocalOutput(result.stderr, 4000)}`;
187
- }
188
- if (result.fullOutputPath != null) {
189
- body += `\n\nfull_output_path: ${result.fullOutputPath}`;
190
- }
191
- const summary = `${headline}${body}\n\nworking_directory: ${cwd}\nreason: ${detection.reason}`;
192
- return [
193
- summary,
194
- {
195
- kind: detection.kind,
196
- ran: true,
197
- passed,
198
- exit_code: result.exitCode,
199
- timed_out: result.timedOut,
200
- command: detection.command,
201
- cwd,
202
- },
203
- ];
204
- }, {
205
- name: CompileCheckToolName,
206
- description: 'Run the project\'s standard typecheck or lint pass and return its output. Auto-detects from project markers (tsconfig.json/package.json -> tsc; Cargo.toml -> cargo check; go.mod -> go vet; pyproject.toml -> mypy or py_compile). Pass `command` to override.',
207
- schema: CompileCheckSchema,
208
- responseFormat: Constants.CONTENT_AND_ARTIFACT,
209
- });
97
+ return tool(async (rawInput) => {
98
+ const input = rawInput;
99
+ const cwd = getLocalCwd(config);
100
+ const fs = getWorkspaceFS(config);
101
+ const overrideCommand = input.command ?? config.compileCheck?.command;
102
+ let detection;
103
+ if (overrideCommand != null && overrideCommand.trim() !== "") detection = {
104
+ kind: "unknown",
105
+ command: overrideCommand,
106
+ reason: "explicit override"
107
+ };
108
+ else detection = await detect(cwd, fs);
109
+ if (detection.command === "") return [`compile_check: ${detection.reason}. Pass an explicit \`command\` (e.g. \`npm run typecheck\`) to override.`, {
110
+ kind: detection.kind,
111
+ ran: false,
112
+ reason: detection.reason,
113
+ cwd
114
+ }];
115
+ const validation = await validateBashCommand(detection.command, config);
116
+ if (!validation.valid) return [`compile_check refused to run \`${detection.command}\`: ${validation.errors.join("; ")}`, {
117
+ kind: detection.kind,
118
+ ran: false,
119
+ reason: validation.errors.join("; "),
120
+ cwd
121
+ }];
122
+ const timeoutMs = input.timeout_ms ?? config.compileCheck?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
123
+ const result = await spawnLocalProcess(config.shell ?? (process.platform === "win32" ? "bash.exe" : "bash"), ["-lc", detection.command], {
124
+ ...config,
125
+ timeoutMs,
126
+ maxOutputChars: config.maxOutputChars ?? 8e3
127
+ });
128
+ const passed = result.exitCode === 0 && !result.timedOut;
129
+ const headline = passed ? `compile_check (${detection.kind}) PASSED via \`${detection.command}\`` : `compile_check (${detection.kind}) FAILED via \`${detection.command}\` (exit=${result.exitCode ?? "unknown"}${result.timedOut ? ", timed_out=true" : ""})`;
130
+ let body = "";
131
+ if (result.stdout !== "") body += `\n\nstdout:\n${truncateLocalOutput(result.stdout, 4e3)}`;
132
+ if (result.stderr !== "") body += `\n\nstderr:\n${truncateLocalOutput(result.stderr, 4e3)}`;
133
+ if (result.fullOutputPath != null) body += `\n\nfull_output_path: ${result.fullOutputPath}`;
134
+ return [`${headline}${body}\n\nworking_directory: ${cwd}\nreason: ${detection.reason}`, {
135
+ kind: detection.kind,
136
+ ran: true,
137
+ passed,
138
+ exit_code: result.exitCode,
139
+ timed_out: result.timedOut,
140
+ command: detection.command,
141
+ cwd
142
+ }];
143
+ }, {
144
+ name: CompileCheckToolName,
145
+ description: "Run the project's standard typecheck or lint pass and return its output. Auto-detects from project markers (tsconfig.json/package.json -> tsc; Cargo.toml -> cargo check; go.mod -> go vet; pyproject.toml -> mypy or py_compile). Pass `command` to override.",
146
+ schema: CompileCheckSchema,
147
+ responseFormat: "content_and_artifact"
148
+ });
210
149
  }
211
150
  function createCompileCheckToolDefinition() {
212
- return {
213
- name: CompileCheckToolName,
214
- description: 'Run the project\'s standard typecheck or lint pass and return its output.',
215
- parameters: CompileCheckSchema,
216
- allowed_callers: ['direct', 'code_execution'],
217
- responseFormat: Constants.CONTENT_AND_ARTIFACT,
218
- toolType: 'builtin',
219
- };
151
+ return {
152
+ name: CompileCheckToolName,
153
+ description: "Run the project's standard typecheck or lint pass and return its output.",
154
+ parameters: CompileCheckSchema,
155
+ allowed_callers: ["direct", "code_execution"],
156
+ responseFormat: "content_and_artifact",
157
+ toolType: "builtin"
158
+ };
220
159
  }
221
-
160
+ //#endregion
222
161
  export { CompileCheckToolName, createCompileCheckTool, createCompileCheckToolDefinition };
223
- //# sourceMappingURL=CompileCheckTool.mjs.map
162
+
163
+ //# sourceMappingURL=CompileCheckTool.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CompileCheckTool.mjs","sources":["../../../../src/tools/local/CompileCheckTool.ts"],"sourcesContent":["/**\n * `compile_check` — a thin LLM-callable wrapper around the project's\n * standard typecheck/lint command. Lets the agent answer \"did my\n * change break anything?\" without us shipping a real LSP client.\n *\n * Auto-detection priority (first hit wins):\n *\n * 1. `local.compileCheck.command` — explicit override\n * 2. `tsconfig.json` → `npx --no-install tsc --noEmit`\n * 3. `package.json` with a typescript dep → same as 2\n * 4. `pyproject.toml` or `setup.py` / `setup.cfg`\n * with a dev dep on mypy → `python3 -m mypy .`\n * else → `python3 -m py_compile <every .py>`\n * (bounded by find-walk so node_modules\n * and `.venv` don't blow up)\n * 5. `Cargo.toml` → `cargo check --message-format=short`\n * 6. `go.mod` → `go vet ./...`\n * 7. otherwise → tells the agent there's\n * no detected toolchain.\n *\n * Output is the spawn process's stdout/stderr passed through\n * `truncateLocalOutput` so a 10MB tsc dump can't blow context. The\n * exit code is reported.\n */\n\nimport { resolve } from 'path';\nimport { tool } from '@langchain/core/tools';\nimport type { DynamicStructuredTool } from '@langchain/core/tools';\nimport type { WorkspaceFS } from './workspaceFS';\nimport type * as t from '@/types';\nimport {\n getLocalCwd,\n getWorkspaceFS,\n spawnLocalProcess,\n truncateLocalOutput,\n validateBashCommand,\n} from './LocalExecutionEngine';\nimport { Constants } from '@/common';\n\n/** Back-compat alias; canonical name lives on `Constants.COMPILE_CHECK`. */\nexport const CompileCheckToolName = Constants.COMPILE_CHECK;\n\nconst CompileCheckSchema: t.JsonSchemaType = {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description:\n 'Optional explicit command to run instead of the auto-detected one. Runs verbatim from the local engine cwd; honours the standard sandbox/AST gate.',\n },\n timeout_ms: {\n type: 'integer',\n description:\n 'Optional timeout in milliseconds. Defaults to 120000 (2 min).',\n },\n },\n};\n\ntype DetectedKind =\n | 'typescript'\n | 'python-mypy'\n | 'python-compile'\n | 'rust'\n | 'go'\n | 'unknown';\n\ntype Detection = {\n kind: DetectedKind;\n command: string;\n reason: string;\n};\n\nasync function pathExists(fs: WorkspaceFS, p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\n// Probes for project markers via the configured WorkspaceFS so a Run\n// with `local.exec.fs` (in-memory or remote engine) detects the right\n// toolchain against the actual workspace — not the host filesystem.\n// Codex P1 #25.\nasync function detect(cwd: string, fs: WorkspaceFS): Promise<Detection> {\n if (await pathExists(fs, resolve(cwd, 'tsconfig.json'))) {\n return {\n kind: 'typescript',\n command: 'npx --no-install tsc --noEmit',\n reason: 'tsconfig.json present',\n };\n }\n if (await pathExists(fs, resolve(cwd, 'package.json'))) {\n const pkgRaw = await fs\n .readFile(resolve(cwd, 'package.json'), 'utf8')\n .catch(() => '');\n if (pkgRaw.includes('\"typescript\"')) {\n return {\n kind: 'typescript',\n command: 'npx --no-install tsc --noEmit',\n reason: 'package.json declares typescript',\n };\n }\n }\n if (await pathExists(fs, resolve(cwd, 'Cargo.toml'))) {\n return {\n kind: 'rust',\n command: 'cargo check --message-format=short',\n reason: 'Cargo.toml present',\n };\n }\n if (await pathExists(fs, resolve(cwd, 'go.mod'))) {\n return {\n kind: 'go',\n command: 'go vet ./...',\n reason: 'go.mod present',\n };\n }\n if (\n (await pathExists(fs, resolve(cwd, 'pyproject.toml'))) ||\n (await pathExists(fs, resolve(cwd, 'setup.py'))) ||\n (await pathExists(fs, resolve(cwd, 'setup.cfg')))\n ) {\n const pyToml = await fs\n .readFile(resolve(cwd, 'pyproject.toml'), 'utf8')\n .catch(() => '');\n if (pyToml.includes('mypy')) {\n return {\n kind: 'python-mypy',\n command: 'python3 -m mypy .',\n reason: 'pyproject.toml declares mypy',\n };\n }\n return {\n kind: 'python-compile',\n command:\n 'python3 -c \"import compileall, sys; sys.exit(0 if compileall.compile_dir(\\'.\\', quiet=1, rx=__import__(\\'re\\').compile(r\\'(node_modules|\\\\.venv|\\\\.git|build|dist)\\')) else 1)\"',\n reason: 'Python project (no mypy detected)',\n };\n }\n return {\n kind: 'unknown',\n command: '',\n reason:\n 'no recognised project marker (tsconfig.json, package.json[typescript], Cargo.toml, go.mod, pyproject.toml, setup.py)',\n };\n}\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\nexport function createCompileCheckTool(\n config: t.LocalExecutionConfig = {}\n): DynamicStructuredTool {\n return tool(\n async (rawInput) => {\n const input = rawInput as {\n command?: string;\n timeout_ms?: number;\n };\n const cwd = getLocalCwd(config);\n const fs = getWorkspaceFS(config);\n const overrideCommand = input.command ?? config.compileCheck?.command;\n let detection: Detection;\n if (overrideCommand != null && overrideCommand.trim() !== '') {\n detection = {\n kind: 'unknown',\n command: overrideCommand,\n reason: 'explicit override',\n };\n } else {\n detection = await detect(cwd, fs);\n }\n\n if (detection.command === '') {\n const explainer = `compile_check: ${detection.reason}. Pass an explicit \\`command\\` (e.g. \\`npm run typecheck\\`) to override.`;\n return [\n explainer,\n {\n kind: detection.kind,\n ran: false,\n reason: detection.reason,\n cwd,\n },\n ];\n }\n\n // Codex P1 #21: route the resolved command through the same\n // safety gates the rest of the local engine uses. Without this\n // a host with `readOnly: true` (or relying on the destructive-\n // command guard) could be bypassed by passing a `command`\n // override to compile_check that performs writes/deletes.\n // Auto-detected commands (tsc/cargo/etc.) pass these gates\n // unchanged — the validation is only blocking for genuinely\n // mutating overrides.\n const validation = await validateBashCommand(detection.command, config);\n if (!validation.valid) {\n const explainer = `compile_check refused to run \\`${detection.command}\\`: ${validation.errors.join('; ')}`;\n return [\n explainer,\n {\n kind: detection.kind,\n ran: false,\n reason: validation.errors.join('; '),\n cwd,\n },\n ];\n }\n\n const timeoutMs =\n input.timeout_ms ??\n config.compileCheck?.timeoutMs ??\n DEFAULT_TIMEOUT_MS;\n const result = await spawnLocalProcess(\n config.shell ?? (process.platform === 'win32' ? 'bash.exe' : 'bash'),\n ['-lc', detection.command],\n {\n ...config,\n timeoutMs,\n maxOutputChars: config.maxOutputChars ?? 8000,\n }\n );\n\n const passed = result.exitCode === 0 && !result.timedOut;\n const headline = passed\n ? `compile_check (${detection.kind}) PASSED via \\`${detection.command}\\``\n : `compile_check (${detection.kind}) FAILED via \\`${detection.command}\\` ` +\n `(exit=${result.exitCode ?? 'unknown'}${result.timedOut ? ', timed_out=true' : ''})`;\n\n let body = '';\n if (result.stdout !== '') {\n body += `\\n\\nstdout:\\n${truncateLocalOutput(result.stdout, 4000)}`;\n }\n if (result.stderr !== '') {\n body += `\\n\\nstderr:\\n${truncateLocalOutput(result.stderr, 4000)}`;\n }\n if (result.fullOutputPath != null) {\n body += `\\n\\nfull_output_path: ${result.fullOutputPath}`;\n }\n const summary = `${headline}${body}\\n\\nworking_directory: ${cwd}\\nreason: ${detection.reason}`;\n\n return [\n summary,\n {\n kind: detection.kind,\n ran: true,\n passed,\n exit_code: result.exitCode,\n timed_out: result.timedOut,\n command: detection.command,\n cwd,\n },\n ];\n },\n {\n name: CompileCheckToolName,\n description:\n 'Run the project\\'s standard typecheck or lint pass and return its output. Auto-detects from project markers (tsconfig.json/package.json -> tsc; Cargo.toml -> cargo check; go.mod -> go vet; pyproject.toml -> mypy or py_compile). Pass `command` to override.',\n schema: CompileCheckSchema,\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n\nexport function createCompileCheckToolDefinition(): t.LCTool {\n return {\n name: CompileCheckToolName,\n description:\n 'Run the project\\'s standard typecheck or lint pass and return its output.',\n parameters: CompileCheckSchema,\n allowed_callers: ['direct', 'code_execution'],\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n toolType: 'builtin',\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CompileCheckTool.mjs","names":[],"sources":["../../../../src/tools/local/CompileCheckTool.ts"],"sourcesContent":["/**\n * `compile_check` — a thin LLM-callable wrapper around the project's\n * standard typecheck/lint command. Lets the agent answer \"did my\n * change break anything?\" without us shipping a real LSP client.\n *\n * Auto-detection priority (first hit wins):\n *\n * 1. `local.compileCheck.command` — explicit override\n * 2. `tsconfig.json` → `npx --no-install tsc --noEmit`\n * 3. `package.json` with a typescript dep → same as 2\n * 4. `pyproject.toml` or `setup.py` / `setup.cfg`\n * with a dev dep on mypy → `python3 -m mypy .`\n * else → `python3 -m py_compile <every .py>`\n * (bounded by find-walk so node_modules\n * and `.venv` don't blow up)\n * 5. `Cargo.toml` → `cargo check --message-format=short`\n * 6. `go.mod` → `go vet ./...`\n * 7. otherwise → tells the agent there's\n * no detected toolchain.\n *\n * Output is the spawn process's stdout/stderr passed through\n * `truncateLocalOutput` so a 10MB tsc dump can't blow context. The\n * exit code is reported.\n */\n\nimport { resolve } from 'path';\nimport { tool } from '@langchain/core/tools';\nimport type { DynamicStructuredTool } from '@langchain/core/tools';\nimport type { WorkspaceFS } from './workspaceFS';\nimport type * as t from '@/types';\nimport {\n getLocalCwd,\n getWorkspaceFS,\n spawnLocalProcess,\n truncateLocalOutput,\n validateBashCommand,\n} from './LocalExecutionEngine';\nimport { Constants } from '@/common';\n\n/** Back-compat alias; canonical name lives on `Constants.COMPILE_CHECK`. */\nexport const CompileCheckToolName = Constants.COMPILE_CHECK;\n\nconst CompileCheckSchema: t.JsonSchemaType = {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description:\n 'Optional explicit command to run instead of the auto-detected one. Runs verbatim from the local engine cwd; honours the standard sandbox/AST gate.',\n },\n timeout_ms: {\n type: 'integer',\n description:\n 'Optional timeout in milliseconds. Defaults to 120000 (2 min).',\n },\n },\n};\n\ntype DetectedKind =\n | 'typescript'\n | 'python-mypy'\n | 'python-compile'\n | 'rust'\n | 'go'\n | 'unknown';\n\ntype Detection = {\n kind: DetectedKind;\n command: string;\n reason: string;\n};\n\nasync function pathExists(fs: WorkspaceFS, p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\n// Probes for project markers via the configured WorkspaceFS so a Run\n// with `local.exec.fs` (in-memory or remote engine) detects the right\n// toolchain against the actual workspace — not the host filesystem.\n// Codex P1 #25.\nasync function detect(cwd: string, fs: WorkspaceFS): Promise<Detection> {\n if (await pathExists(fs, resolve(cwd, 'tsconfig.json'))) {\n return {\n kind: 'typescript',\n command: 'npx --no-install tsc --noEmit',\n reason: 'tsconfig.json present',\n };\n }\n if (await pathExists(fs, resolve(cwd, 'package.json'))) {\n const pkgRaw = await fs\n .readFile(resolve(cwd, 'package.json'), 'utf8')\n .catch(() => '');\n if (pkgRaw.includes('\"typescript\"')) {\n return {\n kind: 'typescript',\n command: 'npx --no-install tsc --noEmit',\n reason: 'package.json declares typescript',\n };\n }\n }\n if (await pathExists(fs, resolve(cwd, 'Cargo.toml'))) {\n return {\n kind: 'rust',\n command: 'cargo check --message-format=short',\n reason: 'Cargo.toml present',\n };\n }\n if (await pathExists(fs, resolve(cwd, 'go.mod'))) {\n return {\n kind: 'go',\n command: 'go vet ./...',\n reason: 'go.mod present',\n };\n }\n if (\n (await pathExists(fs, resolve(cwd, 'pyproject.toml'))) ||\n (await pathExists(fs, resolve(cwd, 'setup.py'))) ||\n (await pathExists(fs, resolve(cwd, 'setup.cfg')))\n ) {\n const pyToml = await fs\n .readFile(resolve(cwd, 'pyproject.toml'), 'utf8')\n .catch(() => '');\n if (pyToml.includes('mypy')) {\n return {\n kind: 'python-mypy',\n command: 'python3 -m mypy .',\n reason: 'pyproject.toml declares mypy',\n };\n }\n return {\n kind: 'python-compile',\n command:\n 'python3 -c \"import compileall, sys; sys.exit(0 if compileall.compile_dir(\\'.\\', quiet=1, rx=__import__(\\'re\\').compile(r\\'(node_modules|\\\\.venv|\\\\.git|build|dist)\\')) else 1)\"',\n reason: 'Python project (no mypy detected)',\n };\n }\n return {\n kind: 'unknown',\n command: '',\n reason:\n 'no recognised project marker (tsconfig.json, package.json[typescript], Cargo.toml, go.mod, pyproject.toml, setup.py)',\n };\n}\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\nexport function createCompileCheckTool(\n config: t.LocalExecutionConfig = {}\n): DynamicStructuredTool {\n return tool(\n async (rawInput) => {\n const input = rawInput as {\n command?: string;\n timeout_ms?: number;\n };\n const cwd = getLocalCwd(config);\n const fs = getWorkspaceFS(config);\n const overrideCommand = input.command ?? config.compileCheck?.command;\n let detection: Detection;\n if (overrideCommand != null && overrideCommand.trim() !== '') {\n detection = {\n kind: 'unknown',\n command: overrideCommand,\n reason: 'explicit override',\n };\n } else {\n detection = await detect(cwd, fs);\n }\n\n if (detection.command === '') {\n const explainer = `compile_check: ${detection.reason}. Pass an explicit \\`command\\` (e.g. \\`npm run typecheck\\`) to override.`;\n return [\n explainer,\n {\n kind: detection.kind,\n ran: false,\n reason: detection.reason,\n cwd,\n },\n ];\n }\n\n // Codex P1 #21: route the resolved command through the same\n // safety gates the rest of the local engine uses. Without this\n // a host with `readOnly: true` (or relying on the destructive-\n // command guard) could be bypassed by passing a `command`\n // override to compile_check that performs writes/deletes.\n // Auto-detected commands (tsc/cargo/etc.) pass these gates\n // unchanged — the validation is only blocking for genuinely\n // mutating overrides.\n const validation = await validateBashCommand(detection.command, config);\n if (!validation.valid) {\n const explainer = `compile_check refused to run \\`${detection.command}\\`: ${validation.errors.join('; ')}`;\n return [\n explainer,\n {\n kind: detection.kind,\n ran: false,\n reason: validation.errors.join('; '),\n cwd,\n },\n ];\n }\n\n const timeoutMs =\n input.timeout_ms ??\n config.compileCheck?.timeoutMs ??\n DEFAULT_TIMEOUT_MS;\n const result = await spawnLocalProcess(\n config.shell ?? (process.platform === 'win32' ? 'bash.exe' : 'bash'),\n ['-lc', detection.command],\n {\n ...config,\n timeoutMs,\n maxOutputChars: config.maxOutputChars ?? 8000,\n }\n );\n\n const passed = result.exitCode === 0 && !result.timedOut;\n const headline = passed\n ? `compile_check (${detection.kind}) PASSED via \\`${detection.command}\\``\n : `compile_check (${detection.kind}) FAILED via \\`${detection.command}\\` ` +\n `(exit=${result.exitCode ?? 'unknown'}${result.timedOut ? ', timed_out=true' : ''})`;\n\n let body = '';\n if (result.stdout !== '') {\n body += `\\n\\nstdout:\\n${truncateLocalOutput(result.stdout, 4000)}`;\n }\n if (result.stderr !== '') {\n body += `\\n\\nstderr:\\n${truncateLocalOutput(result.stderr, 4000)}`;\n }\n if (result.fullOutputPath != null) {\n body += `\\n\\nfull_output_path: ${result.fullOutputPath}`;\n }\n const summary = `${headline}${body}\\n\\nworking_directory: ${cwd}\\nreason: ${detection.reason}`;\n\n return [\n summary,\n {\n kind: detection.kind,\n ran: true,\n passed,\n exit_code: result.exitCode,\n timed_out: result.timedOut,\n command: detection.command,\n cwd,\n },\n ];\n },\n {\n name: CompileCheckToolName,\n description:\n 'Run the project\\'s standard typecheck or lint pass and return its output. Auto-detects from project markers (tsconfig.json/package.json -> tsc; Cargo.toml -> cargo check; go.mod -> go vet; pyproject.toml -> mypy or py_compile). Pass `command` to override.',\n schema: CompileCheckSchema,\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n }\n );\n}\n\nexport function createCompileCheckToolDefinition(): t.LCTool {\n return {\n name: CompileCheckToolName,\n description:\n 'Run the project\\'s standard typecheck or lint pass and return its output.',\n parameters: CompileCheckSchema,\n allowed_callers: ['direct', 'code_execution'],\n responseFormat: Constants.CONTENT_AND_ARTIFACT,\n toolType: 'builtin',\n };\n}\n"],"mappings":"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"}
@@ -1,88 +1,82 @@
1
- import { dirname } from 'path';
2
- import { nodeWorkspaceFS } from './workspaceFS.mjs';
3
-
1
+ import { nodeWorkspaceFS } from "./workspaceFS.mjs";
2
+ import { dirname } from "path";
3
+ //#region src/tools/local/FileCheckpointer.ts
4
4
  /**
5
- * Per-Run snapshot store for write_file / edit_file. Captures the
6
- * pre-write byte content of every path the local engine is about to
7
- * mutate so a later `rewind()` can restore the working tree to its
8
- * original state. Notes:
9
- *
10
- * - Idempotent per path: subsequent captures preserve the first
11
- * snapshot (so rewind always restores the *original* content).
12
- * - Captures missing files as `{ kind: 'absent' }`; rewind deletes
13
- * those paths so created files are removed.
14
- * - In-memory: snapshots live for the lifetime of this instance and
15
- * are not persisted across processes. Tie the lifetime to a Run.
16
- * - Bounded by `maxBytesPerFile` (default 32 MiB) to bound memory.
17
- * A file larger than the cap is recorded but not snapshotted; the
18
- * rewind of that path is best-effort and the caller is told via
19
- * the result count not to trust it.
20
- */
21
- class LocalFileCheckpointerImpl {
22
- maxBytesPerFile;
23
- fs;
24
- snapshots = new Map();
25
- oversizePaths = new Set();
26
- constructor(maxBytesPerFile = 32 * 1024 * 1024, fs = nodeWorkspaceFS) {
27
- this.maxBytesPerFile = maxBytesPerFile;
28
- this.fs = fs;
29
- }
30
- async captureBeforeWrite(absolutePath) {
31
- if (this.snapshots.has(absolutePath) ||
32
- this.oversizePaths.has(absolutePath)) {
33
- return;
34
- }
35
- let info;
36
- try {
37
- info = await this.fs.stat(absolutePath);
38
- }
39
- catch {
40
- this.snapshots.set(absolutePath, { kind: 'absent' });
41
- return;
42
- }
43
- if (!info.isFile()) {
44
- return;
45
- }
46
- if (info.size > this.maxBytesPerFile) {
47
- this.oversizePaths.add(absolutePath);
48
- return;
49
- }
50
- const content = (await this.fs.readFile(absolutePath));
51
- this.snapshots.set(absolutePath, { kind: 'present', content });
52
- }
53
- async rewind() {
54
- let restored = 0;
55
- for (const [path, snapshot] of this.snapshots.entries()) {
56
- if (snapshot.kind === 'absent') {
57
- await this.fs.unlink(path).catch(() => undefined);
58
- restored++;
59
- continue;
60
- }
61
- try {
62
- await this.fs.mkdir(dirname(path), { recursive: true });
63
- await this.fs.writeFile(path, snapshot.content);
64
- restored++;
65
- }
66
- catch {
67
- // Best-effort: ignore individual restore failures so the rest
68
- // of the rewind continues.
69
- }
70
- }
71
- return restored;
72
- }
73
- capturedPaths() {
74
- return [...this.snapshots.keys(), ...this.oversizePaths];
75
- }
76
- }
5
+ * Per-Run snapshot store for write_file / edit_file. Captures the
6
+ * pre-write byte content of every path the local engine is about to
7
+ * mutate so a later `rewind()` can restore the working tree to its
8
+ * original state. Notes:
9
+ *
10
+ * - Idempotent per path: subsequent captures preserve the first
11
+ * snapshot (so rewind always restores the *original* content).
12
+ * - Captures missing files as `{ kind: 'absent' }`; rewind deletes
13
+ * those paths so created files are removed.
14
+ * - In-memory: snapshots live for the lifetime of this instance and
15
+ * are not persisted across processes. Tie the lifetime to a Run.
16
+ * - Bounded by `maxBytesPerFile` (default 32 MiB) to bound memory.
17
+ * A file larger than the cap is recorded but not snapshotted; the
18
+ * rewind of that path is best-effort and the caller is told via
19
+ * the result count not to trust it.
20
+ */
21
+ var LocalFileCheckpointerImpl = class {
22
+ maxBytesPerFile;
23
+ fs;
24
+ snapshots = /* @__PURE__ */ new Map();
25
+ oversizePaths = /* @__PURE__ */ new Set();
26
+ constructor(maxBytesPerFile = 32 * 1024 * 1024, fs = nodeWorkspaceFS) {
27
+ this.maxBytesPerFile = maxBytesPerFile;
28
+ this.fs = fs;
29
+ }
30
+ async captureBeforeWrite(absolutePath) {
31
+ if (this.snapshots.has(absolutePath) || this.oversizePaths.has(absolutePath)) return;
32
+ let info;
33
+ try {
34
+ info = await this.fs.stat(absolutePath);
35
+ } catch {
36
+ this.snapshots.set(absolutePath, { kind: "absent" });
37
+ return;
38
+ }
39
+ if (!info.isFile()) return;
40
+ if (info.size > this.maxBytesPerFile) {
41
+ this.oversizePaths.add(absolutePath);
42
+ return;
43
+ }
44
+ const content = await this.fs.readFile(absolutePath);
45
+ this.snapshots.set(absolutePath, {
46
+ kind: "present",
47
+ content
48
+ });
49
+ }
50
+ async rewind() {
51
+ let restored = 0;
52
+ for (const [path, snapshot] of this.snapshots.entries()) {
53
+ if (snapshot.kind === "absent") {
54
+ await this.fs.unlink(path).catch(() => void 0);
55
+ restored++;
56
+ continue;
57
+ }
58
+ try {
59
+ await this.fs.mkdir(dirname(path), { recursive: true });
60
+ await this.fs.writeFile(path, snapshot.content);
61
+ restored++;
62
+ } catch {}
63
+ }
64
+ return restored;
65
+ }
66
+ capturedPaths() {
67
+ return [...this.snapshots.keys(), ...this.oversizePaths];
68
+ }
69
+ };
77
70
  /**
78
- * Convenience factory so callers don't have to reach for the impl
79
- * class directly. Accepts an optional `WorkspaceFS` so a host using a
80
- * non-default engine (remote sandbox, in-memory test FS, etc.) can
81
- * route the checkpointer through the same I/O.
82
- */
71
+ * Convenience factory so callers don't have to reach for the impl
72
+ * class directly. Accepts an optional `WorkspaceFS` so a host using a
73
+ * non-default engine (remote sandbox, in-memory test FS, etc.) can
74
+ * route the checkpointer through the same I/O.
75
+ */
83
76
  function createLocalFileCheckpointer(options = {}) {
84
- return new LocalFileCheckpointerImpl(options.maxBytesPerFile, options.fs);
77
+ return new LocalFileCheckpointerImpl(options.maxBytesPerFile, options.fs);
85
78
  }
86
-
79
+ //#endregion
87
80
  export { LocalFileCheckpointerImpl, createLocalFileCheckpointer };
88
- //# sourceMappingURL=FileCheckpointer.mjs.map
81
+
82
+ //# sourceMappingURL=FileCheckpointer.mjs.map