| 253 | slot := e.slots[tid] |
| 254 | if slot == nil || slot.State == ToolStateYielded { |
| 255 | continue |
| 256 | } |
| 257 | if slot.Result != nil { |
| 258 | results = append(results, slot.Result) |
| 259 | } |
| 260 | } |
| 261 | if len(results) > 1 && totalToolResultContentChars(results) > e.Config.MaxMessageToolResultsChars { |
| 262 | return coretools.ApplyAggregateResultBudget(results, e.Config.MaxMessageToolResultsChars) |
| 263 | } |
| 264 | return results |
| 265 | } |
| 266 | |
| 267 | func (e *StreamingToolExecutor) hasRunningWork() bool { |
| 268 | e.mu.Lock() |
| 269 | defer e.mu.Unlock() |
| 270 | for _, slot := range e.slots { |
| 271 | if slot.State == ToolStateExecuting { |
| 272 | return true |
| 273 | } |
| 274 | } |
| 275 | return false |
| 276 | } |
| 277 | |
| 278 | func (e *StreamingToolExecutor) HasRunningWork() bool { |
| 279 | return e.hasRunningWork() |
| 280 | } |
| 281 | |
| 282 | func (e *StreamingToolExecutor) DrainProgress() []map[string]any { |
| 283 | var events []map[string]any |
| 284 | for { |
| 285 | select { |
| 286 | case item := <-e.progress: |
| 287 | events = append(events, item) |
| 288 | default: |
| 289 | return events |
| 290 | } |
| 291 | } |