@@ -195,11 +195,7 @@ class SessionListViewModel(private val container: AppContainer) : ViewModel() {
195195 livePreviewJobs[sessionId] = viewModelScope.launch {
196196 val job = coroutineContext[kotlinx.coroutines.Job]
197197 try {
198− val preview = runCatching {
199− api.listMessages(sessionId).lastOrNull()?.let { msg ->
200− msg.parts.filterIsInstance<TextPart>().lastOrNull()?.text
201− }
202− }.getOrNull()?.takeIf { it.isNotBlank() }?.take(NetworkConfig.previewTextMaxLength) ?: return@launch
198+ val preview = fetchSessionPreview(api, sessionId) ?: return@launch
203199 _state.update { s -> s.copy(previews = s.previews + (sessionId to preview)) }
204200 } finally {
205201 if (job != null) livePreviewJobs.remove(sessionId, job)
@@ -218,11 +214,7 @@ class SessionListViewModel(private val container: AppContainer) : ViewModel() {
218214 sessions.take(NetworkConfig.maxPreviewSessions).map { session ->
219215 launch {
220216 semaphore.withPermit {
221− val preview = runCatching {
222− api.listMessages(session.id).lastOrNull()?.let { msg ->
223− msg.parts.filterIsInstance<TextPart>().lastOrNull()?.text
224− }
225− }.getOrNull()?.takeIf { it.isNotBlank() }?.take(NetworkConfig.previewTextMaxLength) ?: return@withPermit
217+ val preview = fetchSessionPreview(api, session.id) ?: return@withPermit
226218 _state.update { s -> s.copy(previews = s.previews + (session.id to preview)) }
227219 }
228220 }
@@ -291,3 +283,17 @@ class SessionListViewModel(private val container: AppContainer) : ViewModel() {
291283 }
292284 }
293285}
286+
287+/**
288+ * Fetch the last text part of a session's most recent message, truncated to
289+ * [NetworkConfig.previewTextMaxLength]. Returns null on failure or when the
290+ * last message has no text part.
291+ */
292+private suspend fun fetchSessionPreview(
293+ api: soy.iko.opencode.data.network.OpencodeApiClient,
294+ sessionId: String,
295+): String? = runCatching {
296+ api.listMessages(sessionId).lastOrNull()?.let { msg ->
297+ msg.parts.filterIsInstance<TextPart>().lastOrNull()?.text
298+ }
299+}.getOrNull()?.takeIf { it.isNotBlank() }?.take(NetworkConfig.previewTextMaxLength)