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:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user