fix: pre-launch UI hardening + KOL reduce-action type, proxy IP relay, settings redesign

Frontend half of the pre-launch audit campaign:

- types/index.ts + kol/KolPageClient.tsx: add missing 'reduce' KolAction
  (backend emits it; frontend lacked the type + color/label maps → undefined
  styling). Adds ACTION_COLOR/actionLabel/postActionLabel entries.
- proxy/[...path]/route.ts: relay real client IP (x-forwarded-for / x-real-ip)
  so the backend rate limiter buckets per-user instead of per-Next-server (BUG-02).
- Settings/BotConfigPanel redesign, paper-mode clarity, copy cleanup.
- Assorted page/display fixes, loading states, Pagination component.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
k
2026-05-29 11:57:43 +08:00
parent b76de36af0
commit d50c05b120
32 changed files with 1003 additions and 224 deletions
+13 -2
View File
@@ -8,12 +8,23 @@ async function handler(request: NextRequest): Promise<NextResponse> {
const targetUrl = `${API_BASE}${targetPath}${url.search}`
const headers = new Headers(request.headers)
// Remove Next.js internal headers
// Remove Next.js internal headers that would confuse the upstream server.
// Keep (or relay) x-forwarded-for so the backend's rate limiter can
// identify individual clients — without it, all users share the Next.js
// server IP and a single rate-limit bucket.
headers.delete('host')
headers.delete('x-forwarded-for')
headers.delete('x-forwarded-host')
headers.delete('x-forwarded-proto')
// Relay real client IP. Prefer the header Vercel/CDN already set; fall
// back to x-real-ip; ultimately unknown if neither is present (e.g. local
// dev through a raw Node server).
const clientIp =
request.headers.get('x-forwarded-for') ??
request.headers.get('x-real-ip') ??
'unknown'
headers.set('x-forwarded-for', clientIp)
const body =
request.method !== 'GET' && request.method !== 'HEAD'
? await request.arrayBuffer()