Skip to content

Commit 6094564

Browse files
sudo-teecameronr
andauthored
perf: open the panel without waiting on session (#134)
This PR is removing the :wait on the critical paths in favor of a coroutine similar to how promises work in js. This should resolve #137 and #133 --------- Co-authored-by: Cameron Ring <[email protected]>
1 parent efe3d8c commit 6094564

34 files changed

+1237
-762
lines changed

lua/opencode/api.lua

Lines changed: 141 additions & 162 deletions
Large diffs are not rendered by default.

lua/opencode/api_client.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ function OpencodeApiClient:_ensure_base_url()
3030
local state = require('opencode.state')
3131

3232
if not state.opencode_server then
33-
state.opencode_server = server_job.ensure_server() --[[@as OpencodeServer]]
33+
-- this is last resort - try to start the server and could be blocking
34+
state.opencode_server = server_job.ensure_server():wait() --[[@as OpencodeServer]]
3435
-- shouldn't normally happen but prevents error in replay tester
3536
if not state.opencode_server then
3637
return false

lua/opencode/config_file.lua

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,71 @@
1+
local Promise = require('opencode.promise')
12
local M = {
23
config_promise = nil,
34
project_promise = nil,
45
providers_promise = nil,
56
}
67

7-
---@return OpencodeConfigFile|nil
8-
function M.get_opencode_config()
8+
---@type fun(): Promise<OpencodeConfigFile|nil>
9+
M.get_opencode_config = Promise.async(function()
910
if not M.config_promise then
1011
local state = require('opencode.state')
1112
M.config_promise = state.api_client:get_config()
1213
end
1314
local ok, result = pcall(function()
14-
return M.config_promise:wait()
15+
return M.config_promise:await()
1516
end)
1617

1718
if not ok then
1819
vim.notify('Error fetching Opencode config: ' .. vim.inspect(result), vim.log.levels.ERROR)
1920
return nil
2021
end
2122

22-
return result --[[@as OpencodeConfigFile|nil]]
23-
end
23+
return result
24+
end)
2425

25-
---@return OpencodeProject|nil
26-
function M.get_opencode_project()
26+
---@type fun(): Promise<OpencodeProject|nil>
27+
M.get_opencode_project = Promise.async(function()
2728
if not M.project_promise then
2829
local state = require('opencode.state')
2930
M.project_promise = state.api_client:get_current_project()
3031
end
3132
local ok, result = pcall(function()
32-
return M.project_promise:wait()
33+
return M.project_promise:await()
3334
end)
3435
if not ok then
3536
vim.notify('Error fetching Opencode project: ' .. vim.inspect(result), vim.log.levels.ERROR)
3637
return nil
3738
end
3839

3940
return result --[[@as OpencodeProject|nil]]
40-
end
41+
end)
42+
43+
---Get the snapshot storage path for the current workspace
44+
---@type fun(): Promise<string>
45+
M.get_workspace_snapshot_path = Promise.async(function()
46+
local project = M.get_opencode_project():await() --[[@as OpencodeProject|nil]]
47+
if not project then
48+
return ''
49+
end
50+
local home = vim.uv.os_homedir()
51+
return home .. '/.local/share/opencode/snapshot/' .. project.id
52+
end)
4153

42-
---@return OpencodeProvidersResponse|nil
54+
---@return Promise<OpencodeProvidersResponse|nil>
4355
function M.get_opencode_providers()
4456
if not M.providers_promise then
4557
local state = require('opencode.state')
4658
M.providers_promise = state.api_client:list_providers()
4759
end
48-
local ok, result = pcall(function()
49-
return M.providers_promise:wait()
50-
end)
51-
if not ok then
52-
vim.notify('Error fetching Opencode providers: ' .. vim.inspect(result), vim.log.levels.ERROR)
60+
return M.providers_promise:catch(function(err)
61+
vim.notify('Error fetching Opencode providers: ' .. vim.inspect(err), vim.log.levels.ERROR)
5362
return nil
54-
end
55-
56-
return result --[[@as OpencodeProvidersResponse|nil]]
63+
end)
5764
end
5865

59-
function M.get_model_info(provider, model)
60-
local config_file = require('opencode.config_file')
61-
local providers_response = config_file.get_opencode_providers()
66+
M.get_model_info = function(provider, model)
67+
local providers_response = M.get_opencode_providers():peek()
68+
6269
local providers = providers_response and providers_response.providers or {}
6370

6471
local filtered_providers = vim.tbl_filter(function(p)
@@ -72,8 +79,9 @@ function M.get_model_info(provider, model)
7279
return filtered_providers[1] and filtered_providers[1].models and filtered_providers[1].models[model] or nil
7380
end
7481

75-
function M.get_opencode_agents()
76-
local cfg = M.get_opencode_config() --[[@as OpencodeConfigFile]]
82+
---@type fun(): Promise<string[]>
83+
M.get_opencode_agents = Promise.async(function()
84+
local cfg = M.get_opencode_config():await()
7785
if not cfg then
7886
return {}
7987
end
@@ -96,10 +104,11 @@ function M.get_opencode_agents()
96104
end
97105
end
98106
return agents
99-
end
107+
end)
100108

101-
function M.get_subagents()
102-
local cfg = M.get_opencode_config()
109+
---@type fun(): Promise<string[]>
110+
M.get_subagents = Promise.async(function()
111+
local cfg = M.get_opencode_config():await()
103112
if not cfg then
104113
return {}
105114
end
@@ -113,17 +122,19 @@ function M.get_subagents()
113122
table.insert(subagents, 1, 'general')
114123

115124
return subagents
116-
end
125+
end)
117126

118-
function M.get_user_commands()
119-
local cfg = M.get_opencode_config() --[[@as OpencodeConfigFile]]
127+
---@type fun(): Promise<table<string, table>|nil>
128+
M.get_user_commands = Promise.async(function()
129+
local cfg = M.get_opencode_config():await()
120130
return cfg and cfg.command or nil
121-
end
131+
end)
122132

123-
function M.get_mcp_servers()
124-
local cfg = M.get_opencode_config() --[[@as OpencodeConfigFile]]
133+
---@type fun(): Promise<table<string, table>|nil>
134+
M.get_mcp_servers = Promise.async(function()
135+
local cfg = M.get_opencode_config():await()
125136
return cfg and cfg.mcp or nil
126-
end
137+
end)
127138

128139
---Does this opencode user command take arguments?
129140
---@param command OpencodeCommand

0 commit comments

Comments
 (0)