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
@@ -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
- sys.stdout.write("\033[2J\033[H")
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
- sys.stdout.write(f"\033[{row};1H\033[K")
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
- sys.stdout.write(f"\033[{y+1};{x+1}H")
223
+ self._write(f"\033[{y+1};{x+1}H")
188
224
 
189
225
  def hide_cursor(self):
190
226
  """Hide the cursor."""
191
- sys.stdout.write("\033[?25l")
227
+ self._write("\033[?25l")
192
228
 
193
229
  def show_cursor(self):
194
230
  """Show the cursor."""
195
- sys.stdout.write("\033[?25h")
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
- sys.stdout.write(text)
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
- sys.stdout.write(f"{color}{text}{ColorPalette.RESET}")
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
- sys.stdout.flush()
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()
@@ -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 = 60.0):
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
- self.target_fps = target_fps
58
- self.frame_delay = 1.0 / target_fps
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
- print(f"🎯 CRITICAL: Adding key to pending_input queue: {key_press.name} ({key_press.char})")
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
- print(f"❌ CRITICAL: No key_press in event data: {event_data}")
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
- if not await self.plugin.render_frame(delta_time):
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
- char = sys.stdin.read(1)
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 or not char:
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 input character properly
259
- key_press = self._key_parser.parse_char(char)
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 VisualEffects, ColorPalette, EffectType
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, StatusMetric, StatusFormat
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
- "StatusMetric",
46
- "StatusFormat",
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
@@ -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, StatusMetric
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 "[OK] Config: OK"
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
- ]