Dispatch an event to all registered handlers. Broadcast request events (external_tool.requested, permission.requested) are handled internally before being forwarded to user handlers. Note: This method is internal and should not be called directly.
(self, event: SessionEvent)
| 1718 | return unsubscribe |
| 1719 | |
| 1720 | def _dispatch_event(self, event: SessionEvent) -> None: |
| 1721 | """ |
| 1722 | Dispatch an event to all registered handlers. |
| 1723 | |
| 1724 | Broadcast request events (external_tool.requested, permission.requested) are handled |
| 1725 | internally before being forwarded to user handlers. |
| 1726 | |
| 1727 | Note: |
| 1728 | This method is internal and should not be called directly. |
| 1729 | |
| 1730 | Args: |
| 1731 | event: The session event to dispatch to all handlers. |
| 1732 | """ |
| 1733 | dispatch_start = time.perf_counter() |
| 1734 | # Handle broadcast request events (protocol v3) before dispatching to user handlers. |
| 1735 | # Fire-and-forget: the response is sent asynchronously via RPC. |
| 1736 | self._handle_broadcast_event(event) |
| 1737 | |
| 1738 | with self._event_handlers_lock: |
| 1739 | handlers = list(self._event_handlers) |
| 1740 | |
| 1741 | for handler in handlers: |
| 1742 | try: |
| 1743 | handler(event) |
| 1744 | except Exception: |
| 1745 | logger.error("Unhandled exception in session event handler", exc_info=True) |
| 1746 | log_timing( |
| 1747 | logger, |
| 1748 | logging.DEBUG, |
| 1749 | "CopilotSession._dispatch_event dispatch", |
| 1750 | dispatch_start, |
| 1751 | session_id=self.session_id, |
| 1752 | event_type=event.type, |
| 1753 | ) |
| 1754 | |
| 1755 | def _handle_broadcast_event(self, event: SessionEvent) -> None: |
| 1756 | """Handle broadcast request events by executing local handlers and responding via RPC. |