Skip to content

Commit c265e25

Browse files
authored
fix(adapters): increase timeout for env var cmds (#2601)
Closes #2594
1 parent ff3eae6 commit c265e25

File tree

7 files changed

+19
-11
lines changed

7 files changed

+19
-11
lines changed

lua/codecompanion/acp/init.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
local METHODS = require("codecompanion.acp.methods")
2222
local PromptBuilder = require("codecompanion.acp.prompt_builder")
2323
local adapter_utils = require("codecompanion.utils.adapters")
24+
local config = require("codecompanion.config")
2425
local log = require("codecompanion.utils.log")
2526

2627
local TIMEOUTS = {
@@ -348,7 +349,7 @@ end
348349
---@return CodeCompanion.ACPAdapter
349350
function Connection:prepare_adapter()
350351
local adapter = vim.deepcopy(self.adapter)
351-
adapter = adapter_utils.get_env_vars(adapter)
352+
adapter = adapter_utils.get_env_vars(adapter, { timeout = config.adapters.opts.cmd_timeout })
352353
adapter.parameters = adapter_utils.set_env_vars(adapter, adapter.parameters)
353354
adapter.defaults.auth_method = adapter_utils.set_env_vars(adapter, adapter.defaults.auth_method)
354355
adapter.defaults.mcpServers = adapter_utils.set_env_vars(adapter, adapter.defaults.mcpServers)

lua/codecompanion/adapters/http/ollama/get_models.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ function M.choices(self, opts)
126126
log:error("Could not resolve Ollama adapter in the `choices` function")
127127
return {}
128128
end
129-
adapter_utils.get_env_vars(adapter)
129+
adapter_utils.get_env_vars(adapter, { timeout = config.adapters.opts.cmd_timeout })
130130
local url = adapter.env_replaced.url
131131
local is_uninitialised = _cached_models[url] == nil
132132

lua/codecompanion/adapters/http/openai_compatible.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ local function get_models(self, opts)
4040
return {}
4141
end
4242

43-
adapter_utils.get_env_vars(adapter)
43+
adapter_utils.get_env_vars(adapter, { timeout = config.adapters.opts.cmd_timeout })
4444
local url = adapter.env_replaced.url .. adapter.env_replaced.models_endpoint
4545

4646
local headers = {

lua/codecompanion/config.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ local defaults = {
4848
show_presets = true,
4949
},
5050
},
51+
opts = {
52+
cmd_timeout = 10e3, -- Timeout for commands that resolve env variables (milliseconds)
53+
},
5154
},
5255
constants = constants,
5356
interactions = {

lua/codecompanion/http.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ function Client:send_sync(payload, opts)
181181
return nil, { message = "Failed to setup adapter", stderr = "setup=false" }
182182
end
183183

184-
adapter = adapter_utils.get_env_vars(adapter)
184+
adapter = adapter_utils.get_env_vars(adapter, { timeout = config.adapters.opts.cmd_timeout })
185185

186186
local body = self.methods.encode(
187187
vim.tbl_extend(
@@ -307,7 +307,7 @@ function Client:request(payload, actions, opts)
307307
return log:error("Failed to setup adapter")
308308
end
309309

310-
adapter = adapter_utils.get_env_vars(adapter)
310+
adapter = adapter_utils.get_env_vars(adapter, { timeout = config.adapters.opts.cmd_timeout })
311311

312312
local body = self.methods.encode(
313313
vim.tbl_extend(

lua/codecompanion/utils/adapters.lua

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,17 +215,16 @@ end
215215

216216
---Run the command in the environment variable
217217
---@param var string
218+
---@param timeout number
218219
---@return string|nil
219-
local function run_cmd(var)
220+
local function run_cmd(var, timeout)
220221
log:trace("[Adapters] Detected cmd in environment variable")
221222

222-
local timeout_ms = 5000 -- 5 second timeout
223-
224223
local cmd = var:sub(5)
225224

226225
local shell_cmd = require("codecompanion.utils.os").build_shell_command(cmd)
227226

228-
local obj = vim.system(shell_cmd, { text = true, timeout = timeout_ms })
227+
local obj = vim.system(shell_cmd, { text = true, timeout = timeout })
229228
if not obj then
230229
return log:error("[Adapters] Could not execute cmd: %s", cmd)
231230
end
@@ -302,8 +301,9 @@ end
302301

303302
---Get the variables from the env key of the adapter
304303
---@param adapter table
304+
---@param args? { timeout: number }
305305
---@return table
306-
function M.get_env_vars(adapter)
306+
function M.get_env_vars(adapter, args)
307307
local env_vars = adapter.env or {}
308308

309309
if not env_vars then
@@ -314,7 +314,8 @@ function M.get_env_vars(adapter)
314314

315315
for k, v in pairs(env_vars) do
316316
if type(v) == "string" and is_cmd(v) then
317-
adapter.env_replaced[k] = run_cmd(v)
317+
local timeout = (args and args.timeout) or 5000
318+
adapter.env_replaced[k] = run_cmd(v, timeout)
318319
elseif type(v) == "string" and is_env_var(v) then
319320
adapter.env_replaced[k] = get_env_var(v)
320321
elseif type(v) == "function" then

tests/config.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ return {
6969
roles = { user = "user", assistant = "assistant" },
7070
},
7171
},
72+
opts = {
73+
cmd_timeout = 10e3,
74+
},
7275
},
7376
interactions = {
7477
background = {},

0 commit comments

Comments
 (0)