on main help sign in
fix: fix `panic` that happens on `crush run` with tool calls

We need to track the number of read bytes per message. Fixes #871

commit4bd2cddfee45bb072623c68a9e5cd4efc138488c authorAndrey Nering <andreynering@users.noreply.github.com> dateMon 25 Aug 2025, 15:08 (1 year ago) parent15b989c
1 file changed+15−3
internal/app/app.go+15−3
internal/app/app.go+15−3
@@ -154,7 +154,7 @@ func (app *App) RunNonInteractive(ctx context.Context, prompt string, quiet bool
154154 }
155155
156156 messageEvents := app.Messages.Subscribe(ctx)
157− readBts := 0
157+ messageReadBytes := make(map[string]int)
158158
159159 for {
160160 select {
@@ -170,11 +170,14 @@ func (app *App) RunNonInteractive(ctx context.Context, prompt string, quiet bool
170170 }
171171
172172 msgContent := result.Message.Content().String()
173+ readBts := messageReadBytes[result.Message.ID]
174+
173175 if len(msgContent) < readBts {
174176 slog.Error("Non-interactive: message content is shorter than read bytes", "message_length", len(msgContent), "read_bytes", readBts)
175177 return fmt.Errorf("message content is shorter than read bytes: %d < %d", len(msgContent), readBts)
176178 }
177179 fmt.Println(msgContent[readBts:])
180+ messageReadBytes[result.Message.ID] = len(msgContent)
178181
179182 slog.Info("Non-interactive: run completed", "session_id", sess.ID)
180183 return nil
@@ -183,9 +186,18 @@ func (app *App) RunNonInteractive(ctx context.Context, prompt string, quiet bool
183186 msg := event.Payload
184187 if msg.SessionID == sess.ID && msg.Role == message.Assistant && len(msg.Parts) > 0 {
185188 stopSpinner()
186− part := msg.Content().String()[readBts:]
189+
190+ content := msg.Content().String()
191+ readBytes := messageReadBytes[msg.ID]
192+
193+ if len(content) < readBytes {
194+ slog.Error("Non-interactive: message content is shorter than read bytes", "message_length", len(content), "read_bytes", readBytes)
195+ return fmt.Errorf("message content is shorter than read bytes: %d < %d", len(content), readBytes)
196+ }
197+
198+ part := content[readBytes:]
187199 fmt.Print(part)
188− readBts += len(part)
200+ messageReadBytes[msg.ID] = len(content)
189201 }
190202
191203 case <-ctx.Done():