| 344 | case "tool_call_started": |
| 345 | r.recordInlineActivity("tool_call", FormatToolCallEntry(event)) |
| 346 | case "tool_call_finished": |
| 347 | r.recordInlineActivity("tool_result", FormatToolResultEntry(event)) |
| 348 | case "ui_warning": |
| 349 | if event.Content != "" { |
| 350 | r.Frame.Warnings = append(r.Frame.Warnings, event.Content) |
| 351 | r.markDirty() |
| 352 | } |
| 353 | case "ui_fatal": |
| 354 | if event.Content != "" { |
| 355 | r.Frame.Errors = append(r.Frame.Errors, event.Content) |
| 356 | r.markDirty() |
| 357 | } |
| 358 | } |
| 359 | } |
| 360 | |
| 361 | func (r *UiRuntime) DrainTaskEvents() { |
| 362 | updated := false |
| 363 | for { |
| 364 | select { |
| 365 | case taskEvent := <-r.TaskSink.queue: |
| 366 | r.Frame.Tasks[taskEvent.TaskID] = taskEvent.Record |
| 367 | if taskEvent.Type == "task_summary_available" { |