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();