summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-11-24 19:56:12 -0600
committerAdam <[email protected]>2025-11-24 19:56:12 -0600
commit001b4be0ae19e394c584e9f2e3d0e878ae149b3c (patch)
tree784bfb89d88073ea0020c12b266392364e21126a
parent427c62d0528ec213ce7295a9b921320db9dbfe25 (diff)
downloadopencode-001b4be0ae19e394c584e9f2e3d0e878ae149b3c.tar.gz
opencode-001b4be0ae19e394c584e9f2e3d0e878ae149b3c.zip
fix(desktop): message summaries
-rw-r--r--packages/ui/src/components/session-turn.tsx31
1 files changed, 24 insertions, 7 deletions
diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx
index f92089d00..6e5e74fad 100644
--- a/packages/ui/src/components/session-turn.tsx
+++ b/packages/ui/src/components/session-turn.tsx
@@ -57,22 +57,26 @@ export function SessionTurn(
{(msg) => {
const titleSeen = createMemo(() => true)
const contentSeen = createMemo(() => true)
-
+ const [detailsExpanded, setDetailsExpanded] = createSignal(false)
const [titled, setTitled] = createSignal(titleSeen())
+
const assistantMessages = createMemo(() => {
return messages()?.filter((m) => m.role === "assistant" && m.parentID == msg().id) as AssistantMessage[]
})
+ const assistantMessageParts = createMemo(() => assistantMessages()?.flatMap((m) => data.part[m.id]))
const error = createMemo(() => assistantMessages().find((m) => m?.error)?.error)
- const [detailsExpanded, setDetailsExpanded] = createSignal(false)
const parts = createMemo(() => data.part[msg().id])
- const hasToolPart = createMemo(() =>
- assistantMessages()
- ?.flatMap((m) => data.part[m.id])
- .some((p) => p?.type === "tool"),
+ const lastTextPart = createMemo(() =>
+ assistantMessageParts()
+ .filter((p) => p.type === "text")
+ ?.at(-1),
)
+ const hasToolPart = createMemo(() => assistantMessageParts().some((p) => p?.type === "tool"))
const messageWorking = createMemo(() => msg().id === lastUserMessage()?.id && working())
const initialCompleted = !(msg().id === lastUserMessage()?.id && working())
const [completed, setCompleted] = createSignal(initialCompleted)
+ const summary = createMemo(() => msg().summary?.body ?? lastTextPart()?.text)
+ const lastTextPartShown = createMemo(() => !msg().summary?.body && (lastTextPart()?.text?.length ?? 0) > 0)
// allowing time for the animations to finish
createEffect(() => {
@@ -111,7 +115,7 @@ export function SessionTurn(
<Match when={true}>Response</Match>
</Switch>
</h2>
- <Show when={msg().summary?.body}>
+ <Show when={summary()}>
{(summary) => (
<Markdown
data-slot="session-turn-markdown"
@@ -195,6 +199,19 @@ export function SessionTurn(
<For each={assistantMessages()}>
{(assistantMessage) => {
const parts = createMemo(() => data.part[assistantMessage.id])
+ const last = createMemo(() =>
+ parts()
+ .filter((p) => p.type === "text")
+ .at(-1),
+ )
+ if (lastTextPartShown() && lastTextPart()?.id === last()?.id) {
+ return (
+ <Message
+ message={assistantMessage}
+ parts={parts().filter((p) => p.id !== last()?.id)}
+ />
+ )
+ }
return <Message message={assistantMessage} parts={parts()} />
}}
</For>