diff --git a/backend/tests/test_error_handling.py b/backend/tests/test_error_handling.py index 00d09476..4125d13c 100644 --- a/backend/tests/test_error_handling.py +++ b/backend/tests/test_error_handling.py @@ -3,10 +3,14 @@ from __future__ import annotations from fastapi import FastAPI, HTTPException from fastapi.testclient import TestClient from pydantic import BaseModel, Field - from starlette.requests import Request -from app.core.error_handling import REQUEST_ID_HEADER, _error_payload, _get_request_id, install_error_handling +from app.core.error_handling import ( + REQUEST_ID_HEADER, + _error_payload, + _get_request_id, + install_error_handling, +) def test_request_validation_error_includes_request_id(): diff --git a/backend/tests/test_request_id_middleware.py b/backend/tests/test_request_id_middleware.py index 1f2bb998..08b83bd0 100644 --- a/backend/tests/test_request_id_middleware.py +++ b/backend/tests/test_request_id_middleware.py @@ -46,7 +46,9 @@ async def test_request_id_middleware_ignores_blank_client_header_and_generates_o assert isinstance(captured_request_id, str) and captured_request_id # Header should reflect the generated id, not the blank one. - values = [v for k, v in response_headers if k.lower() == REQUEST_ID_HEADER.lower().encode("latin-1")] + values = [ + v for k, v in response_headers if k.lower() == REQUEST_ID_HEADER.lower().encode("latin-1") + ] assert values == [captured_request_id.encode("latin-1")] @@ -81,5 +83,7 @@ async def test_request_id_middleware_does_not_duplicate_existing_header() -> Non assert start_headers is not None # Ensure the middleware did not append a second copy. - values = [v for k, v in start_headers if k.lower() == REQUEST_ID_HEADER.lower().encode("latin-1")] + values = [ + v for k, v in start_headers if k.lower() == REQUEST_ID_HEADER.lower().encode("latin-1") + ] assert values == [b"already"] diff --git a/frontend/README.md b/frontend/README.md index 52ddef78..09e5074a 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -4,7 +4,7 @@ This package is the **Next.js** web UI for OpenClaw Mission Control. - Talks to the Mission Control **backend** over HTTP (typically `http://localhost:8000`). - Uses **React Query** for data fetching. -- Can optionally enable **Clerk** authentication (disabled by default unless you provide a *real* Clerk publishable key). +- Can optionally enable **Clerk** authentication (disabled by default unless you provide a _real_ Clerk publishable key). ## Prerequisites @@ -73,7 +73,7 @@ Implementation detail: we gate on a conservative regex (`pk_test_...` / `pk_live - `NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL` **Important:** `frontend/.env.example` contains placeholder values like `YOUR_PUBLISHABLE_KEY`. -Those placeholders are *not* valid keys and are intentionally treated as “Clerk disabled”. +Those placeholders are _not_ valid keys and are intentionally treated as “Clerk disabled”. ## How the frontend talks to the backend @@ -161,4 +161,4 @@ Clerk should be **off** unless you set a real `pk_test_...` or `pk_live_...` pub - `allowedDevOrigins: ["192.168.1.101"]` -If you’re developing from a different hostname/IP, you may need to update `allowedDevOrigins` (or use `npm run dev` on localhost). \ No newline at end of file +If you’re developing from a different hostname/IP, you may need to update `allowedDevOrigins` (or use `npm run dev` on localhost). diff --git a/frontend/src/app/activity/page.test.tsx b/frontend/src/app/activity/page.test.tsx index 7f4bc766..94b5ccf9 100644 --- a/frontend/src/app/activity/page.test.tsx +++ b/frontend/src/app/activity/page.test.tsx @@ -26,15 +26,23 @@ vi.mock("next/link", () => { // wrappers still render from @clerk/nextjs (which crashes in real builds). vi.mock("@clerk/nextjs", () => { return { - ClerkProvider: ({ children }: { children: React.ReactNode }) => <>{children}, + ClerkProvider: ({ children }: { children: React.ReactNode }) => ( + <>{children} + ), SignedIn: () => { - throw new Error("@clerk/nextjs SignedIn rendered (unexpected in secretless mode)"); + throw new Error( + "@clerk/nextjs SignedIn rendered (unexpected in secretless mode)", + ); }, SignedOut: () => { throw new Error("@clerk/nextjs SignedOut rendered without ClerkProvider"); }, - SignInButton: ({ children }: { children: React.ReactNode }) => <>{children}, - SignOutButton: ({ children }: { children: React.ReactNode }) => <>{children}, + SignInButton: ({ children }: { children: React.ReactNode }) => ( + <>{children} + ), + SignOutButton: ({ children }: { children: React.ReactNode }) => ( + <>{children} + ), useAuth: () => ({ isLoaded: true, isSignedIn: false }), useUser: () => ({ isLoaded: true, isSignedIn: false, user: null }), }; diff --git a/frontend/src/app/board-groups/[groupId]/page.tsx b/frontend/src/app/board-groups/[groupId]/page.tsx index ef9606f9..cf59731a 100644 --- a/frontend/src/app/board-groups/[groupId]/page.tsx +++ b/frontend/src/app/board-groups/[groupId]/page.tsx @@ -135,7 +135,11 @@ const SSE_RECONNECT_BACKOFF = { type HeartbeatUnit = "s" | "m" | "h" | "d"; -const HEARTBEAT_PRESETS: Array<{ label: string; amount: number; unit: HeartbeatUnit }> = [ +const HEARTBEAT_PRESETS: Array<{ + label: string; + amount: number; + unit: HeartbeatUnit; +}> = [ { label: "30s", amount: 30, unit: "s" }, { label: "1m", amount: 1, unit: "m" }, { label: "2m", amount: 2, unit: "m" }, @@ -781,22 +785,22 @@ export default function BoardGroupDetailPage() { {HEARTBEAT_PRESETS.map((preset) => { const value = `${preset.amount}${preset.unit}`; return ( - + ); })} diff --git a/frontend/src/auth/clerkKey.ts b/frontend/src/auth/clerkKey.ts index 3e361862..3c0ed17c 100644 --- a/frontend/src/auth/clerkKey.ts +++ b/frontend/src/auth/clerkKey.ts @@ -3,7 +3,9 @@ // IMPORTANT: keep this file dependency-free (no `"use client"`, no React, no Clerk imports) // so it can be used from both client and server/edge entrypoints. -export function isLikelyValidClerkPublishableKey(key: string | undefined): key is string { +export function isLikelyValidClerkPublishableKey( + key: string | undefined, +): key is string { if (!key) return false; // Clerk publishable keys look like: pk_test_... or pk_live_... diff --git a/frontend/src/proxy.ts b/frontend/src/proxy.ts index 429d9ae8..c147ef4a 100644 --- a/frontend/src/proxy.ts +++ b/frontend/src/proxy.ts @@ -4,7 +4,9 @@ import { clerkMiddleware } from "@clerk/nextjs/server"; import { isLikelyValidClerkPublishableKey } from "@/auth/clerkKey"; const isClerkEnabled = () => - isLikelyValidClerkPublishableKey(process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY); + isLikelyValidClerkPublishableKey( + process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, + ); export default isClerkEnabled() ? clerkMiddleware() : () => NextResponse.next();