diff --git a/src/common/events.ts b/src/common/events.ts index ecfedcb..367a345 100644 --- a/src/common/events.ts +++ b/src/common/events.ts @@ -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"; }