fix: memory screen reset actions serialization error (fixes #1020)

This commit is contained in:
Hy4ri committed 2026-08-31 11:10:26 +03:00
1 parent 6b2268004f
commit d8e3992c33
4 files changed
+21 -8

No files matched your search

@@ -13,3 +13,14 @@ data class BuiltinFileSizes(
val memory: Long? = null,
val user: Long? = null,
)
@Serializable
data class MemoryResetRequest(
val target: String = "all",
)
@Serializable
data class MemoryResetResponse(
val ok: Boolean = false,
val deleted: List<String> = emptyList(),
)
@@ -851,8 +851,8 @@ interface HermesApiService {
@POST("api/memory/reset")
suspend fun resetMemory(
@Body body: Map<String, String>,
): Response<Map<String, Any>>
@Body body: MemoryResetRequest,
): Response<MemoryResetResponse>
// ── Admin: Credential pool ────────────────────────────────────────
@GET("api/credentials/pool")
@@ -3,6 +3,7 @@ package com.m57.hermescontrol.ui.memory
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.m57.hermescontrol.data.model.LearningGraphResponse
import com.m57.hermescontrol.data.model.MemoryResetRequest
import com.m57.hermescontrol.data.model.MemoryResponse
import com.m57.hermescontrol.data.remote.ApiClient
import com.m57.hermescontrol.data.remote.NetworkResult
@@ -67,7 +68,7 @@ class MemoryViewModel : ViewModel(), ToastHost {
if (_uiState.value.resetting != null) return
_uiState.update { it.copy(resetting = target) }
viewModelScope.launch {
val result = safeApiCall { ApiClient.hermesApi.resetMemory(mapOf("target" to target)) }
val result = safeApiCall { ApiClient.hermesApi.resetMemory(MemoryResetRequest(target = target)) }
when (result) {
is NetworkResult.Success ->
_uiState.update {
@@ -1,5 +1,7 @@
package com.m57.hermescontrol.ui.memory
import com.m57.hermescontrol.data.model.MemoryResetRequest
import com.m57.hermescontrol.data.model.MemoryResetResponse
import com.m57.hermescontrol.data.model.MemoryProviderStatusRow
import com.m57.hermescontrol.data.model.MemoryResponse
import com.m57.hermescontrol.data.remote.ApiClient
@@ -103,15 +105,15 @@ class MemoryViewModelTest {
@Test
fun `resetMemory posts target and reloads`() {
coEvery { mockApi.resetMemory(mapOf("target" to "all")) } returns
Response.success(emptyMap<String, String>())
coEvery { mockApi.resetMemory(MemoryResetRequest(target = "all")) } returns
Response.success(MemoryResetResponse(ok = true))
val vm = MemoryViewModel()
vm.load()
testDispatcher.scheduler.advanceUntilIdle()
vm.resetMemory("all")
testDispatcher.scheduler.advanceUntilIdle()
coVerify { mockApi.resetMemory(mapOf("target" to "all")) }
coVerify { mockApi.resetMemory(MemoryResetRequest(target = "all")) }
assertEquals("Memory (all) reset successfully", vm.uiState.value.toastMessage)
// One load + one reload after reset.
coVerify(exactly = 2) { mockApi.getMemory() }
@@ -119,7 +121,7 @@ class MemoryViewModelTest {
@Test
fun `resetMemory failure shows error toast`() {
coEvery { mockApi.resetMemory(mapOf("target" to "memory")) } returns
coEvery { mockApi.resetMemory(MemoryResetRequest(target = "memory")) } returns
Response.error(500, "boom".toResponseBody())
val vm = MemoryViewModel()
vm.resetMemory("memory")
@@ -128,4 +130,3 @@ class MemoryViewModelTest {
assertTrue(vm.uiState.value.toastMessage.orEmpty().contains("Failed to reset memory"))
assertNull(vm.uiState.value.resetting)
}
}