'use client' import { useState, useEffect, useRef } from 'react' import Image from 'next/image' import { Eye } from 'lucide-react' const slides = [ { label: 'Dashboard', src: '/dashboard.png', alt: 'Greywall dashboard showing total requests, allowed, blocked, and allow rate stats', }, { label: 'Pending', src: '/pending_requests.png', alt: 'Greywall pending network requests with Allow and Deny controls for each domain', }, { label: 'Rules', src: '/rules.png', alt: 'Greywall domain rules configuration showing allow and deny policies per source', }, { label: 'Activity', src: '/activity.png', alt: 'Greywall activity log showing real-time TCP connections with status, source, destination, and duration', }, { label: 'Conversations', src: '/conversations.png', alt: 'Greywall conversations view showing agent interactions with tool calls and results', }, ] const INTERVAL = 4000 export function Observability() { const [active, setActive] = useState(0) const [paused, setPaused] = useState(false) const timerRef = useRef | null>(null) // Key to force re-mount of the progress bar so animation restarts const [tick, setTick] = useState(0) function goTo(i: number) { setActive(i) setTick((t) => t + 1) resetTimer() } function advance() { setActive((i) => (i + 1) % slides.length) setTick((t) => t + 1) } function resetTimer() { if (timerRef.current) clearInterval(timerRef.current) if (!paused) { timerRef.current = setInterval(advance, INTERVAL) } } useEffect(() => { if (paused) { if (timerRef.current) clearInterval(timerRef.current) return } timerRef.current = setInterval(advance, INTERVAL) return () => { if (timerRef.current) clearInterval(timerRef.current) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [paused]) return (
Clarity

See every file access and network connection.

You can't predict which files your agent will read or which domains it will reach for. Greywall learns what the agent needs on your filesystem automatically and captures every outbound connection, letting you adjust policies in real time without restarting the session.

setPaused(true)} onMouseLeave={() => setPaused(false)} > {/* Screenshot with crossfade */}
{/* Hidden reference image to lock container height */} {slides.map((slide, i) => ( {slide.alt} ))}
{/* Progress indicators + labels */}
{slides.map((slide, i) => ( ))}

Every outbound request is visible. Allow trusted domains, block unknown ones, and adjust policies live as your agent works.

) }