diff --git a/backend/Services/OpenClawGatewayClient.cs b/backend/Services/OpenClawGatewayClient.cs index c29e661..2918460 100644 --- a/backend/Services/OpenClawGatewayClient.cs +++ b/backend/Services/OpenClawGatewayClient.cs @@ -145,24 +145,49 @@ public sealed class OpenClawGatewayClient(HttpClient httpClient, IConfiguration { try { - var result = await InvokeToolAsync("sessions_history", new { sessionKey, limit, offset }); + var result = await InvokeToolAsync("sessions_history", new { + sessionKey, limit, offset, + includeTools = false + }); if (result is null) return new List(); - var messages = new List(); - var array = result as JsonArray ?? result.AsArray(); - if (array is null) return messages; + // sessions_history returns { details: { messages: [...] } } + var messageArray = result["details"]?["messages"] as JsonArray; + if (messageArray is null) return new List(); - foreach (var msg in array) + var messages = new List(); + foreach (var msg in messageArray.Cast()) { if (msg is null) continue; var role = msg["role"]?.GetValue() ?? ""; - var content = msg["content"]?.GetValue() ?? ""; + // Skip non-user/assistant roles + if (role is not ("user" or "assistant")) continue; + + // Content is an array of blocks: [{type: "text"/"thinking", text: "..."}] + // Extract only pure text blocks, skip thinking-only messages + var contentBlocks = msg["content"] as JsonArray; + if (contentBlocks is null) continue; + + var visibleTexts = new List(); + foreach (var block in contentBlocks.Cast()) + { + if (block is null) continue; + var type = block["type"]?.GetValue() ?? ""; + var text = block["text"]?.GetValue() ?? ""; + if (type == "text" && !string.IsNullOrWhiteSpace(text)) + visibleTexts.Add(text); + } + + var visibleContent = string.Join(" ", visibleTexts).Trim(); + if (string.IsNullOrWhiteSpace(visibleContent)) continue; + + // Skip system-only replies + if (visibleContent is "REPLY_SKIP" or "ANNOUNCE_SKIP") continue; + var timestamp = msg["timestamp"]?.GetValue() - ?? msg["ts"]?.GetValue() - ?? msg["createdAt"]?.GetValue() ?? DateTimeOffset.UtcNow.ToString("o"); - messages.Add(new MessageEntry(role, content, timestamp)); + messages.Add(new MessageEntry(role, visibleContent, timestamp)); } return messages;