From 036286e00e3b4f81624503b5496bef35bba34f56 Mon Sep 17 00:00:00 2001 From: Yan Wang Date: Sat, 1 Aug 2026 18:58:53 -0700 Subject: [PATCH 1/4] feat(models): add Ollama DeepSeek V4 Flash 0731 preset --- .../main/java/com/yage/opencode_client/ui/MainViewModel.kt | 1 + .../main/java/com/yage/opencode_client/ui/ModelPresets.kt | 1 + app/src/test/java/com/yage/opencode_client/AppStateTest.kt | 2 ++ app/src/test/java/com/yage/opencode_client/ModelTests.kt | 5 +++++ 4 files changed, 9 insertions(+) diff --git a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt index f6f6779..8c75787 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt @@ -124,6 +124,7 @@ data class AppState( displayName == "Ollama GLM 5.2" -> "OGLM-5.2" displayName == "GPT-5.6 Sol Fast" -> "GPT-F" displayName == "GPT-5.6 Terra Fast" -> "GPT-TF" + displayName == "DeepSeek V4 Flash 0731" -> "DS4F" "Haiku" in displayName -> "Haiku" "Gemini" in displayName -> "Gemini" "GPT" in displayName -> "GPT" diff --git a/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt b/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt index a1f12ce..d18c88c 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt @@ -14,5 +14,6 @@ object ModelPresets { AppState.ModelOption("Ollama GLM 5.2", "ollama-cloud", "glm-5.2"), AppState.ModelOption("GPT-5.6 Sol Fast", "openai", "gpt-5.6-sol-fast"), AppState.ModelOption("GPT-5.6 Terra Fast", "openai", "gpt-5.6-terra-fast"), + AppState.ModelOption("DeepSeek V4 Flash 0731", "ollama-cloud", "deepseek-v4-flash:0731"), ) } diff --git a/app/src/test/java/com/yage/opencode_client/AppStateTest.kt b/app/src/test/java/com/yage/opencode_client/AppStateTest.kt index 53e11ac..0e41533 100644 --- a/app/src/test/java/com/yage/opencode_client/AppStateTest.kt +++ b/app/src/test/java/com/yage/opencode_client/AppStateTest.kt @@ -172,6 +172,8 @@ class AppStateTest { assertTrue(models.any { it.displayName == "GPT-5.6 Terra Fast" && it.providerId == "openai" && it.modelId == "gpt-5.6-terra-fast" }) + assertEquals("DeepSeek V4 Flash 0731", models.last().displayName) + assertEquals("deepseek-v4-flash:0731", models.last().modelId) } @Test diff --git a/app/src/test/java/com/yage/opencode_client/ModelTests.kt b/app/src/test/java/com/yage/opencode_client/ModelTests.kt index ab7e269..619ec13 100644 --- a/app/src/test/java/com/yage/opencode_client/ModelTests.kt +++ b/app/src/test/java/com/yage/opencode_client/ModelTests.kt @@ -338,6 +338,11 @@ class ModelTests { assertEquals("GPT-TF", modelOption("GPT-5.6 Terra Fast").shortName) } + @Test + fun `ModelOption shortName returns DS4F for DeepSeek V4 Flash 0731`() { + assertEquals("DS4F", modelOption("DeepSeek V4 Flash 0731").shortName) + } + @Test fun `removed GPT Sol Pro preset indices migrate without changing other slots`() { assertEquals(1, migrateLegacyModelIndex(6)) From d9ce421244d9c830a255ffb5ec06feedb9a2d155 Mon Sep 17 00:00:00 2001 From: Yan Wang Date: Sat, 1 Aug 2026 19:08:49 -0700 Subject: [PATCH 2/4] fix(models): remove DeepSeek V4 Pro and V4 Flash 0731 presets --- .../main/java/com/yage/opencode_client/ui/MainViewModel.kt | 2 -- .../main/java/com/yage/opencode_client/ui/ModelPresets.kt | 2 -- app/src/test/java/com/yage/opencode_client/AppStateTest.kt | 4 ++-- app/src/test/java/com/yage/opencode_client/ModelTests.kt | 5 ----- 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt index 8c75787..a3c8ae6 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt @@ -120,11 +120,9 @@ data class AppState( get() = when { displayName == "DeepSeek V4 Flash" -> "DS-Flash" displayName == "DeepSeek Local" -> "DS-L" - displayName == "DeepSeek V4 Pro" -> "DS-Pro" displayName == "Ollama GLM 5.2" -> "OGLM-5.2" displayName == "GPT-5.6 Sol Fast" -> "GPT-F" displayName == "GPT-5.6 Terra Fast" -> "GPT-TF" - displayName == "DeepSeek V4 Flash 0731" -> "DS4F" "Haiku" in displayName -> "Haiku" "Gemini" in displayName -> "Gemini" "GPT" in displayName -> "GPT" diff --git a/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt b/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt index d18c88c..4a5ac74 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt @@ -10,10 +10,8 @@ object ModelPresets { AppState.ModelOption("GPT-5.6 Sol", "openai", "gpt-5.6-sol"), AppState.ModelOption("Gemini 3.6 Flash", "google", "gemini-3.6-flash"), AppState.ModelOption("DeepSeek Local", "ds4", "deepseek-v4-flash"), - AppState.ModelOption("DeepSeek V4 Pro", "deepseek", "deepseek-v4-pro"), AppState.ModelOption("Ollama GLM 5.2", "ollama-cloud", "glm-5.2"), AppState.ModelOption("GPT-5.6 Sol Fast", "openai", "gpt-5.6-sol-fast"), AppState.ModelOption("GPT-5.6 Terra Fast", "openai", "gpt-5.6-terra-fast"), - AppState.ModelOption("DeepSeek V4 Flash 0731", "ollama-cloud", "deepseek-v4-flash:0731"), ) } diff --git a/app/src/test/java/com/yage/opencode_client/AppStateTest.kt b/app/src/test/java/com/yage/opencode_client/AppStateTest.kt index 0e41533..da83c50 100644 --- a/app/src/test/java/com/yage/opencode_client/AppStateTest.kt +++ b/app/src/test/java/com/yage/opencode_client/AppStateTest.kt @@ -172,8 +172,8 @@ class AppStateTest { assertTrue(models.any { it.displayName == "GPT-5.6 Terra Fast" && it.providerId == "openai" && it.modelId == "gpt-5.6-terra-fast" }) - assertEquals("DeepSeek V4 Flash 0731", models.last().displayName) - assertEquals("deepseek-v4-flash:0731", models.last().modelId) + assertFalse(models.any { it.modelId == "deepseek-v4-flash:0731" }) + assertFalse(models.any { it.providerId == "deepseek" && it.modelId == "deepseek-v4-pro" }) } @Test diff --git a/app/src/test/java/com/yage/opencode_client/ModelTests.kt b/app/src/test/java/com/yage/opencode_client/ModelTests.kt index 619ec13..ab7e269 100644 --- a/app/src/test/java/com/yage/opencode_client/ModelTests.kt +++ b/app/src/test/java/com/yage/opencode_client/ModelTests.kt @@ -338,11 +338,6 @@ class ModelTests { assertEquals("GPT-TF", modelOption("GPT-5.6 Terra Fast").shortName) } - @Test - fun `ModelOption shortName returns DS4F for DeepSeek V4 Flash 0731`() { - assertEquals("DS4F", modelOption("DeepSeek V4 Flash 0731").shortName) - } - @Test fun `removed GPT Sol Pro preset indices migrate without changing other slots`() { assertEquals(1, migrateLegacyModelIndex(6)) From 1fde43605999ded2412f646b8cbbe979aa5e8625 Mon Sep 17 00:00:00 2001 From: Yan Wang Date: Sat, 1 Aug 2026 20:34:29 -0700 Subject: [PATCH 3/4] feat(models): replace GPT-5.6 Sol Fast with GPT-5.6 Luna preset --- .../java/com/yage/opencode_client/ui/MainViewModel.kt | 2 +- .../main/java/com/yage/opencode_client/ui/ModelPresets.kt | 2 +- .../test/java/com/yage/opencode_client/AppStateTest.kt | 5 +++-- app/src/test/java/com/yage/opencode_client/ModelTests.kt | 8 ++++---- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt index a3c8ae6..617fa44 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/MainViewModel.kt @@ -121,8 +121,8 @@ data class AppState( displayName == "DeepSeek V4 Flash" -> "DS-Flash" displayName == "DeepSeek Local" -> "DS-L" displayName == "Ollama GLM 5.2" -> "OGLM-5.2" - displayName == "GPT-5.6 Sol Fast" -> "GPT-F" displayName == "GPT-5.6 Terra Fast" -> "GPT-TF" + displayName == "GPT-5.6 Luna" -> "GPT-L" "Haiku" in displayName -> "Haiku" "Gemini" in displayName -> "Gemini" "GPT" in displayName -> "GPT" diff --git a/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt b/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt index 4a5ac74..ee56e30 100644 --- a/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt +++ b/app/src/main/java/com/yage/opencode_client/ui/ModelPresets.kt @@ -11,7 +11,7 @@ object ModelPresets { AppState.ModelOption("Gemini 3.6 Flash", "google", "gemini-3.6-flash"), AppState.ModelOption("DeepSeek Local", "ds4", "deepseek-v4-flash"), AppState.ModelOption("Ollama GLM 5.2", "ollama-cloud", "glm-5.2"), - AppState.ModelOption("GPT-5.6 Sol Fast", "openai", "gpt-5.6-sol-fast"), AppState.ModelOption("GPT-5.6 Terra Fast", "openai", "gpt-5.6-terra-fast"), + AppState.ModelOption("GPT-5.6 Luna", "openai", "gpt-5.6-luna"), ) } diff --git a/app/src/test/java/com/yage/opencode_client/AppStateTest.kt b/app/src/test/java/com/yage/opencode_client/AppStateTest.kt index da83c50..07463a7 100644 --- a/app/src/test/java/com/yage/opencode_client/AppStateTest.kt +++ b/app/src/test/java/com/yage/opencode_client/AppStateTest.kt @@ -166,11 +166,12 @@ class AppStateTest { assertEquals("openai", models[1].providerId) assertEquals("gpt-5.6-sol", models[1].modelId) assertFalse(models.any { it.providerId == "openai" && it.modelId == "gpt-5.6-sol-pro" }) + assertFalse(models.any { it.providerId == "openai" && it.modelId == "gpt-5.6-sol-fast" }) assertTrue(models.any { - it.displayName == "GPT-5.6 Sol Fast" && it.providerId == "openai" && it.modelId == "gpt-5.6-sol-fast" + it.displayName == "GPT-5.6 Terra Fast" && it.providerId == "openai" && it.modelId == "gpt-5.6-terra-fast" }) assertTrue(models.any { - it.displayName == "GPT-5.6 Terra Fast" && it.providerId == "openai" && it.modelId == "gpt-5.6-terra-fast" + it.displayName == "GPT-5.6 Luna" && it.providerId == "openai" && it.modelId == "gpt-5.6-luna" }) assertFalse(models.any { it.modelId == "deepseek-v4-flash:0731" }) assertFalse(models.any { it.providerId == "deepseek" && it.modelId == "deepseek-v4-pro" }) diff --git a/app/src/test/java/com/yage/opencode_client/ModelTests.kt b/app/src/test/java/com/yage/opencode_client/ModelTests.kt index ab7e269..2db018d 100644 --- a/app/src/test/java/com/yage/opencode_client/ModelTests.kt +++ b/app/src/test/java/com/yage/opencode_client/ModelTests.kt @@ -329,13 +329,13 @@ class ModelTests { } @Test - fun `ModelOption shortName distinguishes GPT Sol Fast`() { - assertEquals("GPT-F", modelOption("GPT-5.6 Sol Fast").shortName) + fun `ModelOption shortName distinguishes GPT Terra Fast`() { + assertEquals("GPT-TF", modelOption("GPT-5.6 Terra Fast").shortName) } @Test - fun `ModelOption shortName distinguishes GPT Terra Fast`() { - assertEquals("GPT-TF", modelOption("GPT-5.6 Terra Fast").shortName) + fun `ModelOption shortName returns GPT-L for GPT Luna`() { + assertEquals("GPT-L", modelOption("GPT-5.6 Luna").shortName) } @Test From cbbef4818bba7898293e6360b722717f79b31ecc Mon Sep 17 00:00:00 2001 From: Yan Wang Date: Sat, 1 Aug 2026 20:48:00 -0700 Subject: [PATCH 4/4] fix(test): stabilize flaky realtime session-switch test The stop path runs closeAndDrain on Dispatchers.IO (real threads), so runCurrent() alone cannot advance it. Poll with Thread.sleep + runCurrent until commitStarted completes instead of relying on withTimeout auto-advance, which raced with the IO thread under StandardTestDispatcher. --- .../com/yage/opencode_client/MainViewModelTest.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt b/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt index 1333662..5bb7fea 100644 --- a/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt +++ b/app/src/test/java/com/yage/opencode_client/MainViewModelTest.kt @@ -1394,11 +1394,20 @@ class MainViewModelTest { it.copy(currentSessionId = "source", inputText = "source prefix", aiBuilderConnectionOK = true) } - viewModel.toggleRecording() - withTimeout(5_000) { viewModel.state.first { it.isRecording } } viewModel.toggleRecording() runCurrent() - withTimeout(5_000) { commitStarted.await() } + assertTrue(viewModel.state.value.isRecording) + viewModel.toggleRecording() + // Stop path runs closeAndDrain on Dispatchers.IO (real threads), so we + // must yield to let it complete before commitAndStop fires. Poll with + // small sleeps + runCurrent until commitStarted completes. + var waited = 0L + while (!commitStarted.isCompleted && waited < 5_000) { + Thread.sleep(20) + waited += 20 + runCurrent() + } + assertTrue(commitStarted.isCompleted) viewModel.selectSession("destination") sendPartial("stale partial") runCurrent()