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
This commit is contained in:
ajaysi
2026-06-01 12:24:31 +05:30
parent 9b472f1c18
commit 923fa671fe
90 changed files with 8914 additions and 2731 deletions

View File

@@ -13,7 +13,7 @@ builtins.Union = typing.Union
from models.onboarding import APIKey, WebsiteAnalysis, ResearchPreferences, PersonaData, CompetitorAnalysis
from fastapi import FastAPI, HTTPException, Depends, Request, BackgroundTasks
from fastapi import FastAPI, HTTPException, Depends, Request, BackgroundTasks, Query
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import FileResponse
@@ -137,6 +137,11 @@ from api.seo_dashboard import (
get_sif_indexing_health,
get_guardian_audit,
get_keyword_gaps,
get_serp_gaps,
get_competitor_content,
get_content_gap_radar,
generate_content_from_gap,
GenerateContentRequest,
)
# Initialize FastAPI app
@@ -391,6 +396,64 @@ async def keyword_gaps_endpoint(
return await get_keyword_gaps(current_user, site_url)
@app.get("/api/seo-dashboard/serp-gaps")
async def serp_gaps_endpoint(
current_user: dict = Depends(get_current_user),
topics: Optional[List[str]] = None,
):
"""
Get SERP gap analysis — detect which competitors rank for given topics.
Uses Google Custom Search `site:` queries per competitor domain to detect
ranking presence. If no topics are provided, derives them from the user's
latest SIF semantic gap analysis (up to 12 topics).
"""
return await get_serp_gaps(current_user, topics)
@app.get("/api/seo-dashboard/competitor-content")
async def competitor_content_endpoint(
current_user: dict = Depends(get_current_user),
topics: Optional[List[str]] = None,
):
"""
Get competitor content deep-dive for gap topics using Exa.
Scopes Exa neural search to known competitor domains and returns
full text, highlights, and summaries for competitive analysis.
If no topics provided, derives up to 6 from the latest SIF semantic gaps.
"""
return await get_competitor_content(current_user, topics)
@app.get("/api/seo-dashboard/content-gap-radar")
async def content_gap_radar_endpoint(
current_user: dict = Depends(get_current_user),
bypass_cache: bool = Query(False, description="Bypass 24h cache"),
):
"""
Run the Content Gap Radar pipeline — full Phase 3 agent.
Orchestrates SIF semantic gap analysis, SERP ranking presence (Google CSE),
competitor content deep-dive (Exa), and trend momentum scoring into a single
ROI-ranked list of content opportunities.
"""
return await get_content_gap_radar(current_user, bypass_cache=bypass_cache)
@app.post("/api/seo-dashboard/content-gap-radar/generate-content")
async def generate_content_from_gap_endpoint(
request: GenerateContentRequest,
current_user: dict = Depends(get_current_user),
):
"""
Generate a content brief from a content gap radar item and save it
as a blog ContentAsset. Navigate to /blog-writer with the returned
asset_id to resume in the full Blog Writer workflow.
"""
return await generate_content_from_gap(request, current_user)
# Comprehensive SEO Analysis endpoints
@app.post("/api/seo-dashboard/analyze-comprehensive")
async def analyze_seo_comprehensive_endpoint(request: SEOAnalysisRequest):