Summary
Show a Claude-style progress indicator with elapsed timer in the Chat UI when report generation is in progress. Currently, the user sees only three bouncing dots for 30-120+ seconds during the entire report generation flow (data fetch → report generation → status polling → reviewer validation), with no visual distinction between "thinking", "fetching data", or "generating report".
Research Document: .copilot-tracking/research/2026-04-06/report-generation-progress-indicator-research.md
Problem
When a user requests a report via the chat interface, the Chat.Api agent:
- Fetches health data via MCP tools (5-15s)
- Calls
RequestReport tool → POST to Reporting.Api → 202 Accepted (1-2s)
- Polls
GetReportStatus tool while report generates in background (20-90s)
- Runs a reviewer agent to validate (5-10s)
- Streams the final response with charts and download links
During this entire 30-120+ second flow, the user sees only the generic typing indicator (three bouncing dots) — the same animation shown for a 2-second response.
Goal
Replace the generic typing indicator with a contextual progress indicator that shows:
- Pulsing spinner (
RadzenProgressBarCircular, indeterminate)
- Contextual label ("Generating report...")
- Elapsed timer counting up in
Xs or m:ss format
Similar to Claude's "Thinking..." / "Analyzing..." indicator that shows transparency during long-running operations.
Implementation Approaches
Three approaches were researched and evaluated. Each approach is tracked as a sub-issue:
| Approach |
Effort |
Files |
Projects |
Status |
| A: AGUI-Stream-Only (recommended) |
2-4h, ~50 LOC |
3 |
UI only |
Selected |
| B: Chat.Api Proxy + UI Polling |
8-12h, ~200 LOC |
10-13 |
UI + Chat.Api + Infra |
Available as upgrade |
| C: AGUI Custom Events |
15-25h |
4-5 |
Chat.Api + UI |
Rejected (high risk) |
Key Research Findings
- TOOL_CALL_RESULT confirmed emitted — Source code from
microsoft/agent-framework confirms MapAGUI emits TOOL_CALL_RESULT events in the SSE stream, carrying tool return content
- AGUIEvent model needs 3 properties —
Content, ToolCallId, ToolCallName are missing; tool result data is silently discarded during JSON deserialization
- UI cannot call Reporting.Api directly — all endpoints require
ChatApiAgent authorization (azp claim)
- APIM uses explicit operations — new routes require Bicep additions (~15 lines), but API-level policy auto-applies
- Blob enumeration concern —
GetMetadataAsync does O(N) scan; relevant if Approach B is pursued
- Approach A is fully additive — doesn't block adding B later
Acceptance Criteria
References
Summary
Show a Claude-style progress indicator with elapsed timer in the Chat UI when report generation is in progress. Currently, the user sees only three bouncing dots for 30-120+ seconds during the entire report generation flow (data fetch → report generation → status polling → reviewer validation), with no visual distinction between "thinking", "fetching data", or "generating report".
Research Document:
.copilot-tracking/research/2026-04-06/report-generation-progress-indicator-research.mdProblem
When a user requests a report via the chat interface, the Chat.Api agent:
RequestReporttool → POST to Reporting.Api → 202 Accepted (1-2s)GetReportStatustool while report generates in background (20-90s)During this entire 30-120+ second flow, the user sees only the generic typing indicator (three bouncing dots) — the same animation shown for a 2-second response.
Goal
Replace the generic typing indicator with a contextual progress indicator that shows:
RadzenProgressBarCircular, indeterminate)Xsorm:ssformatSimilar to Claude's "Thinking..." / "Analyzing..." indicator that shows transparency during long-running operations.
Implementation Approaches
Three approaches were researched and evaluated. Each approach is tracked as a sub-issue:
Key Research Findings
microsoft/agent-frameworkconfirmsMapAGUIemitsTOOL_CALL_RESULTevents in the SSE stream, carrying tool return contentContent,ToolCallId,ToolCallNameare missing; tool result data is silently discarded during JSON deserializationChatApiAgentauthorization (azp claim)GetMetadataAsyncdoes O(N) scan; relevant if Approach B is pursuedAcceptance Criteria
aria-labelon progress component, not color-onlyReferences
.copilot-tracking/research/2026-04-06/report-generation-progress-indicator-research.md.copilot-tracking/research/subagents/2026-04-06/(5 documents)