Skip to content

Commit 44097cd

Browse files
committed
feat(session_picker): <C-g> to toggle project/global session
1 parent a40b8af commit 44097cd

4 files changed

Lines changed: 37 additions & 9 deletions

File tree

lua/opencode/config.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ M.defaults = {
114114
delete_session = { '<C-d>', desc = 'Delete selected sessions' },
115115
new_session = { '<C-s>', desc = 'Create a new session' },
116116
fork_session = { '<C-f>', desc = 'Fork selected session' },
117+
toggle_scope = { '<C-g>', desc = 'Toggle between project/global scope' },
117118
},
118119
timeline_picker = {
119120
undo = { '<C-u>', mode = { 'i', 'n' }, desc = 'Undo to selected message' },

lua/opencode/services/session_runtime.lua

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,26 @@ function M.toggle_session_lock()
3434
return M.set_session_lock(not M.is_session_locked())
3535
end
3636

37+
---List sessions in the given scope. Always returns a non-nil array.
38+
---@param scope? 'project' | 'global' defaults to project-scoped
39+
---@return Session[]|GlobalSession[]
40+
function M.list_sessions_by_scope(scope)
41+
if scope == 'global' then
42+
return session.get_all_global_sessions():await() or {}
43+
end
44+
return session.get_all_workspace_sessions():await() or {}
45+
end
46+
47+
---Keep only pickable sessions: non-empty title and matching parent_id.
48+
---@param sessions Session[]|GlobalSession[]
49+
---@param parent_id? string nil selects mainline (no parent), otherwise children of parent_id
50+
---@return Session[]
51+
function M.filter_pickable_sessions(sessions, parent_id)
52+
return vim.tbl_filter(function(s)
53+
return s ~= nil and s.title ~= '' and s.parentID == parent_id
54+
end, sessions)
55+
end
56+
3757
local function focus_after_session_switch(selected_session)
3858
if not state.ui.is_visible() then
3959
M.open()
@@ -57,17 +77,10 @@ end
5777
---@param parent_id string?
5878
---@param scope? 'project' | 'global' when nil, defaults to project-scoped
5979
M.select_session = Promise.async(function(parent_id, scope)
60-
local all_sessions
61-
if scope == 'global' then
62-
all_sessions = session.get_all_global_sessions():await() or {}
63-
else
64-
all_sessions = session.get_all_workspace_sessions():await() or {}
65-
end
80+
local all_sessions = M.list_sessions_by_scope(scope)
6681
---@cast all_sessions Session[]
6782

68-
local filtered_sessions = vim.tbl_filter(function(s)
69-
return s.title ~= '' and s ~= nil and s.parentID == parent_id
70-
end, all_sessions)
83+
local filtered_sessions = M.filter_pickable_sessions(all_sessions, parent_id)
7184

7285
if #filtered_sessions == 0 then
7386
vim.notify(parent_id and 'No child sessions found' or 'No sessions found', vim.log.levels.INFO)

lua/opencode/types.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@
170170
---@field new_session OpencodeKeymapEntry
171171
---@field rename_session OpencodeKeymapEntry
172172
---@field fork_session OpencodeKeymapEntry
173+
---@field toggle_scope OpencodeKeymapEntry
173174

174175
---@class OpencodeTimelinePickerKeymap
175176
---@field undo OpencodeKeymapEntry

lua/opencode/ui/session_picker.lua

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,19 @@ function M.pick(sessions, callback, opts)
351351
end),
352352
reload = true,
353353
},
354+
toggle = {
355+
key = config.keymap.session_picker.toggle_scope,
356+
label = 'toggle scope',
357+
fn = Promise.async(function(_, _)
358+
local session_runtime = require('opencode.services.session_runtime')
359+
local new_scope = (opts.scope == 'global') and 'project' or 'global'
360+
local new_sessions = session_runtime.list_sessions_by_scope(new_scope)
361+
local filtered_sessions = session_runtime.filter_pickable_sessions(new_sessions, nil)
362+
opts.scope = new_scope
363+
return filtered_sessions
364+
end),
365+
reload = true,
366+
},
354367
}
355368

356369
-- Preview state for race condition protection

0 commit comments

Comments
 (0)