summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRohan Godha <[email protected]>2025-12-18 19:17:34 -0500
committerGitHub <[email protected]>2025-12-18 18:17:34 -0600
commit5f0329053451aa1120ac005abe98e3176b8ebfdc (patch)
tree56e507ce1d2e2116853e57affa48c592979a6a97
parent427157c683853604f96f09586c5aa92668cc0ee1 (diff)
downloadopencode-5f0329053451aa1120ac005abe98e3176b8ebfdc.tar.gz
opencode-5f0329053451aa1120ac005abe98e3176b8ebfdc.zip
feat(tui): click on subagents to open them (#5761)
Co-authored-by: Aiden Cline <[email protected]>
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/dialog-subagent.tsx26
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx27
2 files changed, 50 insertions, 3 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-subagent.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-subagent.tsx
new file mode 100644
index 000000000..a9446b20d
--- /dev/null
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-subagent.tsx
@@ -0,0 +1,26 @@
+import { DialogSelect } from "@tui/ui/dialog-select"
+import { useRoute } from "@tui/context/route"
+
+export function DialogSubagent(props: { sessionID: string }) {
+ const route = useRoute()
+
+ return (
+ <DialogSelect
+ title="Subagent Actions"
+ options={[
+ {
+ title: "Open",
+ value: "subagent.view",
+ description: "open the subagent's session",
+ onSelect: (dialog) => {
+ route.navigate({
+ type: "session",
+ sessionID: props.sessionID,
+ })
+ dialog.clear()
+ },
+ },
+ ]}
+ />
+ )
+}
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 2d6f60cc0..2e72f482d 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -66,6 +66,7 @@ import stripAnsi from "strip-ansi"
import { Footer } from "./footer.tsx"
import { usePromptRef } from "../../context/prompt"
import { Filesystem } from "@/util/filesystem"
+import { DialogSubagent } from "./dialog-subagent.tsx"
addDefaultParsers(parsers.parsers)
@@ -1528,13 +1529,33 @@ ToolRegistry.register<typeof ListTool>({
ToolRegistry.register<typeof TaskTool>({
name: "task",
- container: "block",
+ container: "inline",
render(props) {
const { theme } = useTheme()
const keybind = useKeybind()
+ const dialog = useDialog()
+ const renderer = useRenderer()
+ const [hover, setHover] = createSignal(false)
return (
- <>
+ <box
+ border={["left"]}
+ customBorderChars={SplitBorder.customBorderChars}
+ borderColor={theme.background}
+ paddingTop={1}
+ paddingBottom={1}
+ paddingLeft={2}
+ marginTop={1}
+ gap={1}
+ backgroundColor={hover() ? theme.backgroundElement : theme.backgroundPanel}
+ onMouseOver={() => setHover(true)}
+ onMouseOut={() => setHover(false)}
+ onMouseUp={() => {
+ const id = props.metadata.sessionId
+ if (renderer.getSelection()?.getSelectedText() || !id) return
+ dialog.replace(() => <DialogSubagent sessionID={id} />)
+ }}
+ >
<ToolTitle icon="◉" fallback="Delegating..." when={props.input.subagent_type ?? props.input.description}>
{Locale.titlecase(props.input.subagent_type ?? "unknown")} Task "{props.input.description}"
</ToolTitle>
@@ -1557,7 +1578,7 @@ ToolRegistry.register<typeof TaskTool>({
{keybind.print("session_child_cycle")}, {keybind.print("session_child_cycle_reverse")}
<span style={{ fg: theme.textMuted }}> to navigate between subagent sessions</span>
</text>
- </>
+ </box>
)
},
})