@@ -6,7 +6,7 @@ import { Binary } from "@opencode-ai/util/binary"
66import { getDirectory , getFilename } from "@opencode-ai/util/path"
77import { createEffect , createMemo , createSignal , For , on , ParentProps , Show } from "solid-js"
88import { Dynamic } from "solid-js/web"
9- import { AssistantParts , Message , PART_MAPPING } from "./message-part"
9+ import { AssistantParts , Message , Part , PART_MAPPING } from "./message-part"
1010import { Card } from "./card"
1111import { Accordion } from "./accordion"
1212import { StickyAccordionHeader } from "./sticky-accordion-header"
@@ -139,7 +139,6 @@ export function SessionTurn(
139139 props : ParentProps < {
140140 sessionID : string
141141 messageID : string
142- lastUserMessageID ?: string
143142 showReasoningSummaries ?: boolean
144143 shellToolDefaultOpen ?: boolean
145144 editToolDefaultOpen ?: boolean
@@ -187,25 +186,27 @@ export function SessionTurn(
187186 return msg
188187 } )
189188
190- const lastUserMessageID = createMemo ( ( ) => {
191- if ( props . lastUserMessageID ) return props . lastUserMessageID
192-
189+ const pending = createMemo ( ( ) => {
193190 const messages = allMessages ( ) ?? emptyMessages
194- for ( let i = messages . length - 1 ; i >= 0 ; i -- ) {
195- const msg = messages [ i ]
196- if ( msg ?. role === "user" ) return msg . id
197- }
198- return undefined
191+ return messages . findLast (
192+ ( item ) : item is AssistantMessage => item . role === "assistant" && typeof item . time . completed !== "number" ,
193+ )
194+ } )
195+ const active = createMemo ( ( ) => {
196+ const msg = message ( )
197+ const item = pending ( )
198+ if ( ! msg || ! item ) return false
199+ return item . parentID === msg . id
199200 } )
200-
201- const isLastUserMessage = createMemo ( ( ) => props . messageID === lastUserMessageID ( ) )
202201
203202 const parts = createMemo ( ( ) => {
204203 const msg = message ( )
205204 if ( ! msg ) return emptyParts
206205 return list ( data . store . part ?. [ msg . id ] , emptyParts )
207206 } )
208207
208+ const compaction = createMemo ( ( ) => parts ( ) . find ( ( part ) => part . type === "compaction" ) )
209+
209210 const diffs = createMemo ( ( ) => {
210211 const files = message ( ) ?. summary ?. diffs
211212 if ( ! files ?. length ) return emptyDiffs
@@ -285,7 +286,7 @@ export function SessionTurn(
285286 } )
286287
287288 const status = createMemo ( ( ) => data . store . session_status [ props . sessionID ] ?? idle )
288- const working = createMemo ( ( ) => status ( ) . type !== "idle" && isLastUserMessage ( ) )
289+ const working = createMemo ( ( ) => status ( ) . type !== "idle" && active ( ) )
289290 const showReasoningSummaries = createMemo ( ( ) => props . showReasoningSummaries ?? true )
290291
291292 const assistantCopyPartID = createMemo ( ( ) => {
@@ -365,6 +366,13 @@ export function SessionTurn(
365366 < div data-slot = "session-turn-message-content" aria-live = "off" >
366367 < Message message = { msg ( ) } parts = { parts ( ) } interrupted = { interrupted ( ) } />
367368 </ div >
369+ < Show when = { compaction ( ) } >
370+ { ( part ) => (
371+ < div data-slot = "session-turn-compaction" >
372+ < Part part = { part ( ) } message = { msg ( ) } hideDetails />
373+ </ div >
374+ ) }
375+ </ Show >
368376 < Show when = { assistantMessages ( ) . length > 0 } >
369377 < div data-slot = "session-turn-assistant-content" aria-hidden = { working ( ) } >
370378 < AssistantParts
@@ -386,7 +394,7 @@ export function SessionTurn(
386394 </ Show >
387395 </ div >
388396 </ Show >
389- < SessionRetry status = { status ( ) } show = { isLastUserMessage ( ) } />
397+ < SessionRetry status = { status ( ) } show = { active ( ) } />
390398 < Show when = { edited ( ) > 0 && ! working ( ) } >
391399 < div data-slot = "session-turn-diffs" >
392400 < Collapsible open = { open ( ) } onOpenChange = { setOpen } variant = "ghost" >
0 commit comments