__init__.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. """
  2. Trixy Event System
  3. This module provides a comprehensive event handling system for the Trixy application.
  4. It includes event data structures, decorators for event handler registration,
  5. and a thread-safe event handler with history tracking and debugging capabilities.
  6. The event system is the central component that enables communication between
  7. all parts of the Trixy application, including plugins, satellites, and core systems.
  8. Usage Example:
  9. # Import the event system
  10. from trixy_core.events import EventHandler, TrixyEvent, EventType
  11. # Create an event handler
  12. event_handler = EventHandler()
  13. # Define an event handler method
  14. class MyComponent:
  15. @TrixyEvent(["wakeword_received", "text_received"])
  16. def handle_events(self, event_name, event_data):
  17. if event_name == "wakeword_received":
  18. print(f"Wakeword detected from {event_data.speaker_info.speaker_name}")
  19. elif event_name == "text_received":
  20. print(f"Text received: {event_data.text}")
  21. # Register the component
  22. component = MyComponent()
  23. event_handler.register_handler_object(component)
  24. # Trigger events
  25. event_handler.trigger_event("system_startup", mode="server", version="1.0.0")
  26. """
  27. from .event_data import (
  28. # Core event data classes
  29. TrixyEventData,
  30. EventType,
  31. EventDataFactory,
  32. # Data structures
  33. SatelliteInfo,
  34. SpeakerInfo,
  35. # Event data classes - Satellite Management
  36. SatelliteConnectedEventData,
  37. SatelliteDisconnectedEventData,
  38. SatelliteRegisteredEventData,
  39. # Event data classes - Wakeword & Audio
  40. WakewordReceivedEventData,
  41. RawAudioInputReceivedEventData,
  42. # Event data classes - Processing
  43. TextReceivedEventData,
  44. IntentReceivedEventData,
  45. TTSReceivedEventData,
  46. # Event data classes - System
  47. SystemStartupEventData,
  48. SystemShutdownEventData,
  49. PluginEventData,
  50. PluginLoadedEventData,
  51. PluginUnloadedEventData,
  52. TrainingStartedEventData,
  53. TrainingCompletedEventData,
  54. ScheduleTriggeredEventData,
  55. # Event data classes - Arbitration
  56. ArbitrationStartedEventData,
  57. ArbitrationCompletedEventData,
  58. ArbitrationCancelledEventData,
  59. ArbitrationTimedOutEventData,
  60. ArbitrationReportAddedEventData,
  61. SatelliteSelectedEventData,
  62. SatelliteIgnoredEventData,
  63. )
  64. from .decorators import (
  65. # Main decorator
  66. TrixyEvent,
  67. # Registry functions
  68. register_event_handlers,
  69. unregister_event_handlers,
  70. get_event_registry,
  71. TrixyEventRegistry,
  72. # Utility functions
  73. validate_event_handler,
  74. list_registered_events,
  75. get_handler_info,
  76. )
  77. from .event_handler import (
  78. # Main event handler class
  79. EventHandler,
  80. # Supporting classes
  81. EventStatus,
  82. EventHistoryEntry,
  83. )
  84. # Version information
  85. __version__ = "1.0.0"
  86. __author__ = "Trixy Development Team"
  87. # Public API
  88. __all__ = [
  89. # Core classes
  90. "EventHandler",
  91. "TrixyEvent",
  92. "EventType",
  93. "TrixyEventData",
  94. "EventDataFactory",
  95. # Event status and history
  96. "EventStatus",
  97. "EventHistoryEntry",
  98. # Data structures
  99. "SatelliteInfo",
  100. "SpeakerInfo",
  101. # Event data classes - Satellite Management
  102. "SatelliteConnectedEventData",
  103. "SatelliteDisconnectedEventData",
  104. "SatelliteRegisteredEventData",
  105. # Event data classes - Wakeword & Audio
  106. "WakewordReceivedEventData",
  107. "RawAudioInputReceivedEventData",
  108. # Event data classes - Processing
  109. "TextReceivedEventData",
  110. "IntentReceivedEventData",
  111. "TTSReceivedEventData",
  112. # Event data classes - System
  113. "SystemStartupEventData",
  114. "SystemShutdownEventData",
  115. "PluginEventData",
  116. "PluginLoadedEventData",
  117. "PluginUnloadedEventData",
  118. "TrainingStartedEventData",
  119. "TrainingCompletedEventData",
  120. "ScheduleTriggeredEventData",
  121. # Event data classes - Arbitration
  122. "ArbitrationStartedEventData",
  123. "ArbitrationCompletedEventData",
  124. "ArbitrationCancelledEventData",
  125. "ArbitrationTimedOutEventData",
  126. "ArbitrationReportAddedEventData",
  127. "SatelliteSelectedEventData",
  128. "SatelliteIgnoredEventData",
  129. # Registry and utilities
  130. "TrixyEventRegistry",
  131. "register_event_handlers",
  132. "unregister_event_handlers",
  133. "get_event_registry",
  134. "validate_event_handler",
  135. "list_registered_events",
  136. "get_handler_info",
  137. ]
  138. def create_default_event_handler(**kwargs) -> EventHandler:
  139. """
  140. Create a default EventHandler instance with reasonable defaults.
  141. Args:
  142. **kwargs: Additional arguments to pass to EventHandler constructor
  143. Returns:
  144. EventHandler: Configured event handler instance
  145. """
  146. return EventHandler(**kwargs)
  147. def get_supported_event_types():
  148. """
  149. Get a list of all supported event types.
  150. Returns:
  151. List[EventType]: All supported event types
  152. """
  153. return list(EventType)
  154. def get_event_documentation():
  155. """
  156. Get documentation for all event types and their data structures.
  157. Returns:
  158. Dict[str, str]: Mapping of event types to their descriptions
  159. """
  160. return {
  161. # Satellite Management Events
  162. "satellite_connected": "Triggered when a satellite establishes connection to the server",
  163. "satellite_disconnected": "Triggered when a satellite loses connection to the server",
  164. "satellite_registered": "Triggered when a new satellite is registered with the system",
  165. # Wakeword & Audio Events
  166. "wakeword_received": "Triggered when a satellite detects the wakeword",
  167. "raw_audio_input_received": "Triggered when audio recording from satellite completes",
  168. # Processing Events
  169. "text_received": "Triggered when STT (Speech-to-Text) converts audio to text",
  170. "intent_received": "Triggered when NLP extracts intent from text",
  171. "tts_received": "Triggered when TTS (Text-to-Speech) generates response audio",
  172. # System Events
  173. "system_startup": "Triggered when the system completes initialization",
  174. "system_shutdown": "Triggered when the system is shutting down",
  175. "plugin_loaded": "Triggered when a plugin is successfully loaded",
  176. "plugin_unloaded": "Triggered when a plugin is unloaded",
  177. "training_started": "Triggered when ML model training begins",
  178. "training_completed": "Triggered when ML model training finishes",
  179. "schedule_triggered": "Triggered when a scheduled event fires",
  180. # Arbitration Events
  181. "arbitration_started": "Triggered when wakeword arbitration session begins",
  182. "arbitration_completed": "Triggered when satellite selection is completed",
  183. "arbitration_cancelled": "Triggered when arbitration session is cancelled",
  184. "arbitration_timed_out": "Triggered when arbitration session times out",
  185. "arbitration_report_added": "Triggered when wakeword report is added to session",
  186. "satellite_selected": "Triggered when satellite is selected for conversation",
  187. "satellite_ignored": "Triggered when satellite is told to ignore wakeword",
  188. }
  189. # Initialize logging function that will be replaced by proper logging system
  190. def _init_logging():
  191. """Initialize logging for the events module."""
  192. # This will be replaced with proper logging integration
  193. pass
  194. # Initialize the module
  195. _init_logging()
  196. # Module-level debug function for consistent logging
  197. def pprint(message: str) -> None:
  198. """
  199. Module-level debug printing function.
  200. This should be replaced with proper logging integration.
  201. """
  202. print(f"[trixy_core.events] {message}")
  203. # Convenience function for quick event handler setup
  204. def setup_event_system(debug_mode: bool = False, max_history: int = 1000) -> EventHandler:
  205. """
  206. Set up a complete event system with reasonable defaults.
  207. Args:
  208. debug_mode: Enable debug mode for verbose logging
  209. max_history: Maximum number of events to keep in history
  210. Returns:
  211. EventHandler: Configured and ready-to-use event handler
  212. """
  213. event_handler = EventHandler(max_history_size=max_history)
  214. event_handler.enable_debug_mode(debug_mode)
  215. pprint(f"Event system initialized (debug: {debug_mode}, max_history: {max_history})")
  216. return event_handler