1+ local Promise = require (' opencode.promise' )
12local 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>
4355function 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 )
5764end
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
7380end
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