summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSebastian Herrlinger <[email protected]>2025-12-19 13:51:26 +0100
committerSebastian Herrlinger <[email protected]>2025-12-19 13:51:26 +0100
commitebfb98521590f75b843029e32a0506d38f5f08f9 (patch)
tree594c0a2cdf9126475ea7f40d7d3d47343716b037
parent2646da50df5e5a4d32d3412dbf5ca699a14090a3 (diff)
downloadopencode-ebfb98521590f75b843029e32a0506d38f5f08f9.tar.gz
opencode-ebfb98521590f75b843029e32a0506d38f5f08f9.zip
user messages as markdown with toggle
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx35
1 files changed, 33 insertions, 2 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 2e72f482d..288504a72 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -87,6 +87,7 @@ const context = createContext<{
showTimestamps: () => boolean
usernameVisible: () => boolean
showDetails: () => boolean
+ userMessageMarkdown: () => boolean
diffWrapMode: () => "word" | "none"
sync: ReturnType<typeof useSync>
}>()
@@ -124,6 +125,7 @@ export function Session() {
const [usernameVisible, setUsernameVisible] = createSignal(kv.get("username_visible", true))
const [showDetails, setShowDetails] = createSignal(kv.get("tool_details_visibility", true))
const [showScrollbar, setShowScrollbar] = createSignal(kv.get("scrollbar_visible", false))
+ const [userMessageMarkdown, setUserMessageMarkdown] = createSignal(kv.get("user_message_markdown", true))
const [diffWrapMode, setDiffWrapMode] = createSignal<"word" | "none">("word")
const wide = createMemo(() => dimensions().width > 120)
@@ -516,6 +518,19 @@ export function Session() {
},
},
{
+ title: userMessageMarkdown() ? "Disable user message markdown" : "Enable user message markdown",
+ value: "session.toggle.user_message_markdown",
+ category: "Session",
+ onSelect: (dialog) => {
+ setUserMessageMarkdown((prev) => {
+ const next = !prev
+ kv.set("user_message_markdown", next)
+ return next
+ })
+ dialog.clear()
+ },
+ },
+ {
title: "Page up",
value: "session.page.up",
keybind: "messages_page_up",
@@ -852,6 +867,7 @@ export function Session() {
showTimestamps,
usernameVisible,
showDetails,
+ userMessageMarkdown,
diffWrapMode,
sync,
}}
@@ -1025,7 +1041,7 @@ function UserMessage(props: {
const text = createMemo(() => props.parts.flatMap((x) => (x.type === "text" && !x.synthetic ? [x] : []))[0])
const files = createMemo(() => props.parts.flatMap((x) => (x.type === "file" ? [x] : [])))
const sync = useSync()
- const { theme } = useTheme()
+ const { theme, syntax } = useTheme()
const [hover, setHover] = createSignal(false)
const queued = createMemo(() => props.pending && props.message.id > props.pending)
const color = createMemo(() => (queued() ? theme.accent : local.agent.color(props.message.agent)))
@@ -1056,7 +1072,22 @@ function UserMessage(props: {
backgroundColor={hover() ? theme.backgroundElement : theme.backgroundPanel}
flexShrink={0}
>
- <text fg={theme.text}>{text()?.text}</text>
+ <Switch>
+ <Match when={ctx.userMessageMarkdown()}>
+ <code
+ filetype="markdown"
+ drawUnstyledText={false}
+ streaming={false}
+ syntaxStyle={syntax()}
+ content={text()?.text ?? ""}
+ conceal={ctx.conceal()}
+ fg={theme.text}
+ />
+ </Match>
+ <Match when={!ctx.userMessageMarkdown()}>
+ <text fg={theme.text}>{text()?.text}</text>
+ </Match>
+ </Switch>
<Show when={files().length}>
<box flexDirection="row" paddingBottom={1} paddingTop={1} gap={1} flexWrap="wrap">
<For each={files()}>