Skip to content

Commit 03a1475

Browse files
authored
fix(core): only fail startup on actual errors (#202)
The latest version of OpenCode (1.1.35) outputs a log line to stderr on startup (see anomalyco/opencode#10506 ). This causes the NeoVim plugin to hang indefinitely. This commit makes two changes: 1. If we fail to start the OpenCode server, we display a notification with the error rather than hanging indefinitely. 2. We don't allow DEBUG, INFO, or WARN-level messages to fail initialization.
1 parent 6940ea6 commit 03a1475

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

lua/opencode/core.lua

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,17 @@ M.open = Promise.async(function(opts)
8585
ui.focus_output({ restore_position = are_windows_closed })
8686
end
8787

88-
local server = server_job.ensure_server():await()
88+
local server
89+
local server_ok, server_err = pcall(function()
90+
server = server_job.ensure_server():await()
91+
end)
92+
93+
if not server_ok or not server then
94+
state.is_opening = false
95+
vim.notify('Failed to start opencode server: ' .. tostring(server_err or 'Unknown error'), vim.log.levels.ERROR)
96+
return Promise.new():reject(server_err or 'Server failed to start')
97+
end
98+
8999
state.opencode_server = server
90100

91101
local ok, err = pcall(function()

lua/opencode/opencode_server.lua

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,21 @@ function OpencodeServer:spawn(opts)
100100
end
101101
end,
102102
stderr = function(err, data)
103-
if err or data then
104-
self.spawn_promise:reject(err or data)
105-
safe_call(opts.on_error, err or data)
103+
if err then
104+
self.spawn_promise:reject(err)
105+
safe_call(opts.on_error, err)
106+
return
107+
end
108+
if data then
109+
-- Filter out INFO/WARN/DEBUG log lines (not actual errors)
110+
local log_level = data:match('^%s*(%u+)%s')
111+
if log_level and (log_level == 'INFO' or log_level == 'WARN' or log_level == 'DEBUG') then
112+
-- Ignore log lines, don't reject
113+
return
114+
end
115+
-- Only reject on actual errors
116+
self.spawn_promise:reject(data)
117+
safe_call(opts.on_error, data)
106118
end
107119
end,
108120
}, function(exit_opts)

0 commit comments

Comments
 (0)