kollabor 0.4.9__py3-none-any.whl → 0.4.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. agents/__init__.py +2 -0
  2. agents/coder/__init__.py +0 -0
  3. agents/coder/agent.json +4 -0
  4. agents/coder/api-integration.md +2150 -0
  5. agents/coder/cli-pretty.md +765 -0
  6. agents/coder/code-review.md +1092 -0
  7. agents/coder/database-design.md +1525 -0
  8. agents/coder/debugging.md +1102 -0
  9. agents/coder/dependency-management.md +1397 -0
  10. agents/coder/git-workflow.md +1099 -0
  11. agents/coder/refactoring.md +1454 -0
  12. agents/coder/security-hardening.md +1732 -0
  13. agents/coder/system_prompt.md +1448 -0
  14. agents/coder/tdd.md +1367 -0
  15. agents/creative-writer/__init__.py +0 -0
  16. agents/creative-writer/agent.json +4 -0
  17. agents/creative-writer/character-development.md +1852 -0
  18. agents/creative-writer/dialogue-craft.md +1122 -0
  19. agents/creative-writer/plot-structure.md +1073 -0
  20. agents/creative-writer/revision-editing.md +1484 -0
  21. agents/creative-writer/system_prompt.md +690 -0
  22. agents/creative-writer/worldbuilding.md +2049 -0
  23. agents/data-analyst/__init__.py +30 -0
  24. agents/data-analyst/agent.json +4 -0
  25. agents/data-analyst/data-visualization.md +992 -0
  26. agents/data-analyst/exploratory-data-analysis.md +1110 -0
  27. agents/data-analyst/pandas-data-manipulation.md +1081 -0
  28. agents/data-analyst/sql-query-optimization.md +881 -0
  29. agents/data-analyst/statistical-analysis.md +1118 -0
  30. agents/data-analyst/system_prompt.md +928 -0
  31. agents/default/__init__.py +0 -0
  32. agents/default/agent.json +4 -0
  33. agents/default/dead-code.md +794 -0
  34. agents/default/explore-agent-system.md +585 -0
  35. agents/default/system_prompt.md +1448 -0
  36. agents/kollabor/__init__.py +0 -0
  37. agents/kollabor/analyze-plugin-lifecycle.md +175 -0
  38. agents/kollabor/analyze-terminal-rendering.md +388 -0
  39. agents/kollabor/code-review.md +1092 -0
  40. agents/kollabor/debug-mcp-integration.md +521 -0
  41. agents/kollabor/debug-plugin-hooks.md +547 -0
  42. agents/kollabor/debugging.md +1102 -0
  43. agents/kollabor/dependency-management.md +1397 -0
  44. agents/kollabor/git-workflow.md +1099 -0
  45. agents/kollabor/inspect-llm-conversation.md +148 -0
  46. agents/kollabor/monitor-event-bus.md +558 -0
  47. agents/kollabor/profile-performance.md +576 -0
  48. agents/kollabor/refactoring.md +1454 -0
  49. agents/kollabor/system_prompt copy.md +1448 -0
  50. agents/kollabor/system_prompt.md +757 -0
  51. agents/kollabor/trace-command-execution.md +178 -0
  52. agents/kollabor/validate-config.md +879 -0
  53. agents/research/__init__.py +0 -0
  54. agents/research/agent.json +4 -0
  55. agents/research/architecture-mapping.md +1099 -0
  56. agents/research/codebase-analysis.md +1077 -0
  57. agents/research/dependency-audit.md +1027 -0
  58. agents/research/performance-profiling.md +1047 -0
  59. agents/research/security-review.md +1359 -0
  60. agents/research/system_prompt.md +492 -0
  61. agents/technical-writer/__init__.py +0 -0
  62. agents/technical-writer/agent.json +4 -0
  63. agents/technical-writer/api-documentation.md +2328 -0
  64. agents/technical-writer/changelog-management.md +1181 -0
  65. agents/technical-writer/readme-writing.md +1360 -0
  66. agents/technical-writer/style-guide.md +1410 -0
  67. agents/technical-writer/system_prompt.md +653 -0
  68. agents/technical-writer/tutorial-creation.md +1448 -0
  69. core/__init__.py +0 -2
  70. core/application.py +343 -88
  71. core/cli.py +229 -10
  72. core/commands/menu_renderer.py +463 -59
  73. core/commands/registry.py +14 -9
  74. core/commands/system_commands.py +2461 -14
  75. core/config/loader.py +151 -37
  76. core/config/service.py +18 -6
  77. core/events/bus.py +29 -9
  78. core/events/executor.py +205 -75
  79. core/events/models.py +27 -8
  80. core/fullscreen/command_integration.py +20 -24
  81. core/fullscreen/components/__init__.py +10 -1
  82. core/fullscreen/components/matrix_components.py +1 -2
  83. core/fullscreen/components/space_shooter_components.py +654 -0
  84. core/fullscreen/plugin.py +5 -0
  85. core/fullscreen/renderer.py +52 -13
  86. core/fullscreen/session.py +52 -15
  87. core/io/__init__.py +29 -5
  88. core/io/buffer_manager.py +6 -1
  89. core/io/config_status_view.py +7 -29
  90. core/io/core_status_views.py +267 -347
  91. core/io/input/__init__.py +25 -0
  92. core/io/input/command_mode_handler.py +711 -0
  93. core/io/input/display_controller.py +128 -0
  94. core/io/input/hook_registrar.py +286 -0
  95. core/io/input/input_loop_manager.py +421 -0
  96. core/io/input/key_press_handler.py +502 -0
  97. core/io/input/modal_controller.py +1011 -0
  98. core/io/input/paste_processor.py +339 -0
  99. core/io/input/status_modal_renderer.py +184 -0
  100. core/io/input_errors.py +5 -1
  101. core/io/input_handler.py +211 -2452
  102. core/io/key_parser.py +7 -0
  103. core/io/layout.py +15 -3
  104. core/io/message_coordinator.py +111 -2
  105. core/io/message_renderer.py +129 -4
  106. core/io/status_renderer.py +147 -607
  107. core/io/terminal_renderer.py +97 -51
  108. core/io/terminal_state.py +21 -4
  109. core/io/visual_effects.py +816 -165
  110. core/llm/agent_manager.py +1063 -0
  111. core/llm/api_adapters/__init__.py +44 -0
  112. core/llm/api_adapters/anthropic_adapter.py +432 -0
  113. core/llm/api_adapters/base.py +241 -0
  114. core/llm/api_adapters/openai_adapter.py +326 -0
  115. core/llm/api_communication_service.py +167 -113
  116. core/llm/conversation_logger.py +322 -16
  117. core/llm/conversation_manager.py +556 -30
  118. core/llm/file_operations_executor.py +84 -32
  119. core/llm/llm_service.py +934 -103
  120. core/llm/mcp_integration.py +541 -57
  121. core/llm/message_display_service.py +135 -18
  122. core/llm/plugin_sdk.py +1 -2
  123. core/llm/profile_manager.py +1183 -0
  124. core/llm/response_parser.py +274 -56
  125. core/llm/response_processor.py +16 -3
  126. core/llm/tool_executor.py +6 -1
  127. core/logging/__init__.py +2 -0
  128. core/logging/setup.py +34 -6
  129. core/models/resume.py +54 -0
  130. core/plugins/__init__.py +4 -2
  131. core/plugins/base.py +127 -0
  132. core/plugins/collector.py +23 -161
  133. core/plugins/discovery.py +37 -3
  134. core/plugins/factory.py +6 -12
  135. core/plugins/registry.py +5 -17
  136. core/ui/config_widgets.py +128 -28
  137. core/ui/live_modal_renderer.py +2 -1
  138. core/ui/modal_actions.py +5 -0
  139. core/ui/modal_overlay_renderer.py +0 -60
  140. core/ui/modal_renderer.py +268 -7
  141. core/ui/modal_state_manager.py +29 -4
  142. core/ui/widgets/base_widget.py +7 -0
  143. core/updates/__init__.py +10 -0
  144. core/updates/version_check_service.py +348 -0
  145. core/updates/version_comparator.py +103 -0
  146. core/utils/config_utils.py +685 -526
  147. core/utils/plugin_utils.py +1 -1
  148. core/utils/session_naming.py +111 -0
  149. fonts/LICENSE +21 -0
  150. fonts/README.md +46 -0
  151. fonts/SymbolsNerdFont-Regular.ttf +0 -0
  152. fonts/SymbolsNerdFontMono-Regular.ttf +0 -0
  153. fonts/__init__.py +44 -0
  154. {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/METADATA +54 -4
  155. kollabor-0.4.15.dist-info/RECORD +228 -0
  156. {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/top_level.txt +2 -0
  157. plugins/agent_orchestrator/__init__.py +39 -0
  158. plugins/agent_orchestrator/activity_monitor.py +181 -0
  159. plugins/agent_orchestrator/file_attacher.py +77 -0
  160. plugins/agent_orchestrator/message_injector.py +135 -0
  161. plugins/agent_orchestrator/models.py +48 -0
  162. plugins/agent_orchestrator/orchestrator.py +403 -0
  163. plugins/agent_orchestrator/plugin.py +976 -0
  164. plugins/agent_orchestrator/xml_parser.py +191 -0
  165. plugins/agent_orchestrator_plugin.py +9 -0
  166. plugins/enhanced_input/box_styles.py +1 -0
  167. plugins/enhanced_input/color_engine.py +19 -4
  168. plugins/enhanced_input/config.py +2 -2
  169. plugins/enhanced_input_plugin.py +61 -11
  170. plugins/fullscreen/__init__.py +6 -2
  171. plugins/fullscreen/example_plugin.py +1035 -222
  172. plugins/fullscreen/setup_wizard_plugin.py +592 -0
  173. plugins/fullscreen/space_shooter_plugin.py +131 -0
  174. plugins/hook_monitoring_plugin.py +436 -78
  175. plugins/query_enhancer_plugin.py +66 -30
  176. plugins/resume_conversation_plugin.py +1494 -0
  177. plugins/save_conversation_plugin.py +98 -32
  178. plugins/system_commands_plugin.py +70 -56
  179. plugins/tmux_plugin.py +154 -78
  180. plugins/workflow_enforcement_plugin.py +94 -92
  181. system_prompt/default.md +952 -886
  182. core/io/input_mode_manager.py +0 -402
  183. core/io/modal_interaction_handler.py +0 -315
  184. core/io/raw_input_processor.py +0 -946
  185. core/storage/__init__.py +0 -5
  186. core/storage/state_manager.py +0 -84
  187. core/ui/widget_integration.py +0 -222
  188. core/utils/key_reader.py +0 -171
  189. kollabor-0.4.9.dist-info/RECORD +0 -128
  190. {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/WHEEL +0 -0
  191. {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/entry_points.txt +0 -0
  192. {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,128 @@
1
+ """Display controller component for Kollabor CLI.
2
+
3
+ Responsible for coordinating terminal display updates during input handling.
4
+ This is a thin wrapper that manages rendering state and delegates to the terminal renderer.
5
+ """
6
+
7
+ import asyncio
8
+ import logging
9
+ from typing import Any, Optional
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class DisplayController:
15
+ """Controls display updates during input handling.
16
+
17
+ This component manages:
18
+ - Display updates from buffer changes
19
+ - Rendering pause/resume for special effects (Matrix, etc.)
20
+ - Cursor position tracking
21
+
22
+ Attributes:
23
+ renderer: Terminal renderer for actual rendering.
24
+ buffer_manager: Buffer manager for getting display content.
25
+ error_handler: Error handler for display errors.
26
+ """
27
+
28
+ def __init__(
29
+ self,
30
+ renderer: Any,
31
+ buffer_manager: Any,
32
+ error_handler: Optional[Any] = None,
33
+ ) -> None:
34
+ """Initialize the display controller.
35
+
36
+ Args:
37
+ renderer: Terminal renderer instance.
38
+ buffer_manager: Buffer manager for display content.
39
+ error_handler: Optional error handler for display errors.
40
+ """
41
+ self.renderer = renderer
42
+ self.buffer_manager = buffer_manager
43
+ self.error_handler = error_handler
44
+
45
+ # Rendering state
46
+ self.rendering_paused = False
47
+ self._last_cursor_pos = 0
48
+
49
+ logger.debug("DisplayController initialized")
50
+
51
+ async def update_display(self, force_render: bool = False) -> None:
52
+ """Update the terminal display with current buffer state.
53
+
54
+ Args:
55
+ force_render: If True, force immediate rendering even if paused.
56
+ """
57
+ try:
58
+ # Skip rendering if paused (during special effects like Matrix)
59
+ if self.rendering_paused and not force_render:
60
+ return
61
+
62
+ buffer_content, cursor_pos = self.buffer_manager.get_display_info()
63
+
64
+ # Update renderer with buffer content and cursor position
65
+ self.renderer.input_buffer = buffer_content
66
+ self.renderer.cursor_position = cursor_pos
67
+
68
+ # Force immediate rendering if requested (needed for paste operations)
69
+ if force_render:
70
+ await self._force_render()
71
+
72
+ # Only update cursor if position changed
73
+ if cursor_pos != self._last_cursor_pos:
74
+ # Could implement cursor positioning in renderer
75
+ self._last_cursor_pos = cursor_pos
76
+
77
+ except Exception as e:
78
+ if self.error_handler:
79
+ from ..input_errors import ErrorType, ErrorSeverity
80
+ await self.error_handler.handle_error(
81
+ ErrorType.SYSTEM_ERROR,
82
+ f"Error updating display: {e}",
83
+ ErrorSeverity.LOW,
84
+ {"buffer_manager": self.buffer_manager},
85
+ )
86
+ else:
87
+ logger.error(f"Error updating display: {e}")
88
+
89
+ async def _force_render(self) -> None:
90
+ """Force immediate rendering of the display."""
91
+ try:
92
+ if hasattr(
93
+ self.renderer, "render_active_area"
94
+ ) and asyncio.iscoroutinefunction(
95
+ self.renderer.render_active_area
96
+ ):
97
+ await self.renderer.render_active_area()
98
+ elif hasattr(
99
+ self.renderer, "render_input"
100
+ ) and asyncio.iscoroutinefunction(self.renderer.render_input):
101
+ await self.renderer.render_input()
102
+ elif hasattr(self.renderer, "render_active_area"):
103
+ self.renderer.render_active_area()
104
+ elif hasattr(self.renderer, "render_input"):
105
+ self.renderer.render_input()
106
+ except Exception as e:
107
+ logger.debug(f"Force render failed: {e}")
108
+ # Continue without forced render
109
+
110
+ def pause_rendering(self) -> None:
111
+ """Pause all UI rendering for special effects."""
112
+ self.rendering_paused = True
113
+ logger.debug("Input rendering paused")
114
+
115
+ def resume_rendering(self) -> None:
116
+ """Resume normal UI rendering."""
117
+ self.rendering_paused = False
118
+ logger.debug("Input rendering resumed")
119
+
120
+ @property
121
+ def last_cursor_pos(self) -> int:
122
+ """Get the last cursor position."""
123
+ return self._last_cursor_pos
124
+
125
+ @last_cursor_pos.setter
126
+ def last_cursor_pos(self, value: int) -> None:
127
+ """Set the last cursor position."""
128
+ self._last_cursor_pos = value
@@ -0,0 +1,286 @@
1
+ """Hook registration component for InputHandler.
2
+
3
+ Manages registration and lifecycle of event hooks for input handling,
4
+ modal triggers, rendering control, and command output display.
5
+ """
6
+
7
+ import logging
8
+ from typing import Dict, Any, Callable, Optional, List
9
+
10
+ from ...events import EventType
11
+ from ...events.models import Hook, HookPriority
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class HookRegistrar:
17
+ """Component responsible for registering and managing InputHandler event hooks.
18
+
19
+ Centralizes hook registration logic for:
20
+ - Command menu rendering
21
+ - Modal triggers (standard, status, live)
22
+ - Modal hiding/cleanup
23
+ - Rendering pause/resume
24
+ - Command output display
25
+
26
+ The registrar accepts callback functions for each hook type, allowing
27
+ the InputHandler to inject its handler methods while keeping registration
28
+ logic separate and testable.
29
+ """
30
+
31
+ def __init__(
32
+ self,
33
+ event_bus,
34
+ command_menu_render_handler: Callable,
35
+ modal_trigger_handler: Callable,
36
+ status_modal_trigger_handler: Callable,
37
+ live_modal_trigger_handler: Callable,
38
+ status_modal_render_handler: Callable,
39
+ command_output_display_handler: Callable,
40
+ pause_rendering_handler: Callable,
41
+ resume_rendering_handler: Callable,
42
+ modal_hide_handler: Callable,
43
+ ):
44
+ """Initialize the hook registrar with callback handlers.
45
+
46
+ Args:
47
+ event_bus: Event bus for hook registration.
48
+ command_menu_render_handler: Handler for COMMAND_MENU_RENDER events.
49
+ modal_trigger_handler: Handler for MODAL_TRIGGER events.
50
+ status_modal_trigger_handler: Handler for STATUS_MODAL_TRIGGER events.
51
+ live_modal_trigger_handler: Handler for LIVE_MODAL_TRIGGER events.
52
+ status_modal_render_handler: Handler for STATUS_MODAL_RENDER events.
53
+ command_output_display_handler: Handler for COMMAND_OUTPUT_DISPLAY events.
54
+ pause_rendering_handler: Handler for PAUSE_RENDERING events.
55
+ resume_rendering_handler: Handler for RESUME_RENDERING events.
56
+ modal_hide_handler: Handler for MODAL_HIDE events.
57
+ """
58
+ self.event_bus = event_bus
59
+ self._command_menu_render_handler = command_menu_render_handler
60
+ self._modal_trigger_handler = modal_trigger_handler
61
+ self._status_modal_trigger_handler = status_modal_trigger_handler
62
+ self._live_modal_trigger_handler = live_modal_trigger_handler
63
+ self._status_modal_render_handler = status_modal_render_handler
64
+ self._command_output_display_handler = command_output_display_handler
65
+ self._pause_rendering_handler = pause_rendering_handler
66
+ self._resume_rendering_handler = resume_rendering_handler
67
+ self._modal_hide_handler = modal_hide_handler
68
+
69
+ # Track registered hooks for cleanup
70
+ self._registered_hooks: List[Hook] = []
71
+
72
+ async def register_all_hooks(self) -> None:
73
+ """Register all InputHandler hooks with the event bus."""
74
+ logger.info("Registering all InputHandler hooks")
75
+
76
+ await self._register_command_menu_render_hook()
77
+ await self._register_modal_trigger_hook()
78
+ await self._register_status_modal_trigger_hook()
79
+ await self._register_live_modal_trigger_hook()
80
+ await self._register_status_modal_render_hook()
81
+ await self._register_command_output_display_hook()
82
+ await self._register_pause_rendering_hook()
83
+ await self._register_resume_rendering_hook()
84
+ await self._register_modal_hide_hook()
85
+
86
+ logger.info(f"Successfully registered {len(self._registered_hooks)} hooks")
87
+
88
+ async def unregister_all_hooks(self) -> None:
89
+ """Unregister all hooks from the event bus."""
90
+ logger.info(f"Unregistering {len(self._registered_hooks)} InputHandler hooks")
91
+
92
+ for hook in self._registered_hooks:
93
+ try:
94
+ if self.event_bus:
95
+ await self.event_bus.unregister_hook(hook)
96
+ except Exception as e:
97
+ logger.error(f"Failed to unregister hook {hook.name}: {e}")
98
+
99
+ self._registered_hooks.clear()
100
+ logger.info("All InputHandler hooks unregistered")
101
+
102
+ # ==================== HOOK REGISTRATION METHODS ====================
103
+
104
+ async def _register_command_menu_render_hook(self) -> None:
105
+ """Register hook to provide command menu content for COMMAND_MENU_RENDER events."""
106
+ try:
107
+ if self.event_bus:
108
+ hook = Hook(
109
+ name="command_menu_render",
110
+ plugin_name="input_handler",
111
+ event_type=EventType.COMMAND_MENU_RENDER,
112
+ priority=HookPriority.DISPLAY.value,
113
+ callback=self._command_menu_render_handler,
114
+ )
115
+ success = await self.event_bus.register_hook(hook)
116
+ if success:
117
+ self._registered_hooks.append(hook)
118
+ logger.info(
119
+ "Successfully registered COMMAND_MENU_RENDER hook for command menu display"
120
+ )
121
+ else:
122
+ logger.error("Failed to register COMMAND_MENU_RENDER hook")
123
+ except Exception as e:
124
+ logger.error(f"Failed to register COMMAND_MENU_RENDER hook: {e}")
125
+
126
+ async def _register_modal_trigger_hook(self) -> None:
127
+ """Register hook to handle modal trigger events."""
128
+ try:
129
+ if self.event_bus:
130
+ hook = Hook(
131
+ name="modal_trigger",
132
+ plugin_name="input_handler",
133
+ event_type=EventType.MODAL_TRIGGER,
134
+ priority=HookPriority.DISPLAY.value,
135
+ callback=self._modal_trigger_handler,
136
+ )
137
+ success = await self.event_bus.register_hook(hook)
138
+ if success:
139
+ self._registered_hooks.append(hook)
140
+ logger.info("Successfully registered MODAL_TRIGGER hook")
141
+ else:
142
+ logger.error("Failed to register MODAL_TRIGGER hook")
143
+ except Exception as e:
144
+ logger.error(f"Failed to register MODAL_TRIGGER hook: {e}")
145
+
146
+ async def _register_status_modal_trigger_hook(self) -> None:
147
+ """Register hook to handle status modal trigger events."""
148
+ try:
149
+ if self.event_bus:
150
+ hook = Hook(
151
+ name="status_modal_trigger",
152
+ plugin_name="input_handler",
153
+ event_type=EventType.STATUS_MODAL_TRIGGER,
154
+ priority=HookPriority.DISPLAY.value,
155
+ callback=self._status_modal_trigger_handler,
156
+ )
157
+ success = await self.event_bus.register_hook(hook)
158
+ if success:
159
+ self._registered_hooks.append(hook)
160
+ logger.info("Successfully registered STATUS_MODAL_TRIGGER hook")
161
+ else:
162
+ logger.error("Failed to register STATUS_MODAL_TRIGGER hook")
163
+ except Exception as e:
164
+ logger.error(f"Failed to register STATUS_MODAL_TRIGGER hook: {e}")
165
+
166
+ async def _register_live_modal_trigger_hook(self) -> None:
167
+ """Register hook to handle live modal trigger events."""
168
+ try:
169
+ if self.event_bus:
170
+ hook = Hook(
171
+ name="live_modal_trigger",
172
+ plugin_name="input_handler",
173
+ event_type=EventType.LIVE_MODAL_TRIGGER,
174
+ priority=HookPriority.DISPLAY.value,
175
+ callback=self._live_modal_trigger_handler,
176
+ )
177
+ success = await self.event_bus.register_hook(hook)
178
+ if success:
179
+ self._registered_hooks.append(hook)
180
+ logger.info("Successfully registered LIVE_MODAL_TRIGGER hook")
181
+ else:
182
+ logger.error("Failed to register LIVE_MODAL_TRIGGER hook")
183
+ except Exception as e:
184
+ logger.error(f"Failed to register LIVE_MODAL_TRIGGER hook: {e}")
185
+
186
+ async def _register_status_modal_render_hook(self) -> None:
187
+ """Register hook to handle status modal render events."""
188
+ try:
189
+ if self.event_bus:
190
+ hook = Hook(
191
+ name="status_modal_render",
192
+ plugin_name="input_handler",
193
+ event_type=EventType.STATUS_MODAL_RENDER,
194
+ priority=HookPriority.DISPLAY.value,
195
+ callback=self._status_modal_render_handler,
196
+ )
197
+ success = await self.event_bus.register_hook(hook)
198
+ if success:
199
+ self._registered_hooks.append(hook)
200
+ logger.info("Successfully registered STATUS_MODAL_RENDER hook")
201
+ else:
202
+ logger.error("Failed to register STATUS_MODAL_RENDER hook")
203
+ except Exception as e:
204
+ logger.error(f"Failed to register STATUS_MODAL_RENDER hook: {e}")
205
+
206
+ async def _register_command_output_display_hook(self) -> None:
207
+ """Register hook to handle command output display events."""
208
+ try:
209
+ if self.event_bus:
210
+ hook = Hook(
211
+ name="command_output_display",
212
+ plugin_name="input_handler",
213
+ event_type=EventType.COMMAND_OUTPUT_DISPLAY,
214
+ priority=HookPriority.DISPLAY.value,
215
+ callback=self._command_output_display_handler,
216
+ )
217
+ success = await self.event_bus.register_hook(hook)
218
+ if success:
219
+ self._registered_hooks.append(hook)
220
+ logger.info(
221
+ "Successfully registered COMMAND_OUTPUT_DISPLAY hook"
222
+ )
223
+ else:
224
+ logger.error("Failed to register COMMAND_OUTPUT_DISPLAY hook")
225
+ except Exception as e:
226
+ logger.error(f"Failed to register COMMAND_OUTPUT_DISPLAY hook: {e}")
227
+
228
+ async def _register_pause_rendering_hook(self) -> None:
229
+ """Register hook for pause rendering events."""
230
+ try:
231
+ if self.event_bus:
232
+ hook = Hook(
233
+ name="pause_rendering",
234
+ plugin_name="input_handler",
235
+ event_type=EventType.PAUSE_RENDERING,
236
+ priority=HookPriority.DISPLAY.value,
237
+ callback=self._pause_rendering_handler,
238
+ )
239
+ success = await self.event_bus.register_hook(hook)
240
+ if success:
241
+ self._registered_hooks.append(hook)
242
+ logger.info("Successfully registered PAUSE_RENDERING hook")
243
+ else:
244
+ logger.error("Failed to register PAUSE_RENDERING hook")
245
+ except Exception as e:
246
+ logger.error(f"Error registering PAUSE_RENDERING hook: {e}")
247
+
248
+ async def _register_resume_rendering_hook(self) -> None:
249
+ """Register hook for resume rendering events."""
250
+ try:
251
+ if self.event_bus:
252
+ hook = Hook(
253
+ name="resume_rendering",
254
+ plugin_name="input_handler",
255
+ event_type=EventType.RESUME_RENDERING,
256
+ priority=HookPriority.DISPLAY.value,
257
+ callback=self._resume_rendering_handler,
258
+ )
259
+ success = await self.event_bus.register_hook(hook)
260
+ if success:
261
+ self._registered_hooks.append(hook)
262
+ logger.info("Successfully registered RESUME_RENDERING hook")
263
+ else:
264
+ logger.error("Failed to register RESUME_RENDERING hook")
265
+ except Exception as e:
266
+ logger.error(f"Error registering RESUME_RENDERING hook: {e}")
267
+
268
+ async def _register_modal_hide_hook(self) -> None:
269
+ """Register hook for modal hide events."""
270
+ try:
271
+ if self.event_bus:
272
+ hook = Hook(
273
+ name="modal_hide",
274
+ plugin_name="input_handler",
275
+ event_type=EventType.MODAL_HIDE,
276
+ priority=HookPriority.DISPLAY.value,
277
+ callback=self._modal_hide_handler,
278
+ )
279
+ success = await self.event_bus.register_hook(hook)
280
+ if success:
281
+ self._registered_hooks.append(hook)
282
+ logger.info("Successfully registered MODAL_HIDE hook")
283
+ else:
284
+ logger.error("Failed to register MODAL_HIDE hook")
285
+ except Exception as e:
286
+ logger.error(f"Error registering MODAL_HIDE hook: {e}")