From 811a32eb6189727594c61956cd5a2ded400977b9 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Sun, 8 Mar 2026 11:54:11 -0500 Subject: [PATCH] fix(web): fix lint/prettier and TypeScript errors in proxy route - Remove unnecessary null-coalesce on request.nextUrl.search - Fix body typing: use null instead of undefined for no-body requests - Use conditional spread to satisfy fetch() overload types - Auto-fix prettier formatting across all changed files --- .../app/api/orchestrator/[...path]/route.ts | 13 +++---- .../mission-control/AuditLogDrawer.tsx | 4 ++- .../mission-control/BargeInInput.test.tsx | 28 ++++++++++----- .../GlobalAgentRoster.test.tsx | 9 +++-- .../mission-control/GlobalAgentRoster.tsx | 9 +++-- .../mission-control/KillAllDialog.test.tsx | 36 ++++++++++++------- .../mission-control/KillAllDialog.tsx | 9 +++-- .../mission-control/PanelControls.test.tsx | 18 ++++++---- 8 files changed, 82 insertions(+), 44 deletions(-) diff --git a/apps/web/src/app/api/orchestrator/[...path]/route.ts b/apps/web/src/app/api/orchestrator/[...path]/route.ts index 2b329a0..430b023 100644 --- a/apps/web/src/app/api/orchestrator/[...path]/route.ts +++ b/apps/web/src/app/api/orchestrator/[...path]/route.ts @@ -39,7 +39,7 @@ async function proxyToOrchestrator( const { path } = await context.params; const upstreamPath = `/${path.join("/")}`; - const search = request.nextUrl.search ?? ""; + const search = request.nextUrl.search; const upstreamUrl = `${getOrchestratorUrl()}${upstreamPath}${search}`; const controller = new AbortController(); @@ -57,15 +57,13 @@ async function proxyToOrchestrator( headers["Content-Type"] = contentType; } - const body = - request.method !== "GET" && request.method !== "HEAD" - ? await request.text() - : undefined; + const hasBody = request.method !== "GET" && request.method !== "HEAD"; + const body = hasBody ? await request.text() : null; const upstream = await fetch(upstreamUrl, { method: request.method, headers, - body, + ...(body !== null ? { body } : {}), cache: "no-store", signal: controller.signal, }); @@ -74,8 +72,7 @@ async function proxyToOrchestrator( return new NextResponse(responseText, { status: upstream.status, headers: { - "Content-Type": - upstream.headers.get("Content-Type") ?? "application/json", + "Content-Type": upstream.headers.get("Content-Type") ?? "application/json", }, }); } catch (error) { diff --git a/apps/web/src/components/mission-control/AuditLogDrawer.tsx b/apps/web/src/components/mission-control/AuditLogDrawer.tsx index 4f2fb0e..022d2d7 100644 --- a/apps/web/src/components/mission-control/AuditLogDrawer.tsx +++ b/apps/web/src/components/mission-control/AuditLogDrawer.tsx @@ -158,7 +158,9 @@ async function fetchAuditLog( } try { - return await apiGet(`/api/orchestrator/api/mission-control/audit-log?${params.toString()}`); + return await apiGet( + `/api/orchestrator/api/mission-control/audit-log?${params.toString()}` + ); } catch (error) { if (isRateLimitError(error)) { return createEmptyAuditLogResponse(page, "Rate limited - retrying..."); diff --git a/apps/web/src/components/mission-control/BargeInInput.test.tsx b/apps/web/src/components/mission-control/BargeInInput.test.tsx index 6dbc0f7..c45ba9f 100644 --- a/apps/web/src/components/mission-control/BargeInInput.test.tsx +++ b/apps/web/src/components/mission-control/BargeInInput.test.tsx @@ -59,9 +59,12 @@ describe("BargeInInput", (): void => { await user.click(screen.getByRole("button", { name: "Send" })); await waitFor((): void => { - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/session-1/inject", { - content: "execute plan", - }); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/session-1/inject", + { + content: "execute plan", + } + ); }); expect(onSent).toHaveBeenCalledTimes(1); @@ -83,12 +86,18 @@ describe("BargeInInput", (): void => { const calls = mockApiPost.mock.calls as [string, unknown?][]; - expect(calls[0]).toEqual(["/api/orchestrator/api/mission-control/sessions/session-2/pause", undefined]); + expect(calls[0]).toEqual([ + "/api/orchestrator/api/mission-control/sessions/session-2/pause", + undefined, + ]); expect(calls[1]).toEqual([ "/api/orchestrator/api/mission-control/sessions/session-2/inject", { content: "hello world" }, ]); - expect(calls[2]).toEqual(["/api/orchestrator/api/mission-control/sessions/session-2/resume", undefined]); + expect(calls[2]).toEqual([ + "/api/orchestrator/api/mission-control/sessions/session-2/resume", + undefined, + ]); }); it("submits with Enter and does not submit on Shift+Enter", async (): Promise => { @@ -105,9 +114,12 @@ describe("BargeInInput", (): void => { fireEvent.keyDown(textarea, { key: "Enter", code: "Enter", shiftKey: false }); await waitFor((): void => { - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/session-3/inject", { - content: "first", - }); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/session-3/inject", + { + content: "first", + } + ); }); }); diff --git a/apps/web/src/components/mission-control/GlobalAgentRoster.test.tsx b/apps/web/src/components/mission-control/GlobalAgentRoster.test.tsx index c76c714..d775d89 100644 --- a/apps/web/src/components/mission-control/GlobalAgentRoster.test.tsx +++ b/apps/web/src/components/mission-control/GlobalAgentRoster.test.tsx @@ -177,9 +177,12 @@ describe("GlobalAgentRoster", (): void => { fireEvent.click(screen.getByRole("button", { name: "Kill session killme12" })); await waitFor((): void => { - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/killme123456/kill", { - force: false, - }); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/killme123456/kill", + { + force: false, + } + ); }); }); diff --git a/apps/web/src/components/mission-control/GlobalAgentRoster.tsx b/apps/web/src/components/mission-control/GlobalAgentRoster.tsx index 29ddf7e..4dc69f6 100644 --- a/apps/web/src/components/mission-control/GlobalAgentRoster.tsx +++ b/apps/web/src/components/mission-control/GlobalAgentRoster.tsx @@ -118,9 +118,12 @@ export function GlobalAgentRoster({ const killMutation = useMutation({ mutationFn: async (sessionId: string): Promise => { - await apiPost<{ message: string }>(`/api/orchestrator/api/mission-control/sessions/${sessionId}/kill`, { - force: false, - }); + await apiPost<{ message: string }>( + `/api/orchestrator/api/mission-control/sessions/${sessionId}/kill`, + { + force: false, + } + ); return sessionId; }, onSuccess: (): void => { diff --git a/apps/web/src/components/mission-control/KillAllDialog.test.tsx b/apps/web/src/components/mission-control/KillAllDialog.test.tsx index eb3c0d9..1504112 100644 --- a/apps/web/src/components/mission-control/KillAllDialog.test.tsx +++ b/apps/web/src/components/mission-control/KillAllDialog.test.tsx @@ -112,14 +112,20 @@ describe("KillAllDialog", (): void => { await user.click(screen.getByRole("button", { name: "Kill All Agents" })); await waitFor((): void => { - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/internal-1/kill", { - force: true, - }); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/internal-1/kill", + { + force: true, + } + ); }); - expect(mockApiPost).not.toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/external-1/kill", { - force: true, - }); + expect(mockApiPost).not.toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/external-1/kill", + { + force: true, + } + ); expect(onComplete).toHaveBeenCalledTimes(1); }); @@ -141,12 +147,18 @@ describe("KillAllDialog", (): void => { await user.click(screen.getByRole("button", { name: "Kill All Agents" })); await waitFor((): void => { - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/internal-2/kill", { - force: true, - }); - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/external-2/kill", { - force: true, - }); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/internal-2/kill", + { + force: true, + } + ); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/external-2/kill", + { + force: true, + } + ); }); }); diff --git a/apps/web/src/components/mission-control/KillAllDialog.tsx b/apps/web/src/components/mission-control/KillAllDialog.tsx index b823cea..2a3a6c0 100644 --- a/apps/web/src/components/mission-control/KillAllDialog.tsx +++ b/apps/web/src/components/mission-control/KillAllDialog.tsx @@ -96,9 +96,12 @@ export function KillAllDialog({ sessions, onComplete }: KillAllDialogProps): Rea const killRequests = targetSessions.map(async (session) => { try { - await apiPost<{ message: string }>(`/api/orchestrator/api/mission-control/sessions/${session.id}/kill`, { - force: true, - }); + await apiPost<{ message: string }>( + `/api/orchestrator/api/mission-control/sessions/${session.id}/kill`, + { + force: true, + } + ); return true; } catch { return false; diff --git a/apps/web/src/components/mission-control/PanelControls.test.tsx b/apps/web/src/components/mission-control/PanelControls.test.tsx index 710998d..cf9a4ab 100644 --- a/apps/web/src/components/mission-control/PanelControls.test.tsx +++ b/apps/web/src/components/mission-control/PanelControls.test.tsx @@ -114,9 +114,12 @@ describe("PanelControls", (): void => { await user.click(screen.getByRole("button", { name: "Confirm" })); await waitFor((): void => { - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/session-4/kill", { - force: false, - }); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/session-4/kill", + { + force: false, + } + ); }); expect(onStatusChange).toHaveBeenCalledWith("killed"); @@ -137,9 +140,12 @@ describe("PanelControls", (): void => { await user.click(screen.getByRole("button", { name: "Confirm" })); await waitFor((): void => { - expect(mockApiPost).toHaveBeenCalledWith("/api/orchestrator/api/mission-control/sessions/session-5/kill", { - force: true, - }); + expect(mockApiPost).toHaveBeenCalledWith( + "/api/orchestrator/api/mission-control/sessions/session-5/kill", + { + force: true, + } + ); }); expect(onStatusChange).toHaveBeenCalledWith("killed");