diff --git a/.vscode/settings.json b/.vscode/settings.json index 89d1965..14cb7f6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,7 @@ { "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[go]": { + "editor.defaultFormatter": "golang.go" + } } \ No newline at end of file diff --git a/lib/screentracker/conversation.go b/lib/screentracker/conversation.go index 4311897..8e55e57 100644 --- a/lib/screentracker/conversation.go +++ b/lib/screentracker/conversation.go @@ -289,15 +289,23 @@ func (c *Conversation) writeMessageWithConfirmation(ctx context.Context, message // wait for the screen to change after the carriage return is written screenBeforeCarriageReturn := c.cfg.AgentIO.ReadScreen() + lastCarriageReturnTime := time.Time{} if err := util.WaitFor(ctx, util.WaitTimeout{ Timeout: 15 * time.Second, MinInterval: 25 * time.Millisecond, }, func() (bool, error) { - if _, err := c.cfg.AgentIO.Write([]byte("\r")); err != nil { - return false, xerrors.Errorf("failed to write carriage return: %w", err) + // we don't want to spam additional carriage returns because the agent may process them + // (aider does this), but we do want to retry sending one if nothing's + // happening for a while + if time.Since(lastCarriageReturnTime) >= 3*time.Second { + lastCarriageReturnTime = time.Now() + if _, err := c.cfg.AgentIO.Write([]byte("\r")); err != nil { + return false, xerrors.Errorf("failed to write carriage return: %w", err) + } } time.Sleep(25 * time.Millisecond) screen := c.cfg.AgentIO.ReadScreen() + return screen != screenBeforeCarriageReturn, nil }); err != nil { return xerrors.Errorf("failed to wait for processing to start: %w", err)