refactor: 移除多余依赖,统一 MUI 为唯一 UI 库

- 移除 radix-ui、clsx、tailwind-merge、class-variance-authority、react-router-dom

- 前后端全面适配 MUI 组件,清理残留 Tailwind 工具类引用

- 优化 Agent Loop 引擎、IPC 处理器、Provider Adapter 等后端模块

- 新增 Agent 网络工具通用设计文档 v2
This commit is contained in:
thzxx
2026-07-05 19:15:48 +08:00
parent ba85328c4f
commit f4532a2bb2
50 changed files with 1474 additions and 2042 deletions
+36 -13
View File
@@ -125,7 +125,7 @@ export const useAgentStore = create<AgentState>((set, get) => ({
streamingContent: '',
provider: '',
model: '',
contextWindow: 1_000_000,
contextWindow: 0,
// ===== Actions =====
@@ -138,7 +138,9 @@ export const useAgentStore = create<AgentState>((set, get) => ({
const messages = (msgs as Array<{
id: string; role: string; content: string;
reasoningContent?: string; toolCalls?: unknown[];
toolResult?: unknown;
attachments?: Array<{ id: string; name: string; type: string; size: number; preview?: string; textContent?: string }>;
iteration?: number;
timestamp: number;
}>).map((m) => ({
id: m.id,
@@ -147,10 +149,11 @@ export const useAgentStore = create<AgentState>((set, get) => ({
reasoningContent: m.reasoningContent,
toolCalls: m.toolCalls as ToolCallInfo[] | undefined,
attachments: m.attachments as AttachmentInfo[] | undefined,
iteration: m.iteration,
timestamp: m.timestamp,
}));
set({ messages });
}).catch(() => {});
}).catch((err) => { console.error('[AgentStore]', err); });
}
// 从数据库加载该会话的 trace 步骤和 token 用量
@@ -160,7 +163,7 @@ export const useAgentStore = create<AgentState>((set, get) => ({
if (data.traceSteps) set({ traceSteps: data.traceSteps as TraceStep[] });
if (data.tokenUsage) set({ tokenUsage: data.tokenUsage as TokenUsage });
}
}).catch(() => {});
}).catch((err) => { console.error('[AgentStore]', err); });
}
},
@@ -190,8 +193,16 @@ export const useAgentStore = create<AgentState>((set, get) => ({
});
sessionId = session.id;
set({ currentSessionId: sessionId });
} catch {
// 创建失败时静默
} catch (err) {
console.error('[AgentStore]', 'Failed to create session:', err);
set({ agentStatus: 'error', isStreaming: false });
get().addMessage({
id: `msg_${Date.now()}_error`,
role: 'system',
content: `错误: 无法创建会话 — ${(err as Error).message}`,
timestamp: Date.now(),
});
return;
}
}
@@ -220,7 +231,7 @@ export const useAgentStore = create<AgentState>((set, get) => ({
window.metona?.sessions?.rename(sessionId, title);
useSessionStore.getState().updateSession(sessionId, { title });
}
}).catch(() => {});
}).catch((err) => { console.error('[AgentStore]', err); });
}
if (sessionId && window.metona?.agent?.sendMessage) {
@@ -257,22 +268,34 @@ export const useAgentStore = create<AgentState>((set, get) => ({
content: llmContent,
images: llmImages.length > 0 ? llmImages : undefined,
};
window.metona.agent.sendMessage(messageWithImages, sessionId).catch(() => {});
window.metona.agent.sendMessage(messageWithImages, sessionId).catch((err) => {
console.error('[AgentStore]', 'IPC sendMessage failed:', err);
set({ agentStatus: 'error', isStreaming: false });
get().addMessage({
id: `msg_${Date.now()}_error`,
role: 'system',
content: `错误: 消息发送失败 — ${(err as Error).message}`,
timestamp: Date.now(),
});
});
}
},
updateLastAssistantMessage: (delta: string) => {
set((s) => {
const messages = [...s.messages];
const lastMsg = messages[messages.length - 1];
const lastIdx = messages.length - 1;
const lastMsg = messages[lastIdx];
if (lastMsg?.role === 'assistant') {
lastMsg.content += delta;
// 不可变更新:创建新对象而非直接突变
messages[lastIdx] = { ...lastMsg, content: lastMsg.content + delta };
} else {
messages.push({
id: `msg_${Date.now()}_assistant`,
role: 'assistant',
content: delta,
timestamp: Date.now(),
iteration: s.currentIteration || undefined,
});
}
return { messages };
@@ -303,7 +326,7 @@ export const useAgentStore = create<AgentState>((set, get) => ({
setProvider: (provider, model) => {
// DeepSeek/Agnes 固定 1MOllama 从配置读取
const ollamaCtx = provider === 'ollama' ? 128_000 : 1_000_000;
const ollamaCtx = provider === 'ollama' ? 4096 : 1_000_000;
set({ provider, model, contextWindow: ollamaCtx });
// 异步读取 Ollama 实际配置
if (provider === 'ollama' && window.metona?.config?.get) {
@@ -311,7 +334,7 @@ export const useAgentStore = create<AgentState>((set, get) => ({
if (v != null && typeof v === 'number' && v > 0) {
set({ contextWindow: v });
}
}).catch(() => {});
}).catch((err) => { console.error('[AgentStore]', err); });
}
},
@@ -322,7 +345,7 @@ export const useAgentStore = create<AgentState>((set, get) => ({
saveTraceData: () => {
const { currentSessionId, traceSteps, tokenUsage } = get();
if (currentSessionId && window.metona?.sessions?.saveTrace) {
window.metona.sessions.saveTrace(currentSessionId, { traceSteps, tokenUsage }).catch(() => {});
window.metona.sessions.saveTrace(currentSessionId, { traceSteps, tokenUsage }).catch((err) => { console.error('[AgentStore]', err); });
}
},
@@ -341,7 +364,7 @@ export const useAgentStore = create<AgentState>((set, get) => ({
const sessionId = get().currentSessionId;
set({ agentStatus: 'idle', isStreaming: false });
if (sessionId && window.metona?.agent?.abortSession) {
window.metona.agent.abortSession(sessionId).catch(() => {});
window.metona.agent.abortSession(sessionId).catch((err) => { console.error('[AgentStore]', err); });
}
},
}));