fix: preserve truncated tool call identity fields

This commit is contained in:
lyon
2026-06-16 00:52:43 +08:00
parent 88a17933c7
commit 35dc7e8b6a
+34 -1
View File
@@ -86,7 +86,7 @@ function normalizeToolCallPayload(payload: JsonRecord): JsonRecord {
const summary = boundedTextSummary(json);
if (summary.outputTruncated !== true) return { ...redacted, summary, outputBytes: summary.outputBytes, outputTruncated: false };
return {
method: typeof payload.method === "string" ? payload.method : null,
...preservedToolCallSummaryFields(redacted),
itemPreview: summary.text,
summary,
outputBytes: summary.outputBytes,
@@ -94,6 +94,39 @@ function normalizeToolCallPayload(payload: JsonRecord): JsonRecord {
};
}
function preservedToolCallSummaryFields(payload: JsonRecord): JsonRecord {
const result: JsonRecord = {};
copyToolCallPrimitive(result, payload, "method");
copyToolCallPrimitive(result, payload, "itemId");
copyToolCallPrimitive(result, payload, "type");
copyToolCallPrimitive(result, payload, "toolName");
copyToolCallPrimitive(result, payload, "name");
copyToolCallPrimitive(result, payload, "status");
copyToolCallPrimitive(result, payload, "exitCode");
copyToolCallPrimitive(result, payload, "durationMs");
copyToolCallPrimitive(result, payload, "outputBytes");
copyToolCallPrimitive(result, payload, "outputTruncated");
copyToolCallSummaryText(result, payload, "command", 600);
copyToolCallSummaryText(result, payload, "commandLine", 600);
copyToolCallSummaryText(result, payload, "outputSummary", 1_000);
copyToolCallSummaryText(result, payload, "stdoutSummary", 1_000);
return result;
}
function copyToolCallPrimitive(target: JsonRecord, source: JsonRecord, key: string): void {
const value = source[key];
if (typeof value === "string" && value.trim().length > 0) target[key] = value;
else if (typeof value === "number" && Number.isFinite(value)) target[key] = value;
else if (typeof value === "boolean") target[key] = value;
}
function copyToolCallSummaryText(target: JsonRecord, source: JsonRecord, key: string, limitChars: number): void {
const value = source[key];
if (typeof value !== "string" || value.trim().length === 0) return;
const summary = boundedTextSummary(value, { limitChars });
target[key] = summary.text;
}
function isCommandExecutionToolCall(payload: JsonRecord): boolean {
return payload.toolName === "commandExecution" || payload.type === "commandExecution";
}