

























@@ -146,6 +146,7 @@ export class CodexAppServerEventProjector {
146146string,
147147{ chars: number; messages: number; truncated: boolean }
148148>();
149+private readonly toolResultOutputTextByItem = new Map<string, string>();
149150private readonly toolMetas = new Map<string, { toolName: string; meta?: string }>();
150151private readonly toolTranscriptMessages: AgentMessage[] = [];
151152private readonly toolTranscriptCallIds = new Set<string>();
@@ -706,7 +707,11 @@ export class CodexAppServerEventProjector {
706707private handleOutputDelta(params: JsonObject, toolName: string): void {
707708const itemId = readString(params, "itemId");
708709const delta = readString(params, "delta");
709-if (!itemId || !delta || !this.shouldEmitToolOutput()) {
710+if (!itemId || !delta) {
711+return;
712+}
713+appendToolOutputDeltaText(this.toolResultOutputTextByItem, itemId, delta);
714+if (!this.shouldEmitToolOutput()) {
710715return;
711716}
712717if (
@@ -953,7 +958,7 @@ export class CodexAppServerEventProjector {
953958return;
954959}
955960const toolResult = itemToolResult(params.item).result;
956-const output = itemOutputText(params.item);
961+const output = itemOutputText(params.item, this.toolResultOutputTextByItem);
957962this.options.trajectoryRecorder?.recordEvent("tool.result", {
958963threadId: this.threadId,
959964turnId: this.turnId,
@@ -1029,7 +1034,7 @@ export class CodexAppServerEventProjector {
10291034}
10301035this.afterToolCallObservedItemIds.add(item.id);
10311036const result = itemToolResult(item).result;
1032-const error = itemToolError(item, status);
1037+const error = itemToolError(item, status, this.toolResultOutputTextByItem);
10331038const startedAt =
10341039typeof item.durationMs === "number" ? Date.now() - Math.max(0, item.durationMs) : undefined;
10351040const hookParams = {
@@ -1097,7 +1102,7 @@ export class CodexAppServerEventProjector {
10971102return;
10981103}
10991104const toolName = itemName(item);
1100-const output = itemOutputText(item);
1105+const output = itemOutputText(item, this.toolResultOutputTextByItem);
11011106if (!toolName || !output) {
11021107return;
11031108}
@@ -1190,7 +1195,7 @@ export class CodexAppServerEventProjector {
11901195this.recordToolTranscriptResult({
11911196id: item.id,
11921197 name,
1193-text: itemTranscriptResultText(item),
1198+text: itemTranscriptResultText(item, this.toolResultOutputTextByItem),
11941199isError: isNonSuccessItemStatus(itemStatus(item)),
11951200});
11961201}
@@ -1789,14 +1794,15 @@ function itemFileChanges(item: CodexThreadItem): Array<{ path: string; kind: str
17891794function itemToolError(
17901795item: CodexThreadItem,
17911796status: ReturnType<typeof itemStatus>,
1797+outputTextByItem?: ReadonlyMap<string, string>,
17921798): string | undefined {
17931799if (status === "blocked") {
17941800return "codex native tool blocked";
17951801}
17961802if (status !== "failed") {
17971803return undefined;
17981804}
1799-return itemOutputText(item) ?? "codex native tool failed";
1805+return itemOutputText(item, outputTextByItem) ?? "codex native tool failed";
18001806}
1801180718021808function itemMeta(
@@ -1823,9 +1829,12 @@ function itemMeta(
18231829return undefined;
18241830}
182518311826-function itemOutputText(item: CodexThreadItem): string | undefined {
1832+function itemOutputText(
1833+item: CodexThreadItem,
1834+outputTextByItem?: ReadonlyMap<string, string>,
1835+): string | undefined {
18271836if (item.type === "commandExecution") {
1828-return item.aggregatedOutput?.trim() || undefined;
1837+return item.aggregatedOutput?.trim() || outputTextByItem?.get(item.id)?.trim() || undefined;
18291838}
18301839if (item.type === "dynamicToolCall") {
18311840return collectDynamicToolContentText(item.contentItems).trim() || undefined;
@@ -1839,15 +1848,32 @@ function itemOutputText(item: CodexThreadItem): string | undefined {
18391848return undefined;
18401849}
184118501842-function itemTranscriptResultText(item: CodexThreadItem): string | undefined {
1843-const output = itemOutputText(item);
1851+function itemTranscriptResultText(
1852+item: CodexThreadItem,
1853+outputTextByItem?: ReadonlyMap<string, string>,
1854+): string | undefined {
1855+const output = itemOutputText(item, outputTextByItem);
18441856if (output) {
18451857return output;
18461858}
18471859const result = itemToolResult(item).result;
18481860return result ? stringifyJsonValue(result) : itemStatus(item);
18491861}
185018621863+function appendToolOutputDeltaText(
1864+outputTextByItem: Map<string, string>,
1865+itemId: string,
1866+delta: string,
1867+): void {
1868+const current = outputTextByItem.get(itemId) ?? "";
1869+if (current.length >= TOOL_TRANSCRIPT_OUTPUT_MAX_CHARS) {
1870+return;
1871+}
1872+const remaining = TOOL_TRANSCRIPT_OUTPUT_MAX_CHARS - current.length;
1873+const next = current + (delta.length > remaining ? delta.slice(0, remaining) : delta);
1874+outputTextByItem.set(itemId, next);
1875+}
1876+18511877function normalizeToolTranscriptArguments(value: unknown): Record<string, unknown> {
18521878if (!value || typeof value !== "object" || Array.isArray(value)) {
18531879return {};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。