diff --git a/src/renderer/components/chat-area.ts b/src/renderer/components/chat-area.ts
index 725d663..51fb8f6 100644
--- a/src/renderer/components/chat-area.ts
+++ b/src/renderer/components/chat-area.ts
@@ -260,7 +260,10 @@ function renderToolCallCard(tc: ToolCallRecord): string {
`;
}
-export function updateLastAssistantMessage(content: string, think: string | null, _stats: unknown, model?: string): void {
+export function updateLastAssistantMessage(
+ content: string, think: string | null, _stats: unknown, model?: string,
+ timestamp?: number, toolCalls?: ToolCallRecord[]
+): void {
const lastMsg = currentPlaceholder;
if (!lastMsg) return;
@@ -307,6 +310,45 @@ export function updateLastAssistantMessage(content: string, think: string | null
thinkBlock.querySelector('pre')!.textContent = think;
}
+ // ── 工具调用历史记录(可折叠)──
+ if (toolCalls && toolCalls.length > 0) {
+ let existingHistory = lastMsg.querySelector('.tool-calls-history');
+ if (existingHistory) existingHistory.remove();
+
+ const tcCount = toolCalls.length;
+ const successCount = toolCalls.filter(t => t.status === 'success').length;
+ const errorCount = toolCalls.filter(t => t.status === 'error').length;
+
+ const historyDiv = document.createElement('div');
+ historyDiv.className = 'tool-calls-history';
+ historyDiv.innerHTML = `
+
+ ▸
+ 🔧 ${tcCount} 个工具调用(✅${successCount} ❌${errorCount})
+
+
+ ${toolCalls.map(tc => renderToolCallCard(tc)).join('')}
+
+ `;
+ const msgBody = lastMsg.querySelector('.msg-body');
+ if (msgBody) {
+ const refNode = contentDiv?.nextSibling || null;
+ msgBody.insertBefore(historyDiv, refNode);
+ }
+ }
+
+ // ── 时间戳 ──
+ if (timestamp) {
+ let statsDiv = lastMsg.querySelector('.msg-stats');
+ if (!statsDiv) {
+ statsDiv = document.createElement('div');
+ statsDiv.className = 'msg-stats';
+ const msgBody = lastMsg.querySelector('.msg-body');
+ if (msgBody) msgBody.appendChild(statsDiv);
+ }
+ statsDiv.innerHTML = `${formatTime(timestamp)}`;
+ }
+
scrollToBottom();
}
diff --git a/src/renderer/components/input-area.ts b/src/renderer/components/input-area.ts
index 17f47b8..36be12a 100644
--- a/src/renderer/components/input-area.ts
+++ b/src/renderer/components/input-area.ts
@@ -356,7 +356,7 @@ async function handleRetry(): Promise {
...s, messages: [...s.messages, lastMsg], updatedAt: Date.now()
}));
}
- updateLastAssistantMessage(finalContent, retryThinkContent || null, loopStats || null);
+ updateLastAssistantMessage(finalContent, retryThinkContent || null, loopStats || null, undefined, Date.now(), toolRecords?.length ? toolRecords : undefined);
} else {
const assistantMsg: ChatMessage = {
role: 'assistant', content: finalContent || '', timestamp: Date.now(),
@@ -369,7 +369,7 @@ async function handleRetry(): Promise {
state.update(KEYS.CURRENT_SESSION, (s: ChatSession | null) => ({
...s, messages: [...s.messages, assistantMsg], updatedAt: Date.now()
}));
- updateLastAssistantMessage(finalContent, retryThinkContent || null, loopStats || null);
+ updateLastAssistantMessage(finalContent, retryThinkContent || null, loopStats || null, undefined, Date.now(), toolRecords?.length ? toolRecords : undefined);
}
renderMessages();
await saveCurrentSession();
@@ -749,7 +749,9 @@ export async function sendMessage(): Promise {
}));
if (finalStats) {
- updateLastAssistantMessage(assistantContent, thinkContent || null, finalStats, modelName || undefined);
+ updateLastAssistantMessage(assistantContent, thinkContent || null, finalStats, modelName || undefined, Date.now());
+ } else {
+ updateLastAssistantMessage(assistantContent, thinkContent || null, null, modelName || undefined, Date.now());
}
await saveCurrentSession();
@@ -1067,7 +1069,7 @@ async function sendMessageWithAgentLoop(text: string, currentSession: ChatSessio
updatedAt: Date.now()
}));
}
- updateLastAssistantMessage(assistantContent, thinkContent || null, loopStats || null);
+ updateLastAssistantMessage(assistantContent, thinkContent || null, loopStats || null, undefined, Date.now(), toolRecords?.length ? toolRecords : undefined);
} else {
// 单迭代模式:正常保存
const assistantMsg: ChatMessage = {
@@ -1085,7 +1087,7 @@ async function sendMessageWithAgentLoop(text: string, currentSession: ChatSessio
messages: [...session.messages, assistantMsg],
updatedAt: Date.now()
}));
- updateLastAssistantMessage(assistantContent, thinkContent || null, loopStats || null);
+ updateLastAssistantMessage(assistantContent, thinkContent || null, loopStats || null, undefined, Date.now(), toolRecords?.length ? toolRecords : undefined);
}
renderMessages();
await saveCurrentSession();