Bot & Automation

Market AI

/root/hermes-projects/Market AI

apps/admin-web/app/page.tsx text
const metrics = [
  { label: "Scanner Scope", value: "Meme only" },
  { label: "Default Chain", value: "Solana" },
  { label: "Trade Mode", value: "Paper-first" },
  { label: "Live Executor", value: "Env gated" },
  { label: "Risk Filter", value: "Strict" },
  { label: "Data Source", value: "DexScreener" },
];

const providerRows = [
  { name: "DexScreener", status: "Primary", coverage: "Token profiles, pairs, liquidity, volume", rateLimit: "Provider-defined" },
  { name: "Trade Executor", status: "Optional", coverage: "Paper + external live execution", rateLimit: "Internal" },
  { name: "Jupiter", status: "Optional", coverage: "Solana route quote support", rateLimit: "Portal/public" },
  { name: "GitHub Models", status: "Optional", coverage: "AI risk review", rateLimit: "Provider" },
];

export default function DashboardPage() {
  return (
    <main className="min-h-screen bg-zinc-50">
      <section className="border-b border-zinc-200 bg-white">
        <div className="mx-auto flex max-w-7xl flex-col gap-3 px-6 py-6 md:flex-row md:items-end md:justify-between">
          <div>
            <p className="text-sm font-medium uppercase tracking-normal text-rose-700">Hermes Agent</p>
            <h1 className="mt-2 text-3xl font-semibold tracking-normal text-zinc-950">Meme Coin Trading Bot</h1>
            <p className="mt-2 max-w-2xl text-sm leading-6 text-zinc-600">
              Internal dashboard for meme coin scanning, risk-first token analysis, paper trading, and guarded live execution.
            </p>
          </div>
          <div className="rounded-md border border-rose-200 bg-rose-50 px-4 py-3 text-sm text-rose-900">
            Runtime: Docker Compose ready
          </div>
        </div>
      </section>

      <section className="mx-auto max-w-7xl px-6 py-8">
        <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
          {metrics.map((metric) => (
            <div key={metric.label} className="rounded-md border border-zinc-200 bg-white p-5 shadow-sm">
              <p className="text-sm text-zinc-500">{metric.label}</p>
              <p className="mt-3 text-2xl font-semibold text-zinc-950">{metric.value}</p>
            </div>
          ))}
        </div>
      </section>

      <section className="mx-auto grid max-w-7xl gap-5 px-6 pb-10 lg:grid-cols-[1fr_360px]">
        <div className="overflow-hidden rounded-md border border-zinc-200 bg-white shadow-sm">
          <div className="border-b border-zinc-200 px-5 py-4">
            <h2 className="text-base font-semibold text-zinc-950">Provider Status</h2>
          </div>
          <div className="overflow-x-auto">
            <table className="w-full border-collapse text-left text-sm">
              <thead className="bg-zinc-50 text-zinc-500">
                <tr>
                  <th className="px-5 py-3 font-medium">Provider</th>
                  <th className="px-5 py-3 font-medium">Status</th>
                  <th className="px-5 py-3 font-medium">Coverage</th>
                  <th className="px-5 py-3 font-medium">Rate Limit</th>
                </tr>
              </thead>
              <tbody>
                {providerRows.map((provider) => (
                  <tr key={provider.name} className="border-t border-zinc-100">
                    <td className="px-5 py-4 font-medium text-zinc-900">{provider.name}</td>
                    <td className="px-5 py-4 text-zinc-600">{provider.status}</td>
                    <td className="px-5 py-4 text-zinc-600">{provider.coverage}</td>
                    <td className="px-5 py-4 text-zinc-600">{provider.rateLimit}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>

        <aside className="rounded-md border border-zinc-200 bg-white p-5 shadow-sm">
          <h2 className="text-base font-semibold text-zinc-950">Risk Guardrails</h2>
          <div className="mt-4 space-y-3 text-sm leading-6 text-zinc-600">
            <p>Paper trading is the default runtime path.</p>
            <p>Live trade requires explicit env executor and Telegram confirmation.</p>
            <p>Scanner score is probabilistic and never a profit guarantee.</p>
            <p>Warnings penalize low liquidity, sell pressure, new pairs, and parabolic moves.</p>
          </div>
        </aside>
      </section>
    </main>
  );
}