# Project export: Voider

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2026
- Tagline: Voider is a voice-first shopping brain that orchestrates cross-platform price comparisons and secure, agentic payments to make buying as effortless as setting a timer.
- Devpost: https://devpost.com/software/voider
- GitHub: https://github.com/Sohamiscurious/TreeHacks2026
- Demo: https://voider-treehacks.vercel.app/
- Video: https://www.youtube.com/embed/ZoUQvbh24mM?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Result: winner ([Fetch.ai] Build, launch and monetise AI Agents on Agentverse that turn user intent into real outcomes. (Best Overall AI Agent Solution - $2500 Best Multi-Agent Workflow - $1500 Best Monetised Agent - $1000))
- Team: 3 GitHub contributor(s) — soham patil (15 commits), Sreeram Sreedhar (8 commits), Siddhant (6 commits)

## Devpost submission (written by the team)

### Inspiration

Ten years ago, setting a timer on an iPhone required unlocking the device, finding the Clock app, and manually scrolling through wheels of numbers. Today, that feels like ancient history - we just ask Siri. We believe commerce is currently stuck in that "manual" phase. Shopping today still requires endless scrolling, multi-step checkouts, and constant context-switching for routine purchases that shouldn't require that much cognitive load. We built Voider to bridge this gap, moving retail away from tedious manual labor toward an instant, zero-friction experience. Our goal is to make "buying" as effortless as "asking."

### What it does

Voider is a universal, voice-first shopping agent that eliminates the "app-hopping" tax. Instead of checking three different apps to find the best delivery fee, you just speak. Voider searches DoorDash, Walmart, and Amazon simultaneously, identifies the lowest price, and completes the transaction autonomously. The app operates in two distinct modes: Direct Orders: "Get me a 12-pack of Red Bull."* The agent benchmarks prices across all platforms, selects the cheapest total (including fees), and executes the payment via Visa instantly. Smart Recommendations:"I’m hungry, I'm in Palo Alto-find me something." Leveraging Elasticsearch, Voider analyzes your location, order history, and dietary preferences to suggest personalized dining options with real-time price comparisons. The "Set and Forget" Layer Voider doesn't just buy; it manages. It remembers your favorites, understands "the usual," and operates within user-defined budget guardrails to ensure the agent never spends more than you’ve authorized.

### How we built it

Voice: ElevenLabs Conversational AI (WebRTC) for low-latency, real-time speech. Brain: Claude 3.5 Sonnet orchestrates tool selection and complex reasoning. Commerce: Pluggable MCP architecture-DoorDash and Uber Eats are queried in parallel. Data: Bright Data scrapes live prices, indexed in Elasticsearch with Jina embeddings. Memory: Elasticsearch stores preferences and order history for hyper-personalized recommendations. Payments: Visa Agent Payment Protocol with tokenized credentials and strict budget limits. Agent Network: Fetch.ai uAgents for ASI:One discovery and payment protocol ($1 USDC/order). Frontend: Next.js 16 on Vercel with Generative UI product cards.

### Challenges we ran into

Reducing the latency of voice models was our biggest hurdle; achieving a "human" response time requires intense optimization of the inference pipeline. We also focused heavily on the UX of "eyes-free" shopping. Ensuring the agent could accurately filter through hundreds of results to find the one correct item without a visual confirmation required fine-tuning our ranking logic and tool-calling accuracy.

### Accomplishments we're proud of

Despite starting later than planned, we are incredibly proud of the end-to-end integration we achieved. Moving from a voice command to a verified, tokenized Visa payment across multiple third-party platforms in under 10 seconds was a massive technical win for us.

### What we learned

We dove deep into the world of AI agents, from mastering multi-turn orchestration to implementing the Fetch.ai uAgent protocol. We also learned the intricacies of real-time data scraping and how to handle structured data in a high-concurrency environment.

### What's next

We believe Voider solves a massive friction point in the modern "on-demand" economy. Moving forward, we want to expand our agent's reach to include travel booking and subscription management. As students, we're excited to keep iterating on this to see how far we can push the boundaries of autonomous commerce.

## README (from the GitHub repository)


##  Inspiration

Ten years ago, setting a timer on an iPhone required unlocking the device, finding the Clock app, and manually scrolling through wheels of numbers. Today, that feels like ancient history - we just ask Siri.

We believe commerce is currently stuck in that "manual" phase. Shopping today still requires endless scrolling, multi-step checkouts, and constant context-switching for routine purchases that shouldn't require that much cognitive load. We built Voider to bridge this gap, moving retail away from tedious manual labor toward an instant, zero-friction experience. Our goal is to make "buying" as effortless as "asking."

##  What it does

Voider is a universal, voice-first shopping agent that eliminates the "app-hopping" tax. Instead of checking three different apps to find the best delivery fee, you just speak. Voider searches DoorDash, Walmart, and Amazon simultaneously, identifies the lowest price, and completes the transaction autonomously.

The app operates in two distinct modes:

Direct Orders: "Get me a 12-pack of Red Bull."* The agent benchmarks prices across all platforms, selects the cheapest total (including fees), and executes the payment via Visa instantly.
Smart Recommendations:"I’m hungry, I'm in Palo Alto-find me something." Leveraging Elasticsearch, Voider analyzes your location, order history, and dietary preferences to suggest personalized dining options with real-time price comparisons.

### The "Set and Forget" Layer

Voider doesn't just buy; it manages. It remembers your favorites, understands "the usual," and operates within user-defined budget guardrails to ensure the agent never spends more than you’ve authorized.

##  How we built it

Voice: ElevenLabs Conversational AI (WebRTC) for low-latency, real-time speech.
Brain: Claude 3.5 Sonnet orchestrates tool selection and complex reasoning.
Commerce: Pluggable MCP architecture-DoorDash and Uber Eats are queried in parallel.
Data: Bright Data scrapes live prices, indexed in Elasticsearch with Jina embeddings.
Memory: Elasticsearch stores preferences and order history for hyper-personalized recommendations.
Payments: Visa Agent Payment Protocol with tokenized credentials and strict budget limits.
Agent Network: Fetch.ai uAgents for ASI:One discovery and payment protocol ($1 USDC/order).
* **Frontend:** Next.js 16 on Vercel with Generative UI product cards.

## Challenges we ran into

Reducing the latency of voice models was our biggest hurdle; achieving a "human" response time requires intense optimization of the inference pipeline. We also focused heavily on the UX of "eyes-free" shopping. Ensuring the agent could accurately filter through hundreds of results to find the one correct item without a visual confirmation required fine-tuning our ranking logic and tool-calling accuracy.

## Accomplishments that we're proud of

Despite starting later than planned, we are incredibly proud of the end-to-end integration we achieved. Moving from a voice command to a verified, tokenized Visa payment across multiple third-party platforms in under 10 seconds was a massive technical win for us.

## What we learned

We dove deep into the world of AI agents, from mastering multi-turn orchestration to implementing the Fetch.ai uAgent protocol. We also learned the intricacies of real-time data scraping and how to handle structured data in a high-concurrency environment.

## What's next for Voider

We believe Voider solves a massive friction point in the modern "on-demand" economy. Moving forward, we want to expand our agent's reach to include travel booking and subscription management. As students, we're excited to keep iterating on this to see how far we can push the boundaries of autonomous commerce.



## Detected evidence (automated analysis)

Indexed codebase: 103 recognized source files, 712 KB.
- Anthropic (technology) — detected in the code
- CSS (language) — detected in the code
- FastAPI (technology) — detected in the code
- Next.js (technology) — detected in the code
- OpenAI (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- LangChain (technology) — claimed on Devpost, not found in the code
- AI coding agent: Claude Code — evidence: config files committed to the repository

## Codebase structure (from repository index)

### Files (120 of 124)

```
.DS_Store
.gitignore
backend/.env.example
backend/agents/__init__.py
backend/agents/.env.example
backend/agents/api_router.py
backend/agents/compare_agent.py
backend/agents/gateway_agent.py
backend/agents/orchestrator_agent.py
backend/agents/payment_agent.py
backend/agents/search_agent.py
backend/agents/voicecart_agent.py
backend/agentverse/.env.example
backend/agentverse/app.py
backend/agentverse/README.md
backend/agentverse/requirements.txt
backend/app.py
backend/memory/__init__.py
backend/memory/main.py
backend/requirements.txt
backend/run_agents.py
backend/test_all.py
backend/test_memory.py
brightdata/main.py
CHECKOUT_IMPLEMENTATION.md
frontend/.DS_Store
frontend/.gitignore
frontend/app/api/checkout/complete/route.ts
frontend/app/api/checkout/create/route.ts
frontend/app/api/custom-llm/route.ts
frontend/app/api/location/route.ts
frontend/app/api/memories/route.ts
frontend/app/api/memory-context/route.ts
frontend/app/api/test-env/route.ts
frontend/app/api/webrtc-token/route.ts
frontend/app/globals.css
frontend/app/layout.tsx
frontend/app/page.tsx
frontend/app/product/[id]/page.tsx
frontend/CLAUDE.md
frontend/components.json
frontend/components/background-wave.tsx
frontend/components/Code.tsx
frontend/components/ConversationalCommerce.tsx
frontend/components/ConversationButton.tsx
frontend/components/logos.tsx
frontend/components/Orb.tsx
frontend/components/theme-provider.tsx
frontend/components/ui/accordion.tsx
frontend/components/ui/alert-dialog.tsx
frontend/components/ui/alert.tsx
frontend/components/ui/aspect-ratio.tsx
frontend/components/ui/avatar.tsx
frontend/components/ui/badge.tsx
frontend/components/ui/breadcrumb.tsx
frontend/components/ui/button.tsx
frontend/components/ui/calendar.tsx
frontend/components/ui/card.tsx
frontend/components/ui/carousel.tsx
frontend/components/ui/chart.tsx
frontend/components/ui/checkbox.tsx
frontend/components/ui/collapsible.tsx
frontend/components/ui/command.tsx
frontend/components/ui/context-menu.tsx
frontend/components/ui/dialog.tsx
frontend/components/ui/drawer.tsx
frontend/components/ui/dropdown-menu.tsx
frontend/components/ui/form.tsx
frontend/components/ui/hover-card.tsx
frontend/components/ui/input-otp.tsx
frontend/components/ui/input.tsx
frontend/components/ui/label.tsx
frontend/components/ui/menubar.tsx
frontend/components/ui/navigation-menu.tsx
frontend/components/ui/pagination.tsx
frontend/components/ui/popover.tsx
frontend/components/ui/progress.tsx
frontend/components/ui/radio-group.tsx
frontend/components/ui/resizable.tsx
frontend/components/ui/scroll-area.tsx
frontend/components/ui/select.tsx
frontend/components/ui/separator.tsx
frontend/components/ui/sheet.tsx
frontend/components/ui/sidebar.tsx
frontend/components/ui/skeleton.tsx
frontend/components/ui/slider.tsx
frontend/components/ui/sonner.tsx
frontend/components/ui/switch.tsx
frontend/components/ui/table.tsx
frontend/components/ui/tabs.tsx
frontend/components/ui/textarea.tsx
frontend/components/ui/toast.tsx
frontend/components/ui/toaster.tsx
frontend/components/ui/toggle-group.tsx
frontend/components/ui/toggle.tsx
frontend/components/ui/tooltip.tsx
frontend/components/ui/use-mobile.tsx
frontend/components/ui/use-toast.ts
frontend/elevenlabs-agent/agent_configs/shopify_buddy.json
frontend/elevenlabs-agent/agent_configs/voicecart_agent.json
frontend/elevenlabs-agent/agents.json
frontend/elevenlabs-agent/agents.lock
frontend/elevenlabs-agent/tests.json
frontend/elevenlabs-agent/tools.json
frontend/example.env.local
frontend/hooks/use-geolocation.ts
frontend/hooks/use-mobile.tsx
frontend/hooks/use-toast.ts
frontend/lib/utils.ts
frontend/next.config.mjs
frontend/next.config.ts
frontend/package.json
frontend/postcss.config.mjs
frontend/README.md
frontend/scripts/configure-agent.py
frontend/scripts/deploy-agent.sh
frontend/scripts/refresh-catalog-token.sh
frontend/scripts/requirements.txt
frontend/styles/globals.css
frontend/tailwind.config.ts
[4 more files omitted for size]
```

### Dependencies

- backend/agentverse/requirements.txt: httpx, langchain_mcp_adapters, openai, python-dotenv, uagents
- backend/requirements.txt: elasticsearch@>=8.12.0,<9.0.0, fastapi@>=0.109.0, httpx@>=0.26.0, openai@>=1.0.0, pydantic@>=2.5.0, python-dotenv@>=1.0.0, python-multipart@>=0.0.6, uagents@>=0.18.0, uagents-core@>=0.5.0, uvicorn[standard]@>=0.27.0
- frontend/package.json: @anthropic-ai/sdk@^0.74.0, @elevenlabs/elevenlabs-js@^2.17.0, @elevenlabs/react@^0.7.1, @emotion/is-prop-valid@latest, @mcp-ui/client@latest, @radix-ui/react-accordion@1.2.2, @radix-ui/react-alert-dialog@1.1.4, @radix-ui/react-aspect-ratio@1.1.1, @radix-ui/react-avatar@1.1.2, @radix-ui/react-checkbox@1.1.3, @radix-ui/react-collapsible@1.1.2, @radix-ui/react-context-menu@2.2.4, @radix-ui/react-dialog@1.1.4, @radix-ui/react-dropdown-menu@2.1.4, @radix-ui/react-hover-card@1.1.4, @radix-ui/react-label@2.1.1, @radix-ui/react-menubar@1.1.4, @radix-ui/react-navigation-menu@1.2.3, @radix-ui/react-popover@1.1.4, @radix-ui/react-progress@1.1.1, @radix-ui/react-radio-group@1.2.2, @radix-ui/react-scroll-area@1.2.2, @radix-ui/react-select@2.1.4, @radix-ui/react-separator@1.1.1, @radix-ui/react-slider@1.2.2, @radix-ui/react-slot@1.1.1, @radix-ui/react-switch@1.1.2, @radix-ui/react-tabs@1.1.2, @radix-ui/react-toast@1.2.4, @radix-ui/react-toggle@1.1.1, @radix-ui/react-toggle-group@1.1.1, @radix-ui/react-tooltip@1.1.6, @types/node@^22, @types/react@^18, @types/react-dom@^18, autoprefixer@^10.4.20, class-variance-authority@^0.7.1, clsx@^2.1.1, cmdk@1.0.4, framer-motion@latest, lucide-react@^0.454.0, next@14.2.16, postcss@^8.5, react@^18, react-dom@^18, react-resizable-panels@^2.1.7, tailwind-merge@^2.5.5, tailwindcss@^3.4.17, tailwindcss-animate@^1.0.7, typescript@^5
- frontend/scripts/requirements.txt: python-dotenv@>=1.0.0

### Recent commits (newest first)

- readme
- Rename VoiceCart to Voider in app.py
- Add langchain_mcp_adapters to requirements
- Enhance logging and error handling in app.py
- Integrate ASI:One LLM with Bright Data MCP
- Update requirements.txt
- Update requirements.txt with new dependencies
- agentverse
- only walmart
- cleanup
- cleanup
- cleaned
- minor edits
- Add end-to-end checkout flow with embedded payment pipeline and order history
- Merge remote-tracking branch 'refs/remotes/origin/main'
- Enhance ConversationalCommerce with memory tracking and user context integration
- Merge branch 'main' of https://github.com/Sohamiscurious/TreeHacks2026
- push
- updated location identifier
- added location identifier

## Key source files (fetched from GitHub, selected and truncated for size)

### CHECKOUT_IMPLEMENTATION.md

```markdown
# VoiceCart — Agentic Checkout Implementation Plan

## Goal

End-to-end agentic commerce: **User speaks → Agent finds product → Agent creates checkout → Embedded payment UI → Order confirmed** — all without leaving VoiceCart.

---

## Current State

| Component | Status | Details |
|-----------|--------|---------|
| Voice agent | Working | ElevenLabs WebRTC + Claude Haiku 4.5 LLM |
| Product search (Allbirds) | Working | Allbirds Storefront MCP with UI resources |
| Product search (Global) | Working | Shopify Catalog MCP with text fallback cards |
| Cart (Allbirds) | Working | `update_cart` creates cart, shows cart UI |
| Checkout | **Broken** | Cart iframe link doesn't open; no embedded checkout |
| Payment | **Not implemented** | No agentic payment flow |

### Credential Constraint

Our Shopify OAuth credentials (`619400cd...`) have scope `read_global_api_catalog_search` only. The Checkout MCP at `https://allbirds.com/api/ucp/mcp` returns **"Access disabled"** with these credentials. We need a different approach.

---

## Architecture: Two-Path Strategy

### Path A: Cart Permalink + Checkout Kit (Works NOW — no new credentials needed)

```
Agent finds product via Allbirds MCP
    → gets variant ID from product details
    → generates cart permalink: https://allbirds.com/cart/{variantId}:{qty}
    → opens in <shopify-checkout> web component (popup)
    → buyer completes payment on Shopify's trusted UI
    → checkout:complete event fires
    → agent confirms order via voice
```

**Why this works:** Cart permalinks are public URLs that create Shopify checkouts directly. The `<shopify-checkout>` web component from `@shopify/checkout-kit` can embed any Shopify checkout URL as a popup/sheet — no OAuth needed.

### Path B: Full Checkout MCP (Requires checkout-scoped credentials)

```
Agent finds product via Allbirds MCP
    → Next.js API route calls create_checkout via MCP
    → API route calls update_checkout with buyer info
    → Status: requires_escalation → get continue_url
    → opens continue_url in <shopify-checkout> web component
    → checkout:complete event fires
    → API route calls complete_checkout
    → agent confirms order via voice
```

**Why this is better:** Agent controls the entire checkout — can pre-fill buyer info, apply discounts, manage the state machine. This is true "agentic commerce."

**Blocker:** Need OAuth credentials with checkout scope. Options:
1. Register a new Shopify app with checkout permissions
2. Contact Shopify DevRel at TreeHacks for hackathon credentials
3. Use the Allbirds Storefront MCP's built-in checkout flow if it exposes one

### Implementation Priority

**Build Path A first** (guaranteed to work for demo), then upgrade to Path B if credentials are obtained.

---

## Implementation Steps

### Step 1: Install & Register Shopify Checkout Kit

**File:** `frontend/components/CheckoutSheet.tsx` (NEW)

Create a React wrapper around the `<shopify-checkout>` web component:

```tsx
'use client';

import { useEff
[truncated — 8002 more characters]
```

### frontend/CLAUDE.md

```markdown
# VoiceCart — Technical Documentation

## Project Overview
VoiceCart is a Next.js 14 voice-first agentic commerce application. Users speak to order food and products — the agent searches across multiple delivery platforms via MCP, compares prices, and places orders with Visa payment.

## Tech Stack
- **Framework**: Next.js 14.2.16 (React 18, App Router)
- **Language**: TypeScript
- **Styling**: Tailwind CSS + Framer Motion
- **UI Components**: Radix UI / shadcn/ui
- **Voice AI**: ElevenLabs Conversational AI (WebRTC)
- **Agent LLM**: Claude (Anthropic)
- **MCP Integration**: @mcp-ui/client for product card rendering
- **Deployment**: Vercel

## Project Structure

### Core Directories
- `/app` — Next.js App Router pages and API routes
- `/components` — React components (main app + shadcn/ui library)
- `/hooks` — Custom React hooks
- `/lib` — Utility functions
- `/public` — Static assets
- `/elevenlabs-agent` — Agent configuration files

### Key Files
- `app/page.tsx` — Landing page, renders ConversationalCommerce
- `app/layout.tsx` — Root layout with metadata
- `components/ConversationalCommerce.tsx` — Main orchestrator (voice + UI + MCP)
- `components/Orb.tsx` — Animated voice visualization
- `components/logos.tsx` — VoiceCart and GitHub logos
- `app/api/webrtc-token/route.ts` — ElevenLabs WebRTC token generation
- `elevenlabs-agent/agent_configs/voicecart_agent.json` — Agent persona and LLM config

## Application Flow

### Three View States
1. **Initial** — Landing with "Start Shopping" button
2. **Listening** — Animated orb, voice interaction active
3. **Results** — Compact header + horizontally scrollable product cards

### Voice Conversation Flow
1. User clicks "Start Shopping" → terms consent → microphone permission
2. Frontend fetches WebRTC token from `/api/webrtc-token`
3. ElevenLabs WebRTC connection established
4. Agent greets user, listens for requests
5. Agent calls MCP tools to search platforms
6. MCP resources rendered as product cards via UIResourceRenderer
7. User can interact with cards or continue voice conversation

### Client Tools
- `redirect_to_checkout` — Opens checkout URL in new tab
- `place_order` — Places order on selected platform (Visa payment in Phase 2)

## API Routes

### POST /api/webrtc-token
- Generates ElevenLabs WebRTC conversation token
- Falls back to demo mode if env vars missing
- Returns `{ conversationToken, isDemo }`

### GET /api/test-env
- Returns environment variable presence checks for debugging

## Environment Variables
```
ELEVENLABS_API_KEY — Required for voice agent
AGENT_ID — Required for voice agent
ANTHROPIC_API_KEY — Future: Claude Agent SDK
ELASTICSEARCH_URL — Future: context memory
ELASTICSEARCH_API_KEY — Future: context memory
BRIGHT_DATA_API_TOKEN — Future: web scraping
VISA_MCP_TOKEN — Future: agent payments
```

## Agent Configuration
Located at `elevenlabs-agent/agent_configs/voicecart_agent.json`:
- **LLM**: Claude (claude-3-5-sonnet)
- **Voice**: Jessica (eleven_turbo_v2)
- **Person
[truncated — 420 more characters]
```

### backend/requirements.txt

```
# VoiceCart Backend Dependencies
# ================================

# FastAPI and server
fastapi>=0.109.0

uvicorn[standard]>=0.27.0
python-multipart>=0.0.6

# Elasticsearch (pin to 8.x to match server version)
elasticsearch>=8.12.0,<9.0.0

# HTTP client for JINA API and external services
httpx>=0.26.0

# Data validation
pydantic>=2.5.0

# Environment variables
python-dotenv>=1.0.0

# Fetch.ai uAgents for Agentverse integration
uagents>=0.18.0
uagents-core>=0.5.0

# OpenAI client (for ASI:One API compatibility)
openai>=1.0.0

```

### frontend/package.json

```
{
  "name": "my-v0-project",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "build": "next build",
    "dev": "next dev",
    "lint": "next lint",
    "start": "next start"
  },
  "dependencies": {
    "@anthropic-ai/sdk": "^0.74.0",
    "@elevenlabs/elevenlabs-js": "^2.17.0",
    "@elevenlabs/react": "^0.7.1",
    "@emotion/is-prop-valid": "latest",
    "@mcp-ui/client": "latest",
    "@radix-ui/react-accordion": "1.2.2",
    "@radix-ui/react-alert-dialog": "1.1.4",
    "@radix-ui/react-aspect-ratio": "1.1.1",
    "@radix-ui/react-avatar": "1.1.2",
    "@radix-ui/react-checkbox": "1.1.3",
    "@radix-ui/react-collapsible": "1.1.2",
    "@radix-ui/react-context-menu": "2.2.4",
    "@radix-ui/react-dialog": "1.1.4",
    "@radix-ui/react-dropdown-menu": "2.1.4",
    "@radix-ui/react-hover-card": "1.1.4",
    "@radix-ui/react-label": "2.1.1",
    "@radix-ui/react-menubar": "1.1.4",
    "@radix-ui/react-navigation-menu": "1.2.3",
    "@radix-ui/react-popover": "1.1.4",
    "@radix-ui/react-progress": "1.1.1",
    "@radix-ui/react-radio-group": "1.2.2",
    "@radix-ui/react-scroll-area": "1.2.2",
    "@radix-ui/react-select": "2.1.4",
    "@radix-ui/react-separator": "1.1.1",
    "@radix-ui/react-slider": "1.2.2",
    "@radix-ui/react-slot": "1.1.1",
    "@radix-ui/react-switch": "1.1.2",
    "@radix-ui/react-tabs": "1.1.2",
    "@radix-ui/react-toast": "1.2.4",
    "@radix-ui/react-toggle": "1.1.1",
    "@radix-ui/react-toggle-group": "1.1.1",
    "@radix-ui/react-tooltip": "1.1.6",
    "autoprefixer": "^10.4.20",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "cmdk": "1.0.4",
    "framer-motion": "latest",
    "lucide-react": "^0.454.0",
    "next": "14.2.16",
    "react": "^18",
    "react-dom": "^18",
    "react-resizable-panels": "^2.1.7",
    "tailwind-merge": "^2.5.5",
    "tailwindcss-animate": "^1.0.7"
  },
  "devDependencies": {
    "@types/node": "^22",
    "@types/react": "^18",
    "@types/react-dom": "^18",
    "postcss": "^8.5",
    "tailwindcss": "^3.4.17",
    "typescript": "^5"
  }
}

```

### backend/agentverse/requirements.txt

```
openai
python-dotenv
httpx
uagents
langchain_mcp_adapters

```

### frontend/scripts/requirements.txt

```
# Requirements for ElevenLabs agent configuration script
python-dotenv>=1.0.0

```

### backend/app.py

```python
"""
VoiceCart Backend API
=====================
Main FastAPI application for VoiceCart - Voice-First Agentic Commerce.
"""

import os
from contextlib import asynccontextmanager

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from dotenv import load_dotenv

# Load environment variables
load_dotenv()

# Import routers
from memory import router as memory_router, initialize_memory_store, cleanup_memory_store
from agents.api_router import router as agent_router


@asynccontextmanager
async def lifespan(app: FastAPI):
    """Application lifespan handler."""
    # Startup
    print("🚀 VoiceCart API starting up...")
    await initialize_memory_store()
    yield
    # Shutdown
    print("👋 VoiceCart API shutting down...")
    await cleanup_memory_store()


app = FastAPI(
    title="VoiceCart API",
    description="Voice-First Agentic Commerce Backend",
    version="0.1.0",
    lifespan=lifespan,
)

# CORS middleware
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Configure appropriately for production
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Include routers
app.include_router(memory_router)
app.include_router(agent_router)


@app.get("/")
async def root():
    """Root endpoint."""
    return {
        "name": "VoiceCart API",
        "version": "0.1.0",
        "description": "Voice-First Agentic Commerce Backend",
        "docs": "/docs",
    }


@app.get("/health")
async def health():
    """Health check endpoint."""
    return {"status": "healthy"}


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        "app:app",
        host="0.0.0.0",
        port=int(os.getenv("PORT", 8000)),
        reload=True,
    )

```

### brightdata/main.py

```python
import os
import json
import asyncio
import logging
from dotenv import load_dotenv
from anthropic import Anthropic
from langchain_mcp_adapters.client import MultiServerMCPClient

# ============================================================
# CONFIG
# ============================================================

load_dotenv()

BRIGHTDATA_TOKEN = os.getenv("BRIGHTDATA_TOKEN")
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")

if not BRIGHTDATA_TOKEN:
    raise ValueError("Missing BRIGHTDATA_TOKEN")

if not ANTHROPIC_API_KEY:
    raise ValueError("Missing ANTHROPIC_API_KEY")

# Suppress MCP progress validation spam
logging.getLogger().setLevel(logging.ERROR)

MCP_URL = (
    f"https://mcp.brightdata.com/sse?"
    f"token={BRIGHTDATA_TOKEN}&groups=advanced_scraping,ecommerce"
)

anthropic_client = Anthropic(api_key=ANTHROPIC_API_KEY)

TIMEOUT = 45  # seconds per tool


# ============================================================
# CLAUDE COMPARISON
# ============================================================

def claude_compare(query, data):

    prompt = f"""
User query: {query}

You are a smart ecommerce comparison assistant.

1. Compare products across platforms.
2. Identify best price.
3. Consider availability.
4. Recommend best overall option.
5. Be concise but informative.

Marketplace Data:
{json.dumps(data, indent=2)}
"""

    response = anthropic_client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=1000,
        messages=[{"role": "user", "content": prompt}]
    )

    return response.content[0].text


# ============================================================
# SAFE TOOL WRAPPER (45s timeout)
# ============================================================

async def safe_tool_call(tool, payload, name):
    try:
        result = await asyncio.wait_for(
            tool.ainvoke(payload),
            timeout=TIMEOUT
        )
        return name, result
    except asyncio.TimeoutError:
        return name, {"error": "Timed out after 45 seconds"}
    except Exception as e:
        return name, {"error": str(e)}


# ============================================================
# MAIN AGENT
# ============================================================

async def main():

    user_query = input("🛒 What do you want? ")

    client = MultiServerMCPClient(
        {
            "brightdata": {
                "transport": "sse",
                "url": MCP_URL,
            }
        }
    )

    print("🔗 Connecting to Bright Data...")
    tools = await client.get_tools()
    tool_map = {tool.name: tool for tool in tools}

    print(f"✅ Loaded {len(tool_map)} tools\n")

    tasks = []

    # -------------------------------------------------------
    # AMAZON
    # -------------------------------------------------------

    if "web_data_amazon_product_search" in tool_map:
        tasks.append(
            safe_tool_call(
                tool_map["web_data_amazon_product_search"],
                {
                    "keyword": user_query,
                    "url": "https://www.amazon.com"
                },
                "amazon"
            )
        )

    # -------------------------------------------------------
    # WALMART via Google SERP
    # -------------------------------------------------------

    if "search_engine" in tool_map:
        tasks.append(
            safe_tool_call(
                tool_map["search_engine"],
                {
                    "engine": "google",
                    "query": f"{user_query} site:walmart.com",
                    "num_results": 5
                },
                "walmart_search"
            )
        )

        tasks.append(
            safe_tool_call(
                tool_map["search_engine"],
                {
                    "engine": "google",
                    "query": f"{user_query} site:ebay.com",
                    "num_results": 5
                },
                "ebay_search"
            )
        )

    # -------------------------------------------------------
    # DOORDASH
    # -------------------------------------------------------

    if "scrape_as_markdown" in tool_map:
        tasks.append(
            safe_tool_call(
                tool_map["scrape_as_markdown"],
                {
                    "url": f"https://www.doordash.com/search/store/{user_query}/"
                },
                "doordash"
            )
        )

    print("🚀 Running marketplace queries in parallel...\n")

    results_list = await asyncio.gather(*tasks)

    results = {name: data for name, data in results_list}
    from pprint import pprint
    pprint(results, indent=4)
    # -------------------------------------------------------
    # CLAUDE COMPARISON
    # -------------------------------------------------------

    print("🧠 Asking Claude to compare results...\n")

    summary = claude_compare(user_query, results)

    print("\n====================================")
    print("🛍️ AI SHOPPING RECOMMENDATION")
    print("====================================\n")
    print(summary)

    with open("comparison_results.json", "w") as f:
        json.dump(results, f, indent=2)

    print("\n💾 Raw marketplace data saved to comparison_results.json")


if __name__ == "__main__":
    asyncio.run(main())

```

### frontend/app/page.tsx

```typescript
import { ConversationalCommerce } from "@/components/ConversationalCommerce";

export default function Home() {
  return (
    <div className="w-full h-full">
      <main className="w-full h-full">
        <ConversationalCommerce />
      </main>
    </div>
  );
}

```

### frontend/app/layout.tsx

```typescript
import type React from "react";
import type { Metadata } from "next";
import "./globals.css";
import { BackgroundWave } from "@/components/background-wave";

export const metadata: Metadata = {
  title: "VoiceCart — Talk to Buy Anything",
  description:
    "Your AI shopping agent understands you, finds it, and pays for it. Voice-first agentic commerce across every platform.",
  icons: {
    icon: [
      { url: "/favicon.ico", sizes: "any" },
      { url: "/Avatar.png", type: "image/png" },
    ],
    apple: "/apple-touch-icon.png",
  },
  openGraph: {
    title: "VoiceCart — Talk to Buy Anything",
    description:
      "Your AI shopping agent understands you, finds it, and pays for it. Voice-first agentic commerce across every platform.",
    images: [
      {
        url: "/eleven_shopping_og.png",
        width: 1200,
        height: 630,
        alt: "VoiceCart — Voice-First Agentic Commerce",
      },
    ],
    type: "website",
  },
  twitter: {
    card: "summary_large_image",
    title: "VoiceCart — Talk to Buy Anything",
    description:
      "Your AI shopping agent understands you, finds it, and pays for it. Voice-first agentic commerce across every platform.",
    images: ["/eleven_shopping_og.png"],
  },
};

export default function RootLayout({
  children,
}: Readonly<{ children: React.ReactNode }>) {
  return (
    <html lang="en" className={"h-full w-full"}>
      <body className={`antialiased w-full h-full flex flex-col`}>
        <div className="flex flex-col flex-grow w-full">
          {children}
          <BackgroundWave />
        </div>
      </body>
    </html>
  );
}

```

[92 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]