From 4fa16f589117e2f94014aedb2062bae60e7f8b08 Mon Sep 17 00:00:00 2001 From: Daniel Polito Date: Thu, 20 Nov 2025 21:12:43 -0300 Subject: [PATCH 1/9] List Subagent Sessions --- packages/opencode/src/cli/cmd/tui/app.tsx | 10 ++++ .../component/dialog-child-session-list.tsx | 57 +++++++++++++++++++ .../cmd/tui/component/prompt/autocomplete.tsx | 5 ++ .../src/cli/cmd/tui/routes/session/index.tsx | 4 +- packages/opencode/src/config/config.ts | 1 + packages/sdk/js/src/gen/types.gen.ts | 4 ++ 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 4f990e76e9f..2693531a977 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -16,6 +16,7 @@ import { DialogHelp } from "./ui/dialog-help" import { CommandProvider, useCommandDialog } from "@tui/component/dialog-command" import { DialogAgent } from "@tui/component/dialog-agent" import { DialogSessionList } from "@tui/component/dialog-session-list" +import { DialogChildSessionList } from "@tui/component/dialog-child-session-list" import { KeybindProvider } from "@tui/context/keybind" import { ThemeProvider, useTheme } from "@tui/context/theme" import { Home } from "@tui/routes/home" @@ -220,6 +221,15 @@ function App() { dialog.clear() }, }, + { + title: "List child sessions", + value: "session.child.list", + keybind: "session_child_list", + category: "Session", + onSelect: () => { + dialog.replace(() => ) + }, + }, { title: "Switch model", value: "model.list", diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx new file mode 100644 index 00000000000..7830b1a4ed0 --- /dev/null +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx @@ -0,0 +1,57 @@ +import { useDialog } from "@tui/ui/dialog" +import { DialogSelect } from "@tui/ui/dialog-select" +import { useRoute } from "@tui/context/route" +import { useSync } from "@tui/context/sync" +import { createMemo, onMount } from "solid-js" +import { Locale } from "@/util/locale" + +export function DialogChildSessionList() { + const dialog = useDialog() + const sync = useSync() + const route = useRoute() + + const currentSessionID = createMemo(() => (route.data.type === "session" ? route.data.sessionID : undefined)) + const currentSession = createMemo(() => sync.session.get(currentSessionID()!)) + + const options = createMemo(() => { + const current = currentSession() + if (!current) return [] + + const parentID = current.parentID ?? current.id + + const allSessions = sync.data.session + .filter((x) => x.id === parentID || x.parentID === parentID) + .toSorted((b, a) => a.id.localeCompare(b.id)) + + return allSessions.map((x) => { + const isParent = x.id === parentID + const label = isParent ? "Parent" : "Child" + + return { + title: `${x.title}`, + value: x.id, + category: label, + footer: Locale.time(x.time.updated), + } + }) + }) + + onMount(() => { + dialog.setSize("large") + }) + + return ( + { + route.navigate({ + type: "session", + sessionID: option.value, + }) + dialog.clear() + }} + /> + ) +} diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx index 3029eafcce3..250f2f85474 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx @@ -276,6 +276,11 @@ export function Autocomplete(props: { description: "list sessions", onSelect: () => command.trigger("session.list"), }, + { + display: "/subagent-sessions", + description: "list subagent sessions", + onSelect: () => command.trigger("session.child.list"), + }, { display: "/status", aliases: ["/mcp"], diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 2bffa360fa1..2fb56cf44d4 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -1425,7 +1425,9 @@ ToolRegistry.register({ {keybind.print("session_child_cycle")}, {keybind.print("session_child_cycle_reverse")} - to navigate between subagent sessions + to navigate + {keybind.print("session_child_list")} + to list subagent sessions ) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index f5b402e3601..eed22452a7e 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -430,6 +430,7 @@ export namespace Config { history_next: z.string().optional().default("down").describe("Next history item"), session_child_cycle: z.string().optional().default("right").describe("Next child session"), session_child_cycle_reverse: z.string().optional().default("left").describe("Previous child session"), + session_child_list: z.string().optional().default("j").describe("List subagent sessions"), }) .strict() .meta({ diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index 52cde5e5827..61f2db52c6a 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -845,6 +845,10 @@ export type KeybindsConfig = { * Previous child session */ session_child_cycle_reverse?: string + /** + * List child sessions + */ + session_child_list?: string } export type AgentConfig = { From d000f030a2f09b8efda3781f804fecf8df572d67 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 21 Nov 2025 00:13:33 +0000 Subject: [PATCH 2/9] chore: format code --- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 4b954456d4e..f3eef128c4d 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -24,4 +24,4 @@ "typescript": "catalog:", "@typescript/native-preview": "catalog:" } -} \ No newline at end of file +} diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 3e58881dbed..2930cd6b9cb 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -26,4 +26,4 @@ "publishConfig": { "directory": "dist" } -} \ No newline at end of file +} From 727c39de8f5a77f66248c5786a4591d9f6cf5b60 Mon Sep 17 00:00:00 2001 From: Daniel Polito Date: Thu, 20 Nov 2025 21:17:48 -0300 Subject: [PATCH 3/9] Tweak --- packages/opencode/src/cli/cmd/tui/app.tsx | 2 +- .../src/cli/cmd/tui/component/dialog-child-session-list.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 2693531a977..345bf6f11c8 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -222,7 +222,7 @@ function App() { }, }, { - title: "List child sessions", + title: "List subagent sessions", value: "session.child.list", keybind: "session_child_list", category: "Session", diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx index 7830b1a4ed0..ba9e98821d1 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx @@ -42,7 +42,7 @@ export function DialogChildSessionList() { return ( { From e594aae0b1025bc5bd27eb79849d3a966447aed1 Mon Sep 17 00:00:00 2001 From: Daniel Polito Date: Thu, 20 Nov 2025 21:20:13 -0300 Subject: [PATCH 4/9] Tweak --- .../src/cli/cmd/tui/component/dialog-child-session-list.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx index ba9e98821d1..2070cbfc364 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-child-session-list.tsx @@ -25,7 +25,7 @@ export function DialogChildSessionList() { return allSessions.map((x) => { const isParent = x.id === parentID - const label = isParent ? "Parent" : "Child" + const label = isParent ? "Main" : "Subagent" return { title: `${x.title}`, From a0d51a0adb290c68b9fa1f26af37385be19d40bf Mon Sep 17 00:00:00 2001 From: Daniel Polito Date: Thu, 20 Nov 2025 22:08:31 -0300 Subject: [PATCH 5/9] Tweak --- packages/sdk/js/src/gen/types.gen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index 61f2db52c6a..21291d152d8 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -846,7 +846,7 @@ export type KeybindsConfig = { */ session_child_cycle_reverse?: string /** - * List child sessions + * List subagent sessions */ session_child_list?: string } From 5db8353c35b1e339fe335255c309206823991da3 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 24 Nov 2025 13:53:04 +0000 Subject: [PATCH 6/9] chore: format code --- packages/sdk/js/src/gen/types.gen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/js/src/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index cda94b1faab..948f14505fb 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -857,7 +857,7 @@ export type KeybindsConfig = { /** * List subagent sessions */ - session_child_list?: string, + session_child_list?: string /** * Suspend terminal */ From e6753627a8e22fe2a2291bf74b78e0ccf01d07ae Mon Sep 17 00:00:00 2001 From: dbpolito Date: Fri, 26 Dec 2025 13:16:55 -0300 Subject: [PATCH 7/9] Tweak --- packages/sdk/js/src/v2/gen/types.gen.ts | 4 ++++ packages/sdk/openapi.json | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 0a31394ed9c..29520c68fc0 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1133,6 +1133,10 @@ export type KeybindsConfig = { * Previous child session */ session_child_cycle_reverse?: string + /** + * List subagent sessions + */ + session_child_list?: string /** * Go to parent session */ diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 96ba0720c73..a7171dc19ed 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -7664,6 +7664,11 @@ "default": "left", "type": "string" }, + "session_child_list": { + "description": "List subagent sessions", + "default": "j", + "type": "string" + }, "session_parent": { "description": "Go to parent session", "default": "up", From 66e5cbfd6a523020ef0412076a3d8ad2481a26f6 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Fri, 26 Dec 2025 13:37:31 -0300 Subject: [PATCH 8/9] Remvoe Default keybind --- .../src/cli/cmd/tui/routes/session/index.tsx | 13 ++++++++++--- packages/opencode/src/config/config.ts | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 319714db07f..ab63d5f3b6d 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -1676,9 +1676,16 @@ ToolRegistry.register({ {keybind.print("session_child_cycle")}, {keybind.print("session_child_cycle_reverse")} - to navigate - {keybind.print("session_child_list")} - to list subagent sessions + to navigate subagent sessions + + {(key) => ( + <> + {" "} + {key()} + to list subagent sessions + + )} + ) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 958a4ba7577..4a70e8fc7ae 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -563,7 +563,7 @@ export namespace Config { history_next: z.string().optional().default("down").describe("Next history item"), session_child_cycle: z.string().optional().default("right").describe("Next child session"), session_child_cycle_reverse: z.string().optional().default("left").describe("Previous child session"), - session_child_list: z.string().optional().default("j").describe("List subagent sessions"), + session_child_list: z.string().optional().default("none").describe("List subagent sessions"), session_parent: z.string().optional().default("up").describe("Go to parent session"), terminal_suspend: z.string().optional().default("ctrl+z").describe("Suspend terminal"), terminal_title_toggle: z.string().optional().default("none").describe("Toggle terminal title"), From 9a856674d8ebfd5711aed1fcb095657f1e6394a5 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Fri, 26 Dec 2025 13:38:47 -0300 Subject: [PATCH 9/9] Tweak --- packages/sdk/openapi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index a7171dc19ed..8102b929465 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -7666,7 +7666,7 @@ }, "session_child_list": { "description": "List subagent sessions", - "default": "j", + "default": "none", "type": "string" }, "session_parent": {