on main help sign in
fix: fix `panic` that happens on `crush run` with tool calls
4bd2cddAndrey Nering
internal/app/app.go+15−3
@@ -154,7 +154,7 @@ func (app *App) RunNonInteractive(ctx context.Context, prompt string, quiet bool
154 }
154 }
155
155
156 messageEvents := app.Messages.Subscribe(ctx)
156 messageEvents := app.Messages.Subscribe(ctx)
157− readBts := 0
157+ messageReadBytes := make(map[string]int)
158
158
159 for {
159 for {
160 select {
160 select {
@@ -170,11 +170,14 @@ func (app *App) RunNonInteractive(ctx context.Context, prompt string, quiet bool
170 }
170 }
171
171
172 msgContent := result.Message.Content().String()
172 msgContent := result.Message.Content().String()
173+ readBts := messageReadBytes[result.Message.ID]
174+
173 if len(msgContent) < readBts {
175 if len(msgContent) < readBts {
174 slog.Error("Non-interactive: message content is shorter than read bytes", "message_length", len(msgContent), "read_bytes", readBts)
176 slog.Error("Non-interactive: message content is shorter than read bytes", "message_length", len(msgContent), "read_bytes", readBts)
175 return fmt.Errorf("message content is shorter than read bytes: %d < %d", len(msgContent), readBts)
177 return fmt.Errorf("message content is shorter than read bytes: %d < %d", len(msgContent), readBts)
176 }
178 }
177 fmt.Println(msgContent[readBts:])
179 fmt.Println(msgContent[readBts:])
180+ messageReadBytes[result.Message.ID] = len(msgContent)
178
181
179 slog.Info("Non-interactive: run completed", "session_id", sess.ID)
182 slog.Info("Non-interactive: run completed", "session_id", sess.ID)
180 return nil
183 return nil
@@ -183,9 +186,18 @@ func (app *App) RunNonInteractive(ctx context.Context, prompt string, quiet bool
183 msg := event.Payload
186 msg := event.Payload
184 if msg.SessionID == sess.ID && msg.Role == message.Assistant && len(msg.Parts) > 0 {
187 if msg.SessionID == sess.ID && msg.Role == message.Assistant && len(msg.Parts) > 0 {
185 stopSpinner()
188 stopSpinner()
189+
186− part := msg.Content().String()[readBts:]
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:]
187 fmt.Print(part)
199 fmt.Print(part)
188− readBts += len(part)
200+ messageReadBytes[msg.ID] = len(content)
189 }
201 }
190
202
191 case <-ctx.Done():
203 case <-ctx.Done():