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.
- agents/__init__.py +2 -0
- agents/coder/__init__.py +0 -0
- agents/coder/agent.json +4 -0
- agents/coder/api-integration.md +2150 -0
- agents/coder/cli-pretty.md +765 -0
- agents/coder/code-review.md +1092 -0
- agents/coder/database-design.md +1525 -0
- agents/coder/debugging.md +1102 -0
- agents/coder/dependency-management.md +1397 -0
- agents/coder/git-workflow.md +1099 -0
- agents/coder/refactoring.md +1454 -0
- agents/coder/security-hardening.md +1732 -0
- agents/coder/system_prompt.md +1448 -0
- agents/coder/tdd.md +1367 -0
- agents/creative-writer/__init__.py +0 -0
- agents/creative-writer/agent.json +4 -0
- agents/creative-writer/character-development.md +1852 -0
- agents/creative-writer/dialogue-craft.md +1122 -0
- agents/creative-writer/plot-structure.md +1073 -0
- agents/creative-writer/revision-editing.md +1484 -0
- agents/creative-writer/system_prompt.md +690 -0
- agents/creative-writer/worldbuilding.md +2049 -0
- agents/data-analyst/__init__.py +30 -0
- agents/data-analyst/agent.json +4 -0
- agents/data-analyst/data-visualization.md +992 -0
- agents/data-analyst/exploratory-data-analysis.md +1110 -0
- agents/data-analyst/pandas-data-manipulation.md +1081 -0
- agents/data-analyst/sql-query-optimization.md +881 -0
- agents/data-analyst/statistical-analysis.md +1118 -0
- agents/data-analyst/system_prompt.md +928 -0
- agents/default/__init__.py +0 -0
- agents/default/agent.json +4 -0
- agents/default/dead-code.md +794 -0
- agents/default/explore-agent-system.md +585 -0
- agents/default/system_prompt.md +1448 -0
- agents/kollabor/__init__.py +0 -0
- agents/kollabor/analyze-plugin-lifecycle.md +175 -0
- agents/kollabor/analyze-terminal-rendering.md +388 -0
- agents/kollabor/code-review.md +1092 -0
- agents/kollabor/debug-mcp-integration.md +521 -0
- agents/kollabor/debug-plugin-hooks.md +547 -0
- agents/kollabor/debugging.md +1102 -0
- agents/kollabor/dependency-management.md +1397 -0
- agents/kollabor/git-workflow.md +1099 -0
- agents/kollabor/inspect-llm-conversation.md +148 -0
- agents/kollabor/monitor-event-bus.md +558 -0
- agents/kollabor/profile-performance.md +576 -0
- agents/kollabor/refactoring.md +1454 -0
- agents/kollabor/system_prompt copy.md +1448 -0
- agents/kollabor/system_prompt.md +757 -0
- agents/kollabor/trace-command-execution.md +178 -0
- agents/kollabor/validate-config.md +879 -0
- agents/research/__init__.py +0 -0
- agents/research/agent.json +4 -0
- agents/research/architecture-mapping.md +1099 -0
- agents/research/codebase-analysis.md +1077 -0
- agents/research/dependency-audit.md +1027 -0
- agents/research/performance-profiling.md +1047 -0
- agents/research/security-review.md +1359 -0
- agents/research/system_prompt.md +492 -0
- agents/technical-writer/__init__.py +0 -0
- agents/technical-writer/agent.json +4 -0
- agents/technical-writer/api-documentation.md +2328 -0
- agents/technical-writer/changelog-management.md +1181 -0
- agents/technical-writer/readme-writing.md +1360 -0
- agents/technical-writer/style-guide.md +1410 -0
- agents/technical-writer/system_prompt.md +653 -0
- agents/technical-writer/tutorial-creation.md +1448 -0
- core/__init__.py +0 -2
- core/application.py +343 -88
- core/cli.py +229 -10
- core/commands/menu_renderer.py +463 -59
- core/commands/registry.py +14 -9
- core/commands/system_commands.py +2461 -14
- core/config/loader.py +151 -37
- core/config/service.py +18 -6
- core/events/bus.py +29 -9
- core/events/executor.py +205 -75
- core/events/models.py +27 -8
- core/fullscreen/command_integration.py +20 -24
- core/fullscreen/components/__init__.py +10 -1
- core/fullscreen/components/matrix_components.py +1 -2
- core/fullscreen/components/space_shooter_components.py +654 -0
- core/fullscreen/plugin.py +5 -0
- core/fullscreen/renderer.py +52 -13
- core/fullscreen/session.py +52 -15
- core/io/__init__.py +29 -5
- core/io/buffer_manager.py +6 -1
- core/io/config_status_view.py +7 -29
- core/io/core_status_views.py +267 -347
- core/io/input/__init__.py +25 -0
- core/io/input/command_mode_handler.py +711 -0
- core/io/input/display_controller.py +128 -0
- core/io/input/hook_registrar.py +286 -0
- core/io/input/input_loop_manager.py +421 -0
- core/io/input/key_press_handler.py +502 -0
- core/io/input/modal_controller.py +1011 -0
- core/io/input/paste_processor.py +339 -0
- core/io/input/status_modal_renderer.py +184 -0
- core/io/input_errors.py +5 -1
- core/io/input_handler.py +211 -2452
- core/io/key_parser.py +7 -0
- core/io/layout.py +15 -3
- core/io/message_coordinator.py +111 -2
- core/io/message_renderer.py +129 -4
- core/io/status_renderer.py +147 -607
- core/io/terminal_renderer.py +97 -51
- core/io/terminal_state.py +21 -4
- core/io/visual_effects.py +816 -165
- core/llm/agent_manager.py +1063 -0
- core/llm/api_adapters/__init__.py +44 -0
- core/llm/api_adapters/anthropic_adapter.py +432 -0
- core/llm/api_adapters/base.py +241 -0
- core/llm/api_adapters/openai_adapter.py +326 -0
- core/llm/api_communication_service.py +167 -113
- core/llm/conversation_logger.py +322 -16
- core/llm/conversation_manager.py +556 -30
- core/llm/file_operations_executor.py +84 -32
- core/llm/llm_service.py +934 -103
- core/llm/mcp_integration.py +541 -57
- core/llm/message_display_service.py +135 -18
- core/llm/plugin_sdk.py +1 -2
- core/llm/profile_manager.py +1183 -0
- core/llm/response_parser.py +274 -56
- core/llm/response_processor.py +16 -3
- core/llm/tool_executor.py +6 -1
- core/logging/__init__.py +2 -0
- core/logging/setup.py +34 -6
- core/models/resume.py +54 -0
- core/plugins/__init__.py +4 -2
- core/plugins/base.py +127 -0
- core/plugins/collector.py +23 -161
- core/plugins/discovery.py +37 -3
- core/plugins/factory.py +6 -12
- core/plugins/registry.py +5 -17
- core/ui/config_widgets.py +128 -28
- core/ui/live_modal_renderer.py +2 -1
- core/ui/modal_actions.py +5 -0
- core/ui/modal_overlay_renderer.py +0 -60
- core/ui/modal_renderer.py +268 -7
- core/ui/modal_state_manager.py +29 -4
- core/ui/widgets/base_widget.py +7 -0
- core/updates/__init__.py +10 -0
- core/updates/version_check_service.py +348 -0
- core/updates/version_comparator.py +103 -0
- core/utils/config_utils.py +685 -526
- core/utils/plugin_utils.py +1 -1
- core/utils/session_naming.py +111 -0
- fonts/LICENSE +21 -0
- fonts/README.md +46 -0
- fonts/SymbolsNerdFont-Regular.ttf +0 -0
- fonts/SymbolsNerdFontMono-Regular.ttf +0 -0
- fonts/__init__.py +44 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/METADATA +54 -4
- kollabor-0.4.15.dist-info/RECORD +228 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/top_level.txt +2 -0
- plugins/agent_orchestrator/__init__.py +39 -0
- plugins/agent_orchestrator/activity_monitor.py +181 -0
- plugins/agent_orchestrator/file_attacher.py +77 -0
- plugins/agent_orchestrator/message_injector.py +135 -0
- plugins/agent_orchestrator/models.py +48 -0
- plugins/agent_orchestrator/orchestrator.py +403 -0
- plugins/agent_orchestrator/plugin.py +976 -0
- plugins/agent_orchestrator/xml_parser.py +191 -0
- plugins/agent_orchestrator_plugin.py +9 -0
- plugins/enhanced_input/box_styles.py +1 -0
- plugins/enhanced_input/color_engine.py +19 -4
- plugins/enhanced_input/config.py +2 -2
- plugins/enhanced_input_plugin.py +61 -11
- plugins/fullscreen/__init__.py +6 -2
- plugins/fullscreen/example_plugin.py +1035 -222
- plugins/fullscreen/setup_wizard_plugin.py +592 -0
- plugins/fullscreen/space_shooter_plugin.py +131 -0
- plugins/hook_monitoring_plugin.py +436 -78
- plugins/query_enhancer_plugin.py +66 -30
- plugins/resume_conversation_plugin.py +1494 -0
- plugins/save_conversation_plugin.py +98 -32
- plugins/system_commands_plugin.py +70 -56
- plugins/tmux_plugin.py +154 -78
- plugins/workflow_enforcement_plugin.py +94 -92
- system_prompt/default.md +952 -886
- core/io/input_mode_manager.py +0 -402
- core/io/modal_interaction_handler.py +0 -315
- core/io/raw_input_processor.py +0 -946
- core/storage/__init__.py +0 -5
- core/storage/state_manager.py +0 -84
- core/ui/widget_integration.py +0 -222
- core/utils/key_reader.py +0 -171
- kollabor-0.4.9.dist-info/RECORD +0 -128
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/WHEEL +0 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/entry_points.txt +0 -0
- {kollabor-0.4.9.dist-info → kollabor-0.4.15.dist-info}/licenses/LICENSE +0 -0
core/fullscreen/renderer.py
CHANGED
|
@@ -51,6 +51,10 @@ class FullScreenRenderer:
|
|
|
51
51
|
self.terminal_width = 80
|
|
52
52
|
self.terminal_height = 24
|
|
53
53
|
|
|
54
|
+
# Frame buffering to eliminate flicker
|
|
55
|
+
self._frame_buffer = []
|
|
56
|
+
self._buffering_enabled = False
|
|
57
|
+
|
|
54
58
|
logger.info("FullScreenRenderer initialized")
|
|
55
59
|
|
|
56
60
|
def setup_terminal(self) -> bool:
|
|
@@ -163,10 +167,43 @@ class FullScreenRenderer:
|
|
|
163
167
|
logger.error(f"Failed to restore terminal: {e}")
|
|
164
168
|
return False
|
|
165
169
|
|
|
170
|
+
def begin_frame(self):
|
|
171
|
+
"""Begin a new frame with buffering enabled.
|
|
172
|
+
|
|
173
|
+
All writes will be buffered until end_frame() is called.
|
|
174
|
+
This eliminates flicker by making the entire frame update atomic.
|
|
175
|
+
"""
|
|
176
|
+
self._frame_buffer = []
|
|
177
|
+
self._buffering_enabled = True
|
|
178
|
+
|
|
179
|
+
def end_frame(self):
|
|
180
|
+
"""End the current frame and flush all buffered writes.
|
|
181
|
+
|
|
182
|
+
Writes the entire buffered frame as a single operation,
|
|
183
|
+
eliminating visible flickering.
|
|
184
|
+
"""
|
|
185
|
+
if self._buffering_enabled and self._frame_buffer:
|
|
186
|
+
# Write entire frame as single operation
|
|
187
|
+
sys.stdout.write(''.join(self._frame_buffer))
|
|
188
|
+
sys.stdout.flush()
|
|
189
|
+
self._frame_buffer = []
|
|
190
|
+
self._buffering_enabled = False
|
|
191
|
+
|
|
192
|
+
def _write(self, text: str):
|
|
193
|
+
"""Internal write method that respects buffering.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
text: Text to write (can include ANSI codes)
|
|
197
|
+
"""
|
|
198
|
+
if self._buffering_enabled:
|
|
199
|
+
self._frame_buffer.append(text)
|
|
200
|
+
else:
|
|
201
|
+
sys.stdout.write(text)
|
|
202
|
+
sys.stdout.flush()
|
|
203
|
+
|
|
166
204
|
def clear_screen(self):
|
|
167
205
|
"""Clear the entire screen."""
|
|
168
|
-
|
|
169
|
-
sys.stdout.flush()
|
|
206
|
+
self._write("\033[2J\033[H")
|
|
170
207
|
|
|
171
208
|
def clear_line(self, row: int):
|
|
172
209
|
"""Clear a specific line.
|
|
@@ -174,8 +211,7 @@ class FullScreenRenderer:
|
|
|
174
211
|
Args:
|
|
175
212
|
row: Row number (1-based).
|
|
176
213
|
"""
|
|
177
|
-
|
|
178
|
-
sys.stdout.flush()
|
|
214
|
+
self._write(f"\033[{row};1H\033[K")
|
|
179
215
|
|
|
180
216
|
def move_cursor(self, x: int, y: int):
|
|
181
217
|
"""Move cursor to specific position.
|
|
@@ -184,15 +220,15 @@ class FullScreenRenderer:
|
|
|
184
220
|
x: Column position (0-based).
|
|
185
221
|
y: Row position (0-based).
|
|
186
222
|
"""
|
|
187
|
-
|
|
223
|
+
self._write(f"\033[{y+1};{x+1}H")
|
|
188
224
|
|
|
189
225
|
def hide_cursor(self):
|
|
190
226
|
"""Hide the cursor."""
|
|
191
|
-
|
|
227
|
+
self._write("\033[?25l")
|
|
192
228
|
|
|
193
229
|
def show_cursor(self):
|
|
194
230
|
"""Show the cursor."""
|
|
195
|
-
|
|
231
|
+
self._write("\033[?25h")
|
|
196
232
|
|
|
197
233
|
def write_raw(self, text: str):
|
|
198
234
|
"""Write raw text to terminal.
|
|
@@ -200,8 +236,7 @@ class FullScreenRenderer:
|
|
|
200
236
|
Args:
|
|
201
237
|
text: Text to write (can include ANSI codes).
|
|
202
238
|
"""
|
|
203
|
-
|
|
204
|
-
sys.stdout.flush()
|
|
239
|
+
self._write(text)
|
|
205
240
|
|
|
206
241
|
def write_at(self, x: int, y: int, text: str, color: str = ColorPalette.RESET):
|
|
207
242
|
"""Write text at specific position with optional color.
|
|
@@ -214,8 +249,7 @@ class FullScreenRenderer:
|
|
|
214
249
|
"""
|
|
215
250
|
if 0 <= x < self.terminal_width and 0 <= y < self.terminal_height:
|
|
216
251
|
self.move_cursor(x, y)
|
|
217
|
-
|
|
218
|
-
sys.stdout.flush()
|
|
252
|
+
self._write(f"{color}{text}{ColorPalette.RESET}")
|
|
219
253
|
|
|
220
254
|
def draw_box(self, x: int, y: int, width: int, height: int,
|
|
221
255
|
border_color: str = ColorPalette.WHITE,
|
|
@@ -278,5 +312,10 @@ class FullScreenRenderer:
|
|
|
278
312
|
return self.active
|
|
279
313
|
|
|
280
314
|
def flush(self):
|
|
281
|
-
"""Flush output buffer.
|
|
282
|
-
|
|
315
|
+
"""Flush output buffer.
|
|
316
|
+
|
|
317
|
+
If frame buffering is enabled, this does nothing.
|
|
318
|
+
Use end_frame() to flush buffered content.
|
|
319
|
+
"""
|
|
320
|
+
if not self._buffering_enabled:
|
|
321
|
+
sys.stdout.flush()
|
core/fullscreen/session.py
CHANGED
|
@@ -44,18 +44,19 @@ class FullScreenSession:
|
|
|
44
44
|
including terminal setup, input handling, rendering loop, and cleanup.
|
|
45
45
|
"""
|
|
46
46
|
|
|
47
|
-
def __init__(self, plugin: FullScreenPlugin, event_bus=None, target_fps: float =
|
|
47
|
+
def __init__(self, plugin: FullScreenPlugin, event_bus=None, target_fps: float = None):
|
|
48
48
|
"""Initialize a full-screen session.
|
|
49
49
|
|
|
50
50
|
Args:
|
|
51
51
|
plugin: The plugin to run.
|
|
52
52
|
event_bus: Event bus for input routing (optional, falls back to direct stdin).
|
|
53
|
-
target_fps: Target frame rate for rendering.
|
|
53
|
+
target_fps: Target frame rate for rendering (None = use plugin's target_fps).
|
|
54
54
|
"""
|
|
55
55
|
self.plugin = plugin
|
|
56
56
|
self.event_bus = event_bus
|
|
57
|
-
|
|
58
|
-
self.
|
|
57
|
+
# Use plugin's target_fps if not explicitly overridden
|
|
58
|
+
self.target_fps = target_fps if target_fps is not None else getattr(plugin, 'target_fps', 20.0)
|
|
59
|
+
self.frame_delay = 1.0 / self.target_fps
|
|
59
60
|
|
|
60
61
|
# Session state
|
|
61
62
|
self.running = False
|
|
@@ -93,17 +94,14 @@ class FullScreenSession:
|
|
|
93
94
|
async def _handle_fullscreen_input(self, event_data, context=None):
|
|
94
95
|
"""Handle FULLSCREEN_INPUT events from InputHandler."""
|
|
95
96
|
try:
|
|
96
|
-
print(f"🎯 CRITICAL: Session received FULLSCREEN_INPUT event: {event_data}")
|
|
97
97
|
key_press = event_data.get('key_press')
|
|
98
98
|
if key_press:
|
|
99
|
-
|
|
100
|
-
logger.info(f"🎯 Session received input: {key_press.name}")
|
|
99
|
+
logger.debug(f"Session received input: {key_press.name}")
|
|
101
100
|
await self.pending_input.put(key_press)
|
|
102
101
|
return {"success": True, "handled": True}
|
|
103
|
-
|
|
102
|
+
logger.warning("No key_press in FULLSCREEN_INPUT event data")
|
|
104
103
|
return {"success": False, "error": "No key_press in event data"}
|
|
105
104
|
except Exception as e:
|
|
106
|
-
print(f"❌ CRITICAL: Exception in _handle_fullscreen_input: {e}")
|
|
107
105
|
logger.error(f"Error handling fullscreen input: {e}")
|
|
108
106
|
return {"success": False, "error": str(e)}
|
|
109
107
|
|
|
@@ -181,8 +179,16 @@ class FullScreenSession:
|
|
|
181
179
|
if await self._handle_input():
|
|
182
180
|
break # Exit requested
|
|
183
181
|
|
|
182
|
+
# Begin buffered frame (eliminates flicker)
|
|
183
|
+
self.renderer.begin_frame()
|
|
184
|
+
|
|
184
185
|
# Render frame
|
|
185
|
-
|
|
186
|
+
should_continue = await self.plugin.render_frame(delta_time)
|
|
187
|
+
|
|
188
|
+
# End frame and flush all buffered writes atomically
|
|
189
|
+
self.renderer.end_frame()
|
|
190
|
+
|
|
191
|
+
if not should_continue:
|
|
186
192
|
break # Plugin requested exit
|
|
187
193
|
|
|
188
194
|
self.stats.frame_count += 1
|
|
@@ -202,6 +208,17 @@ class FullScreenSession:
|
|
|
202
208
|
True if exit was requested, False otherwise.
|
|
203
209
|
"""
|
|
204
210
|
try:
|
|
211
|
+
# Priority 1: Check pending_input queue (from event-routed input)
|
|
212
|
+
try:
|
|
213
|
+
key_press = self.pending_input.get_nowait()
|
|
214
|
+
if key_press:
|
|
215
|
+
logger.info(f"Processing queued input: {key_press.name} ({key_press.char})")
|
|
216
|
+
self.stats.input_events += 1
|
|
217
|
+
return await self.plugin.handle_input(key_press)
|
|
218
|
+
except asyncio.QueueEmpty:
|
|
219
|
+
pass # No queued input, try fallback
|
|
220
|
+
|
|
221
|
+
# Priority 2: Direct stdin reading (fallback when main input loop not running)
|
|
205
222
|
# Check for available input (non-blocking)
|
|
206
223
|
if not sys.stdin.isatty():
|
|
207
224
|
return False
|
|
@@ -246,19 +263,39 @@ class FullScreenSession:
|
|
|
246
263
|
ready, _, _ = select.select([sys.stdin], [], [], 0)
|
|
247
264
|
if ready:
|
|
248
265
|
has_input = True
|
|
249
|
-
|
|
266
|
+
# Read all available characters at once
|
|
267
|
+
import fcntl
|
|
268
|
+
import os as os_module
|
|
269
|
+
# Set non-blocking mode temporarily
|
|
270
|
+
fd = sys.stdin.fileno()
|
|
271
|
+
old_flags = fcntl.fcntl(fd, fcntl.F_GETFL)
|
|
272
|
+
fcntl.fcntl(fd, fcntl.F_SETFL, old_flags | os_module.O_NONBLOCK)
|
|
273
|
+
try:
|
|
274
|
+
chars = sys.stdin.read(32) # Read up to 32 chars
|
|
275
|
+
except (IOError, BlockingIOError):
|
|
276
|
+
chars = ""
|
|
277
|
+
finally:
|
|
278
|
+
fcntl.fcntl(fd, fcntl.F_SETFL, old_flags)
|
|
279
|
+
|
|
280
|
+
if not chars:
|
|
281
|
+
return False
|
|
250
282
|
|
|
251
|
-
if not has_input
|
|
283
|
+
if not has_input:
|
|
252
284
|
return False
|
|
253
285
|
|
|
254
286
|
# Use the actual key parser for proper parsing
|
|
255
287
|
if not hasattr(self, '_key_parser'):
|
|
256
288
|
self._key_parser = KeyParser()
|
|
257
289
|
|
|
258
|
-
# Parse the
|
|
259
|
-
key_press =
|
|
290
|
+
# Parse all characters through the key parser
|
|
291
|
+
key_press = None
|
|
292
|
+
for char in chars:
|
|
293
|
+
key_press = self._key_parser.parse_char(char)
|
|
294
|
+
if key_press:
|
|
295
|
+
break
|
|
296
|
+
|
|
297
|
+
# If still no key press, check for standalone ESC
|
|
260
298
|
if not key_press:
|
|
261
|
-
# Check for standalone ESC key
|
|
262
299
|
key_press = self._key_parser.check_for_standalone_escape()
|
|
263
300
|
if not key_press:
|
|
264
301
|
return False
|
core/io/__init__.py
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
|
-
"""Input/Output subsystem for Kollabor CLI.
|
|
1
|
+
"""Input/Output subsystem for Kollabor CLI.
|
|
2
|
+
|
|
3
|
+
This module provides comprehensive input/output handling for the Kollabor CLI application,
|
|
4
|
+
including terminal rendering, input processing, message display, and visual effects.
|
|
5
|
+
"""
|
|
2
6
|
|
|
3
7
|
from .input_handler import InputHandler
|
|
4
8
|
from .terminal_renderer import TerminalRenderer
|
|
5
9
|
from .key_parser import KeyParser, KeyPress, KeyType
|
|
6
10
|
from .buffer_manager import BufferManager
|
|
7
11
|
from .input_errors import InputErrorHandler, ErrorType, ErrorSeverity
|
|
8
|
-
from .visual_effects import
|
|
12
|
+
from .visual_effects import (
|
|
13
|
+
VisualEffects,
|
|
14
|
+
ColorPalette,
|
|
15
|
+
EffectType,
|
|
16
|
+
ColorSupport,
|
|
17
|
+
get_color_support,
|
|
18
|
+
set_color_support,
|
|
19
|
+
reset_color_support,
|
|
20
|
+
detect_color_support,
|
|
21
|
+
rgb_to_256,
|
|
22
|
+
color_code,
|
|
23
|
+
)
|
|
9
24
|
from .terminal_state import TerminalState, TerminalCapabilities, TerminalMode
|
|
10
25
|
from .layout import LayoutManager, LayoutArea, ThinkingAnimationManager
|
|
11
|
-
from .status_renderer import StatusRenderer,
|
|
26
|
+
from .status_renderer import StatusRenderer, StatusViewRegistry, StatusViewConfig, BlockConfig
|
|
12
27
|
from .message_renderer import (
|
|
13
28
|
MessageRenderer,
|
|
14
29
|
ConversationMessage,
|
|
@@ -32,6 +47,14 @@ __all__ = [
|
|
|
32
47
|
"VisualEffects",
|
|
33
48
|
"ColorPalette",
|
|
34
49
|
"EffectType",
|
|
50
|
+
# Color support detection
|
|
51
|
+
"ColorSupport",
|
|
52
|
+
"get_color_support",
|
|
53
|
+
"set_color_support",
|
|
54
|
+
"reset_color_support",
|
|
55
|
+
"detect_color_support",
|
|
56
|
+
"rgb_to_256",
|
|
57
|
+
"color_code",
|
|
35
58
|
# Terminal management
|
|
36
59
|
"TerminalState",
|
|
37
60
|
"TerminalCapabilities",
|
|
@@ -42,8 +65,9 @@ __all__ = [
|
|
|
42
65
|
"ThinkingAnimationManager",
|
|
43
66
|
# Status rendering
|
|
44
67
|
"StatusRenderer",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
68
|
+
"StatusViewRegistry",
|
|
69
|
+
"StatusViewConfig",
|
|
70
|
+
"BlockConfig",
|
|
47
71
|
# Message rendering
|
|
48
72
|
"MessageRenderer",
|
|
49
73
|
"ConversationMessage",
|
core/io/buffer_manager.py
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
"""Input buffer management for terminal input handling.
|
|
1
|
+
"""Input buffer management for terminal input handling.
|
|
2
|
+
|
|
3
|
+
This module provides comprehensive buffer management for terminal input, including
|
|
4
|
+
character insertion/deletion, cursor movement, history navigation, and
|
|
5
|
+
input validation.
|
|
6
|
+
"""
|
|
2
7
|
|
|
3
8
|
import logging
|
|
4
9
|
from typing import List, Tuple
|
core/io/config_status_view.py
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
"""Configuration status view for displaying config errors and status.
|
|
1
|
+
"""Configuration status view for displaying config errors and status.
|
|
2
|
+
|
|
3
|
+
This module provides a status view component for monitoring configuration
|
|
4
|
+
errors, validation warnings, and overall configuration health status.
|
|
5
|
+
"""
|
|
2
6
|
|
|
3
7
|
import logging
|
|
4
8
|
from typing import Dict, Any, Optional, List
|
|
5
9
|
|
|
6
|
-
from .status_renderer import StatusViewConfig
|
|
10
|
+
from .status_renderer import StatusViewConfig
|
|
7
11
|
|
|
8
12
|
logger = logging.getLogger(__name__)
|
|
9
13
|
|
|
@@ -114,7 +118,7 @@ class ConfigStatusView:
|
|
|
114
118
|
|
|
115
119
|
# Normal status - only show if explicitly requested
|
|
116
120
|
if data.get("show_normal_status", False):
|
|
117
|
-
return "[
|
|
121
|
+
return "[ok] Config: OK"
|
|
118
122
|
|
|
119
123
|
# No status line needed for normal operation
|
|
120
124
|
return None
|
|
@@ -244,29 +248,3 @@ class ConfigStatusView:
|
|
|
244
248
|
|
|
245
249
|
# Normal status - show healthy config
|
|
246
250
|
return ["Config: OK", "No errors or warnings"]
|
|
247
|
-
|
|
248
|
-
def _get_config_status_metrics(self) -> List[StatusMetric]:
|
|
249
|
-
"""Get configuration status as StatusMetric objects.
|
|
250
|
-
|
|
251
|
-
Returns:
|
|
252
|
-
List of StatusMetric objects for display.
|
|
253
|
-
"""
|
|
254
|
-
status_data = self.get_status_data()
|
|
255
|
-
|
|
256
|
-
if not self.should_display(status_data):
|
|
257
|
-
return []
|
|
258
|
-
|
|
259
|
-
status_line = self.format_status_line(status_data)
|
|
260
|
-
if not status_line:
|
|
261
|
-
return []
|
|
262
|
-
|
|
263
|
-
color_scheme = self.get_color_scheme(status_data)
|
|
264
|
-
|
|
265
|
-
return [
|
|
266
|
-
StatusMetric(
|
|
267
|
-
name="config",
|
|
268
|
-
value=status_line,
|
|
269
|
-
color=color_scheme,
|
|
270
|
-
unit="",
|
|
271
|
-
)
|
|
272
|
-
]
|