feat(chat): support hierarchical nested subtasks in Todos via parent property (#1018) (#1028)

Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-08-31 22:09:15 +03:00
1 parent 3fd9ac767f
commit ceb4813218
9 files changed
+443 -17

No files matched your search

@@ -1,6 +1,7 @@
package com.m57.hermescontrol.data.ws
import android.util.Log
import com.m57.hermescontrol.ui.chat.extractTodosFromMap
/**
* Converts raw [JsonRpcResponse] objects into typed [WsEvent] instances.
@@ -189,6 +190,15 @@ object EventParser {
WsEvent.SessionUsage(payload, sessionId)
}
"todo.updated" -> {
val revision =
(payload?.get("revision") as? Number)?.toInt()
?: (params["revision"] as? Number)?.toInt()
val rawTodos = payload ?: params
val todos = extractTodosFromMap(rawTodos) ?: emptyList()
WsEvent.TodoUpdated(todos, revision, sessionId)
}
"reaction" -> {
val kind = payload?.get("kind") as? String ?: ""
WsEvent.ReactionEvent(kind)
@@ -1,5 +1,7 @@
package com.m57.hermescontrol.data.ws
import com.m57.hermescontrol.ui.chat.TodoItem
/** Parsed WebSocket events emitted by [HermesWsClient]. */
sealed class WsEvent {
// ── Gateway lifecycle ────────────────────────────────────────────────
@@ -183,6 +185,17 @@ sealed class WsEvent {
val sessionId: String? = null,
) : WsEvent()
/**
* Revisioned todo snapshot event emitted by backend todo tool updates (issue #1018).
* Event: `todo.updated`
* Payload: `{ "todos": [...], "revision": Int }`
*/
data class TodoUpdated(
val todos: List<TodoItem> = emptyList(),
val revision: Int? = null,
val sessionId: String? = null,
) : WsEvent()
// ── RPC responses ────────────────────────────────────────────────────
data class RpcResult(