|
|
@@ -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)
|
|
|
@@ -515,6 +517,19 @@ export function Session() {
|
|
|
dialog.clear()
|
|
|
},
|
|
|
},
|
|
|
+ {
|
|
|
+ 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",
|
|
|
@@ -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()}>
|