diff --git a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt index 28c580ea..3cb9e9c7 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt @@ -1573,7 +1573,22 @@ class ChatViewModel( } is SlashResult.NewSession -> { - createNewSession() + val currentTitle = _uiState.value.chatTitle + if (currentTitle.equals("Bot Chat", ignoreCase = true)) { + // Bot Chat is a canonical forever-conversation — compact instead of creating an orphan + val sessionId = _uiState.value.currentSessionId + if (!sessionId.isNullOrBlank()) { + addAssistantMessage( + "Bot chats are one continuous conversation — compacting instead. " + + "For a throwaway session, create a standard chat.", + ) + dispatchViaRpc("/compact") + } else { + createNewSession() + } + } else { + createNewSession() + } } is SlashResult.SessionBranch -> { diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 13a85fcd..d0794d84 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -104,6 +104,7 @@ 답장 + 봇 대화는 지속적인 대화입니다 — 대신 압축합니다. 임시 세션을 사용하려면 일반 채팅을 생성하세요. 검색 검색 닫기 재접속 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 57f49fd8..02bab50d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -105,6 +105,7 @@ Hermes 对话回复 Hermes 新回复提醒 回复 + Bot 聊天是连续对话 — 正在压缩替代。如需临时会话,请使用普通聊天。 搜索 关闭搜索 重新连接 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 795594fc..607183b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -122,6 +122,7 @@ Reply + Bot chats are one continuous conversation — compacting instead. For a throwaway session, create a standard chat. Search Close search Reconnect diff --git a/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt b/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt index 02670757..c20b10c2 100644 --- a/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt +++ b/app/src/test/java/com/m57/hermescontrol/ui/chat/ChatViewModelTest.kt @@ -288,6 +288,50 @@ class ChatViewModelTest { verify(atLeast = 1) { HermesWsClient.send(WsMethods.SESSION_CREATE, any(), any()) } } + @Test + fun testSlashCommand_new_inBotChat_compactsInsteadOfCreatingSession() = + runTest { + val (viewModel, sessionId) = createViewModelWithSession() + // Set session title to "Bot Chat" via SESSION_LIST result + mockEventsFlow.emit( + WsEvent.RpcResult( + id = "req-id-1", + result = + mapOf( + "sessions" to + listOf( + mapOf( + "id" to sessionId, + "title" to "Bot Chat", + "message_count" to 5.0, + ), + ), + ), + ), + ) + advanceUntilIdle() + + // Reset recording on HermesWsClient to only inspect calls after /new + clearMocks(HermesWsClient, answers = false, recordedCalls = true) + + viewModel.sendMessage("/new") + advanceUntilIdle() + + // In Bot Chat, /new should NOT create a fresh session, but instead dispatch /compact + verify(exactly = 0) { + HermesWsClient.send( + WsMethods.SESSION_CREATE, + any(), + any(), + ) + } + assertTrue( + viewModel.uiState.value.messages.any { + it.content.contains("compacting instead") + }, + ) + } + @Test fun profileSwitch_wipesOpenSessionForFreshStart() = runTest {