feat(mission-control): add all missing pages
- Automation: AutoRun, ExecutionLogs, ChangeLog, Brainown, HorusAI - Projects: Tasks, TaskHistory, Monday - Trading: Trading Panel, Chart, Reports, Tools (placeholders) - Leads: Lead Manager - System: System Status, Skills Panel, Command Center, Projects Panel - Council: Agents roster, Sessions, Council Chat, Voice - All pages return 200 OK
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
"use client";
|
||||
|
||||
import Link from "next/link";
|
||||
|
||||
const AGENTS = [
|
||||
{ id: "thoth", name: "Thoth", role: "Strategy & Research", icon: "🦉", color: "#6366f1", status: "idle" },
|
||||
{ id: "ptah", name: "Ptah", role: "Dev & Ops", icon: "🛠️", color: "#f59e0b", status: "idle" },
|
||||
{ id: "seshat", name: "Seshat", role: "Content & SEO", icon: "📜", color: "#22c55e", status: "idle" },
|
||||
{ id: "anubis", name: "Anubis", role: "Outreach & Growth", icon: "🐕", color: "#ef4444", status: "idle" },
|
||||
{ id: "thoth-trading", name: "Thoth Trading", role: "Market Research", icon: "📈", color: "#10b981", status: "idle" },
|
||||
{ id: "sekhmet", name: "Sekhmet", role: "Trade Execution", icon: "🦁", color: "#fbbf24", status: "idle" },
|
||||
{ id: "hathor", name: "Hathor", role: "Personal Growth", icon: "💜", color: "#a855f7", status: "idle" },
|
||||
];
|
||||
|
||||
const SQUADS = [
|
||||
{
|
||||
name: "SiteMente Squad",
|
||||
icon: "🌐",
|
||||
agents: ["thoth", "ptah", "seshat", "anubis"],
|
||||
},
|
||||
{
|
||||
name: "Trading Squad",
|
||||
icon: "📈",
|
||||
agents: ["thoth-trading", "sekhmet"],
|
||||
},
|
||||
{
|
||||
name: "Personal",
|
||||
icon: "💜",
|
||||
agents: ["hathor"],
|
||||
},
|
||||
];
|
||||
|
||||
export default function AgentsPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-8">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">👥 Agent Roster</h1>
|
||||
<p className="text-slate-400">Manage your AI agent council</p>
|
||||
</div>
|
||||
|
||||
{SQUADS.map(squad => (
|
||||
<div key={squad.name} className="mb-8">
|
||||
<h2 className="text-xl font-semibold text-white mb-4 flex items-center gap-2">
|
||||
<span>{squad.icon}</span> {squad.name}
|
||||
</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4">
|
||||
{squad.agents.map(agentId => {
|
||||
const agent = AGENTS.find(a => a.id === agentId);
|
||||
if (!agent) return null;
|
||||
return (
|
||||
<Link
|
||||
key={agent.id}
|
||||
href={`/mission-control/agent/${agent.id}`}
|
||||
className="bg-slate-800 rounded-lg p-4 hover:bg-slate-700 transition-colors group"
|
||||
>
|
||||
<div className="flex items-center gap-3 mb-3">
|
||||
<div
|
||||
className="w-12 h-12 rounded-xl flex items-center justify-center text-2xl"
|
||||
style={{ backgroundColor: `${agent.color}20` }}
|
||||
>
|
||||
{agent.icon}
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="font-semibold text-white group-hover:text-brand-pink transition-colors">
|
||||
{agent.name}
|
||||
</h3>
|
||||
<p className="text-xs text-slate-400">{agent.role}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="w-2 h-2 rounded-full bg-green-500" />
|
||||
<span className="text-xs text-slate-500">{agent.status}</span>
|
||||
</div>
|
||||
</Link>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
|
||||
<div className="mt-8 p-4 bg-slate-800/50 rounded-lg">
|
||||
<p className="text-slate-400 text-sm">
|
||||
💡 Click any agent to view their command center with tasks, logs, and brainown outputs.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import AutoRunPanel from "@/components/mission-control/AutoRunPanel";
|
||||
|
||||
export default function AutoRunPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<AutoRunPanel />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import BrainownPanel from "@/components/mission-control/BrainownPanel";
|
||||
|
||||
export default function BrainownPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<BrainownPanel />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import ChangeLogPanel from "@/components/mission-control/ChangeLogPanel";
|
||||
|
||||
export default function ChangeLogPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<ChangeLogPanel />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
export default function CommandPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">⌨️ Command Center</h1>
|
||||
<p className="text-slate-400">Execute commands</p>
|
||||
</div>
|
||||
<div className="bg-slate-800 rounded-lg p-8 text-center">
|
||||
<p className="text-slate-400">Command center loading...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
import HorusChat from "@/components/mission-control/HorusChat";
|
||||
|
||||
export default function CouncilPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">🏛️ Council Chat</h1>
|
||||
<p className="text-slate-400">Chat with your agent council</p>
|
||||
</div>
|
||||
<HorusChat />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import ExecutionLogsPanel from "@/components/mission-control/ExecutionLogsPanel";
|
||||
|
||||
export default function ExecutionLogsPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<ExecutionLogsPanel />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
|
||||
const SKILLS = [
|
||||
{ id: "github", name: "GitHub", description: "Manage GitHub repositories", enabled: true },
|
||||
{ id: "healthcheck", name: "Health Check", description: "System security hardening", enabled: true },
|
||||
{ id: "tmux", name: "Tmux", description: "Remote-control tmux sessions", enabled: true },
|
||||
{ id: "weather", name: "Weather", description: "Weather forecasts via wttr.in", enabled: true },
|
||||
{ id: "tavily", name: "Tavily", description: "Web search and extraction", enabled: true },
|
||||
{ id: "coingecko", name: "CoinGecko", description: "Crypto prices and market data", enabled: true },
|
||||
{ id: "discord", name: "Discord", description: "Discord operations", enabled: false },
|
||||
{ id: "clawhub", name: "ClawHub", description: "Skill management", enabled: true },
|
||||
];
|
||||
|
||||
const APIS = [
|
||||
{ id: "perplexity", name: "Perplexity", status: "active", color: "green" },
|
||||
{ id: "openweather", name: "OpenWeather", status: "active", color: "green" },
|
||||
{ id: "newsapi", name: "NewsAPI", status: "active", color: "green" },
|
||||
{ id: "coingecko", name: "CoinGecko", status: "active", color: "green" },
|
||||
{ id: "tavily", name: "Tavily", status: "active", color: "green" },
|
||||
{ id: "elevenlabs", name: "ElevenLabs", status: "inactive", color: "yellow" },
|
||||
];
|
||||
|
||||
const AUTOMATIONS = [
|
||||
{ id: "morning-brief", name: "Morning Brief", schedule: "06:00 CET", enabled: true },
|
||||
{ id: "backups", name: "Backups", schedule: "02:00 CET", enabled: true },
|
||||
{ id: "health-checks", name: "Health Checks", schedule: "30min", enabled: true },
|
||||
{ id: "trading-scan", name: "Trading Scan", schedule: "30min", enabled: false },
|
||||
];
|
||||
|
||||
export default function HorusAIPage() {
|
||||
const [skills, setSkills] = useState(SKILLS);
|
||||
const [automations, setAutomations] = useState(AUTOMATIONS);
|
||||
|
||||
const toggleSkill = (id: string) => {
|
||||
setSkills(skills.map(s => s.id === id ? { ...s, enabled: !s.enabled } : s));
|
||||
};
|
||||
|
||||
const toggleAutomation = (id: string) => {
|
||||
setAutomations(automations.map(a => a.id === id ? { ...a, enabled: !a.enabled } : a));
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="p-6 max-w-6xl">
|
||||
<div className="mb-8">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">🤖 Horus AI</h1>
|
||||
<p className="text-slate-400">Manage skills, APIs, and automation toggles</p>
|
||||
</div>
|
||||
|
||||
{/* Skills */}
|
||||
<div className="mb-8">
|
||||
<h2 className="text-xl font-semibold text-white mb-4 flex items-center gap-2">
|
||||
<span>🎯</span> Skills
|
||||
</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
{skills.map(skill => (
|
||||
<div key={skill.id} className="bg-slate-800 rounded-lg p-4 flex items-center justify-between">
|
||||
<div>
|
||||
<h3 className="font-medium text-white">{skill.name}</h3>
|
||||
<p className="text-xs text-slate-400">{skill.description}</p>
|
||||
</div>
|
||||
<button
|
||||
onClick={() => toggleSkill(skill.id)}
|
||||
className={`w-12 h-6 rounded-full transition-colors ${
|
||||
skill.enabled ? "bg-green-500" : "bg-slate-600"
|
||||
}`}
|
||||
>
|
||||
<div className={`w-5 h-5 rounded-full bg-white transition-transform ${
|
||||
skill.enabled ? "translate-x-6" : "translate-x-0.5"
|
||||
}`} />
|
||||
</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* APIs */}
|
||||
<div className="mb-8">
|
||||
<h2 className="text-xl font-semibold text-white mb-4 flex items-center gap-2">
|
||||
<span>🔌</span> APIs
|
||||
</h2>
|
||||
<div className="bg-slate-800 rounded-lg overflow-hidden">
|
||||
<table className="w-full">
|
||||
<thead>
|
||||
<tr className="border-b border-slate-700">
|
||||
<th className="text-left p-3 text-slate-400 font-medium">API</th>
|
||||
<th className="text-left p-3 text-slate-400 font-medium">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{APIS.map(api => (
|
||||
<tr key={api.id} className="border-b border-slate-700/50">
|
||||
<td className="p-3 text-white">{api.name}</td>
|
||||
<td className="p-3">
|
||||
<span className={`inline-flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium ${
|
||||
api.color === "green" ? "bg-green-500/20 text-green-400" : "bg-yellow-500/20 text-yellow-400"
|
||||
}`}>
|
||||
<span className={`w-1.5 h-1.5 rounded-full ${
|
||||
api.color === "green" ? "bg-green-400" : "bg-yellow-400"
|
||||
}`} />
|
||||
{api.status}
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Automations */}
|
||||
<div className="mb-8">
|
||||
<h2 className="text-xl font-semibold text-white mb-4 flex items-center gap-2">
|
||||
<span>⚡</span> Automation
|
||||
</h2>
|
||||
<div className="bg-slate-800 rounded-lg overflow-hidden">
|
||||
<table className="w-full">
|
||||
<thead>
|
||||
<tr className="border-b border-slate-700">
|
||||
<th className="text-left p-3 text-slate-400 font-medium">Cron Job</th>
|
||||
<th className="text-left p-3 text-slate-400 font-medium">Schedule</th>
|
||||
<th className="text-left p-3 text-slate-400 font-medium">Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{automations.map(automation => (
|
||||
<tr key={automation.id} className="border-b border-slate-700/50">
|
||||
<td className="p-3 text-white">{automation.name}</td>
|
||||
<td className="p-3 text-slate-400">{automation.schedule}</td>
|
||||
<td className="p-3">
|
||||
<button
|
||||
onClick={() => toggleAutomation(automation.id)}
|
||||
className={`w-12 h-6 rounded-full transition-colors ${
|
||||
automation.enabled ? "bg-green-500" : "bg-slate-600"
|
||||
}`}
|
||||
>
|
||||
<div className={`w-5 h-5 rounded-full bg-white transition-transform ${
|
||||
automation.enabled ? "translate-x-6" : "translate-x-0.5"
|
||||
}`} />
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
|
||||
const LEAD_STATUSES = ["all", "new", "contacted", "qualified", "proposal", "won", "lost"];
|
||||
|
||||
const SAMPLE_LEADS = [
|
||||
{ id: 1, name: "Restaurante El Galeón", email: "info@galeon.es", phone: "+34 952 123 456", status: "qualified", source: "Website" },
|
||||
{ id: 2, name: "Clínica Dental Mar", email: "contacto@clinica-dental-mar.es", phone: "+34 951 234 567", status: "contacted", source: "Referral" },
|
||||
{ id: 3, name: "Inmobiliaria Sol", email: "info@inmobiliariasol.com", phone: "+34 953 345 678", status: "new", source: "Website" },
|
||||
];
|
||||
|
||||
export default function LeadsPage() {
|
||||
const [filter, setFilter] = useState("all");
|
||||
|
||||
const filteredLeads = filter === "all"
|
||||
? SAMPLE_LEADS
|
||||
: SAMPLE_LEADS.filter(l => l.status === filter);
|
||||
|
||||
const statusColors: Record<string, string> = {
|
||||
new: "bg-blue-500/20 text-blue-400",
|
||||
contacted: "bg-yellow-500/20 text-yellow-400",
|
||||
qualified: "bg-green-500/20 text-green-400",
|
||||
proposal: "bg-purple-500/20 text-purple-400",
|
||||
won: "bg-emerald-500/20 text-emerald-400",
|
||||
lost: "bg-red-500/20 text-red-400",
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">📋 Lead Manager</h1>
|
||||
<p className="text-slate-400">Manage your SiteMente leads</p>
|
||||
</div>
|
||||
|
||||
{/* Filters */}
|
||||
<div className="flex gap-2 mb-6 flex-wrap">
|
||||
{LEAD_STATUSES.map(status => (
|
||||
<button
|
||||
key={status}
|
||||
onClick={() => setFilter(status)}
|
||||
className={`px-4 py-2 rounded-lg text-sm font-medium transition-colors ${
|
||||
filter === status
|
||||
? "bg-brand-pink text-white"
|
||||
: "bg-slate-800 text-slate-400 hover:bg-slate-700"
|
||||
}`}
|
||||
>
|
||||
{status.charAt(0).toUpperCase() + status.slice(1)}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Table */}
|
||||
<div className="bg-slate-800 rounded-lg overflow-hidden">
|
||||
<table className="w-full">
|
||||
<thead>
|
||||
<tr className="border-b border-slate-700">
|
||||
<th className="text-left p-4 text-slate-400 font-medium">Name</th>
|
||||
<th className="text-left p-4 text-slate-400 font-medium">Email</th>
|
||||
<th className="text-left p-4 text-slate-400 font-medium">Phone</th>
|
||||
<th className="text-left p-4 text-slate-400 font-medium">Status</th>
|
||||
<th className="text-left p-4 text-slate-400 font-medium">Source</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{filteredLeads.map(lead => (
|
||||
<tr key={lead.id} className="border-b border-slate-700/50 hover:bg-slate-700/30">
|
||||
<td className="p-4 text-white font-medium">{lead.name}</td>
|
||||
<td className="p-4 text-slate-400">{lead.email}</td>
|
||||
<td className="p-4 text-slate-400">{lead.phone}</td>
|
||||
<td className="p-4">
|
||||
<span className={`px-2 py-1 rounded text-xs font-medium ${statusColors[lead.status]}`}>
|
||||
{lead.status}
|
||||
</span>
|
||||
</td>
|
||||
<td className="p-4 text-slate-400">{lead.source}</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<p className="text-slate-500 text-sm mt-4">
|
||||
Showing {filteredLeads.length} of {SAMPLE_LEADS.length} leads (database connection needed for full functionality)
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import MondayBoard from "@/components/mission-control/MondayBoard";
|
||||
|
||||
export default function MondayPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<MondayBoard />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
export default function ProjectsPanelPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">📁 Projects Panel</h1>
|
||||
<p className="text-slate-400">All projects overview</p>
|
||||
</div>
|
||||
<div className="bg-slate-800 rounded-lg p-8 text-center">
|
||||
<p className="text-slate-400">Projects panel loading...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import VoiceChat from "@/components/mission-control/VoiceChat";
|
||||
|
||||
export default function VoiceChatPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<VoiceChat />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
export default function SkillsPanelPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">🎯 Skills Panel</h1>
|
||||
<p className="text-slate-400">Manage OpenClaw skills</p>
|
||||
</div>
|
||||
<div className="bg-slate-800 rounded-lg p-8 text-center">
|
||||
<p className="text-slate-400">Skills panel loading...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
export default function SystemStatusPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">📡 System Status</h1>
|
||||
<p className="text-slate-400">Server health and monitoring</p>
|
||||
</div>
|
||||
<div className="bg-slate-800 rounded-lg p-8 text-center">
|
||||
<p className="text-slate-400">System status loading...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import TaskHistoryPanel from "@/components/mission-control/TaskHistoryPanel";
|
||||
|
||||
export default function TaskHistoryPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<TaskHistoryPanel />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
"use client";
|
||||
|
||||
import { TaskCardsPanel } from "@/components/mission-control/TaskCardsPanel";
|
||||
import { useState, useEffect } from "react";
|
||||
import { Task, TaskStatus } from "@/lib/mission-control/types";
|
||||
|
||||
const SAMPLE_TASKS: Task[] = [
|
||||
{ id: "1", title: "Complete SiteMente landing page", status: "todo", project: "sitemente", priority: "high", createdAt: "2026-03-22", agent: "ptah" },
|
||||
{ id: "2", title: "Write content for HostPioneers", status: "in_progress", project: "sitemente", priority: "medium", createdAt: "2026-03-21", agent: "seshat" },
|
||||
{ id: "3", title: "Deploy trading bot", status: "done", project: "trading", priority: "high", createdAt: "2026-03-20", agent: "sekhmet" },
|
||||
];
|
||||
|
||||
export default function TasksPage() {
|
||||
const [tasks, setTasks] = useState<Task[]>(SAMPLE_TASKS);
|
||||
|
||||
const toggleTask = (id: string) => {
|
||||
setTasks(tasks.map(t =>
|
||||
t.id === id
|
||||
? { ...t, status: t.status === "done" ? "todo" as TaskStatus : "done" as TaskStatus }
|
||||
: t
|
||||
));
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">📋 Task Board</h1>
|
||||
<p className="text-slate-400">Manage tasks across all projects</p>
|
||||
</div>
|
||||
<TaskCardsPanel tasks={tasks} toggleTask={toggleTask} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
export default function TradingChartPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">📊 Trading Chart</h1>
|
||||
<p className="text-slate-400">BTC, ETH, SOL price charts</p>
|
||||
</div>
|
||||
<div className="bg-slate-800 rounded-lg p-8 text-center">
|
||||
<p className="text-slate-400">Trading charts loading...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
export default function TradingReportsPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">📔 Trading Reports</h1>
|
||||
<p className="text-slate-400">P&L stats, win rate, trade history</p>
|
||||
</div>
|
||||
<div className="bg-slate-800 rounded-lg p-8 text-center">
|
||||
<p className="text-slate-400">Trading reports loading...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
"use client";
|
||||
|
||||
export default function TradingToolsPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<div className="mb-6">
|
||||
<h1 className="text-3xl font-bold text-white mb-2">🛠️ Trading Tools</h1>
|
||||
<p className="text-slate-400">Risk management, position sizing, etc.</p>
|
||||
</div>
|
||||
<div className="bg-slate-800 rounded-lg p-8 text-center">
|
||||
<p className="text-slate-400">Trading tools loading...</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import { TradingPanel } from "@/components/mission-control/TradingPanel";
|
||||
|
||||
export default function TradingPage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<TradingPanel />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
"use client";
|
||||
|
||||
import VoiceChat from "@/components/mission-control/VoiceChat";
|
||||
|
||||
export default function VoicePage() {
|
||||
return (
|
||||
<div className="p-6">
|
||||
<VoiceChat />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user