From 48178d44db155920826fdda976dcfc93780b57d5 Mon Sep 17 00:00:00 2001 From: tt-a1i <53142663+tt-a1i@users.noreply.github.com> Date: Sat, 20 Jun 2026 12:51:21 +0800 Subject: [PATCH] fix(acp): fallback unknown turn end reasons --- .changeset/acp-stop-reason-fallback.md | 5 +++++ packages/acp-adapter/src/events-map.ts | 4 ++++ packages/acp-adapter/test/events-map.test.ts | 17 +++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 .changeset/acp-stop-reason-fallback.md create mode 100644 packages/acp-adapter/test/events-map.test.ts diff --git a/.changeset/acp-stop-reason-fallback.md b/.changeset/acp-stop-reason-fallback.md new file mode 100644 index 000000000..11407bdd0 --- /dev/null +++ b/.changeset/acp-stop-reason-fallback.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Fallback ACP turn-end stop reason mapping to `end_turn` for unknown runtime values. diff --git a/packages/acp-adapter/src/events-map.ts b/packages/acp-adapter/src/events-map.ts index 37b4cc6ca..71a17ef45 100644 --- a/packages/acp-adapter/src/events-map.ts +++ b/packages/acp-adapter/src/events-map.ts @@ -56,6 +56,8 @@ export function assistantDeltaToSessionUpdate( * belong on the JSON-RPC error channel). Returning `end_turn` keeps the * client unblocked; the caller is expected to log the `error` payload * separately so the failure is observable in the agent logs. + * Unknown runtime values also fall back to `end_turn` so a newer SDK + * reason cannot leak `undefined` onto the ACP wire. */ export function turnEndReasonToStopReason(reason: TurnEndReason): AcpStopReason { switch (reason) { @@ -65,6 +67,8 @@ export function turnEndReasonToStopReason(reason: TurnEndReason): AcpStopReason return 'cancelled'; case 'failed': return 'end_turn'; + default: + return 'end_turn'; } } diff --git a/packages/acp-adapter/test/events-map.test.ts b/packages/acp-adapter/test/events-map.test.ts new file mode 100644 index 000000000..15637022c --- /dev/null +++ b/packages/acp-adapter/test/events-map.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest'; + +import type { TurnEndReason } from '@moonshot-ai/kimi-code-sdk'; + +import { turnEndReasonToStopReason } from '../src/events-map'; + +describe('turnEndReasonToStopReason', () => { + it('maps known SDK turn-end reasons to ACP stop reasons', () => { + expect(turnEndReasonToStopReason('completed')).toBe('end_turn'); + expect(turnEndReasonToStopReason('cancelled')).toBe('cancelled'); + expect(turnEndReasonToStopReason('failed')).toBe('end_turn'); + }); + + it('falls back to end_turn for unknown runtime reasons', () => { + expect(turnEndReasonToStopReason('interrupted' as TurnEndReason)).toBe('end_turn'); + }); +});