'use client'; import { motion } from 'framer-motion'; import { Eye, Sliders, Waypoints } from 'lucide-react'; import { useEffect, useState } from 'react'; // ─── Scenarios (the agent console cycles through these) ──────────────────── type Scenario = { agent: string; voice: string; voiceGradient: [string, string]; log: { prefix: string; text: string; tone: 'accent' | 'success' | 'dim' }[]; utterance: string; }; const SCENARIOS: Scenario[] = [ { agent: 'Claude Code', voice: 'Morgan', voiceGradient: ['#60a5fa', '#6366f1'], log: [ { prefix: '$', text: 'claude run', tone: 'accent' }, { prefix: '✓', text: 'Tests passing (42 files)', tone: 'success' }, { prefix: '✓', text: 'Build succeeded in 12.4s', tone: 'success' }, { prefix: '→', text: 'voicebox.speak({ profile: "Morgan" })', tone: 'dim' }, ], utterance: 'Tests passing. Ready to merge.', }, { agent: 'Cursor', voice: 'Scarlett', voiceGradient: ['#34d399', '#14b8a6'], log: [ { prefix: '$', text: 'cursor agent:deploy', tone: 'accent' }, { prefix: '✓', text: 'Migration applied (4 tables)', tone: 'success' }, { prefix: '✓', text: 'Deploy complete', tone: 'success' }, { prefix: '→', text: 'voicebox.speak({ profile: "Scarlett" })', tone: 'dim' }, ], utterance: 'Deploy shipped. Prod is green.', }, { agent: 'Cline', voice: 'Jarvis', voiceGradient: ['#a855f7', '#ec4899'], log: [ { prefix: '$', text: 'cline task:review', tone: 'accent' }, { prefix: '!', text: '3 files need attention', tone: 'dim' }, { prefix: '→', text: 'voicebox.speak({ profile: "Jarvis" })', tone: 'dim' }, ], utterance: 'Review ready. Three files to look at.', }, ]; const TONE_CLASSES: Record = { accent: 'text-accent', success: 'text-emerald-400/80', dim: 'text-ink-faint/70', }; // ─── Console mockup ───────────────────────────────────────────────────────── function AgentConsole({ scenario, cycleKey }: { scenario: Scenario; cycleKey: number }) { return (
{/* Titlebar */}
{scenario.agent}
{/* Body */}
{scenario.log.map((line, i) => ( {line.prefix} {line.text} ))}
{/* Idle cursor so the terminal doesn't feel empty */}
$
); } // ─── Desktop-floating pill stage ──────────────────────────────────────────── function AgentSpeakStage({ scenario, cycleKey }: { scenario: Scenario; cycleKey: number }) { return (
{/* Caption in the corner — "this is on the desktop, not in a terminal" */}
On your desktop
{/* Voice-tinted glow behind the pill */}
{/* Pill + utterance caption */}
Speaking · {scenario.voice}
{[0, 1, 2, 3, 4, 5].map((i) => ( ))}
“{scenario.utterance}”
); } // ─── Code panel ───────────────────────────────────────────────────────────── const MCP_CONFIG = `{ "mcpServers": { "voicebox": { "url": "http://127.0.0.1:17493/mcp" } } }`; const SPEAK_EXAMPLE = `// In any MCP-aware agent: await voicebox.speak({ text: "Deploy complete.", profile: "Morgan", })`; function CodePanel() { return (
{/* MCP config */}
01 Add Voicebox to your MCP config
          {MCP_CONFIG}
        
{/* Tool call */}
02 The tool is now available
          {SPEAK_EXAMPLE}
        
{/* Hint line */}
Also exposed as{' '} POST /speak for anything that doesn’t speak MCP — ACP, A2A, shell scripts, or custom harnesses.
); } // ─── Support bullets ──────────────────────────────────────────────────────── const BULLETS = [ { icon: Sliders, title: 'Per-agent voice', description: 'Bind each MCP client to a voice profile. Claude Code in Morgan, Cursor in Scarlett — you know which agent is talking without looking.', }, { icon: Eye, title: 'Always visible', description: 'Every agent-initiated speech surfaces the pill. No silent background TTS — you always see what’s coming out of your machine.', }, { icon: Waypoints, title: 'Open protocols', description: 'MCP ships day one. ACP, A2A, and anything else built on a tool-call primitive slots into the same endpoint.', }, ]; // ─── Section ──────────────────────────────────────────────────────────────── export function AgentIntegration() { const [idx, setIdx] = useState(0); useEffect(() => { const iv = window.setInterval(() => { setIdx((i) => (i + 1) % SCENARIOS.length); }, 4200); return () => window.clearInterval(iv); }, []); const scenario = SCENARIOS[idx]; return (
{/* Header */}
MCP

Every agent gets a voice.

One tool call —{' '} voicebox.speak — and any MCP-aware agent can talk to you in a voice you’ve cloned. Claude Code, Cursor, Cline, or anything that speaks MCP.

{/* Code (left) + console with pill stage stacked underneath (right) */}
{/* Bullets */}
{BULLETS.map((bullet) => { const Icon = bullet.icon; return (

{bullet.title}

{bullet.description}

); })}
); }