From 047585866a80c6e91af4145ed790161cbcd3701b Mon Sep 17 00:00:00 2001 From: Olivier Debeuf De Rijcker Date: Sat, 3 Jan 2026 20:53:49 +0100 Subject: [PATCH] fix: Add retry logic for Enter key send in NudgeSession/NudgePane (#53) When sending messages to Claude sessions via tmux, the Enter key send could fail silently. This caused polecats to receive their initial prompt but never submit it - the message appeared in Claude's input area but Enter was never pressed. Add retry logic (up to 3 attempts with 200ms delays) for the Enter send step in both NudgeSession() and NudgePane(). This ensures message submission is more reliable even if tmux has transient issues. Fixes #41 --- internal/tmux/tmux.go | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/internal/tmux/tmux.go b/internal/tmux/tmux.go index 7e1936ff..844af816 100644 --- a/internal/tmux/tmux.go +++ b/internal/tmux/tmux.go @@ -274,12 +274,19 @@ func (t *Tmux) NudgeSession(session, message string) error { // 2. Wait 500ms for paste to complete (tested, required) time.Sleep(500 * time.Millisecond) - // 3. Send Enter as separate command (key to reliability) - if _, err := t.run("send-keys", "-t", session, "Enter"); err != nil { - return err + // 3. Send Enter with retry (critical for message submission) + var lastErr error + for attempt := 0; attempt < 3; attempt++ { + if attempt > 0 { + time.Sleep(200 * time.Millisecond) + } + if _, err := t.run("send-keys", "-t", session, "Enter"); err != nil { + lastErr = err + continue + } + return nil } - - return nil + return fmt.Errorf("failed to send Enter after 3 attempts: %w", lastErr) } // NudgePane sends a message to a specific pane reliably. @@ -293,12 +300,19 @@ func (t *Tmux) NudgePane(pane, message string) error { // 2. Wait 500ms for paste to complete (tested, required) time.Sleep(500 * time.Millisecond) - // 3. Send Enter as separate command (key to reliability) - if _, err := t.run("send-keys", "-t", pane, "Enter"); err != nil { - return err + // 3. Send Enter with retry (critical for message submission) + var lastErr error + for attempt := 0; attempt < 3; attempt++ { + if attempt > 0 { + time.Sleep(200 * time.Millisecond) + } + if _, err := t.run("send-keys", "-t", pane, "Enter"); err != nil { + lastErr = err + continue + } + return nil } - - return nil + return fmt.Errorf("failed to send Enter after 3 attempts: %w", lastErr) } // AcceptBypassPermissionsWarning dismisses the Claude Code bypass permissions warning dialog.