From bb7311589c1ac8619f3969267b28c58fff876ef7 Mon Sep 17 00:00:00 2001 From: Huarch Date: Fri, 12 Jun 2026 10:18:41 +0800 Subject: [PATCH] refactor(auth): remove agent user header --- src/components/chat/chatStorage.ts | 4 --- .../chat/hooks/useAgentChatSession.ts | 15 +++++++++++ .../core/Controls/useToolbarChatActions.ts | 1 - src/lib/authToken.ts | 27 ------------------- src/lib/chatModels.test.ts | 1 - src/lib/chatModels.ts | 1 - src/lib/chatStream.ts | 21 ++++++++++----- src/lib/requestHeaders.ts | 11 +------- 8 files changed, 30 insertions(+), 51 deletions(-) diff --git a/src/components/chat/chatStorage.ts b/src/components/chat/chatStorage.ts index dc50618..675bb0a 100644 --- a/src/components/chat/chatStorage.ts +++ b/src/components/chat/chatStorage.ts @@ -49,7 +49,6 @@ const fetchBackendChatSessions = async (): Promise => { const response = await apiFetch(`${config.AGENT_URL}/api/v1/agent/chat/sessions`, { method: "GET", projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }); if (!response.ok) { @@ -77,7 +76,6 @@ const fetchBackendChatSession = async (sessionId: string): Promise { { method: "DELETE", projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }, ); diff --git a/src/components/chat/hooks/useAgentChatSession.ts b/src/components/chat/hooks/useAgentChatSession.ts index de92b9d..dbc45c5 100644 --- a/src/components/chat/hooks/useAgentChatSession.ts +++ b/src/components/chat/hooks/useAgentChatSession.ts @@ -456,6 +456,21 @@ export const useAgentChatSession = ({ ), ); setIsStreaming(false); + } else if (event.type === "auth_required") { + setMessages((prev) => + prev.map((message) => + message.id === assistantMessageId + ? { + ...message, + content: message.content || `⚠️ **${event.message}**`, + isError: true, + progress: completeRunningProgress(message.progress), + todos: cancelRunningTodos(message.todos), + } + : message, + ), + ); + setIsStreaming(false); } }, [ diff --git a/src/components/olmap/core/Controls/useToolbarChatActions.ts b/src/components/olmap/core/Controls/useToolbarChatActions.ts index 7e472ea..e9d8ee7 100644 --- a/src/components/olmap/core/Controls/useToolbarChatActions.ts +++ b/src/components/olmap/core/Controls/useToolbarChatActions.ts @@ -168,7 +168,6 @@ export const useToolbarChatActions = ({ { method: "GET", projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }, ); diff --git a/src/lib/authToken.ts b/src/lib/authToken.ts index 72bbff5..ee0f15c 100644 --- a/src/lib/authToken.ts +++ b/src/lib/authToken.ts @@ -49,30 +49,3 @@ export const getAccessToken = async () => { } return null; }; - -export const getUserId = async () => { - const session = await getSession(); - const sessionUserId = typeof session?.user?.id === "string" ? session.user.id : null; - if (sessionUserId) { - return sessionUserId; - } - - const accessToken = await getAccessToken(); - if (!accessToken) { - return null; - } - - const payload = decodeJwtPayload(accessToken); - if (!payload || typeof payload !== "object") { - return null; - } - - const candidate = - typeof payload.sub === "string" - ? payload.sub - : typeof payload.user_id === "string" - ? payload.user_id - : null; - - return candidate; -}; diff --git a/src/lib/chatModels.test.ts b/src/lib/chatModels.test.ts index 17b33e1..5de9324 100644 --- a/src/lib/chatModels.test.ts +++ b/src/lib/chatModels.test.ts @@ -43,7 +43,6 @@ describe("fetchAgentModels", () => { expect.objectContaining({ method: "GET", projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }), ); diff --git a/src/lib/chatModels.ts b/src/lib/chatModels.ts index 9c9166f..8db7a0a 100644 --- a/src/lib/chatModels.ts +++ b/src/lib/chatModels.ts @@ -50,7 +50,6 @@ export const fetchAgentModels = async (): Promise => { const response = await apiFetch(`${config.AGENT_URL}/api/v1/agent/chat/models`, { method: "GET", projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }); if (!response.ok) { diff --git a/src/lib/chatStream.ts b/src/lib/chatStream.ts index 7b763f8..dea6560 100644 --- a/src/lib/chatStream.ts +++ b/src/lib/chatStream.ts @@ -84,6 +84,12 @@ export type StreamEvent = detail?: string; totalDurationMs?: number; } + | { + type: "auth_required"; + sessionId?: string; + reason?: string; + message: string; + } | { type: "tool_call"; sessionId: string; @@ -303,6 +309,7 @@ const emitParsedStreamEvent = ( rejected?: boolean; message_id?: string; todos?: unknown; + reason?: string; }; if (event === "state") { onEvent({ @@ -352,6 +359,13 @@ const emitParsedStreamEvent = ( detail: parsed.detail, totalDurationMs: parsed.total_duration_ms, }); + } else if (event === "auth_required") { + onEvent({ + type: "auth_required", + sessionId: parsed.session_id, + reason: parsed.reason, + message: parsed.message ?? "登录态已过期,请刷新登录后重试", + }); } else if (event === "tool_call") { onEvent({ type: "tool_call", @@ -478,7 +492,6 @@ export const streamAgentChat = async ({ approval_mode: approvalMode, }), projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }, ); @@ -530,7 +543,6 @@ export const resumeAgentChatStream = async ({ Accept: "text/event-stream", }, projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }, ); @@ -573,7 +585,6 @@ export const abortAgentChat = async (sessionId?: string) => { session_id: sessionId, }), projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }); @@ -600,7 +611,6 @@ export const replyAgentPermission = async ( reply, }), projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }, ); @@ -628,7 +638,6 @@ export const replyAgentQuestion = async ( answers, }), projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }, ); @@ -654,7 +663,6 @@ export const rejectAgentQuestion = async ( session_id: sessionId, }), projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }, ); @@ -676,7 +684,6 @@ export const forkAgentChat = async (sessionId: string | undefined, keepMessageCo keep_message_count: keepMessageCount, }), projectHeaderMode: "include", - userHeaderMode: "include", skipAuthRedirect: true, }); diff --git a/src/lib/requestHeaders.ts b/src/lib/requestHeaders.ts index 541ce4d..95e45ac 100644 --- a/src/lib/requestHeaders.ts +++ b/src/lib/requestHeaders.ts @@ -1,14 +1,12 @@ -import { getAccessToken, getUserId } from "@/lib/authToken"; +import { getAccessToken } from "@/lib/authToken"; import { useProjectStore } from "@/store/projectStore"; export type AuthHeaderMode = "include" | "omit"; export type ProjectHeaderMode = "auto" | "include" | "omit"; -export type UserHeaderMode = "include" | "omit"; export interface AuthContextHeaderOptions { authHeaderMode?: AuthHeaderMode; projectHeaderMode?: ProjectHeaderMode; - userHeaderMode?: UserHeaderMode; } const shouldIncludeProjectHeader = ( @@ -36,13 +34,6 @@ export const applyAuthContextHeaders = async ( headers.set("Authorization", `Bearer ${accessToken}`); } - if (options.userHeaderMode === "include") { - const userId = await getUserId(); - if (userId) { - headers.set("X-User-Id", userId); - } - } - const projectId = useProjectStore.getState().currentProjectId; if ( projectId &&