232 lines
7.6 KiB
TypeScript
232 lines
7.6 KiB
TypeScript
import { DashboardLayout } from "@/components/layout/sidebar";
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Input } from "@/components/ui/input";
|
|
import { Label } from "@/components/ui/label";
|
|
import { Badge } from "@/components/ui/badge";
|
|
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
|
|
import {
|
|
Wrench,
|
|
Plus,
|
|
FileCode,
|
|
Terminal,
|
|
Globe,
|
|
Database,
|
|
Mail,
|
|
Calendar,
|
|
CheckCircle2,
|
|
} from "lucide-react";
|
|
|
|
const installedTools = [
|
|
{
|
|
id: 1,
|
|
name: "File System Assistant",
|
|
description: "Organize, search, and manage local files",
|
|
category: "system",
|
|
status: "active",
|
|
lastUsed: "Today",
|
|
},
|
|
{
|
|
id: 2,
|
|
name: "Browser Automation",
|
|
description: "Web research, screenshots, form filling",
|
|
category: "web",
|
|
status: "active",
|
|
lastUsed: "Yesterday",
|
|
},
|
|
{
|
|
id: 3,
|
|
name: "Calendar Assistant",
|
|
description: "Apple Calendar + Google Calendar integration",
|
|
category: "calendar",
|
|
status: "active",
|
|
lastUsed: "Today",
|
|
},
|
|
{
|
|
id: 4,
|
|
name: "Email Assistant",
|
|
description: "Apple Mail + Gmail integration",
|
|
category: "email",
|
|
status: "active",
|
|
lastUsed: "Today",
|
|
},
|
|
{
|
|
id: 5,
|
|
name: "Daily Automation",
|
|
description: "Morning briefing orchestration",
|
|
category: "automation",
|
|
status: "active",
|
|
lastUsed: "Today",
|
|
},
|
|
];
|
|
|
|
const toolTemplates = [
|
|
{
|
|
name: "API Integration",
|
|
description: "Connect to external APIs",
|
|
icon: Globe,
|
|
category: "integration",
|
|
},
|
|
{
|
|
name: "Database Tool",
|
|
description: "Query and manage databases",
|
|
icon: Database,
|
|
category: "data",
|
|
},
|
|
{
|
|
name: "Script Runner",
|
|
description: "Execute custom scripts",
|
|
icon: Terminal,
|
|
category: "automation",
|
|
},
|
|
{
|
|
name: "Email Processor",
|
|
description: "Process and route emails",
|
|
icon: Mail,
|
|
category: "email",
|
|
},
|
|
{
|
|
name: "Calendar Sync",
|
|
description: "Sync multiple calendars",
|
|
icon: Calendar,
|
|
category: "calendar",
|
|
},
|
|
];
|
|
|
|
const categoryColors: Record<string, string> = {
|
|
system: "bg-blue-500/10 text-blue-500",
|
|
web: "bg-purple-500/10 text-purple-500",
|
|
calendar: "bg-green-500/10 text-green-500",
|
|
email: "bg-yellow-500/10 text-yellow-500",
|
|
automation: "bg-pink-500/10 text-pink-500",
|
|
integration: "bg-orange-500/10 text-orange-500",
|
|
data: "bg-cyan-500/10 text-cyan-500",
|
|
};
|
|
|
|
export default function ToolsPage() {
|
|
return (
|
|
<DashboardLayout>
|
|
<div className="space-y-6">
|
|
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">
|
|
<div>
|
|
<h1 className="text-3xl font-bold tracking-tight">Tool Builder</h1>
|
|
<p className="text-muted-foreground mt-1">
|
|
Create and manage custom tools and skills.
|
|
</p>
|
|
</div>
|
|
<Button>
|
|
<Plus className="w-4 h-4 mr-2" />
|
|
Build New Tool
|
|
</Button>
|
|
</div>
|
|
|
|
<Tabs defaultValue="installed" className="space-y-6">
|
|
<TabsList>
|
|
<TabsTrigger value="installed">Installed ({installedTools.length})</TabsTrigger>
|
|
<TabsTrigger value="templates">Templates</TabsTrigger>
|
|
<TabsTrigger value="builder">Quick Builder</TabsTrigger>
|
|
</TabsList>
|
|
|
|
<TabsContent value="installed" className="space-y-4">
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
{installedTools.map((tool) => (
|
|
<Card key={tool.id}>
|
|
<CardHeader className="pb-3">
|
|
<div className="flex items-start justify-between">
|
|
<div className="w-10 h-10 rounded-lg bg-secondary flex items-center justify-center">
|
|
<Wrench className="w-5 h-5" />
|
|
</div>
|
|
<Badge className={categoryColors[tool.category]}>
|
|
{tool.category}
|
|
</Badge>
|
|
</div>
|
|
<CardTitle className="text-base mt-3">{tool.name}</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-sm text-muted-foreground mb-4">
|
|
{tool.description}
|
|
</p>
|
|
<div className="flex items-center justify-between text-xs text-muted-foreground">
|
|
<span className="flex items-center gap-1">
|
|
<CheckCircle2 className="w-3 h-3 text-green-500" />
|
|
{tool.status}
|
|
</span>
|
|
<span>Last used: {tool.lastUsed}</span>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
))}
|
|
</div>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="templates" className="space-y-4">
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
{toolTemplates.map((template, i) => {
|
|
const Icon = template.icon;
|
|
return (
|
|
<Card key={i} className="cursor-pointer hover:shadow-md transition-shadow">
|
|
<CardHeader className="pb-3">
|
|
<div className="flex items-start justify-between">
|
|
<div className="w-10 h-10 rounded-lg bg-secondary flex items-center justify-center">
|
|
<Icon className="w-5 h-5" />
|
|
</div>
|
|
<Badge variant="outline">Template</Badge>
|
|
</div>
|
|
<CardTitle className="text-base mt-3">{template.name}</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-sm text-muted-foreground">
|
|
{template.description}
|
|
</p>
|
|
<Button variant="ghost" className="w-full mt-4">
|
|
Use Template
|
|
</Button>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
})}
|
|
</div>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="builder" className="space-y-4">
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>Quick Tool Builder</CardTitle>
|
|
</CardHeader>
|
|
<CardContent className="space-y-4">
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div className="space-y-2">
|
|
<Label>Tool Name</Label>
|
|
<Input placeholder="e.g., Stock Price Checker" />
|
|
</div>
|
|
<div className="space-y-2">
|
|
<Label>Category</Label>
|
|
<Input placeholder="e.g., finance" />
|
|
</div>
|
|
</div>
|
|
<div className="space-y-2">
|
|
<Label>Description</Label>
|
|
<Input placeholder="What does this tool do?" />
|
|
</div>
|
|
<div className="space-y-2">
|
|
<Label>Script / Command</Label>
|
|
<textarea
|
|
className="w-full min-h-[150px] p-3 rounded-md border border-input bg-background text-sm font-mono"
|
|
placeholder={`#!/bin/bash
|
|
# Your tool logic here
|
|
echo "Hello World"`}
|
|
/>
|
|
</div>
|
|
<div className="flex gap-2">
|
|
<Button>Build Tool</Button>
|
|
<Button variant="outline">Test</Button>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</TabsContent>
|
|
</Tabs>
|
|
</div>
|
|
</DashboardLayout>
|
|
);
|
|
}
|