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 {