feat: paginate, sync, and display branched sessions (#563)

* mobile: 以 Desktop Sessions 作为聊天历史源

* mobile: 修复快速连接崩溃与无标题会话隐藏

* mobile: 对齐 Desktop 标题并恢复完整历史

* mobile: 分离 Desktop 存储 ID 与运行 Session ID

* mobile: 将新对话持久化为 Desktop Session

* mobile: 渲染 Desktop 本地媒体

* feat: 分页加载并同步当前会话

* fix: 显示分支会话名称与层级

* fix: align PR with upstream app contract

* fix: preserve upstream session RPC lifecycle
This commit is contained in:
Genesi599 authored and GitHub committed 2026-07-12 12:53:23 +03:00
1 parent 306861a222
commit 3052db7d65
8 files changed
+405 -79

No files matched your search

@@ -141,7 +141,8 @@ class HermesApiServiceMockWebServerTest {
"created_at": "2026-06-20T14:30:00Z",
"message_count": 7,
"status": "idle",
"source": "web"
"source": "web",
"parent_session_id": "abc-123"
}
],
"total": 2,
@@ -173,6 +174,7 @@ class HermesApiServiceMockWebServerTest {
assertEquals(7, second.message_count)
assertEquals("idle", second.status)
assertEquals("web", second.source)
assertEquals("abc-123", second.parent_session_id)
}
@Test
@@ -254,6 +256,24 @@ class HermesApiServiceMockWebServerTest {
assertEquals("tool_execution", messages[2].type)
}
@Test
fun getSessionMessages_sendsPaginationQuery() =
runBlocking {
mockServer.enqueue(
MockResponse()
.setResponseCode(200)
.setBody("{\"messages\": []}"),
)
val response = api.getSessionMessages("desktop/session", limit = 150, offset = 300)
assertTrue(response.isSuccessful)
assertEquals(
"/api/sessions/desktop/session/messages?limit=150&offset=300",
mockServer.takeRequest().path,
)
}
@Test
fun getSessionMessages_withNullRole_doesNotCrash() =
runBlocking {