import { useCallback, useEffect, useMemo, useState, type ReactNode } from 'react' import { MdApps, MdDns, MdFolderOpen, MdMemory, MdRefresh, MdSchedule, MdSettingsApplications, MdStorage, MdViewModule, MdWarning, MdOpenInNew, MdArrowUpward, MdSearch, MdNoteAdd, MdDeleteForever, MdSave, MdStopCircle, MdComputer, MdCode, MdContentCopy, MdDataUsage, } from 'react-icons/md' import { IconButton } from './components/IconButton' import { formatBytes, formatSizeKb, formatUptime } from './utils/format' import type { DirEntry, DriveInfo, InstalledApp, NavId, NetworkRow, ProcessRow, ServiceRow, SystemSnapshot, } from './types' const api = typeof window !== 'undefined' ? window.auditor : undefined function useNotes() { const [map, setMap] = useState>({}) const refresh = useCallback(async () => { if (!api) return setMap(await api.notesGetAll()) }, []) useEffect(() => { void refresh() }, [refresh]) const setNote = useCallback( async (key: string, value: string) => { if (!api) return setMap(await api.notesSet(key, value)) }, [] ) const del = useCallback( async (key: string) => { if (!api) return setMap(await api.notesDelete(key)) }, [] ) return { map, refresh, setNote, del } } const NAV: { id: NavId; label: string; icon: ReactNode }[] = [ { id: 'overview', label: 'Overview', icon: }, { id: 'storage', label: 'Storage & volumes', icon: }, { id: 'filesystem', label: 'Folders & files', icon: }, { id: 'processes', label: 'Processes', icon: }, { id: 'services', label: 'Services', icon: }, { id: 'apps', label: 'Installed software', icon: }, { id: 'network', label: 'Network', icon: }, { id: 'environment', label: 'Environment', icon: }, { id: 'startup', label: 'Startup items', icon: }, { id: 'scheduled', label: 'Scheduled tasks', icon: }, { id: 'features', label: 'Windows features', icon: }, ] export default function App() { const [nav, setNav] = useState('overview') const [status, setStatus] = useState('') const [err, setErr] = useState('') const notes = useNotes() const [sys, setSys] = useState(null) const [drives, setDrives] = useState([]) const [path, setPath] = useState('') const [entries, setEntries] = useState([]) const [proc, setProc] = useState([]) const [svc, setSvc] = useState([]) const [apps, setApps] = useState([]) const [net, setNet] = useState([]) const [envText, setEnvText] = useState('') const [startupBlocks, setStartupBlocks] = useState<{ path: string; entries: DirEntry[] }[]>([]) const [tasks, setTasks] = useState<{ name: string; state: string }[]>([]) const [feat, setFeat] = useState('') const [tempAudit, setTempAudit] = useState<{ path: string; bytes: number; files: number; truncated: boolean }[]>( [] ) const [selectedKey, setSelectedKey] = useState(null) const [noteDraft, setNoteDraft] = useState('') const [largeRoot, setLargeRoot] = useState('') const [largeMinMb, setLargeMinMb] = useState(100) const [largeHits, setLargeHits] = useState<{ path: string; sizeBytes: number }[]>([]) const [folderTotal, setFolderTotal] = useState<{ bytes: number files: number truncated: boolean } | null>(null) const [procFilter, setProcFilter] = useState('') const [svcFilter, setSvcFilter] = useState('') const [appFilter, setAppFilter] = useState('') const clearMsg = () => { setErr('') setStatus('') } const loadSystem = useCallback(async (opts?: { silent?: boolean }) => { if (!api) return if (!opts?.silent) clearMsg() try { setSys((await api.system()) as SystemSnapshot) if (!opts?.silent) setStatus('System snapshot updated') } catch (e) { if (!opts?.silent) setErr(String((e as Error).message)) } }, []) const loadDrives = useCallback(async () => { if (!api) return clearMsg() try { setDrives((await api.drives()) as DriveInfo[]) setStatus('Volumes refreshed') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadDir = useCallback(async () => { if (!api || !path.trim()) return clearMsg() try { setStatus('Listing folder (measuring sizes)…') setEntries((await api.listDir(path.trim(), { maxEntries: 800 })) as DirEntry[]) setStatus('Directory listed') } catch (e) { setErr(String((e as Error).message)) } }, [path]) const loadProcesses = useCallback(async () => { if (!api) return clearMsg() setStatus('Loading processes…') try { const rows = (await api.processes()) as ProcessRow[] setProc(rows) setStatus(`Processes loaded (${rows.length})`) } catch (e) { setErr(String((e as Error).message)) } }, []) const loadServices = useCallback(async () => { if (!api) return clearMsg() setStatus('Loading services…') try { setSvc((await api.services()) as ServiceRow[]) setStatus('Services loaded') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadApps = useCallback(async () => { if (!api) return clearMsg() try { setApps((await api.installed()) as InstalledApp[]) setStatus('Installed programs enumerated') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadNetwork = useCallback(async () => { if (!api) return clearMsg() try { setNet((await api.network()) as NetworkRow[]) setStatus('Network interfaces read') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadEnv = useCallback(async () => { if (!api) return clearMsg() try { const o = (await api.env()) as Record const lines = Object.keys(o) .sort() .map((k) => `${k}=${o[k]}`) setEnvText(lines.join('\n')) setStatus('Environment loaded') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadStartup = useCallback(async () => { if (!api) return clearMsg() try { setStartupBlocks((await api.startup()) as { path: string; entries: DirEntry[] }[]) setStatus('Startup folders scanned') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadTasks = useCallback(async () => { if (!api) return clearMsg() setStatus('Loading scheduled tasks…') try { setTasks((await api.tasks()) as { name: string; state: string }[]) setStatus('Scheduled tasks loaded') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadFeatures = useCallback(async () => { if (!api) return clearMsg() setStatus('Querying optional features (may take a minute)…') try { setFeat(await api.features()) setStatus('Feature list retrieved') } catch (e) { setErr(String((e as Error).message)) } }, []) const loadTemp = useCallback(async () => { if (!api) return clearMsg() setStatus('Measuring temp folders…') try { setTempAudit( (await api.temp()) as { path: string; bytes: number; files: number; truncated: boolean }[] ) setStatus('Temp audit complete') } catch (e) { setErr(String((e as Error).message)) } }, []) useEffect(() => { if (!api) return void loadSystem() const t = setInterval(() => void loadSystem({ silent: true }), 60_000) return () => clearInterval(t) }, [loadSystem]) const [pathSeeded, setPathSeeded] = useState(false) useEffect(() => { if (!api || pathSeeded) return if (sys?.homedir) { setPath(sys.homedir) setPathSeeded(true) } }, [api, sys, pathSeeded]) useEffect(() => { if (selectedKey && notes.map[selectedKey] !== undefined) setNoteDraft(notes.map[selectedKey] ?? '') else if (selectedKey) setNoteDraft('') }, [selectedKey, notes.map]) const selectForNote = (key: string) => { setSelectedKey(key) setNoteDraft(notes.map[key] ?? '') } const saveNote = async () => { if (!selectedKey) return await notes.setNote(selectedKey, noteDraft) setStatus('Note saved') } const copyText = async (text: string) => { if (!api) return try { if (navigator.clipboard?.writeText) { await navigator.clipboard.writeText(text) } else { await api.clipboardWriteText(text) } setStatus('Copied to clipboard') } catch { try { await api.clipboardWriteText(text) setStatus('Copied to clipboard') } catch (e) { setErr(String((e as Error).message)) } } } const computeFolderTotal = async () => { if (!api || !path.trim()) return clearMsg() setStatus('Computing folder size (capped walk)…') try { const r = (await api.folderSize(path.trim())) as { bytes: number; files: number; truncated: boolean } setFolderTotal(r) setStatus( `Folder total ${formatSizeKb(r.bytes, { truncated: r.truncated })} — ${r.files} files counted${r.truncated ? ' (hit file cap)' : ''}` ) } catch (e) { setErr(String((e as Error).message)) } } const runLargeScan = async () => { if (!api) return const root = largeRoot.trim() || path.trim() if (!root) return clearMsg() setStatus('Scanning for large files…') try { const hits = (await api.largeFiles(root, largeMinMb * 1024 * 1024, 80)) as { path: string sizeBytes: number }[] setLargeHits(hits) setStatus(`Found ${hits.length} files`) } catch (e) { setErr(String((e as Error).message)) } } const killPid = async (pid: number) => { if (!api) return if (!window.confirm(`End process ${pid}? Unsaved data in that process may be lost.`)) return try { await api.killProcess(pid) setStatus(`Sent terminate to PID ${pid}`) void loadProcesses() } catch (e) { setErr(String((e as Error).message)) } } const openExplorer = async (p: string) => { if (!api) return try { await api.openExplorer(p) } catch (e) { setErr(String((e as Error).message)) } } const filteredProc = useMemo(() => { const q = procFilter.trim().toLowerCase() if (!q) return proc return proc.filter( (p) => p.name.toLowerCase().includes(q) || String(p.pid).includes(q) || (p.commandLine ?? '').toLowerCase().includes(q) ) }, [proc, procFilter]) const filteredSvc = useMemo(() => { const q = svcFilter.trim().toLowerCase() if (!q) return svc return svc.filter( (s) => s.name.toLowerCase().includes(q) || s.displayName.toLowerCase().includes(q) || s.state.toLowerCase().includes(q) ) }, [svc, svcFilter]) const filteredApps = useMemo(() => { const q = appFilter.trim().toLowerCase() if (!q) return apps return apps.filter( (a) => a.name.toLowerCase().includes(q) || a.publisher.toLowerCase().includes(q) || a.installLocation.toLowerCase().includes(q) ) }, [apps, appFilter]) if (!api) { return (

This UI must be run inside the Electron shell so it can reach your system. Use{' '} npm run dev.

) } const memUsed = sys ? sys.totalMem - sys.freeMem : 0 const memPct = sys && sys.totalMem ? Math.round((memUsed / sys.totalMem) * 100) : 0 return (

{NAV.find((n) => n.id === nav)?.label}

void loadSystem()}> {status && {status}} {err && {err}}
{nav === 'overview' && ( <>
Host
{sys?.hostname ?? '—'}
{sys?.userInfo}
Platform
{sys?.platform ?? '—'}
{sys?.release} / {sys?.arch}
Uptime
{sys ? formatUptime(sys.uptimeSec) : '—'}
Memory
{sys ? `${memPct}% used` : '—'}
{sys ? `${formatBytes(memUsed)} / ${formatBytes(sys.totalMem)}` : ''}
{sys && (
)}
CPU
{sys?.cpuCount ?? '—'} logical
{sys?.cpuModel}
Home & temp
{sys?.homedir}
{sys?.tmpdir}
void loadDrives()}> void loadTemp()}>
{drives.length > 0 && ( {drives.map((d) => { const pct = d.totalBytes ? Math.round((d.usedBytes / d.totalBytes) * 100) : 0 return ( ) })}
Volume Label Used Free Total
{d.letter} {d.label || '—'} {formatBytes(d.usedBytes)} ({pct}%) {formatBytes(d.freeBytes)} {formatBytes(d.totalBytes)} void openExplorer(d.mount + '\\')} > selectForNote(`drive:${d.letter}`)} >
)} {tempAudit.length > 0 && ( {tempAudit.map((t) => ( ))}
Temp path Size Files (sampled)
{t.path} {formatBytes(t.bytes)} {t.files} {t.truncated ? ' (cap reached)' : ''}
)}
)} {nav === 'storage' && ( <>
void loadDrives()}>
{drives.map((d) => { const pct = d.totalBytes ? Math.round((d.usedBytes / d.totalBytes) * 100) : 0 return ( ) })}
Volume Label Used Free Total
{d.letter} {d.label || '—'} {formatBytes(d.usedBytes)} ({pct}%)
{formatBytes(d.freeBytes)} {formatBytes(d.totalBytes)} void openExplorer(d.mount + '\\')}> selectForNote(`drive:${d.letter}`)}>
)} {nav === 'filesystem' && ( <>
setPath(e.target.value)} placeholder="Folder path" className="mono" style={{ flex: 1, minWidth: 280 }} /> void loadDir()}> setPath((p) => p.replace(/[/\\][^/\\]*$/, ''))}> void openExplorer(path)}> selectForNote(`path:${path}`)}> void copyText(path)}> void computeFolderTotal()}>
{folderTotal && (

Aggregated: {formatSizeKb(folderTotal.bytes, { truncated: folderTotal.truncated })} —{' '} {folderTotal.files} files {folderTotal.truncated ? ' (enumeration capped for safety)' : ''}

)}
setLargeRoot(e.target.value)} placeholder="Large-file scan root (defaults to path above)" className="mono" style={{ flex: 1, minWidth: 240 }} /> setLargeMinMb(Number(e.target.value) || 100)} title="Minimum size MB" /> void runLargeScan()}>
{entries.map((e) => ( e.isDirectory && setPath(e.fullPath)} > ))}
Name Type Size (KB)
{e.name} {e.isDirectory ? 'Folder' : 'File'} {e.error ? e.error : formatSizeKb(e.sizeBytes, { truncated: e.sizeTruncated })} {e.isDirectory && ( setPath(e.fullPath)}> )} void openExplorer(e.fullPath)}> selectForNote(`path:${e.fullPath}`)}>
{largeHits.length > 0 && ( <>

Large files

{largeHits.map((h) => ( ))}
Path Size (KB)
{h.path} {formatSizeKb(h.sizeBytes)} void openExplorer(h.path)}> selectForNote(`path:${h.path}`)}>
)} )} {nav === 'processes' && ( <>
void loadProcesses()}> setProcFilter(e.target.value)} style={{ minWidth: 240, flex: 1 }} />
{filteredProc.map((p) => ( ))}
PID Name Memory CPU (session est.)
{p.pid} {p.name} {formatBytes(p.memoryBytes)} {p.cpuSeconds != null ? `${p.cpuSeconds}s` : '—'} selectForNote(`proc:${p.pid}`)}> void killPid(p.pid)}>
)} {nav === 'services' && ( <>
void loadServices()}> setSvcFilter(e.target.value)} style={{ minWidth: 240, flex: 1 }} />
{filteredSvc.map((s) => ( ))}
Name Display name State Start
{s.name} {s.displayName} {s.state} {s.startType} selectForNote(`svc:${s.name}`)}>
)} {nav === 'apps' && ( <>
void loadApps()}> setAppFilter(e.target.value)} style={{ minWidth: 240, flex: 1 }} />
{filteredApps.map((a) => ( ))}
Name Version Publisher Location Est. size
{a.name} {a.version} {a.publisher} {a.installLocation || '—'} {a.estimatedSizeKb ? `${(a.estimatedSizeKb / 1024).toFixed(1)} MB` : '—'} {a.installLocation ? ( void openExplorer(a.installLocation)}> ) : null} selectForNote(`app:${a.name}`)}>
)} {nav === 'network' && ( <>
void loadNetwork()}>
{net.map((n, i) => ( ))}
Interface Address Family MAC Internal
{n.name} {n.address} {n.family} {n.mac ?? '—'} {n.internal ? 'yes' : 'no'} selectForNote(`net:${n.name}:${n.address}`)}>
)} {nav === 'environment' && ( <>
void loadEnv()}> selectForNote('env:all')}>