/** * Agent Ready page entry (agent-readiness-spec F1 + F4.5, Phase E Lane E3). * * Audit score hero, per-domain findings accordion with one-click fixes, * and agent-readiness feature toggles. * Loaded lazily by admin-shell-main.tsx for the * `llmagnet-ai-seo-agent-ready` submenu page. */ import { useCallback, useEffect, useState } from 'react'; import { Loader2, Radar } from 'lucide-react'; import { initEntry } from './hooks/use-bootstrap'; import { Button } from '@/components/ui/button'; import { ScoreHero } from '@/components/agent-ready/score-hero'; import { FindingsAccordion } from '@/components/agent-ready/findings-accordion'; import { FeatureToggles } from '@/components/agent-ready/feature-toggles'; import { applyFix, fetchResult, fetchSettings, runAudit, saveSettings, } from '@/components/agent-ready/api'; import type { AgentReadySettings, AuditResult } from '@/components/agent-ready/types'; import { __ } from './lib/i18n'; import './index.css'; initEntry('llmagnetAgentReadyData', 'Agent Ready'); function EmptyState({ running, onRun }: { running: boolean; onRun: () => void }) { return (

{__('Run your first Agent-Ready audit', 'llmagnet-llm-txt-generator')}

{__( 'A sampled audit (homepage + a few representative pages) scores your site across 7 domains of agent-readiness standards and shows exactly what to fix — much of it with one click.', 'llmagnet-llm-txt-generator', )}

); } export function AgentReadyApp() { const [result, setResult] = useState(null); const [settings, setSettings] = useState(null); const [loading, setLoading] = useState(true); const [running, setRunning] = useState(false); const [saving, setSaving] = useState(false); const [fixingId, setFixingId] = useState(null); const [error, setError] = useState(null); useEffect(() => { let cancelled = false; Promise.all([fetchResult().catch(() => null), fetchSettings().catch(() => null)]) .then(([resultData, settingsData]) => { if (cancelled) { return; } if (resultData && resultData.has_result) { setResult(resultData); } if (settingsData) { setSettings(settingsData); } }) .finally(() => { if (!cancelled) { setLoading(false); } }); return () => { cancelled = true; }; }, []); const handleRun = useCallback(() => { setRunning(true); setError(null); runAudit() .then(setResult) .catch((err: Error) => setError(err.message)) .finally(() => setRunning(false)); }, []); const handleFix = useCallback((checkId: string) => { setFixingId(checkId); setError(null); applyFix(checkId) .then((response) => { setResult((prev) => { if (!prev) { return prev; } const findings = prev.findings.map((finding) => finding.id === response.finding.id ? response.finding : finding, ); return response.summary ? { ...prev, ...response.summary, findings } : { ...prev, findings }; }); // Toggles may have flipped as part of the fix. return fetchSettings().then(setSettings); }) .catch((err: Error) => setError(err.message)) .finally(() => setFixingId(null)); }, []); const persistSettings = useCallback( (payload: Parameters[0]) => { setSaving(true); setError(null); saveSettings(payload) .then(setSettings) .catch((err: Error) => setError(err.message)) .finally(() => setSaving(false)); }, [], ); return (

{__('Agent Ready', 'llmagnet-llm-txt-generator')}

{__( 'Audit your site against current agent-readiness standards and fix the gaps — discovery files, machine-readable content, WebMCP, and security headers.', 'llmagnet-llm-txt-generator', )}

{error && (
{error}
)} {loading ? (
{' '} {__('Loading…', 'llmagnet-llm-txt-generator')}
) : ( <> {result ? ( ) : ( )} {result && ( )} {settings && ( persistSettings({ toggles: { [key]: value } })} onContentSignal={(key, value) => persistSettings({ content_signal: { [key]: value } }) } onSubOption={(key, value) => persistSettings({ [key]: value })} onSecurityHeader={(key, value) => persistSettings({ security_headers: { [key]: value } }) } /> )} )}
); }