forwardAgentEvents subscribes to agent events and forwards them to the frontend
(ag *agent.Agent, agentID string)
| 520 | |
| 521 | // forwardAgentEvents subscribes to agent events and forwards them to the frontend |
| 522 | func (a *App) forwardAgentEvents(ag *agent.Agent, agentID string) { |
| 523 | eventCh := ag.Subscribe([]types.AgentChannel{ |
| 524 | types.ChannelProgress, |
| 525 | types.ChannelControl, |
| 526 | }, nil) |
| 527 | |
| 528 | for envelope := range eventCh { |
| 529 | var event *FrontendEvent |
| 530 | |
| 531 | switch e := envelope.Event.(type) { |
| 532 | case *types.ProgressTextChunkEvent: |
| 533 | event = &FrontendEvent{ |
| 534 | Type: EventTypeTextChunk, |
| 535 | AgentID: agentID, |
| 536 | Data: map[string]string{"delta": e.Delta}, |
| 537 | } |
| 538 | |
| 539 | case *types.ProgressToolStartEvent: |
| 540 | event = &FrontendEvent{ |
| 541 | Type: EventTypeToolStart, |
| 542 | AgentID: agentID, |
| 543 | Data: map[string]any{ |
| 544 | "call_id": e.Call.ID, |
| 545 | "name": e.Call.Name, |
| 546 | "arguments": e.Call.Arguments, |
| 547 | }, |
| 548 | } |
| 549 | |
| 550 | case *types.ProgressToolEndEvent: |
| 551 | event = &FrontendEvent{ |
| 552 | Type: EventTypeToolEnd, |
| 553 | AgentID: agentID, |
| 554 | Data: map[string]any{ |
| 555 | "call_id": e.Call.ID, |
| 556 | "name": e.Call.Name, |
| 557 | "result": e.Call.Result, |
| 558 | "error": e.Call.Error, |
| 559 | }, |
| 560 | } |
| 561 | |
| 562 | case *types.ProgressToolProgressEvent: |
| 563 | event = &FrontendEvent{ |
| 564 | Type: EventTypeToolProgress, |
| 565 | AgentID: agentID, |
| 566 | Data: map[string]any{ |
| 567 | "call_id": e.Call.ID, |
| 568 | "progress": e.Progress, |
| 569 | "message": e.Message, |
| 570 | }, |
| 571 | } |
| 572 | |
| 573 | case *types.ControlPermissionRequiredEvent: |
| 574 | event = &FrontendEvent{ |
| 575 | Type: EventTypeApprovalRequired, |
| 576 | AgentID: agentID, |
| 577 | Data: map[string]any{ |
| 578 | "call_id": e.Call.ID, |
| 579 | "name": e.Call.Name, |
no test coverage detected