Files
ALwrity/frontend/src/pages/TeamActivityPage.tsx
ajaysi 923fa671fe feat: ContentGuardianAgent, onboarding UX, Team Activity action wiring, docs, agent help modal
ContentGuardianAgent consolidation:
- Merge 3 duplicate classes into single source in specialized/content_guardian.py
- Watchdog audit_committee() with heuristic scoring, coverage gaps, overlaps, alerts
- Remove misleading rejection_rate() helper; use acceptance_rate directly
- Integrate audit + alerts + trend signals into today_workflow_service.py

Team Activity page:
- QualityAuditPanel: health ring, per-agent critiques, coverage gaps, overlaps
- TrendSignalsPanel: opportunity cards with urgency/impact/coverage bars
- AlertBanner: persistent dismiss via POST /alerts/{id}/mark-read
- AgentHelpModal: dialog showing all 8 agents with descriptions, tools, schedule
- QualityAuditPanel action buttons: Fill gap -> /content-planning, Resolve overlap, View CTA on alerts/issues
- TrendSignalsPanel action buttons: Create content from this trend -> /blog-writer with trend context state

Onboarding system:
- Step 4 validation: no auto-pass via basic_ready; requires persona data or explicit progression
- Step 5 validation: logs warning on auto-pass without integration data
- OnboardingCompletionService: single DB session, transactional task creation, upsert pattern
- Business-without-website: nullable website_url on SIFIndexingTask and MarketTrendsTask
- DeepCompetitorAnalysisExecutor: 5-min timeout, 10-competitor cap, asyncio.wait_for
- Persona generation: async with 30s timeout, falls back to scheduler
- OnboardingProgressService.reset_onboarding(): resets session + pauses all DB tasks
- OnboardingControlService.reset_onboarding(): also cancels APScheduler jobs
- FinalStep TaskSchedulingPanel: shows scheduled/failed tasks after completion, 8s auto-redirect
- onboarding_completed agent activity event logged to feed

Documentation:
- docs-site/features/onboarding/: overview, steps, scheduler-tasks, technical-reference (4 pages)
- docs-site/mkdocs.yml: added Onboarding System nav section
- docs-site/features/sif-agents/: overview, agent-directory, committee-system, content-guardian (4 pages)
- docs-site/features/team-activity/: overview, quality-audit, trend-signals, alert-system (4 pages)
- docs-site/features/todays-workflow/: updated overview, technical-architecture, workflow-guide, api-reference
2026-06-01 12:24:31 +05:30

86 lines
3.4 KiB
TypeScript

import React, { useState } from 'react';
import { Box, Typography, Chip, Button } from '@mui/material';
import { useAgentHuddleFeed } from '../hooks/useAgentHuddleFeed';
import CommitteeSummary from '../components/TeamActivity/CommitteeSummary';
import CommitteeAuditTable from '../components/TeamActivity/CommitteeAuditTable';
import AlertBanner from '../components/TeamActivity/AlertBanner';
import AgentStatusPanel from '../components/TeamActivity/AgentStatusPanel';
import ActivityLog from '../components/TeamActivity/ActivityLog';
import QualityAuditPanel from '../components/TeamActivity/QualityAuditPanel';
import TrendSignalsPanel from '../components/TeamActivity/TrendSignalsPanel';
import AgentHelpModal from '../components/TeamActivity/AgentHelpModal';
const TeamActivityPage: React.FC = () => {
const { runs, events, alerts, approvals, connectionMode } = useAgentHuddleFeed();
const [auditMode, setAuditMode] = useState(false);
return (
<Box sx={{ p: 3 }}>
{/* Header */}
<Box sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 2 }}>
<Typography variant="h5" sx={{ fontWeight: 700, color: 'rgba(255,255,255,0.95)' }}>
Team Activity
</Typography>
<Box sx={{ display: 'flex', gap: 1.5, alignItems: 'center' }}>
<Chip
label={connectionMode === 'sse' ? 'Live' : 'Polling'}
size="small"
sx={{ height: 24, fontSize: 11, fontWeight: 600, bgcolor: connectionMode === 'sse' ? 'rgba(76,175,80,0.15)' : 'rgba(255,152,0,0.15)', color: connectionMode === 'sse' ? '#4caf50' : '#ff9800' }}
/>
<Button
size="small"
variant={auditMode ? 'contained' : 'outlined'}
onClick={() => setAuditMode(!auditMode)}
sx={{
fontSize: 12,
fontWeight: 600,
textTransform: 'none',
borderRadius: 2,
...(auditMode
? {
background: 'linear-gradient(135deg, rgba(102,126,234,0.8), rgba(118,75,162,0.8))',
color: '#fff',
boxShadow: '0 4px 15px rgba(102,126,234,0.3)',
}
: {
color: 'rgba(255,255,255,0.7)',
borderColor: 'rgba(255,255,255,0.2)',
'&:hover': { borderColor: 'rgba(255,255,255,0.4)', bgcolor: 'rgba(255,255,255,0.05)' },
}),
}}
>
{auditMode ? '← Summary' : 'Advanced Audit ▾'}
</Button>
<AgentHelpModal />
</Box>
</Box>
{auditMode ? (
<CommitteeAuditTable events={events} />
) : (
<>
{/* 1. Alerts + Approvals need attention */}
<AlertBanner alerts={alerts} approvals={approvals} />
{/* 2. Committee decision brief */}
<CommitteeSummary events={events} />
{/* 3. Quality audit (ContentGuardianAgent) */}
<QualityAuditPanel events={events} />
{/* 4. Trend signals (TrendSurferAgent) */}
<TrendSignalsPanel events={events} />
{/* 5. Agent health at a glance */}
<AgentStatusPanel events={events} runs={runs} alerts={alerts} />
{/* 6. Raw activity feed (collapsed by default) */}
<ActivityLog runs={runs} events={events} />
</>
)}
</Box>
);
};
export default TeamActivityPage;