diff --git a/lua/opencode/config.lua b/lua/opencode/config.lua index 0845ed9c..cc1b4b46 100644 --- a/lua/opencode/config.lua +++ b/lua/opencode/config.lua @@ -113,6 +113,7 @@ M.defaults = { rename_session = { '', desc = 'Rename selected session' }, delete_session = { '', desc = 'Delete selected sessions' }, new_session = { '', desc = 'Create a new session' }, + fork_session = { '', desc = 'Fork selected session' }, }, timeline_picker = { undo = { '', mode = { 'i', 'n' }, desc = 'Undo to selected message' }, diff --git a/lua/opencode/types.lua b/lua/opencode/types.lua index 9f4bfeb4..4748d8b3 100644 --- a/lua/opencode/types.lua +++ b/lua/opencode/types.lua @@ -169,6 +169,7 @@ ---@field delete_session OpencodeKeymapEntry ---@field new_session OpencodeKeymapEntry ---@field rename_session OpencodeKeymapEntry +---@field fork_session OpencodeKeymapEntry ---@class OpencodeTimelinePickerKeymap ---@field undo OpencodeKeymapEntry diff --git a/lua/opencode/ui/session_picker.lua b/lua/opencode/ui/session_picker.lua index 5503ce95..d6888759 100644 --- a/lua/opencode/ui/session_picker.lua +++ b/lua/opencode/ui/session_picker.lua @@ -336,6 +336,21 @@ function M.pick(sessions, callback, opts) end), reload = true, }, + fork = { + key = config.keymap.session_picker.fork_session, + label = 'fork', + fn = Promise.async(function(selected, opts) + local state = require('opencode.state') + local session_runtime = require('opencode.services.session_runtime') + local new_session = state.api_client:fork_session(selected.id):await() + if new_session then + session_runtime.switch_session(new_session.id):await() + table.insert(opts.items, 1, new_session) + return opts.items + end + end), + reload = true, + }, } -- Preview state for race condition protection