import { useState } from "react"; import Navbar from "../components/Navbar"; import type { AgentSignal, AnalystReport, DebateRound, TradingDecision } from "../types/agents"; type AnalysisStep = "input" | "analysts" | "researchers" | "trader" | "decision"; interface AnalysisState { ticker: string; date: string; analysts: AnalystReport[]; debates: DebateRound[]; decision: TradingDecision | null; isLoading: boolean; error: string | null; } const SignalBadge = ({ signal }: { signal: AgentSignal["signal"] }) => { const colors = { bullish: "bg-green-100 text-green-800", bearish: "bg-red-100 text-red-800", neutral: "bg-gray-100 text-gray-800", }; return ( {signal} ); }; export const meta = () => { return [ { title: "Analyze - AITrader" }, { name: "description", content: "Multi-agent trading analysis with dataflow visualization" }, ]; }; export default function Analyze() { const [state, setState] = useState({ ticker: "", date: new Date().toISOString().split("T")[0], analysts: [], debates: [], decision: null, isLoading: false, error: null, }); const [currentStep, setCurrentStep] = useState("input"); const runAnalysis = async (e: React.FormEvent) => { e.preventDefault(); setState((s) => ({ ...s, isLoading: true, error: null })); try { const response = await fetch("/api/analyze", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ticker: state.ticker, date: state.date }), }); if (!response.ok) throw new Error("Analysis failed"); const decision = await response.json(); setState((s) => ({ ...s, decision, isLoading: false, })); setCurrentStep("decision"); } catch (err) { setState((s) => ({ ...s, error: err instanceof Error ? err.message : "Unknown error", isLoading: false, })); } }; return ( Multi-Agent Trading Analysis Input Parameters Ticker setState((s) => ({ ...s, ticker: e.target.value.toUpperCase() }))} placeholder="AAPL" className="border border-gray-300 rounded-lg px-4 py-2.5 focus:ring-2 focus:ring-blue-500 text-gray-900 placeholder-gray-500" required /> setState((s) => ({ ...s, date: e.target.value }))} className="border border-gray-300 rounded-lg px-4 py-2.5 focus:ring-2 focus:ring-blue-500 text-gray-900" /> Date setState((s) => ({ ...s, date: e.target.value }))} className="border border-gray-300 rounded-lg px-4 py-2 focus:ring-2 focus:ring-blue-500 text-gray-900" /> {state.isLoading ? "Running..." : "Run Analysis"} {state.error && ( {state.error} )} {currentStep !== "input" && ( {["input", "analysts", "researchers", "trader", "decision"].map((step, i) => ( {i + 1} {i < 4 && } ))} {state.analysts.length > 0 && ( Analyst Reports {state.analysts.map((report, i) => ( {report.analyst} {report.report} ))} )} {state.debates.length > 0 && ( Research Debate {state.debates.map((debate, i) => ( Bullish View: {debate.bullishView} Bearish View: {debate.bearishView} ))} )} {state.decision && ( Trading Decision {state.decision.action} Confidence: {(state.decision.confidence * 100).toFixed(0)}% {state.decision.reasoning} Agent Signals: {state.decision.agentSignals.map((s, i) => ( {s.agent}: ))} )} )} ); }
{report.report}
{debate.bullishView}
{debate.bearishView}
{state.decision.reasoning}