'use client'; import { useEffect, useState } from 'react'; import { getManifest } from '@/lib/api'; import { useCopyFeedback } from '@/components/use-copy-feedback'; type ManifestState = 'idle' | 'loading' | 'loaded' | 'error'; export function ManifestViewer({ initialManifest, manifestPath, }: { initialManifest: string; manifestPath: string; }) { const [manifestText, setManifestText] = useState(initialManifest); const [state, setState] = useState(() => initialManifest ? 'loaded' : 'idle' ); const { copied, copyValue } = useCopyFeedback(); useEffect(() => { let cancelled = false; if (initialManifest) { // Hydrate with latest manifest once mounted. (async () => { try { const next = await getManifest(); if (cancelled) return; const text = next && typeof next === 'object' ? JSON.stringify(next, null, 2) : String(next ?? ''); setManifestText(text); setState('loaded'); } catch { if (!cancelled) { setState('error'); } } })(); return () => { cancelled = true; }; } const fetchManifest = async () => { setState('loading'); try { const manifest = await getManifest(); if (cancelled) return; const text = manifest && typeof manifest === 'object' ? JSON.stringify(manifest, null, 2) : String(manifest ?? ''); setManifestText(text); setState('loaded'); } catch (error) { if (!cancelled) { setState('error'); setManifestText('Failed to load manifest.'); } } }; fetchManifest(); return () => { cancelled = true; }; }, [initialManifest]); return (
📄

Agent Manifest

Complete agent specification served from{' '} {manifestPath}

â–¶ View Full Manifest JSON {state === 'loading' && (
)}
            {state === 'loading' ? (
              
Loading manifest…
) : ( manifestText || 'Manifest unavailable.' )}
); }