From fa7cb91ac0e74c9398c482346c39cc7def5039ff Mon Sep 17 00:00:00 2001 From: Amolith Date: Sat, 3 Jan 2026 18:17:37 -0700 Subject: [PATCH] fix(acp): skip echoing user messages to client The client already knows what it sent via the prompt request. Echoing user messages back caused them to appear twice in the client display. Assisted-by: Claude Opus 4.5 via Crush --- internal/acp/sink.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/internal/acp/sink.go b/internal/acp/sink.go index e6d7af94edcc873fc222f27b288a7fa1323f8fff..fd739b894ddadbe6d67c941c7fdd11024efe087b 100644 --- a/internal/acp/sink.go +++ b/internal/acp/sink.go @@ -175,6 +175,12 @@ func (s *Sink) translatePart(msgID string, role message.MessageRole, part messag } func (s *Sink) translateText(msgID string, role message.MessageRole, text message.TextContent) *acp.SessionUpdate { + // Skip user messages - the client already knows what it sent via the + // prompt request. + if role != message.Assistant { + return nil + } + offset := s.textOffsets[msgID] if len(text.Text) <= offset { return nil @@ -187,16 +193,8 @@ func (s *Sink) translateText(msgID string, role message.MessageRole, text messag return nil } - switch role { - case message.Assistant: - update := acp.UpdateAgentMessageText(delta) - return &update - case message.User: - update := acp.UpdateUserMessageText(delta) - return &update - default: - return nil - } + update := acp.UpdateAgentMessageText(delta) + return &update } func (s *Sink) translateReasoning(msgID string, reasoning message.ReasoningContent) *acp.SessionUpdate {