Skip to content

Commit ed89809

Browse files
committed
refactor(state): simplify store API and session/jobs mutations
1 parent dac4648 commit ed89809

6 files changed

Lines changed: 40 additions & 81 deletions

File tree

lua/opencode/core.lua

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ M.open = Promise.async(function(opts)
130130
local ok, err = pcall(function()
131131
if opts.new_session then
132132
state.session.clear_active()
133-
state.session.set_last_sent_context(nil)
134133
context.unload_attachments()
135134

136135
M.ensure_current_mode():await()
@@ -581,7 +580,6 @@ M.handle_directory_change = Promise.async(function()
581580
vim.notify('Loading last session for new working dir [' .. cwd .. ']', vim.log.levels.INFO)
582581

583582
state.session.clear_active()
584-
state.session.set_last_sent_context(nil)
585583
context.unload_attachments()
586584

587585
state.session.set_active(session.get_last_workspace_session():await() or M.create_new_session():await())

lua/opencode/state/init.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ local renderer = require('opencode.state.renderer')
77
local context = require('opencode.state.context')
88

99
---@class OpencodeStateModule
10-
---@field store OpencodeStateStore<OpencodeStateData>
10+
---@field store OpencodeStateStore
1111
---@field session OpencodeSessionStateMutations
1212
---@field jobs OpencodeJobStateMutations
1313
---@field ui OpencodeUiStateMutations

lua/opencode/state/jobs.lua

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,43 @@
11
local store = require('opencode.state.store')
22

33
---@class OpencodeJobStateMutations
4-
---@field increment_count fun(delta?: integer, opts?: OpencodeProtectedStateSetOptions)
5-
---@field decrement_count fun(delta?: integer, opts?: OpencodeProtectedStateSetOptions)
6-
---@field set_count fun(count: integer, opts?: OpencodeProtectedStateSetOptions)
7-
---@field set_server fun(server: OpencodeServer|nil, opts?: OpencodeProtectedStateSetOptions)
8-
---@field clear_server fun(opts?: OpencodeProtectedStateSetOptions)
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()
99
---@field set_api_client fun(client: OpencodeApiClient|nil)
1010
---@field set_event_manager fun(manager: EventManager|nil)
1111
---@field set_opencode_cli_version fun(version: string|nil)
1212

1313
local M = {}
1414

1515
---@param delta integer|nil
16-
---@param opts? OpencodeProtectedStateSetOptions
17-
function M.increment_count(delta, opts)
16+
function M.increment_count(delta)
1817
return store.update('job_count', function(current)
1918
return (current or 0) + (delta or 1)
20-
end, opts)
19+
end)
2120
end
2221

2322
---@param delta integer|nil
24-
---@param opts? OpencodeProtectedStateSetOptions
25-
function M.decrement_count(delta, opts)
23+
function M.decrement_count(delta)
2624
return store.update('job_count', function(current)
2725
return math.max(0, (current or 0) - (delta or 1))
28-
end, opts)
26+
end)
2927
end
3028

3129
---@param count integer
32-
---@param opts? OpencodeProtectedStateSetOptions
33-
function M.set_count(count, opts)
34-
return store.set('job_count', count, opts)
30+
function M.set_count(count)
31+
return store.set('job_count', count)
3532
end
3633

3734
---@param server OpencodeServer|nil
38-
---@param opts? OpencodeProtectedStateSetOptions
39-
function M.set_server(server, opts)
40-
return store.set('opencode_server', server, opts)
35+
function M.set_server(server)
36+
return store.set('opencode_server', server)
4137
end
4238

43-
---@param opts? OpencodeProtectedStateSetOptions
44-
function M.clear_server(opts)
45-
return store.set('opencode_server', nil, opts)
39+
function M.clear_server()
40+
return store.set('opencode_server', nil)
4641
end
4742

4843
---@param client OpencodeApiClient|nil

lua/opencode/state/session.lua

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

33
---@class OpencodeSessionStateMutations
4-
---@field set_active fun(session: Session|nil, opts?: OpencodeProtectedStateSetOptions)
5-
---@field clear_active fun(opts?: OpencodeProtectedStateSetOptions)
6-
---@field set_restore_points fun(points: RestorePoint[], opts?: OpencodeProtectedStateSetOptions)
7-
---@field reset_restore_points fun(opts?: OpencodeProtectedStateSetOptions)
4+
---@field set_active fun(session: Session|nil)
5+
---@field clear_active fun()
6+
---@field set_restore_points fun(points: RestorePoint[])
7+
---@field reset_restore_points fun()
88
---@field set_last_sent_context fun(context: OpencodeContext|nil)
99
---@field set_user_message_count fun(count: table<string, number>)
1010

1111
local M = {}
1212

1313
---@param session Session|nil
14-
---@param opts? OpencodeProtectedStateSetOptions
15-
function M.set_active(session, opts)
16-
return store.set('active_session', session, opts)
14+
function M.set_active(session)
15+
M.clear_active()
16+
return store.set('active_session', session)
1717
end
1818

19-
---@param opts? OpencodeProtectedStateSetOptions
20-
function M.clear_active(opts)
21-
return store.set('active_session', nil, opts)
19+
function M.clear_active()
20+
M.reset_restore_points()
21+
M.set_last_sent_context()
22+
M.set_user_message_count({})
23+
return store.set('active_session', nil)
2224
end
2325

2426
---@param points RestorePoint[]
25-
---@param opts? OpencodeProtectedStateSetOptions
26-
function M.set_restore_points(points, opts)
27-
return store.set('restore_points', points, opts)
27+
function M.set_restore_points(points)
28+
return store.set('restore_points', points)
2829
end
2930

30-
---@param opts? OpencodeProtectedStateSetOptions
31-
function M.reset_restore_points(opts)
32-
return store.set('restore_points', {}, opts)
31+
function M.reset_restore_points()
32+
return store.set('restore_points', {})
3333
end
3434

3535
---@param context OpencodeContext|nil

lua/opencode/state/store.lua

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
---@class OpencodeProtectedStateSetOptions
2-
---@field source? 'helper'|'raw'
3-
---@field silent? boolean
4-
1+
---@class OpencodeStateStore
52
local M = {}
63

74
---@class OpencodeStateData
@@ -91,16 +88,6 @@ local _state = {
9188

9289
local _listeners = {}
9390

94-
---@param key keyof OpencodeStateData
95-
---@param opts? OpencodeProtectedStateSetOptions
96-
local function error_on_raw_write(key, opts)
97-
if opts and opts.silent then
98-
return
99-
end
100-
101-
error(string.format('Direct write to state key `%s` is not allowed; use a state domain setter', key), 3)
102-
end
103-
10491
function M.state()
10592
return _state
10693
end
@@ -115,15 +102,9 @@ end
115102
---@generic K extends keyof OpencodeStateData
116103
---@param key K
117104
---@param value std.RawGet<OpencodeStateData, K>
118-
---@param opts? OpencodeProtectedStateSetOptions
119105
---@return std.RawGet<OpencodeStateData, K>
120-
function M.set(key, value, opts)
106+
function M.set(key, value)
121107
local old = _state[key]
122-
opts = opts or { source = 'helper' }
123-
124-
if opts.source == 'raw' then
125-
error_on_raw_write(key, opts)
126-
end
127108

128109
_state[key] = value
129110
if not vim.deep_equal(old, value) then
@@ -136,21 +117,18 @@ end
136117
---@generic K extends keyof OpencodeStateData
137118
---@param key K
138119
---@param value std.RawGet<OpencodeStateData, K>
139-
---@param opts? OpencodeProtectedStateSetOptions
140120
---@return std.RawGet<OpencodeStateData, K>
141-
function M.set_raw(key, value, opts)
142-
local next_opts = vim.tbl_extend('force', { source = 'raw' }, opts or {})
143-
return M.set(key, value, next_opts)
121+
function M.set_raw(key, value)
122+
return M.set(key, value)
144123
end
145124

146125
---@generic K extends keyof OpencodeStateData
147126
---@param key K
148127
---@param updater fun(current: std.RawGet<OpencodeStateData, K>): std.RawGet<OpencodeStateData, K>
149-
---@param opts? OpencodeProtectedStateSetOptions
150128
---@return std.RawGet<OpencodeStateData, K>
151-
function M.update(key, updater, opts)
129+
function M.update(key, updater)
152130
local next_value = updater(_state[key])
153-
M.set(key, next_value, opts)
131+
M.set(key, next_value)
154132
return next_value
155133
end
156134

lua/opencode/ui/renderer.lua

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -914,21 +914,9 @@ function M.on_session_updated(properties)
914914
local revert_changed = not vim.deep_equal(current_session.revert, updated_session.revert)
915915
local previous_title = current_session.title
916916

917-
-- NOTE: we mutate the existing session object rather than replacing it because it will cause the whole panel to re-render
918917
if not vim.deep_equal(current_session, updated_session) then
919-
for key in pairs(current_session) do
920-
if updated_session[key] == nil then
921-
current_session[key] = nil
922-
end
923-
end
924-
925-
for key, value in pairs(updated_session) do
926-
current_session[key] = value
927-
end
928-
929-
if updated_session.title and updated_session.title ~= previous_title then
930-
require('opencode.ui.topbar').render()
931-
end
918+
-- NOTE: we set the session without emitting a change event because we don't want to trigger another rerender.
919+
state.store.set_raw('active_session', updated_session)
932920
end
933921

934922
if revert_changed then

0 commit comments

Comments
 (0)