Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion lua/opencode/core.lua
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,17 @@ M.open = Promise.async(function(opts)
ui.focus_output({ restore_position = are_windows_closed })
end

local server = server_job.ensure_server():await()
local server
local server_ok, server_err = pcall(function()
server = server_job.ensure_server():await()
end)

if not server_ok or not server then
state.is_opening = false
vim.notify('Failed to start opencode server: ' .. tostring(server_err or 'Unknown error'), vim.log.levels.ERROR)
return Promise.new():reject(server_err or 'Server failed to start')
end

state.opencode_server = server

local ok, err = pcall(function()
Expand Down
18 changes: 15 additions & 3 deletions lua/opencode/opencode_server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,21 @@ function OpencodeServer:spawn(opts)
end
end,
stderr = function(err, data)
if err or data then
self.spawn_promise:reject(err or data)
safe_call(opts.on_error, err or data)
if err then
self.spawn_promise:reject(err)
safe_call(opts.on_error, err)
return
end
if data then
-- Filter out INFO/WARN/DEBUG log lines (not actual errors)
local log_level = data:match('^%s*(%u+)%s')
if log_level and (log_level == 'INFO' or log_level == 'WARN' or log_level == 'DEBUG') then
-- Ignore log lines, don't reject
return
end
-- Only reject on actual errors
self.spawn_promise:reject(data)
safe_call(opts.on_error, data)
end
end,
}, function(exit_opts)
Expand Down