From 2caa6bd84c42816a2e19f2247bb58e71d34e7664 Mon Sep 17 00:00:00 2001 From: John Cummings Date: Fri, 19 Dec 2025 09:01:49 -0700 Subject: [PATCH] Add support for clickable links --- .../src/cli/cmd/tui/routes/session/index.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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..e18ad552f 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -66,9 +66,18 @@ import stripAnsi from "strip-ansi" import { Footer } from "./footer.tsx" import { usePromptRef } from "../../context/prompt" import { Filesystem } from "@/util/filesystem" +import open from "open" addDefaultParsers(parsers.parsers) +/** + * Handle alt+click or ctrl+click on links in markdown content + * Opens URLs in the default browser + */ +function handleLinkClick(url: string) { + open(url).catch(() => {}) +} + class CustomSpeedScroll implements ScrollAcceleration { constructor(private speed: number) {} @@ -1208,6 +1217,7 @@ function ReasoningPart(props: { last: boolean; part: ReasoningPart; message: Ass content={"_Thinking:_ " + content()} conceal={ctx.conceal()} fg={theme.textMuted} + onLinkClick={handleLinkClick} /> @@ -1228,6 +1238,7 @@ function TextPart(props: { last: boolean; part: TextPart; message: AssistantMess content={props.part.text.trim()} conceal={ctx.conceal()} fg={theme.text} + onLinkClick={handleLinkClick} /> @@ -1461,6 +1472,7 @@ ToolRegistry.register({ filetype={filetype(props.input.filePath!)} syntaxStyle={syntax()} content={code()} + onLinkClick={handleLinkClick} />