@librechat/agents 3.2.32 → 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.
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/agents/AgentContext.cjs +844 -1046
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/constants.cjs +13 -13
- package/dist/cjs/common/constants.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +233 -240
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/common/index.cjs +2 -0
- package/dist/cjs/events.cjs +121 -169
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +1389 -1807
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +713 -945
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/graphs/index.cjs +2 -0
- package/dist/cjs/hitl/askUserQuestion.cjs +60 -62
- package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
- package/dist/cjs/hitl/index.cjs +1 -0
- package/dist/cjs/hooks/HookRegistry.cjs +176 -202
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/createToolPolicyHook.cjs +71 -101
- package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +170 -273
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs +227 -282
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs +6 -0
- package/dist/cjs/hooks/matchers.cjs +196 -230
- package/dist/cjs/hooks/matchers.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +24 -24
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +110 -137
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langchain/google-common.cjs +0 -3
- package/dist/cjs/langchain/index.cjs +80 -43
- package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
- package/dist/cjs/langchain/messages/tool.cjs +0 -3
- package/dist/cjs/langchain/messages.cjs +35 -18
- package/dist/cjs/langchain/openai.cjs +0 -3
- package/dist/cjs/langchain/prompts.cjs +5 -8
- package/dist/cjs/langchain/runnables.cjs +11 -10
- package/dist/cjs/langchain/tools.cjs +14 -11
- package/dist/cjs/langchain/utils/env.cjs +5 -8
- package/dist/cjs/langfuse.cjs +60 -79
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +267 -399
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +432 -562
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs +23 -47
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +441 -731
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -256
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/output_parsers.cjs +2 -0
- package/dist/cjs/llm/anthropic/utils/tools.cjs +12 -26
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +195 -240
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/toolCache.cjs +84 -106
- package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/index.cjs +2 -0
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +357 -620
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +105 -149
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/fake.cjs +86 -96
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +183 -237
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +398 -674
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/zod_to_genai_parameters.cjs +2 -0
- package/dist/cjs/llm/init.cjs +44 -53
- package/dist/cjs/llm/init.cjs.map +1 -1
- package/dist/cjs/llm/invoke.cjs +142 -182
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +991 -1276
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +189 -316
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +102 -153
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/toolCache.cjs +35 -44
- package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs +29 -37
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/request.cjs +20 -33
- package/dist/cjs/llm/request.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +427 -453
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +547 -528
- package/dist/cjs/messages/anthropicToolCache.cjs +68 -119
- package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +305 -418
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs +36 -49
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs +112 -145
- package/dist/cjs/messages/contextPruning.cjs.map +1 -1
- package/dist/cjs/messages/contextPruningSettings.cjs +36 -46
- package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +256 -397
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +904 -1387
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs +16 -20
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/index.cjs +12 -0
- package/dist/cjs/messages/langchain.cjs +18 -18
- package/dist/cjs/messages/langchain.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +1054 -1517
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/recency.cjs +77 -95
- package/dist/cjs/messages/recency.cjs.map +1 -1
- package/dist/cjs/messages/reducer.cjs +63 -78
- package/dist/cjs/messages/reducer.cjs.map +1 -1
- package/dist/cjs/messages/tools.cjs +51 -79
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs +171 -217
- package/dist/cjs/openai/index.cjs.map +1 -1
- package/dist/cjs/responses/index.cjs +302 -391
- package/dist/cjs/responses/index.cjs.map +1 -1
- package/dist/cjs/run.cjs +903 -1113
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +805 -986
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/session/JsonlSessionStore.cjs +327 -410
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
- package/dist/cjs/session/handlers.cjs +192 -208
- package/dist/cjs/session/handlers.cjs.map +1 -1
- package/dist/cjs/session/ids.cjs +9 -10
- package/dist/cjs/session/ids.cjs.map +1 -1
- package/dist/cjs/session/index.cjs +4 -0
- package/dist/cjs/session/messageSerialization.cjs +94 -156
- package/dist/cjs/session/messageSerialization.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs +147 -206
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +856 -1344
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/index.cjs +57 -101
- package/dist/cjs/summarization/index.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +643 -796
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +110 -136
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +165 -245
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs +36 -57
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +126 -168
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/CodeSessionFileSummary.cjs +36 -46
- package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +459 -649
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ReadFile.cjs +17 -20
- package/dist/cjs/tools/ReadFile.cjs.map +1 -1
- package/dist/cjs/tools/SkillTool.cjs +26 -27
- package/dist/cjs/tools/SkillTool.cjs.map +1 -1
- package/dist/cjs/tools/SubagentTool.cjs +59 -61
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +2109 -2686
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +663 -825
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +248 -340
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +170 -197
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +425 -520
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +91 -124
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/index.cjs +4 -0
- package/dist/cjs/tools/eagerEventExecution.cjs +75 -99
- package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +200 -262
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/local/CompileCheckTool.cjs +150 -212
- package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
- package/dist/cjs/tools/local/FileCheckpointer.cjs +77 -85
- package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalCodingTools.cjs +763 -1022
- package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs +666 -941
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionTools.cjs +49 -92
- package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +286 -354
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/local/attachments.cjs +108 -165
- package/dist/cjs/tools/local/attachments.cjs.map +1 -1
- package/dist/cjs/tools/local/bashAst.cjs +99 -113
- package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
- package/dist/cjs/tools/local/editStrategies.cjs +126 -169
- package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
- package/dist/cjs/tools/local/index.cjs +12 -0
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +136 -218
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/syntaxCheck.cjs +142 -161
- package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
- package/dist/cjs/tools/local/textEncoding.cjs +25 -23
- package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
- package/dist/cjs/tools/local/workspaceFS.cjs +38 -46
- package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
- package/dist/cjs/tools/ptcTimeout.cjs +27 -47
- package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
- package/dist/cjs/tools/schema.cjs +24 -23
- package/dist/cjs/tools/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/anthropic.cjs +24 -33
- package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
- package/dist/cjs/tools/search/content.cjs +95 -137
- package/dist/cjs/tools/search/content.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs +141 -172
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs +128 -196
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs +165 -232
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/index.cjs +2 -0
- package/dist/cjs/tools/search/rerankers.cjs +151 -174
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/schema.cjs +40 -39
- package/dist/cjs/tools/search/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +428 -530
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs +106 -127
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +129 -181
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs +295 -359
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +260 -299
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +74 -117
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/skillCatalog.cjs +54 -72
- package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
- package/dist/cjs/tools/streamedToolCallSeals.cjs +19 -36
- package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +612 -771
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/index.cjs +1 -0
- package/dist/cjs/tools/toolOutputReferences.cjs +523 -630
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
- package/dist/cjs/utils/callbacks.cjs +11 -21
- package/dist/cjs/utils/callbacks.cjs.map +1 -1
- package/dist/cjs/utils/errors.cjs +70 -95
- package/dist/cjs/utils/errors.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs +32 -42
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs +8 -12
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs +60 -82
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +9 -0
- package/dist/cjs/utils/llm.cjs +19 -27
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs +30 -46
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs +50 -66
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/schema.cjs +11 -19
- package/dist/cjs/utils/schema.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs +71 -106
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +186 -283
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/truncation.cjs +95 -114
- package/dist/cjs/utils/truncation.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +844 -1044
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/constants.mjs +13 -11
- package/dist/esm/common/constants.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +221 -238
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/common/index.mjs +3 -0
- package/dist/esm/events.mjs +121 -167
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +1388 -1804
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +713 -943
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/graphs/index.mjs +3 -0
- package/dist/esm/hitl/askUserQuestion.mjs +60 -60
- package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
- package/dist/esm/hitl/index.mjs +2 -0
- package/dist/esm/hooks/HookRegistry.mjs +176 -200
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/createToolPolicyHook.mjs +71 -99
- package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs +170 -271
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs +227 -280
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs +7 -0
- package/dist/esm/hooks/matchers.mjs +196 -228
- package/dist/esm/hooks/matchers.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +24 -22
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +109 -132
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langchain/google-common.mjs +1 -2
- package/dist/esm/langchain/index.mjs +5 -5
- package/dist/esm/langchain/language_models/chat_models.mjs +1 -2
- package/dist/esm/langchain/messages/tool.mjs +1 -2
- package/dist/esm/langchain/messages.mjs +2 -2
- package/dist/esm/langchain/openai.mjs +1 -2
- package/dist/esm/langchain/prompts.mjs +2 -2
- package/dist/esm/langchain/runnables.mjs +2 -2
- package/dist/esm/langchain/tools.mjs +2 -2
- package/dist/esm/langchain/utils/env.mjs +2 -2
- package/dist/esm/langfuse.mjs +60 -76
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +267 -395
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +432 -559
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs +23 -45
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +439 -725
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -253
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/output_parsers.mjs +3 -0
- package/dist/esm/llm/anthropic/utils/tools.mjs +12 -24
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +195 -238
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/toolCache.mjs +84 -104
- package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/index.mjs +3 -0
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +357 -618
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +105 -147
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/fake.mjs +86 -94
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +183 -235
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +397 -666
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/google/utils/zod_to_genai_parameters.mjs +3 -0
- package/dist/esm/llm/init.mjs +44 -51
- package/dist/esm/llm/init.mjs.map +1 -1
- package/dist/esm/llm/invoke.mjs +142 -180
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +991 -1271
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +188 -312
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +102 -151
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/toolCache.mjs +35 -42
- package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs +29 -34
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/request.mjs +20 -31
- package/dist/esm/llm/request.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +427 -449
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +99 -87
- package/dist/esm/messages/anthropicToolCache.mjs +68 -117
- package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +305 -416
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs +36 -47
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs +112 -143
- package/dist/esm/messages/contextPruning.mjs.map +1 -1
- package/dist/esm/messages/contextPruningSettings.mjs +36 -44
- package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +254 -393
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +902 -1383
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs +16 -18
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/index.mjs +13 -0
- package/dist/esm/messages/langchain.mjs +18 -16
- package/dist/esm/messages/langchain.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +1053 -1514
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/recency.mjs +77 -93
- package/dist/esm/messages/recency.mjs.map +1 -1
- package/dist/esm/messages/reducer.mjs +63 -76
- package/dist/esm/messages/reducer.mjs.map +1 -1
- package/dist/esm/messages/tools.mjs +49 -75
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/openai/index.mjs +170 -215
- package/dist/esm/openai/index.mjs.map +1 -1
- package/dist/esm/responses/index.mjs +301 -389
- package/dist/esm/responses/index.mjs.map +1 -1
- package/dist/esm/run.mjs +903 -1111
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +806 -985
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/session/JsonlSessionStore.mjs +326 -407
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
- package/dist/esm/session/handlers.mjs +192 -206
- package/dist/esm/session/handlers.mjs.map +1 -1
- package/dist/esm/session/ids.mjs +9 -8
- package/dist/esm/session/ids.mjs.map +1 -1
- package/dist/esm/session/index.mjs +5 -0
- package/dist/esm/session/messageSerialization.mjs +94 -154
- package/dist/esm/session/messageSerialization.mjs.map +1 -1
- package/dist/esm/splitStream.mjs +147 -204
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +854 -1341
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/index.mjs +57 -99
- package/dist/esm/summarization/index.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +640 -790
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +103 -129
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +162 -239
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs +34 -36
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +123 -164
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/CodeSessionFileSummary.mjs +36 -44
- package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +454 -644
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ReadFile.mjs +17 -18
- package/dist/esm/tools/ReadFile.mjs.map +1 -1
- package/dist/esm/tools/SkillTool.mjs +26 -25
- package/dist/esm/tools/SkillTool.mjs.map +1 -1
- package/dist/esm/tools/SubagentTool.mjs +59 -59
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +2107 -2684
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +659 -804
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +248 -338
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +170 -195
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +424 -517
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +91 -122
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/index.mjs +5 -0
- package/dist/esm/tools/eagerEventExecution.mjs +75 -96
- package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +200 -260
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/local/CompileCheckTool.mjs +150 -210
- package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
- package/dist/esm/tools/local/FileCheckpointer.mjs +77 -83
- package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
- package/dist/esm/tools/local/LocalCodingTools.mjs +760 -1017
- package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionEngine.mjs +663 -936
- package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionTools.mjs +49 -90
- package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +283 -349
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/local/attachments.mjs +108 -163
- package/dist/esm/tools/local/attachments.mjs.map +1 -1
- package/dist/esm/tools/local/bashAst.mjs +99 -111
- package/dist/esm/tools/local/bashAst.mjs.map +1 -1
- package/dist/esm/tools/local/editStrategies.mjs +126 -167
- package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
- package/dist/esm/tools/local/index.mjs +13 -0
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +136 -216
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/syntaxCheck.mjs +138 -155
- package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
- package/dist/esm/tools/local/textEncoding.mjs +25 -21
- package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
- package/dist/esm/tools/local/workspaceFS.mjs +38 -44
- package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
- package/dist/esm/tools/ptcTimeout.mjs +27 -42
- package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
- package/dist/esm/tools/schema.mjs +24 -21
- package/dist/esm/tools/schema.mjs.map +1 -1
- package/dist/esm/tools/search/anthropic.mjs +24 -31
- package/dist/esm/tools/search/anthropic.mjs.map +1 -1
- package/dist/esm/tools/search/content.mjs +93 -116
- package/dist/esm/tools/search/content.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs +139 -169
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs +128 -194
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs +165 -230
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/index.mjs +3 -0
- package/dist/esm/tools/search/rerankers.mjs +149 -168
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/schema.mjs +39 -37
- package/dist/esm/tools/search/schema.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +426 -528
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs +104 -124
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +127 -178
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-search.mjs +293 -357
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +259 -297
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +74 -115
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/skillCatalog.mjs +54 -70
- package/dist/esm/tools/skillCatalog.mjs.map +1 -1
- package/dist/esm/tools/streamedToolCallSeals.mjs +19 -31
- package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +612 -768
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/index.mjs +2 -0
- package/dist/esm/tools/toolOutputReferences.mjs +523 -624
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
- package/dist/esm/utils/callbacks.mjs +11 -19
- package/dist/esm/utils/callbacks.mjs.map +1 -1
- package/dist/esm/utils/errors.mjs +70 -93
- package/dist/esm/utils/errors.mjs.map +1 -1
- package/dist/esm/utils/events.mjs +32 -40
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs +8 -10
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs +60 -80
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +10 -0
- package/dist/esm/utils/llm.mjs +19 -25
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs +30 -44
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/run.mjs +50 -64
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/schema.mjs +11 -17
- package/dist/esm/utils/schema.mjs.map +1 -1
- package/dist/esm/utils/title.mjs +71 -104
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +186 -281
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/truncation.mjs +95 -112
- package/dist/esm/utils/truncation.mjs.map +1 -1
- package/dist/types/tools/search/tool.d.ts +17 -0
- package/dist/types/tools/search/types.d.ts +4 -0
- package/package.json +4 -10
- package/src/tools/search/highlights.ts +9 -1
- package/src/tools/search/search.ts +41 -3
- package/src/tools/search/source-processing.test.ts +373 -0
- package/src/tools/search/tool.ts +22 -2
- package/src/tools/search/types.ts +4 -0
- package/dist/cjs/langchain/google-common.cjs.map +0 -1
- package/dist/cjs/langchain/index.cjs.map +0 -1
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
- package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
- package/dist/cjs/langchain/messages.cjs.map +0 -1
- package/dist/cjs/langchain/openai.cjs.map +0 -1
- package/dist/cjs/langchain/prompts.cjs.map +0 -1
- package/dist/cjs/langchain/runnables.cjs.map +0 -1
- package/dist/cjs/langchain/tools.cjs.map +0 -1
- package/dist/cjs/langchain/utils/env.cjs.map +0 -1
- package/dist/cjs/main.cjs.map +0 -1
- package/dist/esm/langchain/google-common.mjs.map +0 -1
- package/dist/esm/langchain/index.mjs.map +0 -1
- package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
- package/dist/esm/langchain/messages/tool.mjs.map +0 -1
- package/dist/esm/langchain/messages.mjs.map +0 -1
- package/dist/esm/langchain/openai.mjs.map +0 -1
- package/dist/esm/langchain/prompts.mjs.map +0 -1
- package/dist/esm/langchain/runnables.mjs.map +0 -1
- package/dist/esm/langchain/tools.mjs.map +0 -1
- package/dist/esm/langchain/utils/env.mjs.map +0 -1
- package/dist/esm/main.mjs.map +0 -1
|
@@ -1,129 +1,115 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/tools/local/bashAst.ts
|
|
3
2
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
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 =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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"],"
|
|
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
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
74
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
126
|
+
exactStrategy,
|
|
127
|
+
lineTrimmedStrategy,
|
|
128
|
+
whitespaceNormalizedStrategy,
|
|
129
|
+
indentationFlexibleStrategy
|
|
172
130
|
];
|
|
173
131
|
function locateEdit(source, oldString) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
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
|
-
|
|
144
|
+
|
|
145
|
+
//# sourceMappingURL=editStrategies.cjs.map
|