fix: 工作流完整性和协调性修复

修复 6 个问题:
1. 新一轮对话清理上轮工具卡片和终端输出(避免越积越多)
2. 中止 Agent Loop 时保留已执行的工具记录(不再丢失)
3. 切换历史会话时清理工作空间状态
4. handleRetry 保存 think 内容(之前丢失)
5. 中止流程统一:agent-engine 抛出 AbortError 由消费方处理(消除重复消息风险)
6. 导出 clearToolCardsExternal/clearTerminalExternal 供外部调用
This commit is contained in:
thzxx
2026-04-19 19:48:46 +08:00
parent f5fd851224
commit 01c17a66fc
4 changed files with 53 additions and 10 deletions
+8 -6
View File
@@ -518,8 +518,10 @@ export async function runAgentLoop(
// 检查是否已中止
if (state.get<AbortController | null>(KEYS.ABORT_CONTROLLER)?.signal.aborted) {
logInfo('ReAct Agent Loop 已中止');
callbacks.onDone(content, allToolRecords.length > 0 ? allToolRecords : undefined, makeStats());
return;
if (allToolRecords.length > 0) {
state.set('_abortToolRecords', allToolRecords);
}
throw new DOMException('Aborted', 'AbortError');
}
logAgentLoop(loopCount, maxLoops);
@@ -591,11 +593,11 @@ export async function runAgentLoop(
} catch (err) {
if (abortController.signal.aborted) {
logInfo('流式调用已中止');
if (content || thinking) {
messages.push({ role: 'assistant', content, ...(thinking && { thinking }) });
// 保存工具记录到 state,供消费方的 catch 处理中止消息
if (allToolRecords.length > 0) {
state.set('_abortToolRecords', allToolRecords);
}
callbacks.onDone(content, allToolRecords.length > 0 ? allToolRecords : undefined, makeStats());
return;
throw err; // 抛出 AbortError,由消费方统一处理
}
logError('流式调用异常', (err as Error).message);
// 清理预算警告临时消息