feat: collapsible message bubbles with per-tool activity logging#180
Merged
rockfordlhotka merged 3 commits intomainfrom Mar 20, 2026
Merged
feat: collapsible message bubbles with per-tool activity logging#180rockfordlhotka merged 3 commits intomainfrom
rockfordlhotka merged 3 commits intomainfrom
Conversation
… chat UI Add a visibility hierarchy where only user input and primary agent final replies are fully expanded by default. Subagent completions, A2A status, system scheduled tasks, and WIP progress are collapsed into de-emphasized, expandable bubbles. Backend: add IsSystemTask flag to ScheduledTask/ScheduledTaskMessage so heartbeat-patrol replies use SessionId "scheduled-system" (collapsed) vs "scheduled" (expanded) for user-created tasks. Frontend: introduce MessageCategory enum, ActivityLogEntry record, and activity log accumulation. Progress callbacks now feed a collapsible activity log bubble instead of the thinking indicator. Three rendering paths: activity log, collapsible (dashed border + category badge), and standard expanded. Full dark mode and responsive CSS for all new styles. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add ToolProgressNotifier that publishes AgentReply(IsFinal=false) to the message bus for every tool invocation on the native FunctionInvokingChatClient path. Uses AsyncLocal<ToolProgressContext> so each handler (UserMessage, ScheduledTask, Subagent, A2A) sets routing context before RunAsync. This gives the Blazor activity log a step-by-step view of every tool call as it happens, covering all handler types and both native and text-based tool-calling paths. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Non-final replies now append to the source's activity log bubble instead of creating a new bubble per message. Activity logs are keyed by category + agentName so multiple concurrent sources (primary, subagent-X, scheduled-system) each accumulate into their own bubble. BlazorUserFrontend routes non-final DisplayReplyAsync calls through AppendActivityLogEntry. Activity log headers now show category badge, agent name, and entry count. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
IToolProgressNotifierthat publishes every native tool invocation to the message bus, feeding step-by-step activity log bubbles in the Blazor UIBackend
IsSystemTaskflag onScheduledTask/ScheduledTaskMessagedistinguishes patrol tasks (SessionId = "scheduled-system", collapsed) from user-created tasks ("scheduled", expanded)ToolProgressNotifierusesAsyncLocal<ToolProgressContext>so all handlers set routing context beforeRunAsync— covers UserMessage, ScheduledTask, Subagent, SubagentResult, and all A2A handlersFrontend
MessageCategoryenum withCategorizeReplyheuristics inBlazorUserFrontendTest plan
dotnet build RockBot.slnx— 0 errorsdotnet test RockBot.slnx— all 623 tests pass🤖 Generated with Claude Code