





















@@ -163,6 +163,39 @@ function sanitizeAssistantPhasedContentBlocks(content: unknown[]): {
163163};
164164}
165165166+function projectAssistantTextFromMixedToolContent(
167+content: unknown[],
168+maxChars: number,
169+): { content: unknown[]; changed: boolean } | null {
170+const hasToolHistoryBlock = content.some((block) => {
171+if (!block || typeof block !== "object") {
172+return false;
173+}
174+return isToolHistoryBlockType((block as { type?: unknown }).type);
175+});
176+if (!hasToolHistoryBlock) {
177+return null;
178+}
179+180+const textBlocks: unknown[] = [];
181+for (const block of content) {
182+if (!block || typeof block !== "object") {
183+continue;
184+}
185+const entry = block as { type?: unknown; text?: unknown };
186+if (entry.type !== "text" || typeof entry.text !== "string" || !entry.text.trim()) {
187+continue;
188+}
189+const stripped = stripInlineDirectiveTagsForDisplay(entry.text);
190+const truncated = truncateChatHistoryText(stripped.text, maxChars);
191+if (truncated.text.trim()) {
192+textBlocks.push({ type: "text", text: truncated.text });
193+}
194+}
195+196+return textBlocks.length > 0 ? { content: textBlocks, changed: true } : null;
197+}
198+166199function toFiniteNumber(x: unknown): number | undefined {
167200return typeof x === "number" && Number.isFinite(x) ? x : undefined;
168201}
@@ -285,10 +318,19 @@ function sanitizeChatHistoryMessage(
285318changed = true;
286319}
287320if (entry.role === "assistant" && Array.isArray(entry.content)) {
288-const sanitizedPhases = sanitizeAssistantPhasedContentBlocks(entry.content);
289-if (sanitizedPhases.changed) {
290-entry.content = sanitizedPhases.content;
321+const mixedToolText = projectAssistantTextFromMixedToolContent(entry.content, maxChars);
322+if (mixedToolText) {
323+entry.content = mixedToolText.content;
324+if (entry.phase === "commentary") {
325+delete entry.phase;
326+}
291327changed = true;
328+} else {
329+const sanitizedPhases = sanitizeAssistantPhasedContentBlocks(entry.content);
330+if (sanitizedPhases.changed) {
331+entry.content = sanitizedPhases.content;
332+changed = true;
333+}
292334}
293335}
294336}
@@ -353,6 +395,31 @@ function hasAssistantNonTextContent(message: unknown): boolean {
353395);
354396}
355397398+function hasAssistantMixedToolVisibleText(message: unknown): boolean {
399+if (!message || typeof message !== "object") {
400+return false;
401+}
402+const content = (message as { content?: unknown }).content;
403+if (!Array.isArray(content)) {
404+return false;
405+}
406+let hasToolHistoryBlock = false;
407+let hasText = false;
408+for (const block of content) {
409+if (!block || typeof block !== "object") {
410+continue;
411+}
412+const entry = block as { type?: unknown; text?: unknown };
413+if (isToolHistoryBlockType(entry.type)) {
414+hasToolHistoryBlock = true;
415+}
416+if (entry.type === "text" && typeof entry.text === "string" && entry.text.trim()) {
417+hasText = true;
418+}
419+}
420+return hasToolHistoryBlock && hasText;
421+}
422+356423function shouldDropAssistantHistoryMessage(message: unknown): boolean {
357424if (!message || typeof message !== "object") {
358425return false;
@@ -362,7 +429,7 @@ function shouldDropAssistantHistoryMessage(message: unknown): boolean {
362429return false;
363430}
364431if (resolveAssistantMessagePhase(message) === "commentary") {
365-return true;
432+return !hasAssistantMixedToolVisibleText(message);
366433}
367434const text = extractAssistantTextForSilentCheck(message);
368435if (text === undefined || !isSuppressedControlReplyText(text)) {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。