* feat(#439): enrich sessions tab with dashboard features Add session stats (total/active counts), per-session source icons, active session badges, inline rename, bulk selection with toolbar, prune old sessions dialog with configurable days threshold, session prompt copy, single-session delete, and search highlighting. - SessionInfo model: add source field - New models: SessionStatsResponse, SessionRenameRequest, BulkDeleteRequest, PruneRequest, SessionPromptResponse - HermesApiService: add stats, rename, bulk delete, prune, prompt endpoints - SessionsViewModel: stats loading, bulk select, rename, delete, prune - SessionsScreen: stats row, source icons, active border, rename inline, bulk mode with animated toolbar, prune dialog, search highlight - strings.xml: new resources for all sessions UI features * fix(#439): resolve CI compile errors - Add explicit icon imports for Code, Language, Terminal - Add missing clickable import - Make highlightText non-composable by passing color params - Fix combinedClickable usage on SessionCard * fix(#439): address review findings - Remove unused background import - Add dedicated DELETE /api/sessions/{id} endpoint - Refactor deleteSession to use dedicated endpoint - Add confirmation dialogs for both single-session and bulk delete - Surface statsError in the UI when stats load fails - Add string resources for delete confirmation dialogs * fix(#439): fix delegated property smart cast errors - Capture statsError, errorMessage, sessionToDeleteConfirm in local vals before null checks to avoid 'Smart cast impossible' on delegated props * fix(#439): remove copy and rename buttons, keep delete only * fix(#439): restore CheckCircle import --------- Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
1 parent
41fde55c11
commit
e2349eca22
5 files changed
+981
-77
No files matched your search
@@ -15,4 +15,28 @@ data class SessionInfo(
|
||||
val status: String?,
|
||||
val preview: String? = null,
|
||||
val started_at: Double? = null,
|
||||
val source: String? = null,
|
||||
)
|
||||
|
||||
data class SessionStatsResponse(
|
||||
val total: Int = 0,
|
||||
val active: Int = 0,
|
||||
)
|
||||
|
||||
data class SessionRenameRequest(
|
||||
val title: String,
|
||||
)
|
||||
|
||||
data class BulkDeleteRequest(
|
||||
val ids: List<String>,
|
||||
val delete_all: Boolean = false,
|
||||
)
|
||||
|
||||
data class PruneRequest(
|
||||
val days: Int,
|
||||
)
|
||||
|
||||
data class SessionPromptResponse(
|
||||
val prompt: String? = null,
|
||||
val id: String? = null,
|
||||
)
|
||||
@@ -5,6 +5,7 @@ import com.m57.hermescontrol.data.model.AchievementsResponse
|
||||
import com.m57.hermescontrol.data.model.ActiveProfileResponse
|
||||
import com.m57.hermescontrol.data.model.AgentPluginInstallBody
|
||||
import com.m57.hermescontrol.data.model.AuxiliaryModelsResponse
|
||||
import com.m57.hermescontrol.data.model.BulkDeleteRequest
|
||||
import com.m57.hermescontrol.data.model.ConfigSchemaResponse
|
||||
import com.m57.hermescontrol.data.model.ConfigUpdateRequest
|
||||
import com.m57.hermescontrol.data.model.CreateCronJobRequest
|
||||
@@ -37,12 +38,16 @@ import com.m57.hermescontrol.data.model.PluginProvidersPutRequest
|
||||
import com.m57.hermescontrol.data.model.PluginsHubResponse
|
||||
import com.m57.hermescontrol.data.model.ProfileSoulResponse
|
||||
import com.m57.hermescontrol.data.model.ProfilesResponse
|
||||
import com.m57.hermescontrol.data.model.PruneRequest
|
||||
import com.m57.hermescontrol.data.model.RawConfigResponse
|
||||
import com.m57.hermescontrol.data.model.RecentUnlock
|
||||
import com.m57.hermescontrol.data.model.SaveSkillContentRequest
|
||||
import com.m57.hermescontrol.data.model.ScanStatus
|
||||
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.SessionStatsResponse
|
||||
import com.m57.hermescontrol.data.model.SetActiveProfileRequest
|
||||
import com.m57.hermescontrol.data.model.Skill
|
||||
import com.m57.hermescontrol.data.model.SkillContentResponse
|
||||
@@ -95,6 +100,35 @@ interface HermesApiService {
|
||||
@Path("id") sessionId: String,
|
||||
): Response<SessionMessagesResponse>
|
||||
|
||||
@GET("api/sessions/stats")
|
||||
suspend fun getSessionStats(): Response<SessionStatsResponse>
|
||||
|
||||
@PUT("api/sessions/{id}/rename")
|
||||
suspend fun renameSession(
|
||||
@Path("id") sessionId: String,
|
||||
@Body body: SessionRenameRequest,
|
||||
): Response<Unit>
|
||||
|
||||
@POST("api/sessions/delete")
|
||||
suspend fun bulkDeleteSessions(
|
||||
@Body body: BulkDeleteRequest,
|
||||
): Response<Unit>
|
||||
|
||||
@DELETE("api/sessions/{id}")
|
||||
suspend fun deleteSession(
|
||||
@Path("id") sessionId: String,
|
||||
): Response<Unit>
|
||||
|
||||
@POST("api/sessions/prune")
|
||||
suspend fun pruneSessions(
|
||||
@Body body: PruneRequest,
|
||||
): Response<Unit>
|
||||
|
||||
@GET("api/sessions/{id}/prompt")
|
||||
suspend fun getSessionPrompt(
|
||||
@Path("id") sessionId: String,
|
||||
): Response<SessionPromptResponse>
|
||||
|
||||
@GET("api/system/stats")
|
||||
suspend fun getSystemStats(): Response<SystemStatsResponse>
|
||||
|
||||
|
||||
Reference in new issue
Block a user