feat(agent): enhance local Agent connection handling with silent mode and update UI instructions

This commit is contained in:
HouYunFei
2026-07-14 17:08:20 +08:00
parent 7e0288d461
commit a5824f509e
8 changed files with 71 additions and 193 deletions
+9 -6
View File
@@ -25,6 +25,7 @@ type AgentStore = {
token: string;
connected: boolean;
enabled: boolean;
silentConnect: boolean;
prompt: string;
attachments: AgentAttachment[];
sending: boolean;
@@ -45,7 +46,7 @@ type AgentStore = {
closePanel: () => void;
togglePanel: () => void;
setCanvasContext: (context: AgentCanvasContext | null) => void;
connectAgent: () => void;
connectAgent: (options?: { silent?: boolean }) => void;
disconnectAgent: (patch?: Partial<Omit<AgentStore, "setAgentState" | "connectAgent" | "disconnectAgent" | "addMessage" | "addEventLog" | "clearEventLogs" | "openPanel" | "closePanel" | "togglePanel" | "setCanvasContext">>) => void;
addMessage: (item: AgentChatItem) => void;
addEventLog: (item: AgentEventLog) => void;
@@ -64,6 +65,7 @@ export const useAgentStore = create<AgentStore>((set, get) => ({
token: typeof window === "undefined" ? "" : localStorage.getItem("canvas-agent-token") || "",
connected: false,
enabled: false,
silentConnect: false,
prompt: "",
attachments: [],
sending: false,
@@ -90,27 +92,28 @@ export const useAgentStore = create<AgentStore>((set, get) => ({
},
togglePanel: () => (get().panelOpen ? get().closePanel() : get().openPanel()),
setCanvasContext: (canvasContext) => set({ canvasContext }),
connectAgent: () => {
connectAgent: (options) => {
const silent = options?.silent ?? false;
const endpoint = get().url.trim().replace(/\/$/, "");
const token = get().token.trim();
if (!endpoint || !token) return set({ connectError: "请填写 Local URL 和 Connect token" });
if (!endpoint || !token) return set({ connectError: silent ? "" : "请填写 Local URL 和 Connect token" });
try {
const parsed = new URL(endpoint);
if (!["http:", "https:"].includes(parsed.protocol)) throw new Error();
} catch {
return set({ connectError: "Local URL 格式不正确" });
return set({ connectError: silent ? "" : "Local URL 格式不正确" });
}
localStorage.setItem("canvas-agent-url", endpoint);
localStorage.setItem("canvas-agent-token", token);
// 只设 enabled=true,由 CanvasLocalAgentPanel 的 useEffect 统一负责开 SSE
set({ url: endpoint, token, enabled: true, activity: "连接中", connectError: "" });
set({ url: endpoint, token, enabled: true, silentConnect: silent, activity: "连接中", connectError: "" });
},
disconnectAgent: (patch = {}) => {
agentSource?.close();
agentSource = null;
if (connectTimer) clearTimeout(connectTimer);
connectTimer = null;
set({ enabled: false, connected: false, activity: "离线", ...patch });
set({ enabled: false, connected: false, silentConnect: false, activity: "离线", ...patch });
},
addMessage: (item) => set((state) => ({ messages: [...state.messages.slice(-120), item] })),
addEventLog: (item) => set((state) => ({ eventLogs: [...state.eventLogs.slice(-160), item] })),