diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 4b177e292cf..2b0fda4d2bb 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -296,6 +296,18 @@ function App() { dialog.replace(() => ) }, }, + { + title: "Switch to last session", + value: "session.last", + keybind: "session_last", + category: "Session", + suggested: !!route.previous, + onSelect: () => { + if (!route.previous) return + route.navigate({ type: "session", sessionID: route.previous }) + dialog.clear() + }, + }, { title: "New session", suggested: route.data.type === "session", diff --git a/packages/opencode/src/cli/cmd/tui/context/route.tsx b/packages/opencode/src/cli/cmd/tui/context/route.tsx index 358461921b2..8b43accc2c0 100644 --- a/packages/opencode/src/cli/cmd/tui/context/route.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/route.tsx @@ -26,12 +26,18 @@ export const { use: useRoute, provider: RouteProvider } = createSimpleContext({ }, ) + let previous: string | undefined + return { get data() { return store }, + get previous() { + return previous + }, navigate(route: Route) { console.log("navigate", route) + if (store.type === "session") previous = store.sessionID setStore(route) }, } diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index ddb3af4b0a8..a752ce79dbc 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -640,6 +640,7 @@ export namespace Config { session_export: z.string().optional().default("x").describe("Export session to editor"), session_new: z.string().optional().default("n").describe("Create a new session"), session_list: z.string().optional().default("l").describe("List all sessions"), + session_last: z.string().optional().default("o").describe("Switch to last session"), session_timeline: z.string().optional().default("g").describe("Show session timeline"), session_fork: z.string().optional().default("none").describe("Fork session from message"), session_rename: z.string().optional().default("ctrl+r").describe("Rename session"), diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index b7e72fbad8f..e7433646bf1 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -970,6 +970,10 @@ export type KeybindsConfig = { * List all sessions */ session_list?: string + /** + * Switch to last session + */ + session_last?: string /** * Show session timeline */ diff --git a/packages/web/src/content/docs/keybinds.mdx b/packages/web/src/content/docs/keybinds.mdx index 51508a4f864..f2cdeb8031c 100644 --- a/packages/web/src/content/docs/keybinds.mdx +++ b/packages/web/src/content/docs/keybinds.mdx @@ -21,6 +21,7 @@ OpenCode has a list of keybinds that you can customize through the OpenCode conf "session_export": "x", "session_new": "n", "session_list": "l", + "session_last": "o", "session_timeline": "g", "session_fork": "none", "session_rename": "none",