diff --git a/packages/acp/src/index.ts b/packages/acp/src/index.ts index 97a3d5b0a2..66be7458ec 100644 --- a/packages/acp/src/index.ts +++ b/packages/acp/src/index.ts @@ -59,7 +59,7 @@ import { } from '@agentclientprotocol/sdk' import type { ContentBlock } from '@deepseek-ai/dsh-llm' import type { Agent, AgentStatus } from '@deepseek-ai/dsh-agent' -import type { SessionEvent } from '@deepseek-ai/dsh-session' +import type { SessionEvent, TurnEndReason } from '@deepseek-ai/dsh-session' import type { ToolCallKind, ToolCallPresentation, ToolRegistry, ToolResultPresentation, ToolTerminal } from '@deepseek-ai/dsh-tools' // Side-effect type import: declaration-merges `ctx.sessionPersistence` onto // Context (the bridge injects it and reads `list()` for load cwd validation). @@ -282,6 +282,18 @@ export function apply(ctx: Context, config: AcpConfig): void { inflight.resolve(reason) } + /** Apply the single ACP prompt-settlement mapping for a completed turn. */ + const settleFromTurnEnd = ( + inflight: NonNullable, + reason: TurnEndReason, + ): void => { + if (reason.kind === 'error') { + inflight.reject(internalError(`turn failed: ${reason.message}`)) + } else { + inflight.resolve(turnEndToStopReason(reason)) + } + } + // --- Stream the harness event taxonomy to ACP session/update -------------- // All content streaming AND the prompt settle flow through `session/event`, @@ -327,12 +339,7 @@ export function apply(ctx: Context, config: AcpConfig): void { // Settle only on the OWNING turn's end. if (event.type !== 'turn/end' || inflight.turn !== event.data.turn) return rec.inflight = undefined - const reason = event.data.reason - if (reason.kind === 'error') { - inflight.reject(internalError(`turn failed: ${reason.message}`)) - } else { - inflight.resolve(turnEndToStopReason(reason)) - } + settleFromTurnEnd(inflight, event.data.reason) }) // Settle fallback: a `session/event` listener registered BEFORE ACP that @@ -373,12 +380,7 @@ export function apply(ctx: Context, config: AcpConfig): void { inflight.resolve('cancelled') return } - const reason = end.data.reason - if (reason.kind === 'error') { - inflight.reject(internalError(`turn failed: ${reason.message}`)) - } else { - inflight.resolve(turnEndToStopReason(reason)) - } + settleFromTurnEnd(inflight, end.data.reason) } // On a settle to idle/disposed, reconcile any still-pending prompt from the