diff --git a/packages/server/src/types.ts b/packages/server/src/types.ts index 0fc2a88..0aff4a5 100644 --- a/packages/server/src/types.ts +++ b/packages/server/src/types.ts @@ -92,7 +92,7 @@ export type AgentModeType = 'build' | 'plan'; // 客户端发送的消息 export interface ClientMessage { - type: 'message' | 'cancel' | 'tool_response' | 'permission_response'; + type: 'message' | 'cancel' | 'tool_response' | 'permission_response' | 'config_update'; sessionId: string; payload?: { content?: string; diff --git a/packages/server/src/ws.ts b/packages/server/src/ws.ts index 9379544..d945ee0 100644 --- a/packages/server/src/ws.ts +++ b/packages/server/src/ws.ts @@ -7,7 +7,7 @@ import type { WSContext } from 'hono/ws'; import { getSessionManager } from './session/manager.js'; import { processMessage, cancelProcessing } from './agent/index.js'; -import { handlePermissionResponse } from './permission/handler.js'; +import { handlePermissionResponse, setSessionAutoApprove } from './permission/handler.js'; import type { ClientMessage, ServerMessage } from './types.js'; // 存储活跃的 WebSocket 连接 @@ -156,6 +156,22 @@ export async function handleWebSocketMessage( break; } + case 'config_update': { + // 实时配置更新(如 Auto Edit 开关) + const autoApprove = message.payload?.autoApprove; + if (typeof autoApprove === 'boolean') { + if (autoApprove) { + setSessionAutoApprove(sessionId, { + file: { write: 'allow', edit: 'allow' }, + }); + } else { + setSessionAutoApprove(sessionId, null); + } + console.log(`[WS] Config updated for session ${sessionId}: autoApprove=${autoApprove}`); + } + break; + } + default: ws.send( JSON.stringify({ diff --git a/packages/ui/src/hooks/useChat.ts b/packages/ui/src/hooks/useChat.ts index b9691ff..1617636 100644 --- a/packages/ui/src/hooks/useChat.ts +++ b/packages/ui/src/hooks/useChat.ts @@ -417,10 +417,24 @@ export function useChat({ sessionId, onError, onSessionNotFound, onSessionUpdate setState((prev) => ({ ...prev, agentMode: mode })); }, []); - // 设置自动授权 (会话级别) - const setAutoApprove = useCallback((enabled: boolean) => { - setState((prev) => ({ ...prev, autoApprove: enabled })); - }, []); + // 设置自动授权 (会话级别,立即生效) + const setAutoApprove = useCallback( + (enabled: boolean) => { + setState((prev) => ({ ...prev, autoApprove: enabled })); + + // 立即通过 WebSocket 发送配置更新,使其对当前执行生效 + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.send( + JSON.stringify({ + type: 'config_update', + sessionId, + payload: { autoApprove: enabled }, + }) + ); + } + }, + [sessionId] + ); // 初始化 useEffect(() => {