feat(chat): render tool-call chips and live peek status in mobile bubbles
The mobile app was receiving SSE status events but showing the peek text only while the assistant bubble was empty — as soon as the first token arrived, the status line was replaced by streaming content and any tool calls fired mid-turn left no trace. Tool call SSE events were also being dropped by the parser, and Message.fromJson never read the persisted tool_calls array, so chips never rendered after reload either. Parse tool_call SSE frames into a new ChatToolCall event, carry tool calls on Message, and update the chat and briefing streaming loops to append chips to the in-flight assistant message as they arrive. Rework ChatMessageBubble to show a chip row + rolling peek status line above any streamed text, matching the web ToolCallCard/status indicator behaviour across chat, briefing, and briefing history surfaces. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -18,6 +18,15 @@ class ChatStatusUpdate extends ChatStreamEvent {
|
||||
ChatStatusUpdate(this.status);
|
||||
}
|
||||
|
||||
/// A single tool call fired during generation. Mirrors the `tool_call` SSE
|
||||
/// event emitted by `generation_task.py` and the `tool_calls` array persisted
|
||||
/// on the assistant Message row — same shape either way so the UI can render
|
||||
/// live chips during streaming and re-render them from storage after reload.
|
||||
class ChatToolCall extends ChatStreamEvent {
|
||||
final Map<String, dynamic> toolCall;
|
||||
ChatToolCall(this.toolCall);
|
||||
}
|
||||
|
||||
class ChatApi {
|
||||
final Dio _dio;
|
||||
const ChatApi(this._dio);
|
||||
@@ -136,6 +145,14 @@ class ChatApi {
|
||||
} catch (_) {
|
||||
// Ignore malformed status events
|
||||
}
|
||||
} else if (currentEvent == 'tool_call') {
|
||||
try {
|
||||
final obj = json.decode(data) as Map<String, dynamic>;
|
||||
final tc = obj['tool_call'];
|
||||
if (tc is Map<String, dynamic>) yield ChatToolCall(tc);
|
||||
} catch (_) {
|
||||
// Ignore malformed tool_call events
|
||||
}
|
||||
}
|
||||
} else if (line.isEmpty) {
|
||||
currentEvent = ''; // blank line = SSE event separator
|
||||
|
||||
Reference in New Issue
Block a user