diff --git a/src/acp/translator.ts b/src/acp/translator.ts index 5039cb155..c7cf3739a 100644 --- a/src/acp/translator.ts +++ b/src/acp/translator.ts @@ -423,7 +423,9 @@ export class AcpGatewayAgent implements Agent { } if (state === "final") { - this.finishPrompt(pending.sessionId, pending, "end_turn"); + const rawStopReason = payload.stopReason as string | undefined; + const stopReason: StopReason = rawStopReason === "max_tokens" ? "max_tokens" : "end_turn"; + this.finishPrompt(pending.sessionId, pending, stopReason); return; } if (state === "aborted") { diff --git a/src/gateway/server-chat.ts b/src/gateway/server-chat.ts index 00dc2a9d3..67da7cd8d 100644 --- a/src/gateway/server-chat.ts +++ b/src/gateway/server-chat.ts @@ -346,6 +346,7 @@ export function createAgentEventHandler({ seq: number, jobState: "done" | "error", error?: unknown, + stopReason?: string, ) => { const bufferedText = stripInlineDirectiveTagsForDisplay( chatRunState.buffers.get(clientRunId) ?? "", @@ -399,6 +400,7 @@ export function createAgentEventHandler({ sessionKey, seq, state: "final" as const, + ...(stopReason && { stopReason }), message: text && !shouldSuppressSilent ? { @@ -512,6 +514,8 @@ export function createAgentEventHandler({ if (!isAborted && evt.stream === "assistant" && typeof evt.data?.text === "string") { emitChatDelta(sessionKey, clientRunId, evt.runId, evt.seq, evt.data.text); } else if (!isAborted && (lifecyclePhase === "end" || lifecyclePhase === "error")) { + const evtStopReason = + typeof evt.data?.stopReason === "string" ? evt.data.stopReason : undefined; if (chatLink) { const finished = chatRunState.registry.shift(evt.runId); if (!finished) { @@ -525,6 +529,7 @@ export function createAgentEventHandler({ evt.seq, lifecyclePhase === "error" ? "error" : "done", evt.data?.error, + evtStopReason, ); } else { emitChatFinal( @@ -534,6 +539,7 @@ export function createAgentEventHandler({ evt.seq, lifecyclePhase === "error" ? "error" : "done", evt.data?.error, + evtStopReason, ); } } else if (isAborted && (lifecyclePhase === "end" || lifecyclePhase === "error")) {