Skip to content

Commit 918a732

Browse files
authored
refactor(state): improve use of state helpers (#330)
1 parent 2a3203f commit 918a732

18 files changed

Lines changed: 304 additions & 146 deletions

lua/opencode/context.lua

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,10 @@ local toggleable_context_keys = {
2222
---@param context_key OpencodeToggleableContextKey
2323
---@return table
2424
local function ensure_context_state(context_key)
25-
local current_config = state.current_context_config or {}
26-
local current = current_config[context_key]
27-
local new_config = vim.deepcopy(current_config)
2825
local defaults = vim.tbl_get(config, 'context', context_key) or {}
29-
30-
new_config[context_key] = vim.tbl_deep_extend('force', {}, defaults, current or {})
31-
state.context.set_current_context_config(new_config)
32-
return new_config[context_key]
26+
return state.context.update_current_context_config(function(current_config)
27+
current_config[context_key] = vim.tbl_deep_extend('force', {}, defaults, current_config[context_key] or {})
28+
end)[context_key]
3329
end
3430

3531
M.ChatContext = ChatContext
@@ -120,12 +116,10 @@ end
120116
-- Delegate global state management to ChatContext
121117
function M.add_selection(selection)
122118
ChatContext.add_selection(selection)
123-
state.context.set_context_updated_at(vim.uv.now())
124119
end
125120

126121
function M.remove_selection(selection)
127122
ChatContext.remove_selection(selection)
128-
state.context.set_context_updated_at(vim.uv.now())
129123
end
130124

131125
function M.clear_selections()
@@ -200,12 +194,7 @@ function M.build_inline_selection_text(range)
200194
end
201195

202196
local filetype = vim.bo[buf].filetype or ''
203-
local text = string.format(
204-
'**`%s`**\n\n```%s\n%s\n```',
205-
file.path,
206-
filetype,
207-
current_selection.text
208-
)
197+
local text = string.format('**`%s`**\n\n```%s\n%s\n```', file.path, filetype, current_selection.text)
209198

210199
return text
211200
end
@@ -225,13 +214,11 @@ function M.add_file(file)
225214

226215
file = vim.fn.fnamemodify(file, ':p')
227216
ChatContext.add_file(file)
228-
state.context.set_context_updated_at(vim.uv.now())
229217
end
230218

231219
function M.remove_file(file)
232220
file = vim.fn.fnamemodify(file, ':p')
233221
ChatContext.remove_file(file)
234-
state.context.set_context_updated_at(vim.uv.now())
235222
end
236223

237224
function M.clear_files()
@@ -240,12 +227,10 @@ end
240227

241228
function M.add_subagent(subagent)
242229
ChatContext.add_subagent(subagent)
243-
state.context.set_context_updated_at(vim.uv.now())
244230
end
245231

246232
function M.remove_subagent(subagent)
247233
ChatContext.remove_subagent(subagent)
248-
state.context.set_context_updated_at(vim.uv.now())
249234
end
250235

251236
function M.clear_subagents()
@@ -258,7 +243,6 @@ end
258243

259244
function M.load()
260245
ChatContext.load()
261-
state.context.set_context_updated_at(vim.uv.now())
262246
end
263247

264248
-- Context creation with delta logic (delegates to ChatContext)

lua/opencode/core.lua

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,10 @@ end)
3737
M.switch_session = Promise.async(function(session_id)
3838
local selected_session = session.get_by_id(session_id):await()
3939

40-
state.model.clear_model()
41-
state.model.clear_mode()
40+
state.model.clear()
4241
M.ensure_current_mode():await()
4342

4443
state.session.set_active(selected_session)
45-
state.session.reset_restore_points()
4644
if state.ui.is_visible() then
4745
ui.focus_input()
4846
else
@@ -94,8 +92,7 @@ M.open = Promise.async(function(opts)
9492

9593
if are_windows_closed then
9694
if not ui.is_opencode_focused() then
97-
state.ui.set_last_code_window(vim.api.nvim_get_current_win())
98-
state.ui.set_current_code_buf(vim.api.nvim_get_current_buf())
95+
state.ui.set_code_context(vim.api.nvim_get_current_win(), vim.api.nvim_get_current_buf())
9996
end
10097

10198
M.is_prompting_allowed()

lua/opencode/image_handler.lua

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ function M.paste_image_from_clipboard()
150150

151151
if success then
152152
context.add_file(image_path)
153-
state.context.set_context_updated_at(os.time())
154153
vim.notify('Image saved and added to context: ' .. vim.fn.fnamemodify(image_path, ':t'), vim.log.levels.INFO)
155154
return true
156155
end

lua/opencode/server_job.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ function M.spawn_local_server(promise, port, hostname)
293293
log.notify(string.format('Started local server at %s', base_url), vim.log.levels.INFO)
294294
if url_port then
295295
local port_num = tonumber(url_port)
296-
state.opencode_server.port = port_num
296+
state.jobs.set_server_port(port_num)
297297
local server_pid = job and job.pid
298298
port_mapping.register(port_num, vim.fn.getcwd(), true, 'serve', nil, server_pid)
299299
log.debug(

lua/opencode/state.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
return require('opencode.state.init') --[[@as OpencodeStateModule]]
1+
return require('opencode.state.init') --[[@as OpencodeState]]

lua/opencode/state/context.lua

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
21
local store = require('opencode.state.store')
32

43
---@class OpencodeContextStateMutations
5-
---@field set_current_context_config fun(config: OpencodeContextConfig|nil)
6-
---@field set_context_updated_at fun(timestamp: number|nil)
7-
---@field set_current_cwd fun(cwd: string|nil)
8-
94
local M = {}
105

116
---@param config OpencodeContextConfig|nil
127
function M.set_current_context_config(config)
138
return store.set('current_context_config', config)
149
end
1510

11+
function M.update_current_context_config(mutator)
12+
return store.mutate('current_context_config', mutator)
13+
end
14+
1615
---@param timestamp number|nil
1716
function M.set_context_updated_at(timestamp)
1817
return store.set('context_updated_at', timestamp)

lua/opencode/state/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ local context = require('opencode.state.context')
1616
---@field context OpencodeContextStateMutations
1717

1818
---@alias OpencodeState OpencodeStateModule & OpencodeStateData
19+
1920
---@type OpencodeState
2021
local M = {
2122
store = store,

lua/opencode/state/jobs.lua

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
11
local store = require('opencode.state.store')
22

33
---@class OpencodeJobStateMutations
4-
---@field increment_count fun(delta?: integer)
5-
---@field decrement_count fun(delta?: integer)
6-
---@field set_count fun(count: integer)
7-
---@field set_server fun(server: OpencodeServer|nil)
8-
---@field clear_server fun()
9-
---@field set_api_client fun(client: OpencodeApiClient|nil)
10-
---@field set_event_manager fun(manager: EventManager|nil)
11-
---@field set_opencode_cli_version fun(version: string|nil)
12-
---@field is_running fun():boolean
13-
144
local M = {}
155

166
---@param delta integer|nil
@@ -41,6 +31,18 @@ function M.clear_server()
4131
return store.set('opencode_server', nil)
4232
end
4333

34+
---@param port integer
35+
function M.set_server_port(port)
36+
local server = store.get('opencode_server')
37+
if not server then
38+
error('Opencode server is not set; cannot set port')
39+
end
40+
41+
store.mutate('opencode_server', function(s)
42+
s.port = port
43+
end)
44+
end
45+
4446
---@param client OpencodeApiClient|nil
4547
function M.set_api_client(client)
4648
return store.set('api_client', client)

lua/opencode/state/model.lua

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
local store = require('opencode.state.store')
22

3+
---@class OpencodeModelStateMutations
34
local M = {}
45

56
---@param mode string|nil
@@ -20,6 +21,14 @@ function M.clear_model()
2021
return store.set('current_model', nil)
2122
end
2223

24+
function M.clear()
25+
return store.batch(function()
26+
store.set('current_model', nil)
27+
store.set('current_mode', nil)
28+
store.set('current_variant', nil)
29+
end)
30+
end
31+
2332
---@param info table|nil
2433
function M.set_model_info(info)
2534
return store.set('current_model_info', info)
@@ -42,10 +51,11 @@ end
4251
---@param mode string
4352
---@param model string
4453
function M.set_mode_model_override(mode, model)
45-
local state = store.state()
46-
local mode_map = vim.deepcopy(state.user_mode_model_map)
47-
mode_map[mode] = model
48-
return store.set('user_mode_model_map', mode_map)
54+
return store.update('user_mode_model_map', function(current)
55+
local updated = vim.deepcopy(current)
56+
updated[mode] = model
57+
return updated
58+
end)
4959
end
5060

5161
return M

lua/opencode/state/renderer.lua

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
1-
21
local store = require('opencode.state.store')
32

43
---@class OpencodeRendererStateMutations
5-
---@field set_messages fun(messages: OpencodeMessage[]|nil)
6-
---@field set_current_message fun(message: OpencodeMessage|nil)
7-
---@field set_last_user_message fun(message: OpencodeMessage|nil)
8-
---@field set_pending_permissions fun(permissions: OpencodePermission[])
9-
---@field set_cost fun(cost: number)
10-
---@field set_tokens_count fun(count: number)
11-
124
local M = {}
135

146
---@param messages OpencodeMessage[]|nil
@@ -31,6 +23,10 @@ function M.set_pending_permissions(permissions)
3123
return store.set('pending_permissions', permissions)
3224
end
3325

26+
---@param mutator fun(current_permissions: OpencodePermission[]): nil
27+
function M.update_pending_permissions(mutator)
28+
return store.mutate('pending_permissions', mutator)
29+
end
3430
---@param cost number
3531
function M.set_cost(cost)
3632
return store.set('cost', cost)
@@ -41,4 +37,24 @@ function M.set_tokens_count(count)
4137
return store.set('tokens_count', count)
4238
end
4339

40+
---@param tokens_count number
41+
---@param cost number
42+
function M.set_stats(tokens_count, cost)
43+
return store.batch(function()
44+
store.set('tokens_count', tokens_count)
45+
store.set('cost', cost)
46+
end)
47+
end
48+
49+
function M.reset()
50+
return store.batch(function()
51+
store.set('messages', {})
52+
store.set('current_message', nil)
53+
store.set('last_user_message', nil)
54+
store.set('tokens_count', 0)
55+
store.set('cost', 0)
56+
store.set('pending_permissions', {})
57+
end)
58+
end
59+
4460
return M

0 commit comments

Comments
 (0)