
























@@ -1,5 +1,6 @@
11import type { AgentMessage } from "@mariozechner/pi-agent-core";
22import type { SessionManager } from "@mariozechner/pi-coding-agent";
3+import { stripInboundMetadata } from "../../auto-reply/reply/strip-inbound-meta.js";
34import type { OpenClawConfig } from "../../config/types.openclaw.js";
45import type { ProviderRuntimeModel } from "../../plugins/provider-runtime-model.types.js";
56import {
@@ -237,6 +238,7 @@ function stripStaleAssistantUsageBeforeLatestCompaction(messages: AgentMessage[]
237238// content and, on Bedrock or strict OpenAI-compatible providers, can also
238239// trigger turn-ordering rejections.
239240const TRANSCRIPT_ONLY_OPENCLAW_MODELS = new Set<string>(["delivery-mirror", "gateway-injected"]);
241+const OMITTED_INBOUND_METADATA_TEXT = "[assistant copied inbound metadata omitted]";
240242241243function isTranscriptOnlyOpenclawAssistant(message: AgentMessage): boolean {
242244if (!message || message.role !== "assistant") {
@@ -267,13 +269,48 @@ export function normalizeAssistantReplayContent(messages: AgentMessage[]): Agent
267269}
268270const replayContent = (message as { content?: unknown }).content;
269271if (typeof replayContent === "string") {
272+const strippedText = stripInboundMetadata(replayContent);
270273out.push({
271274 ...message,
272-content: [{ type: "text", text: replayContent }],
275+content: [
276+{
277+type: "text",
278+text: strippedText.trim() ? strippedText : OMITTED_INBOUND_METADATA_TEXT,
279+},
280+],
273281});
274282touched = true;
275283continue;
276284}
285+if (Array.isArray(replayContent)) {
286+let contentTouched = false;
287+const sanitizedContent = replayContent.map((block) => {
288+if (!block || typeof block !== "object") {
289+return block;
290+}
291+const text = (block as { text?: unknown }).text;
292+if (typeof text !== "string") {
293+return block;
294+}
295+const strippedText = stripInboundMetadata(text);
296+if (strippedText === text) {
297+return block;
298+}
299+contentTouched = true;
300+return {
301+ ...block,
302+text: strippedText.trim() ? strippedText : OMITTED_INBOUND_METADATA_TEXT,
303+};
304+});
305+if (contentTouched) {
306+out.push({
307+ ...message,
308+content: sanitizedContent,
309+});
310+touched = true;
311+continue;
312+}
313+}
277314if (Array.isArray(replayContent) && replayContent.length === 0) {
278315// An assistant turn can legitimately end with `content: []` — for
279316// example the silent-reply / NO_REPLY path locked in by
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。