feat(settings): add settings route and API updates\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
/* TRADINGGRAPH related file */
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
import { useLoaderData } from "react-router";
|
||||
import Navbar from "../../components/Navbar";
|
||||
@@ -84,14 +86,88 @@ export default function JobDetail() {
|
||||
<a href={`/api/jobs/${job?.id}`} target="_blank" rel="noreferrer" className="text-sm text-blue-600 hover:underline">Open API</a>
|
||||
</div>
|
||||
|
||||
<div className="text-sm text-gray-700 mb-3">Data:</div>
|
||||
<div className="text-sm text-gray-700 mb-3">Raw Data:</div>
|
||||
<pre className="bg-gray-50 p-3 rounded text-xs overflow-x-auto text-gray-800">{JSON.stringify(job?.data || job?.returnValue || job, null, 2)}</pre>
|
||||
|
||||
<div className="mt-4">
|
||||
|
||||
</div>
|
||||
{/* TradingGraph structured output */}
|
||||
{job?.returnValue && (
|
||||
<div className="mt-4 bg-white rounded-lg p-4 border border-gray-200 text-gray-900">
|
||||
<h4 className="text-lg font-semibold mb-3">TradingGraph Result</h4>
|
||||
|
||||
{/* Decision summary */}
|
||||
{job.returnValue.action && (
|
||||
<div className="mb-3">
|
||||
<div className="text-sm text-gray-600">Decision:</div>
|
||||
<div className="text-base font-medium">{String(job.returnValue.action).toUpperCase()} <span className="text-sm text-gray-500">(confidence: {Number(job.returnValue.confidence ?? 0).toFixed(2)})</span></div>
|
||||
{job.returnValue.reasoning && <div className="mt-2 text-sm text-gray-700">{job.returnValue.reasoning}</div>}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Agent signals / analyst reports */}
|
||||
{Array.isArray(job.returnValue.agentSignals) && job.returnValue.agentSignals.length > 0 && (
|
||||
<div className="mb-3">
|
||||
<div className="text-sm text-gray-600">Analyst Reports</div>
|
||||
<div className="mt-2 space-y-2">
|
||||
{job.returnValue.agentSignals.map((s: any, i: number) => (
|
||||
<div key={i} className="p-3 bg-gray-50 rounded border border-gray-100">
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="font-medium capitalize">{s.agent}</div>
|
||||
<div className="text-sm text-gray-500">{s.signal} ({Math.round((s.confidence ?? 0) * 100)}%)</div>
|
||||
</div>
|
||||
{s.reasoning && <div className="mt-1 text-sm text-gray-700">{s.reasoning}</div>}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Debate rounds (if present) */}
|
||||
{Array.isArray(job.returnValue.debateRounds) && job.returnValue.debateRounds.length > 0 && (
|
||||
<div className="mb-3">
|
||||
<div className="text-sm text-gray-600">Debate Rounds</div>
|
||||
<div className="mt-2 space-y-2">
|
||||
{job.returnValue.debateRounds.map((d: any, i: number) => (
|
||||
<div key={i} className="p-3 bg-gray-50 rounded border border-gray-100">
|
||||
<div className="text-sm font-medium">Researcher: {d.researcher ?? 'unknown'}</div>
|
||||
{d.bullishView && <div className="mt-1 text-sm text-green-600">Bullish: {d.bullishView}</div>}
|
||||
{d.bearishView && <div className="mt-1 text-sm text-red-600">Bearish: {d.bearishView}</div>}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Execution plan */}
|
||||
{job.returnValue.executionPlan && (
|
||||
<div className="mb-3">
|
||||
<div className="text-sm text-gray-600">Execution Plan</div>
|
||||
<div className="mt-2 text-sm text-gray-700">
|
||||
{job.returnValue.executionPlan.amount != null && (<div>Amount: <strong>{job.returnValue.executionPlan.amount}</strong></div>)}
|
||||
{job.returnValue.executionPlan.takeProfit != null && (<div>Take profit: <strong>${job.returnValue.executionPlan.takeProfit}</strong></div>)}
|
||||
{job.returnValue.executionPlan.stopLoss != null && (<div>Stop loss: <strong>${job.returnValue.executionPlan.stopLoss}</strong></div>)}
|
||||
{job.returnValue.executionPlan.riskManagement?.maxLossPercent != null && (<div>Risk: <strong>{job.returnValue.executionPlan.riskManagement.maxLossPercent}%</strong></div>)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* LLM review if available */}
|
||||
{job.returnValue.executionPlan?._llmReview && (
|
||||
<div className="mt-4 bg-white rounded-lg p-3 border border-gray-200 text-gray-900">
|
||||
<h4 className="text-sm font-medium">LLM Review</h4>
|
||||
<div className="mt-2 text-sm text-gray-700">
|
||||
<div>Approved: <strong className={job.returnValue.executionPlan._llmReview.approved ? 'text-green-600' : 'text-red-600'}>{job.returnValue.executionPlan._llmReview.approved ? 'Yes' : 'No'}</strong></div>
|
||||
{job.returnValue.executionPlan._llmReview.notes && (
|
||||
<div className="mt-1">Notes: <span className="font-medium text-gray-800">{job.returnValue.executionPlan._llmReview.notes}</span></div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user