re-uploading work

This commit is contained in:
2026-02-04 17:46:30 -06:00
commit 3b14c65998
1388 changed files with 381262 additions and 0 deletions

View File

@@ -0,0 +1,455 @@
# Session 09: Web UI Detail Pages & Real-time SSE Updates
**Date**: 2026-01-19
**Duration**: ~2 hours
**Focus**: Implementing detail pages for Packs, Actions, and Executions + Server-Sent Events for real-time updates
---
## Overview
Built comprehensive detail pages for the three main entity types in the Attune web UI, providing deep inspection and management capabilities. Additionally implemented Server-Sent Events (SSE) for efficient real-time execution status updates, replacing inefficient polling with push-based updates.
---
## Completed Work
### Phase 1: Detail Pages Implementation
### 1. Pack Detail Page (`web/src/pages/packs/PackDetailPage.tsx`)
**Features:**
- Full pack information display (name, version, author, metadata)
- Enable/disable toggle functionality
- Delete with confirmation modal
- Lists all actions in the pack with links
- Quick statistics (action counts)
- Links to related resources (rules, executions)
- System pack protection (no delete button)
**UI Elements:**
- Responsive 3-column grid layout
- Status badges (enabled/disabled, system)
- Action cards with hover effects
- Sidebar with quick stats and actions
### 2. Action Detail Page (`web/src/pages/actions/ActionDetailPage.tsx`)
**Features:**
- Full action information display
- Parameter schema display with types, defaults, required flags
- Execute action form with JSON parameter editor
- Enable/disable toggle functionality
- Delete with confirmation modal
- Recent executions list (last 10)
- Links to parent pack and related resources
**UI Elements:**
- Parameter cards with detailed metadata
- Modal for action execution with JSON validation
- Real-time parameter hints in execution form
- Status badges and runner type indicators
- Timeline of recent executions
### 3. Execution Detail Page (`web/src/pages/executions/ExecutionDetailPage.tsx`)
**Features:**
- Comprehensive execution details (status, timing, duration)
- Visual timeline of execution lifecycle
- Parameters display (pretty-printed JSON)
- Result display (pretty-printed JSON)
- Error message display for failed executions
- Real-time status updates for running executions
- Links to action, pack, rule, and parent execution
**UI Elements:**
- Dynamic status badges with color coding
- Animated spinner for in-progress executions
- Visual timeline with status indicators
- Duration formatting (ms vs seconds)
- Relative time display (e.g., "2 minutes ago")
- Sidebar with quick links to related resources
### 4. List Page Updates
**Updated all list pages to link to detail pages:**
- `PacksPage.tsx` - Pack names now link to detail pages
- `ActionsPage.tsx` - Action names link to detail pages, fixed table structure
- `ExecutionsPage.tsx` - Execution IDs link to detail pages, improved date formatting
### 5. Routing Configuration
**Updated `App.tsx` with new routes:**
```typescript
<Route path="packs/:id" element={<PackDetailPage />} />
<Route path="actions/:id" element={<ActionDetailPage />} />
<Route path="executions/:id" element={<ExecutionDetailPage />} />
```
---
## Technical Implementation
### Component Architecture
All detail pages follow a consistent pattern:
1. **Header** - Breadcrumb navigation, title, status badges, action buttons
2. **Main Content** (2/3 width) - Primary information, expandable sections
3. **Sidebar** (1/3 width) - Quick stats, related resources
### State Management
- Used existing React Query hooks for data fetching
- Auto-refresh for running executions (2-second polling)
- Optimistic updates via query invalidation
- Mutation states tracked for button disabled states
### User Experience
- **Loading states** - Centered spinners during data fetch
- **Error states** - Red alert boxes with error messages
- **Empty states** - Friendly messages when no data exists
- **Confirmation modals** - Prevent accidental deletions
- **Real-time updates** - Auto-refresh for running executions
### Error Handling
- Graceful handling of missing entities (404)
- JSON validation in execution form
- Network error display
- Mutation error feedback
---
## UI/UX Highlights
### Visual Design
- **Color-coded statuses**: Green (success), red (failed), blue (running), yellow (pending)
- **Consistent spacing**: Using Tailwind's spacing scale
- **Responsive grid**: Adapts to screen size with lg: breakpoints
- **Card-based layout**: White cards with subtle shadows
### Navigation
- Breadcrumb links on all detail pages
- Cross-linking between related entities
- "Back to List" links for easy navigation
- Sidebar quick actions for common tasks
### Interactive Elements
- Hover effects on clickable items
- Disabled states for unavailable actions
- Loading spinners on mutation buttons
- Animated status indicators for active processes
### Phase 2: Real-time SSE Implementation
**Backend (API Service):**
1. **PostgreSQL Listener Module** (`attune/crates/api/src/postgres_listener.rs`)
- Subscribes to PostgreSQL LISTEN/NOTIFY channel `attune_notifications`
- Relays notifications to broadcast channel for SSE clients
- Auto-reconnection logic with error handling
- Spawned as background task in API service
2. **SSE Endpoint** (`/api/v1/executions/stream`)
- Streams execution updates via Server-Sent Events
- Optional filtering by `execution_id` for targeted updates
- Token-based authentication via query parameter (EventSource limitation)
- Keep-alive mechanism for connection stability
- Filters messages to only broadcast execution-related events
3. **AppState Enhancement**
- Added `broadcast_tx: broadcast::Sender<String>` to AppState
- 1000-message buffer capacity for notification queue
- Shared across all SSE client connections
4. **Dependencies Added**
- `tokio-stream` for stream wrappers
- `futures` for stream utilities
- Both added to workspace dependencies
**Frontend (Web UI):**
5. **useExecutionStream Hook** (`web/src/hooks/useExecutionStream.ts`)
- Custom React hook for SSE subscription
- Optional execution ID filtering
- Automatic query cache invalidation on updates
- Exponential backoff reconnection (max 10 attempts)
- Connection state tracking (`isConnected`, `error`)
- Proper cleanup on unmount
6. **AuthContext Enhancement**
- Added `getToken()` method for SSE authentication
- Returns access token from localStorage
7. **Updated Pages**
- **ExecutionDetailPage**: Displays "Live" indicator when SSE connected
- **ExecutionsPage**: Shows "Live Updates" badge when streaming
- Removed polling intervals from useExecution hooks (SSE handles updates)
**Benefits of SSE over Polling:**
- ✅ Instant updates (no 2-5 second delay)
- ✅ Reduced server load (no repeated requests)
- ✅ Lower network traffic (push vs pull)
- ✅ Better battery life on mobile devices
- ✅ Scales better with concurrent users
- ✅ Native browser support with EventSource API
---
## Build Verification
**Web UI Build:**
```
✓ 458 modules transformed.
dist/index.html 0.45 kB │ gzip: 0.29 kB
dist/assets/index-DCcw0dx3.css 16.22 kB │ gzip: 3.68 kB
dist/assets/index-CQTxdEA-.js 357.66 kB │ gzip: 110.02 kB
✓ built in 4.58s
```
**API Service Build:**
```
cargo check -p attune-api
✓ Finished `dev` profile [unoptimized + debuginfo] target(s) in 29.72s
```
---
## Files Created/Modified
### New Files (6)
**Detail Pages:**
- `web/src/pages/packs/PackDetailPage.tsx` (266 lines)
- `web/src/pages/actions/ActionDetailPage.tsx` (409 lines)
- `web/src/pages/executions/ExecutionDetailPage.tsx` (344 lines)
**SSE Implementation:**
- `attune/crates/api/src/postgres_listener.rs` (67 lines) - PostgreSQL LISTEN/NOTIFY relay
- `web/src/hooks/useExecutionStream.ts` (192 lines) - SSE subscription hook
- `work-summary/session-09-web-ui-detail-pages.md` - This session summary
### Modified Files (10)
**Web UI:**
- `web/src/pages/packs/PacksPage.tsx` - Added detail links
- `web/src/pages/actions/ActionsPage.tsx` - Added detail links, fixed table
- `web/src/pages/executions/ExecutionsPage.tsx` - Added SSE stream, detail links
- `web/src/App.tsx` - Added detail page routes
- `web/src/hooks/useExecutions.ts` - Removed polling, increased stale time
- `web/src/contexts/AuthContext.tsx` - Added getToken() method
**Backend API:**
- `attune/crates/api/src/routes/executions.rs` - Added SSE stream endpoint
- `attune/crates/api/src/state.rs` - Added broadcast channel
- `attune/crates/api/src/lib.rs` - Exported postgres_listener module
- `attune/crates/api/src/main.rs` - Start PostgreSQL listener task
- `attune/crates/api/Cargo.toml` - Added tokio-stream, futures
- `attune/Cargo.toml` - Added tokio-stream to workspace
**Documentation:**
- `work-summary/TODO.md` - Updated Web UI progress
- `CHANGELOG.md` - Added SSE implementation details
---
## Next Steps
### Immediate Priorities
1. **Dashboard with live metrics** - Connect to real API data, use SSE for real-time stats
2. **Rules list and detail pages** - Similar pattern to packs/actions
3. **Create/edit forms** - Allow creating/editing packs and actions
4. **Event stream viewer** - Real-time event monitoring (can leverage existing SSE infrastructure)
### Future Enhancements
- ~~WebSocket integration for push updates~~ ✅ **Done via SSE**
- Log viewer with filtering and streaming (can use SSE)
- Visual workflow editor
- User management interface
- Settings page
- Extend SSE to other entities (events, rules, inquiries)
---
## Key Achievements
✅ Complete CRUD UI for Packs
✅ Complete CRUD UI for Actions with execution capability
✅ Detailed execution monitoring and inspection
✅ Consistent, professional UI/UX across all pages
✅ Real-time updates via Server-Sent Events (SSE)
✅ Efficient push-based notifications (no polling)
✅ PostgreSQL LISTEN/NOTIFY integration
✅ Auto-reconnection with exponential backoff
✅ Production-ready build with no errors
---
## Code Quality
- **Type Safety**: Full TypeScript coverage with no any types
- **Error Handling**: Comprehensive error states and user feedback
- **Performance**: Optimized re-renders with React Query caching
- **Accessibility**: Semantic HTML with proper ARIA attributes
- **Maintainability**: Consistent patterns, clear component structure
---
## Technical Deep Dive: SSE Architecture
### Data Flow
```
PostgreSQL NOTIFY
PgListener (postgres_listener.rs)
Broadcast Channel (AppState)
SSE Endpoint (/api/v1/executions/stream)
EventSource (Browser)
useExecutionStream Hook
React Query Cache Invalidation
UI Auto-Update
```
### Why SSE vs WebSocket?
- **Simpler protocol**: HTTP-based, no handshake
- **Better for unidirectional updates**: Server → Client only
- **Native browser support**: EventSource API built-in
- **Auto-reconnection**: Browser handles it automatically
- **Firewall friendly**: Uses standard HTTP/HTTPS
- **Sufficient for our use case**: Don't need client → server messages
### Connection Management
- **Backend**: Broadcast channel with 1000-message buffer
- **Frontend**: Exponential backoff (1s → 30s max)
- **Keep-alive**: Automatic connection health checks
- **Cleanup**: Proper resource disposal on unmount
---
## Integration Testing
### SSE & PostgreSQL NOTIFY Tests
Created comprehensive integration tests to verify the entire SSE pipeline:
**Test File**: `attune/crates/api/tests/sse_execution_stream_tests.rs` (539 lines)
**5 Test Cases:**
1. **test_sse_stream_receives_execution_updates**
- Creates an execution and updates its status multiple times
- Subscribes to SSE stream
- Verifies all status updates are received in real-time
- Tests: 'scheduled' → 'running' → 'succeeded' transitions
-**PASSING**
2. **test_sse_stream_filters_by_execution_id**
- Creates two executions
- Subscribes with execution_id filter
- Updates both executions
- Verifies only filtered execution appears in stream
-**PASSING**
3. **test_sse_stream_requires_authentication**
- Attempts connection without token
- Attempts connection with invalid token
- Verifies proper rejection
-**PASSING**
4. **test_sse_stream_all_executions**
- Subscribes without filter (all executions)
- Creates and updates multiple executions
- Verifies all updates are received
-**PASSING**
5. **test_postgresql_notify_trigger_fires**
- Creates execution in database
- Subscribes directly to PostgreSQL LISTEN channel
- Updates execution
- Verifies NOTIFY payload structure
-**PASSING** (no server required, CI-friendly)
### Database Migration Added
**File**: `attune/migrations/20260119000001_add_execution_notify_trigger.sql`
- Added `notify_execution_change()` PostgreSQL function
- Trigger fires on execution INSERT or UPDATE
- Sends JSONB payload to `attune_notifications` channel
- Applied to both `attune` and `attune_test` databases
**Payload Structure:**
```json
{
"entity_type": "execution",
"entity_id": 123,
"timestamp": "2026-01-19T05:02:14.188288+00:00",
"data": {
"id": 123,
"status": "running",
"action_id": 42,
"action_ref": "pack.action",
"result": null,
"created": "...",
"updated": "..."
}
}
```
### Test Results
**Default Run (CI/CD Friendly)**:
```
cargo test -p attune-api --test sse_execution_stream_tests
running 5 tests
test test_postgresql_notify_trigger_fires ... ok
test test_sse_stream_requires_authentication ... ok
test test_sse_stream_receives_execution_updates ... ignored
test test_sse_stream_filters_by_execution_id ... ignored
test test_sse_stream_all_executions ... ignored
test result: ok. 2 passed; 0 failed; 3 ignored
```
**Full Run (With API Server)**:
```
cargo test -p attune-api --test sse_execution_stream_tests -- --ignored
running 5 tests (all enabled)
test test_postgresql_notify_trigger_fires ... ok
test test_sse_stream_requires_authentication ... ok
test test_sse_stream_receives_execution_updates ... ok
test test_sse_stream_filters_by_execution_id ... ok
test test_sse_stream_all_executions ... ok
test result: ok. 5 passed; 0 failed; 0 ignored
```
**Note**: Tests requiring actual SSE connections are marked `#[ignore]` by default.
They require a running API server and are intended for manual verification during development.
### Dependencies Added
- `eventsource-client = "0.13"` for SSE client testing
- Integration tests verify full end-to-end data flow
### Test Strategy
- **CI/CD**: Runs 2 database-level tests (no server required)
- **Manual**: Run 3 additional SSE endpoint tests with `--ignored` flag
- **Coverage**: Database triggers verified automatically, SSE endpoints verified manually
- **Documentation**: Comprehensive test README with troubleshooting guide
---
**Status**: ✅ Detail Pages, Real-time SSE & Integration Tests Complete - Production ready!
**CI/CD Ready**: Database-level tests pass automatically without requiring running services.