fix(#918): fix profile clone endpoint and prune dead MCP restart & session prompt REST calls (#926)

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-08-17 22:51:29 +03:00
1 parent bd75a6d8ea
commit d6892cde7f
7 files changed
+42 -65

No files matched your search

@@ -47,11 +47,6 @@ data class UpdateProfileModelRequest(
val model: String,
)
@Serializable
data class CloneProfileRequest(
val name: String,
)
@Serializable
data class UpdateProfileDescriptionRequest(
val description: String,
@@ -89,6 +84,9 @@ data class CreateProfileRequest(
val mcp_servers: List<McpServerConfigInput>? = null,
val keep_skills: Boolean? = null,
val hub_skills: List<String>? = null,
val clone_from: String? = null,
val clone_all: Boolean? = null,
val clone_from_default: Boolean? = null,
)
@Serializable
@@ -60,9 +60,3 @@ data class BulkDeleteResponse(
data class PruneRequest(
val days: Int,
)
@Serializable
data class SessionPromptResponse(
val prompt: String? = null,
val id: String? = null,
)
@@ -12,7 +12,6 @@ import com.m57.hermescontrol.data.model.BackupTriggerRequest
import com.m57.hermescontrol.data.model.BulkDeleteRequest
import com.m57.hermescontrol.data.model.BulkDeleteResponse
import com.m57.hermescontrol.data.model.CheckpointsResponse
import com.m57.hermescontrol.data.model.CloneProfileRequest
import com.m57.hermescontrol.data.model.ConfigSchemaResponse
import com.m57.hermescontrol.data.model.ConfigUpdateRequest
import com.m57.hermescontrol.data.model.CreateCronJobRequest
@@ -95,7 +94,6 @@ import com.m57.hermescontrol.data.model.ScanStatus
import com.m57.hermescontrol.data.model.SessionDetailResponse
import com.m57.hermescontrol.data.model.SessionListResponse
import com.m57.hermescontrol.data.model.SessionMessagesResponse
import com.m57.hermescontrol.data.model.SessionPromptResponse
import com.m57.hermescontrol.data.model.SessionRenameRequest
import com.m57.hermescontrol.data.model.SessionSearchResponse
import com.m57.hermescontrol.data.model.SessionStatsResponse
@@ -244,13 +242,6 @@ interface HermesApiService {
@Path("id", encoded = true) sessionId: String,
): Response<LatestDescendantResponse>
@GET("api/sessions/{id}/prompt")
suspend fun getSessionPrompt(
// Preserve slashes in session IDs — backend generates IDs containing '/' characters (issue #468).
// Contract: The server-generated sessionId must only contain URL-safe characters (no ?, #, or spaces).
@Path("id", encoded = true) sessionId: String,
): Response<SessionPromptResponse>
@GET("api/sessions/{id}")
suspend fun getSessionDetail(
// Preserve slashes in session IDs — backend generates IDs containing '/' characters (issue #468).
@@ -407,12 +398,6 @@ interface HermesApiService {
@Body body: UpdateProfileModelRequest,
): Response<Unit>
@POST("api/profiles/{name}/clone")
suspend fun cloneProfile(
@Path("name") name: String,
@Body body: CloneProfileRequest,
): Response<Unit>
@PUT("api/profiles/{name}/description")
suspend fun updateProfileDescription(
@Path("name") name: String,
@@ -541,11 +526,6 @@ interface HermesApiService {
@Body body: Map<String, Any>,
): Response<McpServer>
@POST("api/mcp/servers/{name}/restart")
suspend fun restartMcpServer(
@Path("name") name: String,
): Response<Unit>
@POST("api/mcp/servers/{name}/auth")
suspend fun authMcpServer(
@Path("name") name: String,
@@ -25,7 +25,6 @@ import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Key
import androidx.compose.material.icons.filled.RestartAlt
import androidx.compose.material.icons.filled.Science
import androidx.compose.material.icons.filled.Storage
import androidx.compose.material3.Button
@@ -564,15 +563,6 @@ private fun ServerCard(
Spacer(modifier = Modifier.width(spacing.xs))
Text(stringResource(R.string.mcp_servers_action_test), maxLines = 1)
}
FilledTonalButton(
onClick = { viewModel.restartServer(server.name) },
modifier = Modifier.weight(1f),
contentPadding = PaddingValues(horizontal = 12.dp, vertical = 10.dp),
) {
Icon(Icons.Filled.RestartAlt, contentDescription = null, modifier = Modifier.size(16.dp))
Spacer(modifier = Modifier.width(spacing.xs))
Text(stringResource(R.string.mcp_servers_action_restart), maxLines = 1)
}
IconButton(onClick = { viewModel.deleteServer(server.name) }) {
Icon(Icons.Filled.Delete, contentDescription = stringResource(R.string.action_delete))
}
@@ -162,26 +162,6 @@ class McpServersViewModel :
}
}
fun restartServer(name: String) {
viewModelScope.launch {
_uiState.update { it.copy(toastMessage = "Restarting server '$name'…") }
val result =
withContext(Dispatchers.IO) {
safeApiCall { ApiClient.hermesApi.restartMcpServer(name) }
}
when (result) {
is NetworkResult.Success -> {
_uiState.update { it.copy(toastMessage = "Server '$name' restarted") }
loadServers()
}
is NetworkResult.Failure -> {
_uiState.update { it.copy(toastMessage = "Failed to restart server: ${result.error.message}") }
}
}
}
}
// ── Add server form ──────────────────────────────────────
fun toggleAddForm() {
@@ -3,7 +3,6 @@ package com.m57.hermescontrol.ui.profiles
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.m57.hermescontrol.data.local.AuthManager
import com.m57.hermescontrol.data.model.CloneProfileRequest
import com.m57.hermescontrol.data.model.CreateProfileRequest
import com.m57.hermescontrol.data.model.HubSkill
import com.m57.hermescontrol.data.model.ModelProvider
@@ -242,9 +241,11 @@ class ProfilesViewModel(
val result =
withContext(ioDispatcher) {
safeApiCall {
ApiClient.hermesApi.cloneProfile(
sourceProfileName,
CloneProfileRequest(newProfileName),
ApiClient.hermesApi.createProfile(
CreateProfileRequest(
name = newProfileName,
clone_from = sourceProfileName,
),
)
}
}