+
🟢 RUN COMPLETED [STATUS: 200 OK]
{JSON.stringify(runTrace.final_output, null, 2)}
@@ -665,23 +668,25 @@ export default function AgentDetailPage() {
-
Ratings & Reviews
+
+ # ratings-and-reviews
+
{/* Ratings Distribution graph */}
-
+
- {agent.rating.toFixed(1)}
- / 5.0
+ {agent.rating.toFixed(1)}
+ / 5.0
-
-
+
+
-
Based on {totalReviews} reviews
+
Based on {totalReviews} reviews
{/* Graphical bars */}
@@ -690,12 +695,12 @@ export default function AgentDetailPage() {
const stars = 5 - idx
const pct = totalReviews > 0 ? (count / totalReviews) * 100 : 0
return (
-
-
{stars} Star
-
-
+
+
{stars} Star
+
-
{count}
+
{count}
)
})}
@@ -704,33 +709,34 @@ export default function AgentDetailPage() {
{/* Write a review form */}
@@ -758,23 +764,23 @@ export default function AgentDetailPage() {
{reviews.length > 0 ? (
reviews.map((rev, idx) => (
- {rev.user}
- {rev.date}
+ {rev.user}
+ {rev.date}
-
+
-
+
{rev.review}
))
) : (
-
+
No reviews submitted yet for this agent listing. Be the first to write one!
)}
@@ -791,29 +797,31 @@ export default function AgentDetailPage() {
left: 0,
width: '100%',
height: '100%',
- background: 'rgba(0, 0, 0, 0.7)',
- backdropFilter: 'blur(8px)',
+ background: 'rgba(0, 0, 0, 0.75)',
+ backdropFilter: 'blur(4px)',
display: 'flex',
alignItems: 'center',
- justify-content: 'center',
+ justifyContent: 'center',
zIndex: 1000
}}>
-
fork & Customize Agent
-
+
+ # fork-customize-agent
+
+
Create a derivative copy of {agent.name} . You'll be registered as the creator and can run customized instances.
- New Listing Name
+ New Listing Name
setRemixName(e.target.value)}
className="form-input"
- style={{ background: 'var(--bg-primary)' }}
+ style={{ background: 'var(--bg-primary)', width: '100%' }}
/>
@@ -830,7 +838,7 @@ export default function AgentDetailPage() {
onClick={() => setShowRemix(false)}
disabled={remixing}
className="btn btn-secondary"
- style={{ padding: '0.5rem 1rem' }}
+ style={{ padding: '0.4rem 1rem', fontSize: '0.8rem' }}
>
Cancel
@@ -838,9 +846,9 @@ export default function AgentDetailPage() {
type="submit"
disabled={remixing}
className="btn btn-primary"
- style={{ padding: '0.5rem 1.25rem' }}
+ style={{ padding: '0.4rem 1.25rem', fontSize: '0.8rem' }}
>
- {remixing ? '⏳ Remixing...' : 'Confirm Fork'}
+ {remixing ? 'Forking...' : 'confirm-fork'}
diff --git a/frontend/src/pages/AgentsPage.tsx b/frontend/src/pages/AgentsPage.tsx
index 61aa87a..0b5ad9f 100644
--- a/frontend/src/pages/AgentsPage.tsx
+++ b/frontend/src/pages/AgentsPage.tsx
@@ -3,6 +3,7 @@ import { useSearchParams } from 'react-router-dom'
import AgentCard from '../components/AgentCard'
import { fetchAgents, type AgentSummary } from '../api/client'
import { AgentGridSkeleton } from '../components/SkeletonLoader'
+import { SearchIcon, ShieldAlertIcon } from '../components/Icons'
export default function AgentsPage() {
const [searchParams, setSearchParams] = useSearchParams()
@@ -37,8 +38,7 @@ export default function AgentsPage() {
})
.catch((e) => setError(e.message))
.finally(() => {
- // Subtle simulated delay to showcase the beautiful skeleton loader shimmer
- setTimeout(() => setLoading(false), 600)
+ setTimeout(() => setLoading(false), 500)
})
}, [])
@@ -75,8 +75,8 @@ export default function AgentsPage() {
return (
-
Discover AI Agents
-
+
# agents
+
Browse specialized AI workers for code analysis, travel planner feeds, data cleaning, and email summaries.
@@ -85,7 +85,7 @@ export default function AgentsPage() {
{/* Search bar */}
-
@@ -133,14 +136,14 @@ export default function AgentsPage() {
className="btn"
style={{
padding: '0.4rem 0.9rem',
- fontSize: '0.8rem',
- borderRadius: '20px',
- background: isActive ? 'var(--gradient-primary)' : 'rgba(255, 255, 255, 0.04)',
- color: isActive ? 'white' : 'var(--text-secondary)',
- border: isActive ? 'none' : '1px solid var(--glass-border)',
+ fontSize: '0.75rem',
+ borderRadius: '0px',
+ background: isActive ? 'var(--color-primary)' : 'rgba(255, 255, 255, 0.03)',
+ color: isActive ? '#21252b' : 'var(--text-secondary)',
+ borderColor: isActive ? 'var(--color-primary)' : 'var(--glass-border)',
}}
>
- {cat}
+ {isActive ? `* ${cat}` : cat}
)
})}
@@ -150,14 +153,15 @@ export default function AgentsPage() {
{loading ? (
) : error ? (
-
- ⚠️
API Error: Could not retrieve agent manifests from the server ({error}). Running in offline sandbox simulation mode.
+
+
+ API Error: Could not retrieve agent manifests from the server ({error}). Running in offline sandbox simulation mode.
) : filteredAgents.length === 0 ? (
-
-
🔍
-
No Agents Found
-
+
+
🤖
+
No Agents Found
+
Try adjusting your search filters or select a different category.
- Clear Filters
+ clear-filters <~>
) : (
-
-
Showing {filteredAgents.length} agents
+
+ // Showing {filteredAgents.length} agents
{categoryParam !== 'All' && Filtered by Category: {categoryParam} }
diff --git a/frontend/src/pages/HomePage.tsx b/frontend/src/pages/HomePage.tsx
index f16f581..82f11df 100644
--- a/frontend/src/pages/HomePage.tsx
+++ b/frontend/src/pages/HomePage.tsx
@@ -1,15 +1,16 @@
import { Link } from 'react-router-dom'
+import { getCategoryIcon } from '../components/Icons'
export default function HomePage() {
const categories = [
- { name: 'Productivity', icon: '⚡', desc: 'Email managers, calendar assistants, and agenda creators.' },
- { name: 'Developer Tools', icon: '💻', desc: 'Code reviewers, issue triagers, and commit summarizers.' },
- { name: 'Career', icon: '🎯', desc: 'Resume auditors, job matchers, and portfolio planners.' },
- { name: 'Data Analysis', icon: '📊', desc: 'Spreadsheet formatters, outlier finders, and chart builders.' },
- { name: 'Education', icon: '🎓', desc: 'Flashcard generators, study guide builders, and tutorial summaries.' },
- { name: 'Travel', icon: '✈️', desc: 'Flight deal finders, hotel scrapers, and itinerary planners.' },
- { name: 'Communication', icon: '💬', desc: 'Meeting summary writers, notes formatters, and draft generators.' },
- { name: 'Finance', icon: '💰', desc: 'Expense auditors, burn rate calculations, and budgets.' }
+ { name: 'Productivity', desc: 'Email managers, calendar assistants, and agenda creators.' },
+ { name: 'Developer Tools', desc: 'Code reviewers, issue triagers, and commit summarizers.' },
+ { name: 'Career', desc: 'Resume auditors, job matchers, and portfolio planners.' },
+ { name: 'Data Analysis', desc: 'Spreadsheet formatters, outlier finders, and chart builders.' },
+ { name: 'Education', desc: 'Flashcard generators, study guide builders, and tutorial summaries.' },
+ { name: 'Travel', desc: 'Flight deal finders, hotel scrapers, and itinerary planners.' },
+ { name: 'Communication', desc: 'Meeting summary writers, notes formatters, and draft generators.' },
+ { name: 'Finance', desc: 'Expense audits, burn rate calculations, and budgets.' }
]
const stats = [
@@ -21,17 +22,17 @@ export default function HomePage() {
return (
-
- The App Store for AI Agents
-
+
+ # agent-store
+
Discover, simulate, fork, and review specialized AI agents that execute complex multi-step workflows using integrated marketplace tools.
-
-
- Browse AI Agents
+
+
+ view-agents <~>
-
- Explore Tools
+
+ explore-tools ≥
@@ -49,8 +50,8 @@ export default function HomePage() {
-
Browse by Category
- View All Agents →
+ # categories
+ View All Agents ~~>
{categories.map((cat, i) => (
@@ -59,8 +60,10 @@ export default function HomePage() {
to={`/agents?category=${encodeURIComponent(cat.name)}`}
className="category-card"
>
-
{cat.icon}
-
{cat.name}
+
+ {getCategoryIcon(cat.name, 24)}
+
+
{cat.name}
{cat.desc}
))}
diff --git a/frontend/src/pages/ToolsPage.tsx b/frontend/src/pages/ToolsPage.tsx
index ec887d2..8f8d576 100644
--- a/frontend/src/pages/ToolsPage.tsx
+++ b/frontend/src/pages/ToolsPage.tsx
@@ -2,6 +2,7 @@ import { useEffect, useState } from 'react'
import { Link } from 'react-router-dom'
import { fetchTools, fetchAgents, type Tool, type AgentSummary } from '../api/client'
import { ToolGridSkeleton } from '../components/SkeletonLoader'
+import { SearchIcon, ShieldAlertIcon, KeyIcon, ToolIcon } from '../components/Icons'
export default function ToolsPage() {
const [tools, setTools] = useState
([])
@@ -12,7 +13,6 @@ export default function ToolsPage() {
const [searchQuery, setSearchQuery] = useState('')
const [selectedCategory, setSelectedCategory] = useState('All')
- // Track open state of schemas for each tool by ID
const [openSchemas, setOpenSchemas] = useState>({})
useEffect(() => {
@@ -29,7 +29,6 @@ export default function ToolsPage() {
})
}, [])
- // Listen to hash fragments in URL (e.g. /tools#gmail_reader) to auto-scroll
useEffect(() => {
if (!loading && window.location.hash) {
const id = window.location.hash.replace('#', '')
@@ -38,7 +37,7 @@ export default function ToolsPage() {
setTimeout(() => {
element.scrollIntoView({ behavior: 'smooth', block: 'center' })
element.style.borderColor = 'var(--color-primary)'
- element.style.boxShadow = '0 0 20px rgba(99, 102, 241, 0.25)'
+ element.style.boxShadow = '0 0 20px rgba(199, 120, 221, 0.2)'
}, 100)
}
}
@@ -66,8 +65,8 @@ export default function ToolsPage() {
return (
-
Tools Registry
-
+
# tools
+
Explore external services and APIs that AI agents use to perform active read and write workflows.
@@ -76,7 +75,7 @@ export default function ToolsPage() {
{/* Search bar */}
-
@@ -108,11 +110,11 @@ export default function ToolsPage() {
className="btn"
style={{
padding: '0.4rem 0.9rem',
- fontSize: '0.8rem',
- borderRadius: '20px',
- background: isActive ? 'var(--gradient-primary)' : 'rgba(255, 255, 255, 0.04)',
- color: isActive ? 'white' : 'var(--text-secondary)',
- border: isActive ? 'none' : '1px solid var(--glass-border)',
+ fontSize: '0.75rem',
+ borderRadius: '0px',
+ background: isActive ? 'var(--color-primary)' : 'rgba(255, 255, 255, 0.03)',
+ color: isActive ? '#21252b' : 'var(--text-secondary)',
+ borderColor: isActive ? 'var(--color-primary)' : 'var(--glass-border)',
}}
>
{cat}
@@ -125,12 +127,13 @@ export default function ToolsPage() {
{loading ? (
) : error ? (
-
- ⚠️
API Error: Could not load registry tools ({error}). Running offline.
+
+
+ API Error: Could not load registry tools ({error}). Running offline.
) : filteredTools.length === 0 ? (
-
-
🛠️
+
+
🛠️
No Tools Found
Try adjusting your query filters.
@@ -139,7 +142,6 @@ export default function ToolsPage() {
) : (
{filteredTools.map((tool) => {
- // Find agents that depend on this tool
const dependentAgents = agents.filter((agent) =>
agent.tools_required.some((tId) => tId === tool.id)
)
@@ -152,35 +154,42 @@ export default function ToolsPage() {
style={{
background: 'var(--glass-bg)',
border: '1px solid var(--glass-border)',
- borderRadius: '16px',
+ borderRadius: '0px',
padding: '1.5rem',
display: 'flex',
flexDirection: 'column',
gap: '0.75rem',
- transition: 'all 0.3s ease',
+ transition: 'all 0.2s ease-in-out',
position: 'relative'
}}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.borderColor = 'var(--color-primary)'
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.borderColor = 'var(--glass-border)'
+ }}
>
{/* Header */}
-
{tool.name}
-
+ {tool.name}
+
{tool.category}
-
+
{tool.description}
{/* Permissions & Version */}
-
-
- 🔑 Access:{' '}
+
+
+
+ Access:{' '}
{tool.permission_level.replace('_', ' ').toUpperCase()}
@@ -193,30 +202,30 @@ export default function ToolsPage() {
toggleSchema(tool.id, 'input')}
className="btn btn-secondary"
- style={{ flex: 1, padding: '0.35rem', fontSize: '0.75rem', borderRadius: '6px' }}
+ style={{ flex: 1, padding: '0.35rem', fontSize: '0.75rem' }}
>
- {openSchemaType === 'input' ? '▲ Hide Input' : '▼ Show Input'}
+ {openSchemaType === 'input' ? '▲ hide-input' : '▼ show-input'}
toggleSchema(tool.id, 'output')}
className="btn btn-secondary"
- style={{ flex: 1, padding: '0.35rem', fontSize: '0.75rem', borderRadius: '6px' }}
+ style={{ flex: 1, padding: '0.35rem', fontSize: '0.75rem' }}
>
- {openSchemaType === 'output' ? '▲ Hide Output' : '▼ Show Output'}
+ {openSchemaType === 'output' ? '▲ hide-output' : '▼ show-output'}
{/* Schema display */}
{openSchemaType && (
{JSON.stringify(
@@ -228,8 +237,9 @@ export default function ToolsPage() {
)}
{/* Linked Agents list */}
-
-
+
+
+
USED BY AGENTS:
{dependentAgents.length > 0 ? (
@@ -239,21 +249,21 @@ export default function ToolsPage() {
key={agent.id}
to={`/agents/${agent.id}`}
style={{
- fontSize: '0.72rem',
- background: 'rgba(99, 102, 241, 0.08)',
- border: '1px solid rgba(99, 102, 241, 0.15)',
- color: '#c7d2fe',
- padding: '0.15rem 0.5rem',
- borderRadius: '4px',
+ fontSize: '0.7rem',
+ background: 'rgba(199, 120, 221, 0.08)',
+ border: '1px solid rgba(199, 120, 221, 0.15)',
+ color: 'var(--color-primary)',
+ padding: '0.2rem 0.5rem',
+ borderRadius: '0px',
transition: 'all 0.2s ease'
}}
onMouseEnter={(e) => {
- e.currentTarget.style.background = 'rgba(99, 102, 241, 0.2)'
+ e.currentTarget.style.background = 'rgba(199, 120, 221, 0.2)'
e.currentTarget.style.color = '#ffffff'
}}
onMouseLeave={(e) => {
- e.currentTarget.style.background = 'rgba(99, 102, 241, 0.08)'
- e.currentTarget.style.color = '#c7d2fe'
+ e.currentTarget.style.background = 'rgba(199, 120, 221, 0.08)'
+ e.currentTarget.style.color = 'var(--color-primary)'
}}
>
{agent.name.replace(' Agent', '')}
@@ -261,7 +271,7 @@ export default function ToolsPage() {
))}
) : (
-
+
No agents currently require this tool.
)}