diff --git a/app/api/[...path]/route.ts b/app/api/[...path]/route.ts new file mode 100644 index 0000000..30ea081 --- /dev/null +++ b/app/api/[...path]/route.ts @@ -0,0 +1,63 @@ +import { NextRequest, NextResponse } from "next/server"; + +const BACKEND = process.env.HERMES_BACKEND_URL || "http://127.0.0.1:8643"; + +export async function GET(req: NextRequest, { params }: { params: Promise<{ path: string[] }> }) { + const { path } = await params; + const target = path.join("/"); + const qs = req.nextUrl.search; + const res = await fetch(`${BACKEND}/api/${target}${qs}`); + const data = await res.text(); + return new NextResponse(data, { + status: res.status, + headers: { "content-type": res.headers.get("content-type") || "application/json" }, + }); +} + +export async function POST(req: NextRequest, { params }: { params: Promise<{ path: string[] }> }) { + const { path } = await params; + const target = path.join("/"); + const body = await req.text(); + const res = await fetch(`${BACKEND}/api/${target}`, { + method: "POST", + headers: { "content-type": "application/json" }, + body, + }); + const data = await res.text(); + return new NextResponse(data, { + status: res.status, + headers: { "content-type": res.headers.get("content-type") || "application/json" }, + }); +} + +export async function PATCH(req: NextRequest, { params }: { params: Promise<{ path: string[] }> }) { + const { path } = await params; + const target = path.join("/"); + const body = await req.text(); + const res = await fetch(`${BACKEND}/api/${target}`, { + method: "PATCH", + headers: { "content-type": "application/json" }, + body, + }); + const data = await res.text(); + return new NextResponse(data, { + status: res.status, + headers: { "content-type": res.headers.get("content-type") || "application/json" }, + }); +} + +export async function DELETE(req: NextRequest, { params }: { params: Promise<{ path: string[] }> }) { + const { path } = await params; + const target = path.join("/"); + const body = await req.text(); + const res = await fetch(`${BACKEND}/api/${target}`, { + method: "DELETE", + headers: { "content-type": "application/json" }, + body: body || undefined, + }); + const data = await res.text(); + return new NextResponse(data, { + status: res.status, + headers: { "content-type": res.headers.get("content-type") || "application/json" }, + }); +} diff --git a/app/health/route.ts b/app/health/route.ts new file mode 100644 index 0000000..2dd6f68 --- /dev/null +++ b/app/health/route.ts @@ -0,0 +1,16 @@ +import { NextResponse } from "next/server"; + +const BACKEND = process.env.HERMES_BACKEND_URL || "http://127.0.0.1:8643"; + +export async function GET() { + try { + const res = await fetch(`${BACKEND}/health`); + const data = await res.text(); + return new NextResponse(data, { + status: res.status, + headers: { "content-type": "application/json" }, + }); + } catch { + return NextResponse.json({ status: "error" }, { status: 502 }); + } +} diff --git a/lib/api.ts b/lib/api.ts index 4499c74..f53be22 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -1,4 +1,4 @@ -const BASE = process.env.NEXT_PUBLIC_HERMES_API || "http://localhost:8787"; +const BASE = ""; async function get(path: string): Promise { const res = await fetch(`${BASE}${path}`); @@ -85,4 +85,4 @@ export const fetchSkill = (name: string) => export const fetchConfig = () => get("/api/config"); // Health -export const fetchHealth = () => get<{ status: string }>("/api/health"); +export const fetchHealth = () => get<{ status: string }>("/health"); diff --git a/next.config.ts b/next.config.ts index 3df43b8..2f6491c 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,6 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - output: "standalone", reactStrictMode: true, }; diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000..a69ba2e Binary files /dev/null and b/public/icon-192.png differ diff --git a/public/icon-512.png b/public/icon-512.png new file mode 100644 index 0000000..5393316 Binary files /dev/null and b/public/icon-512.png differ