Merge pull request #1023 from Hy4ri/fix/issue-1020-memory-reset

fix: memory screen reset actions serialization error (fixes #1020)
This commit is contained in:
M57 authored and GitHub committed 2026-08-31 11:37:17 +03:00
commit 3f3b853758
4 files changed
+23 -7

No files matched your search

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