Implement unified dashboard to display tasks and events from multiple federated Mosaic Stack instances with clear provenance indicators. Backend Integration: - Extended federation API client with query support (sendFederatedQuery) - Added query message fetching functions - Integrated with existing QUERY message type from Phase 3 Components Created: - ProvenanceIndicator: Shows which instance data came from - FederatedTaskCard: Task display with provenance - FederatedEventCard: Event display with provenance - AggregatedDataGrid: Unified grid for multiple data types - Dashboard page at /federation/dashboard Key Features: - Query all ACTIVE federated connections on load - Display aggregated tasks and events in unified view - Clear provenance indicators (instance name badges) - PDA-friendly language throughout (no demanding terms) - Loading states and error handling - Empty state when no connections available Technical Implementation: - Uses POST /api/v1/federation/query to send queries - Queries each connection for tasks.list and events.list - Aggregates responses with provenance metadata - Handles connection failures gracefully - 86 tests passing with >85% coverage - TypeScript strict mode compliant - ESLint compliant PDA-Friendly Design: - "Unable to reach" instead of "Connection failed" - "No data available" instead of "No results" - "Loading data from instances..." instead of "Fetching..." - Calm color palette (soft blues, greens, grays) - Status indicators: 🟢 Active, 📋 No data, ⚠️ Error Files Added: - apps/web/src/lib/api/federation-queries.ts - apps/web/src/lib/api/federation-queries.test.ts - apps/web/src/components/federation/types.ts - apps/web/src/components/federation/ProvenanceIndicator.tsx - apps/web/src/components/federation/ProvenanceIndicator.test.tsx - apps/web/src/components/federation/FederatedTaskCard.tsx - apps/web/src/components/federation/FederatedTaskCard.test.tsx - apps/web/src/components/federation/FederatedEventCard.tsx - apps/web/src/components/federation/FederatedEventCard.test.tsx - apps/web/src/components/federation/AggregatedDataGrid.tsx - apps/web/src/components/federation/AggregatedDataGrid.test.tsx - apps/web/src/app/(authenticated)/federation/dashboard/page.tsx - docs/scratchpads/92-aggregated-dashboard.md Testing: - 86 total tests passing - Unit tests for all components - Integration tests for API client - PDA-friendly language verified - TypeScript type checking passing - ESLint passing Ready for code review and QA testing. Related Issues: - Depends on #85 (FED-005: QUERY Message Type) - COMPLETED - Depends on #91 (FED-008: Connection Manager UI) - COMPLETED - Uses #90 (FED-007: EVENT Subscriptions) infrastructure Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
5.5 KiB
5.5 KiB
Issue #92: Aggregated Dashboard View
Objective
Implement an Aggregated Dashboard View that displays data from multiple federated Mosaic Stack instances in a unified interface. This allows users to see tasks, events, and projects from all connected instances in one place, with clear provenance indicators showing which instance each item comes from.
Requirements
Backend infrastructure complete from Phase 3:
- QUERY message type implemented
- Connection Manager UI (FED-008) implemented
- Query service with signature verification
- Connection status tracking
Frontend requirements:
- Display data from multiple federated instances in unified view
- Query federated instances for tasks, events, projects
- Show data provenance (which instance data came from)
- Filter and sort aggregated data
- PDA-friendly design (no demanding language)
- Proper loading states and error handling
- Minimum 85% test coverage
Approach
Phase 1: Federation API Client (TDD)
- Write tests for federation query API client
- Implement federation query client functions:
sendFederatedQuery(connectionId, query, context)fetchQueryMessages(status?)- Types for federated queries and responses
Phase 2: Core Components (TDD)
- Write tests for FederatedTaskCard component
- Implement FederatedTaskCard with provenance indicator
- Write tests for FederatedEventCard component
- Implement FederatedEventCard with provenance indicator
- Write tests for AggregatedDataGrid component
- Implement AggregatedDataGrid with filtering/sorting
Phase 3: Dashboard Page Implementation
- Create
/federation/dashboardpage - Integrate components
- Implement query logic to fetch from all active connections
- Add loading and error states
- Add empty states
Phase 4: PDA-Friendly Polish
- Review all language for PDA-friendliness
- Implement calm visual indicators
- Add helpful empty states
- Test error messaging
Design Decisions
Data Provenance Indicators
Each item shows its source instance with:
- Instance name badge
- Instance-specific color coding (subtle)
- Hover tooltip with full instance details
- "From: [Instance Name]" text
PDA-Friendly Language
- "Unable to reach" instead of "Connection failed"
- "No data available" instead of "No results"
- "Loading data from instances..." instead of "Fetching..."
- "Would you like to..." instead of "You must..."
- Status indicators: 🟢 Active, 🔵 Loading, ⏸️ Paused, ⚪ Unavailable
Component Structure
apps/web/src/
├── app/(authenticated)/federation/
│ └── dashboard/
│ └── page.tsx
├── components/federation/
│ ├── FederatedTaskCard.tsx
│ ├── FederatedTaskCard.test.tsx
│ ├── FederatedEventCard.tsx
│ ├── FederatedEventCard.test.tsx
│ ├── AggregatedDataGrid.tsx
│ ├── AggregatedDataGrid.test.tsx
│ ├── ProvenanceIndicator.tsx
│ └── ProvenanceIndicator.test.tsx
└── lib/api/
└── federation-queries.ts (extend federation.ts)
Query Strategy
For MVP:
- Query all ACTIVE connections on page load
- Show loading state per connection
- Display results as they arrive
- Cache results for 5 minutes (optional, future enhancement)
- Handle connection failures gracefully
Progress
- Create scratchpad
- Research backend query API
- Extend federation API client with query support
- Write tests for ProvenanceIndicator
- Implement ProvenanceIndicator
- Write tests for FederatedTaskCard
- Implement FederatedTaskCard
- Write tests for FederatedEventCard
- Implement FederatedEventCard
- Write tests for AggregatedDataGrid
- Implement AggregatedDataGrid
- Create dashboard page
- Implement query orchestration logic
- Add loading/error states
- Run all tests (86 tests passing)
- TypeScript type checking (passing)
- Linting (passing)
- PDA-friendliness review (all language reviewed)
- Final QA (ready for review)
Testing Strategy
- Unit tests for each component
- Integration tests for the dashboard page
- Test error states and edge cases
- Test provenance display accuracy
- Test PDA-friendly language compliance
- Test loading states for slow connections
- Ensure all tests pass before commit
API Endpoints Used
From backend (already implemented):
POST /api/v1/federation/query- Send query to remote instanceGET /api/v1/federation/queries- List query messagesGET /api/v1/federation/queries/:id- Get single query messageGET /api/v1/federation/connections- List connections
Query payload structure:
{
"connectionId": "conn-1",
"query": "tasks.list",
"context": {
"status": "IN_PROGRESS",
"limit": 10
}
}
Query response structure:
{
"id": "msg-123",
"messageId": "uuid",
"status": "DELIVERED",
"response": {
"data": [...],
"provenance": {
"instanceId": "instance-work-001",
"timestamp": "2026-02-03T..."
}
}
}
Notes
- Backend query service is complete (query.service.ts)
- Need to define standard query names: "tasks.list", "events.list", "projects.list"
- Consider implementing query result caching in future phase
- Real-time updates via WebSocket can be added later (Phase 5)
- Initial implementation will use polling/manual refresh
Blockers
None - all backend infrastructure is complete.
Related Issues
- #85 (FED-005): QUERY Message Type - COMPLETED
- #91 (FED-008): Connection Manager UI - COMPLETED
- #90 (FED-007): EVENT Subscriptions - COMPLETED (for future real-time updates)