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
core/storage/__init__.py DELETED
@@ -1,5 +0,0 @@
1
- """Storage subsystem for Kollabor CLI."""
2
-
3
- from .state_manager import StateManager
4
-
5
- __all__ = ['StateManager']
@@ -1,84 +0,0 @@
1
- """State management system for Kollabor CLI."""
2
-
3
- import json
4
- import logging
5
- import sqlite3
6
- import threading
7
- from typing import Any
8
-
9
- logger = logging.getLogger(__name__)
10
-
11
-
12
- class StateManager:
13
- """SQLite-based state management system.
14
-
15
- Provides persistent storage for application and plugin state.
16
- """
17
-
18
- def __init__(self, db_path: str) -> None:
19
- """Initialize the state manager.
20
-
21
- Args:
22
- db_path: Path to the SQLite database file.
23
- """
24
- self.db_path = db_path
25
- self.conn = sqlite3.connect(db_path, check_same_thread=False)
26
- self._lock = threading.Lock()
27
- self._init_database()
28
- logger.info(f"State manager initialized with database: {db_path}")
29
-
30
- def _init_database(self) -> None:
31
- """Initialize the database schema."""
32
- cursor = self.conn.cursor()
33
-
34
- # Main state table
35
- cursor.execute('''
36
- CREATE TABLE IF NOT EXISTS state (
37
- key TEXT PRIMARY KEY,
38
- value TEXT,
39
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
40
- )
41
- ''')
42
-
43
- self.conn.commit()
44
- logger.debug("Database schema initialized")
45
-
46
- def set(self, key: str, value: Any) -> None:
47
- """Set a state value.
48
-
49
- Args:
50
- key: State key.
51
- value: Value to store (will be JSON serialized).
52
- """
53
- with self._lock:
54
- cursor = self.conn.cursor()
55
- cursor.execute('''
56
- INSERT OR REPLACE INTO state (key, value, updated_at)
57
- VALUES (?, ?, CURRENT_TIMESTAMP)
58
- ''', (key, json.dumps(value)))
59
- self.conn.commit()
60
- logger.debug(f"Set state: {key}")
61
-
62
- def get(self, key: str, default: Any = None) -> Any:
63
- """Get a state value.
64
-
65
- Args:
66
- key: State key.
67
- default: Default value if key not found.
68
-
69
- Returns:
70
- The stored value or default.
71
- """
72
- with self._lock:
73
- cursor = self.conn.cursor()
74
- cursor.execute('SELECT value FROM state WHERE key = ?', (key,))
75
- row = cursor.fetchone()
76
- if row:
77
- return json.loads(row[0])
78
- return default
79
-
80
- def close(self) -> None:
81
- """Close the database connection."""
82
- if self.conn:
83
- self.conn.close()
84
- logger.info("Database connection closed")
@@ -1,222 +0,0 @@
1
- """Widget integration methods for modal_renderer.py.
2
-
3
- This module contains the complete widget integration logic ready to be
4
- merged into modal_renderer.py when Phase 1 signals completion.
5
- """
6
-
7
- from typing import List, Dict, Any, Optional
8
- from .widgets import BaseWidget, CheckboxWidget, DropdownWidget, TextInputWidget, SliderWidget
9
- from ..io.key_parser import KeyPress
10
- from ..io.visual_effects import ColorPalette
11
-
12
-
13
- class WidgetIntegrationMixin:
14
- """Mixin class containing widget integration methods for ModalRenderer."""
15
-
16
- def __init__(self):
17
- """Initialize widget management."""
18
- self.widgets: List[BaseWidget] = []
19
- self.focused_widget_index = 0
20
-
21
- def _create_widgets(self, modal_config: dict) -> List[BaseWidget]:
22
- """Create widgets from modal configuration.
23
-
24
- Args:
25
- modal_config: Modal configuration dictionary.
26
-
27
- Returns:
28
- List of instantiated widgets.
29
- """
30
- widgets = []
31
- for section in modal_config.get("sections", []):
32
- for widget_config in section.get("widgets", []):
33
- widget = self._create_widget(widget_config)
34
- widgets.append(widget)
35
- return widgets
36
-
37
- def _create_widget(self, config: dict) -> BaseWidget:
38
- """Create a single widget from configuration.
39
-
40
- Args:
41
- config: Widget configuration dictionary.
42
-
43
- Returns:
44
- Instantiated widget.
45
-
46
- Raises:
47
- ValueError: If widget type is unknown.
48
- """
49
- widget_type = config["type"]
50
-
51
- # Use config_path directly if provided, otherwise construct from config_path + key
52
- if "config_path" in config:
53
- config_path = config["config_path"]
54
- else:
55
- config_path = f"{config.get('config_path', 'core.ui')}.{config['key']}"
56
-
57
- if widget_type == "checkbox":
58
- return CheckboxWidget(config, config_path, self.config_service)
59
- elif widget_type == "dropdown":
60
- return DropdownWidget(config, config_path, self.config_service)
61
- elif widget_type == "text_input":
62
- return TextInputWidget(config, config_path, self.config_service)
63
- elif widget_type == "slider":
64
- return SliderWidget(config, config_path, self.config_service)
65
- else:
66
- raise ValueError(f"Unknown widget type: {widget_type}")
67
-
68
- def _render_modal_content_with_widgets(self, modal_config: dict, width: int) -> List[str]:
69
- """Render modal content with interactive widgets.
70
-
71
- Args:
72
- modal_config: Modal configuration dict.
73
- width: Modal width.
74
-
75
- Returns:
76
- List of content lines with rendered widgets.
77
- """
78
- lines = []
79
- border_color = ColorPalette.DIM_CYAN
80
-
81
- # Create widgets if not already created
82
- if not self.widgets:
83
- self.widgets = self._create_widgets(modal_config)
84
- if self.widgets:
85
- self.widgets[0].set_focus(True)
86
-
87
- # Add empty line
88
- lines.append(f"{border_color}│{' ' * (width-2)}│{ColorPalette.RESET}")
89
-
90
- # Render sections with widgets
91
- widget_index = 0
92
- sections = modal_config.get("sections", [])
93
-
94
- for section in sections:
95
- section_title = section.get("title", "Section")
96
-
97
- # Section title
98
- title_text = f" {section_title}"
99
- title_line = f"│{title_text.ljust(width-2)}│"
100
- lines.append(f"{border_color}{title_line}{ColorPalette.RESET}")
101
-
102
- # Empty line after title
103
- lines.append(f"{border_color}│{' ' * (width-2)}│{ColorPalette.RESET}")
104
-
105
- # Render widgets in this section
106
- section_widgets = section.get("widgets", [])
107
- for widget_config in section_widgets:
108
- if widget_index < len(self.widgets):
109
- widget = self.widgets[widget_index]
110
- widget_lines = widget.render()
111
-
112
- # Add each widget line with proper padding
113
- for widget_line in widget_lines:
114
- # Remove any existing padding and reformat for modal
115
- clean_line = widget_line.strip()
116
- if clean_line.startswith(" "): # Remove widget's default padding
117
- clean_line = clean_line[2:]
118
-
119
- # Add modal padding and border
120
- padded_line = f" {clean_line}"
121
- modal_line = f"│{padded_line.ljust(width-2)}│"
122
- lines.append(f"{border_color}{modal_line}{ColorPalette.RESET}")
123
-
124
- widget_index += 1
125
-
126
- # Empty line after section
127
- lines.append(f"{border_color}│{' ' * (width-2)}│{ColorPalette.RESET}")
128
-
129
- return lines
130
-
131
- def _handle_widget_navigation(self, key_press: KeyPress) -> bool:
132
- """Handle widget focus navigation.
133
-
134
- Args:
135
- key_press: Key press event.
136
-
137
- Returns:
138
- True if navigation was handled.
139
- """
140
- if not self.widgets:
141
- return False
142
-
143
- if key_press.name == "Tab" or key_press.name == "ArrowDown":
144
- # Move to next widget
145
- self.widgets[self.focused_widget_index].set_focus(False)
146
- self.focused_widget_index = (self.focused_widget_index + 1) % len(self.widgets)
147
- self.widgets[self.focused_widget_index].set_focus(True)
148
- return True
149
-
150
- elif key_press.name == "ArrowUp":
151
- # Move to previous widget
152
- self.widgets[self.focused_widget_index].set_focus(False)
153
- self.focused_widget_index = (self.focused_widget_index - 1) % len(self.widgets)
154
- self.widgets[self.focused_widget_index].set_focus(True)
155
- return True
156
-
157
- return False
158
-
159
- def _handle_widget_input(self, key_press: KeyPress) -> bool:
160
- """Route input to focused widget.
161
-
162
- Args:
163
- key_press: Key press event.
164
-
165
- Returns:
166
- True if input was handled by a widget.
167
- """
168
- if not self.widgets or self.focused_widget_index >= len(self.widgets):
169
- return False
170
-
171
- focused_widget = self.widgets[self.focused_widget_index]
172
- return focused_widget.handle_input(key_press)
173
-
174
- def _get_widget_values(self) -> Dict[str, Any]:
175
- """Get all widget values for saving.
176
-
177
- Returns:
178
- Dictionary mapping config paths to values.
179
- """
180
- values = {}
181
- for widget in self.widgets:
182
- if widget.has_pending_changes():
183
- values[widget.config_path] = widget.get_pending_value()
184
- return values
185
-
186
- def _reset_widget_focus(self):
187
- """Reset widget focus to first widget."""
188
- if self.widgets:
189
- for widget in self.widgets:
190
- widget.set_focus(False)
191
- self.focused_widget_index = 0
192
- self.widgets[0].set_focus(True)
193
-
194
-
195
- # INTEGRATION INSTRUCTIONS FOR PHASE 1 COMPLETION:
196
- """
197
- TO INTEGRATE WIDGETS INTO modal_renderer.py:
198
-
199
- 1. Add import at top:
200
- from .widget_integration import WidgetIntegrationMixin
201
-
202
- 2. Make ModalRenderer inherit from mixin:
203
- class ModalRenderer(WidgetIntegrationMixin):
204
-
205
- 3. Update __init__ method:
206
- def __init__(self, terminal_renderer, visual_effects):
207
- super().__init__() # Initialize widget management
208
- self.terminal_renderer = terminal_renderer
209
- self.visual_effects = visual_effects
210
- self.gradient_renderer = GradientRenderer()
211
-
212
- 4. Replace _render_modal_content with:
213
- def _render_modal_content(self, modal_config: dict, width: int) -> List[str]:
214
- return self._render_modal_content_with_widgets(modal_config, width)
215
-
216
- 5. Update _handle_modal_input to include widget handling:
217
- async def _handle_modal_input(self, ui_config: UIConfig) -> Dict[str, Any]:
218
- # Add widget input handling here
219
- # Navigation: self._handle_widget_navigation(key_press)
220
- # Widget input: self._handle_widget_input(key_press)
221
- # Save values: self._get_widget_values()
222
- """
core/utils/key_reader.py DELETED
@@ -1,171 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Key reader utility for debugging terminal input sequences.
3
-
4
- This tool helps debug what actual key sequences are sent by the terminal
5
- when pressing various key combinations. Useful for implementing new
6
- keyboard shortcuts and understanding terminal behavior.
7
-
8
- Usage:
9
- python core/utils/key_reader.py
10
-
11
- Press keys to see their sequences, Ctrl+C to exit.
12
- """
13
-
14
- import sys
15
- import signal
16
-
17
- # Platform-specific imports
18
- IS_WINDOWS = sys.platform == "win32"
19
-
20
- if IS_WINDOWS:
21
- import msvcrt
22
- else:
23
- import tty
24
- import termios
25
- import select
26
-
27
-
28
- def signal_handler(sig, frame):
29
- """Handle Ctrl+C gracefully."""
30
- print('\n\nExiting key reader...')
31
- sys.exit(0)
32
-
33
-
34
- def main_unix():
35
- """Main key reader loop for Unix systems."""
36
- print("Key Reader (Unix) - Press keys to see their sequences (Ctrl+C to exit)")
37
- print("=" * 60)
38
-
39
- # Set up signal handler for graceful exit
40
- signal.signal(signal.SIGINT, signal_handler)
41
-
42
- # Save terminal settings
43
- fd = sys.stdin.fileno()
44
- old_settings = termios.tcgetattr(fd)
45
-
46
- try:
47
- # Set terminal to raw mode
48
- tty.setraw(sys.stdin.fileno())
49
-
50
- key_count = 0
51
-
52
- while True:
53
- # Read one character
54
- char = sys.stdin.read(1)
55
- key_count += 1
56
-
57
- # Get character info
58
- ascii_code = ord(char)
59
- hex_code = hex(ascii_code)
60
-
61
- # Determine key name
62
- if ascii_code == 3: # Ctrl+C
63
- print(f"\n\r[{key_count:03d}] Key: 'CTRL+C' | ASCII: {ascii_code} | Hex: {hex_code} | Raw: {repr(char)}")
64
- break
65
- elif ascii_code == 27: # ESC or start of escape sequence
66
- key_name = "ESC"
67
- # Try to read more characters for escape sequences
68
- try:
69
- # Set a short timeout to see if more chars follow
70
- if select.select([sys.stdin], [], [], 0.1)[0]:
71
- sequence = char
72
- while select.select([sys.stdin], [], [], 0.05)[0]:
73
- next_char = sys.stdin.read(1)
74
- sequence += next_char
75
- if len(sequence) > 10: # Prevent infinite sequences
76
- break
77
-
78
- # Update display info
79
- char = sequence
80
- ascii_code = f"ESC sequence"
81
- hex_code = " ".join(hex(ord(c)) for c in sequence)
82
- key_name = f"ESC_SEQ({sequence[1:]})" if len(sequence) > 1 else "ESC"
83
- except:
84
- pass
85
- elif 1 <= ascii_code <= 26: # Ctrl+A through Ctrl+Z
86
- key_name = f"CTRL+{chr(ascii_code + 64)}"
87
- elif ascii_code == 127:
88
- key_name = "BACKSPACE"
89
- elif 32 <= ascii_code <= 126:
90
- key_name = f"'{char}'"
91
- else:
92
- key_name = f"SPECIAL({ascii_code})"
93
-
94
- # Display the key info
95
- print(f"\r[{key_count:03d}] Key: {key_name} | ASCII: {ascii_code} | Hex: {hex_code} | Raw: {repr(char)}")
96
-
97
- finally:
98
- # Restore terminal settings
99
- termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
100
-
101
-
102
- def main_windows():
103
- """Main key reader loop for Windows systems."""
104
- print("Key Reader (Windows) - Press keys to see their sequences (Ctrl+C to exit)")
105
- print("=" * 60)
106
-
107
- key_count = 0
108
-
109
- try:
110
- while True:
111
- if msvcrt.kbhit():
112
- # Read a key
113
- char = msvcrt.getch()
114
- key_count += 1
115
-
116
- # Get character info
117
- ascii_code = char[0] if isinstance(char, bytes) else ord(char)
118
- hex_code = hex(ascii_code)
119
-
120
- # Handle special keys (arrow keys, function keys, etc.)
121
- if ascii_code in (0, 224): # Extended key prefix
122
- # Read the actual key code
123
- ext_char = msvcrt.getch()
124
- ext_code = ext_char[0] if isinstance(ext_char, bytes) else ord(ext_char)
125
- key_name = f"EXTENDED({ext_code})"
126
- # Map common extended keys
127
- ext_key_map = {
128
- 72: "ArrowUp", 80: "ArrowDown",
129
- 75: "ArrowLeft", 77: "ArrowRight",
130
- 71: "Home", 79: "End",
131
- 73: "PageUp", 81: "PageDown",
132
- 82: "Insert", 83: "Delete",
133
- 59: "F1", 60: "F2", 61: "F3", 62: "F4",
134
- 63: "F5", 64: "F6", 65: "F7", 66: "F8",
135
- 67: "F9", 68: "F10", 133: "F11", 134: "F12",
136
- }
137
- if ext_code in ext_key_map:
138
- key_name = ext_key_map[ext_code]
139
- print(f"[{key_count:03d}] Key: {key_name} | Code: {ascii_code},{ext_code} | Hex: {hex_code},{hex(ext_code)}")
140
- elif ascii_code == 3: # Ctrl+C
141
- print(f"[{key_count:03d}] Key: 'CTRL+C' | ASCII: {ascii_code} | Hex: {hex_code}")
142
- break
143
- elif ascii_code == 27: # ESC
144
- print(f"[{key_count:03d}] Key: 'ESC' | ASCII: {ascii_code} | Hex: {hex_code}")
145
- elif 1 <= ascii_code <= 26: # Ctrl+A through Ctrl+Z
146
- key_name = f"CTRL+{chr(ascii_code + 64)}"
147
- print(f"[{key_count:03d}] Key: {key_name} | ASCII: {ascii_code} | Hex: {hex_code}")
148
- elif ascii_code == 8:
149
- print(f"[{key_count:03d}] Key: BACKSPACE | ASCII: {ascii_code} | Hex: {hex_code}")
150
- elif ascii_code == 13:
151
- print(f"[{key_count:03d}] Key: ENTER | ASCII: {ascii_code} | Hex: {hex_code}")
152
- elif 32 <= ascii_code <= 126:
153
- char_str = chr(ascii_code)
154
- print(f"[{key_count:03d}] Key: '{char_str}' | ASCII: {ascii_code} | Hex: {hex_code}")
155
- else:
156
- print(f"[{key_count:03d}] Key: SPECIAL({ascii_code}) | Hex: {hex_code}")
157
-
158
- except KeyboardInterrupt:
159
- print('\n\nExiting key reader...')
160
-
161
-
162
- def main():
163
- """Main entry point - selects platform-specific implementation."""
164
- if IS_WINDOWS:
165
- main_windows()
166
- else:
167
- main_unix()
168
-
169
-
170
- if __name__ == "__main__":
171
- main()
@@ -1,128 +0,0 @@
1
- kollabor_cli_main.py,sha256=RdGu7KpBzzxuhvPUiB_lHYk3IeHL6VQlkv_PqDF2wHk,625
2
- core/__init__.py,sha256=ul7d7oL6nTgvY_r9XK0ZZSb3Fqj5Uw-mSbiojr1YhQg,570
3
- core/application.py,sha256=BlLLDeNYvlB0of_42c5HQZg6rQgtMAENRia9sgAQvmc,24147
4
- core/cli.py,sha256=65pWxUqgjVLRDJ0h5AuO-OgDcH3i7fkVEkKFYxPa0Ts,6375
5
- core/commands/__init__.py,sha256=vnmRPP1Z9w-uRVq25hSC6XA7-kQD5GeyntkqjwGQsGs,1067
6
- core/commands/executor.py,sha256=n89GkS2uTi5UGUKlAV1YKQCs2ee8aIqS0ToXyyxBivM,10659
7
- core/commands/menu_renderer.py,sha256=taVWgDB3k_xvNhDE2TuhaZEkQQRXbwRQpCoknblVN-0,10632
8
- core/commands/parser.py,sha256=QNQg6uLXGmrstGSVL3SZbzmuGFvBkyVnixksX8GmNV4,5804
9
- core/commands/registry.py,sha256=elkOuFtzHVH1Bm8yGepi3odzAivoSADM2XGW-Owlxks,12091
10
- core/commands/system_commands.py,sha256=325sLJp_Zxe3IYUFxnyAvq4vtngTjLr0REAsE8avi18,17970
11
- core/config/__init__.py,sha256=LzIghvi-CGT_C-Tpzjpwryu35dKhniWI_QH3s2XsyOk,213
12
- core/config/llm_task_config.py,sha256=Ri-Vu1crP2zcrt9H_vytvxSTiMctmzWkO3IG-nGeSAg,4201
13
- core/config/loader.py,sha256=ulmhHvqU3O1X0bOd8epapA5L1DZ0USnHqEqOOtEhKew,19689
14
- core/config/manager.py,sha256=f_qNV5BZ9Ee2wfWLntgw00NJiqudaVIvxnejWX8-HjQ,3359
15
- core/config/plugin_config_manager.py,sha256=IqcrVOtqrM5R9rvZeiDsjJ4neFZkRtfNlTPJ5-OfIJg,13848
16
- core/config/plugin_schema.py,sha256=Q6KjQc5r1sN48HDzNlv0fSH1MpCclgkdnDENUwxuF0Q,15013
17
- core/config/service.py,sha256=c8XXUDOUv4qZjaXZ1HtS_RnAPX2Z75mksHqpXibkYbc,15099
18
- core/effects/__init__.py,sha256=0dDDDiPEiauWQZBWWJ7XRhE_jGIRsxzPn0SD4BDMTjg,64
19
- core/events/__init__.py,sha256=A6JciibuYZzmGqnhRlVu97LARiPHzRhN1zSh4_47uos,394
20
- core/events/bus.py,sha256=OmeFmvGSEjciXac-mchl2SeZTCZ5uIrZTxNkaY63-aM,4538
21
- core/events/executor.py,sha256=fqODnq1mWrrxy5TsNMtdd_KF-55NT8WHzzOST4b-Zm0,5728
22
- core/events/models.py,sha256=Wk5aKu9Cdn-UQDhz1cWdc1tDwy_weBkOn2FCQuP-als,8180
23
- core/events/processor.py,sha256=2GILZzv8bOc6RWB8i38SUdjw3O-zf83KGEyH3Crb38c,7023
24
- core/events/registry.py,sha256=y4baUpj04_JLME9ZZZkFqH0pWBscm-GnBACfs1yCDxs,10508
25
- core/fullscreen/__init__.py,sha256=RrZlDXqCNks7cmjimwpis7Yvo3lGCF-T3-kmVJf4BlM,558
26
- core/fullscreen/command_integration.py,sha256=GlL3tREmxnhYKn-JA1mN3sTxqkxTOauxNvuKKfVcLRk,10732
27
- core/fullscreen/manager.py,sha256=2aOBbRp2YG3gQSgBg_QKhtdL8qVOKIYF3maSZnDm-sg,10049
28
- core/fullscreen/plugin.py,sha256=qzU-5AJT_LmxPhbXvn9DzCWvYGD3FyYTBlMNfl6KXwc,6341
29
- core/fullscreen/renderer.py,sha256=9az9PNeFejp7PbcZBwxzFpNd5cWI1rkjZZYm-jkLJf4,9924
30
- core/fullscreen/session.py,sha256=d76zUyz7n7Fy26fsESLPEIyjgFbE94QGJH1gC8BHovQ,12018
31
- core/fullscreen/components/__init__.py,sha256=lP5pqxagiFRRt8TRNIGfR1WmXojoSpmdO4pDhQx7FdY,299
32
- core/fullscreen/components/animation.py,sha256=f91iMDi-XnyuygP7FWO2LJZtgwbtoMv_n9guegYjwJ0,7078
33
- core/fullscreen/components/drawing.py,sha256=yuZoY0tG04pWnA2YZqjkSB9mtn9bVc8SkdNcSwOCHfM,5885
34
- core/fullscreen/components/matrix_components.py,sha256=wcR8aC7oGpiq3d76cJ_gRpy4C3fppOtHGSdeNjwQjhw,5871
35
- core/io/__init__.py,sha256=h_Tt_tPQ7kHmu4Qj9RfFua7nPQLpYzkZwfvbcilx-J0,1410
36
- core/io/buffer_manager.py,sha256=0GNP4udUARiAtE69woYBsRg2hY23u0B_xUlwWY0Ga6A,10956
37
- core/io/config_status_view.py,sha256=Tq1Zn9FsK0oYMd8XTeIuLAoxMMFZVoduLpVRBKyouH4,9126
38
- core/io/core_status_views.py,sha256=AakVrKgq75vmjQzL7cHGDdo8RPBrLKgJOuXUF9GxPK8,15910
39
- core/io/input_errors.py,sha256=H3VGID8a8tTuihQguSV1uzG9vXjzOKjB6J-2lJkq-kc,10130
40
- core/io/input_handler.py,sha256=D5cL0TXnCyO4qqSmmjhMCgy3jo9dB4dyfApj5O9uKd4,107665
41
- core/io/input_mode_manager.py,sha256=zGoLmFsM9UNV2iRL_KTqGfXVNTFbaDKDaVZ2P83ZWjM,15328
42
- core/io/key_parser.py,sha256=tLxNliS1Qtm4mQrwc7OzCMuQJ8dXFQ-u3-ySw-XOB3Q,10331
43
- core/io/layout.py,sha256=t1l3MMB-L7Pk6JfbFoSY-o4x8w50TL7pSuuQ70LCMvQ,18308
44
- core/io/message_coordinator.py,sha256=jx0-QCHm2IcWEhksBg5JzYkZC_qQopWaHFt67D0_bNI,7891
45
- core/io/message_renderer.py,sha256=u2P8y9lSg6tCNkbmPU812za37bF3zk8eqZE23_AvtBs,19925
46
- core/io/modal_interaction_handler.py,sha256=giQHTvTHAIoA-rSbPkQm7rdcKMGda7sHmijz-wkOWs4,12990
47
- core/io/raw_input_processor.py,sha256=gQFWm9hQ0BHqadhfjlj2sNNCOBnSoj2sttE8oeC0RdU,38716
48
- core/io/status_renderer.py,sha256=FvQxcdAybsaF-UwWTFQIZRMqDcyPcZW5iPr0uDnI5gI,28262
49
- core/io/terminal_renderer.py,sha256=r-bQ92aHSj_Li_vNw7P9_iAsHwOz_UWTxBMgO8KOG6M,22664
50
- core/io/terminal_state.py,sha256=dJQzECKPu1cZ9AdQ2xKUdHD8cZycDWvZtC_cPXrGXbc,17928
51
- core/io/visual_effects.py,sha256=nzXMVCLXOQUDLM0lKZXaWKfephhgDWpxHLNxye9eNgo,25942
52
- core/llm/__init__.py,sha256=ygjaJOgIBqE3ExUMMiAJQ2E-yDm-IQZrj9uxlGuxBfo,801
53
- core/llm/api_communication_service.py,sha256=gUhV4DK0JMndKiCHgObGtZ74HNcZNr5hYAwLiY8W3nM,33551
54
- core/llm/conversation_logger.py,sha256=My8Cn5DCSyZ-tM5XUvDDXy4Moe1BR1f07nIu9wJp6f8,19181
55
- core/llm/conversation_manager.py,sha256=Atlxm5qACvlJ7MaLXvzKfd8642aARleHmxWxkVpoaH0,14514
56
- core/llm/file_operations_executor.py,sha256=LuA-BXnrEY0K3-39yhFn7UaCYCMYJOVQdgf1s0E_BQA,45464
57
- core/llm/hook_system.py,sha256=NwFfn4a-QSI17pK4ZHCVupfSEo4_iRstBwjOFuwDJKw,14006
58
- core/llm/llm_service.py,sha256=eNWPoF33bDfESuwPKkYJR3x4ncNfI5xodnUrP9iH0k4,72654
59
- core/llm/mcp_integration.py,sha256=DOHYuWDKJx30F83y7V3Vl0nU2DAu0jmMAZv5TCkSLo8,14296
60
- core/llm/message_display_service.py,sha256=dQK2epugDVEt3nQ8dpfNL69Ii-0EDECyu5y0ttnfxXQ,18157
61
- core/llm/model_router.py,sha256=oHbFyJGJvr1mW5MVZ4T2fHrwUy6IKXJijJ9jmPmTmP0,7062
62
- core/llm/plugin_sdk.py,sha256=w9DU2yWLGsSujKtiZjBvMalq35uWWzr8dNQMsgGK6NE,14014
63
- core/llm/response_parser.py,sha256=waZrT53wJ-5ljX6yekox0wzn1QDNZbtFGI0pSBkUnxE,31511
64
- core/llm/response_processor.py,sha256=cIvw9s53gv13KXQZ5xxnRPXcYK5c7OJ_H4hLb1WpfZQ,11877
65
- core/llm/tool_executor.py,sha256=uaGJ9v_l6JGb0h8NSGJuU-hjNbW2QWSoIWDYA5Z0p3c,18990
66
- core/logging/__init__.py,sha256=SYu6X0lc8jICqsifpjBFLk18XSmcBIKcQSMLgtQOY_g,378
67
- core/logging/setup.py,sha256=FIqg36PIJmZsulwjOtdBQu-0xnazuChQeqVN8vy4CyE,6606
68
- core/models/__init__.py,sha256=BXuQeabXxRPMvmymiOjQR44s2TchbZqx2XBbTx7HuoY,111
69
- core/models/base.py,sha256=9tZwUb2VBWkX8YRLpnFSxb_GXmO92IBkwsqyRcOA1EI,711
70
- core/plugins/__init__.py,sha256=euJmpAkgN7nULkihQUu8VD9eXEInt5IgClVwOdGS0Po,307
71
- core/plugins/collector.py,sha256=tRXN8AsH9C5DQm3VdjdijiW676IN10Ig2gmWy3lwwlk,7991
72
- core/plugins/discovery.py,sha256=ivep1ueIbNbSfltTzDDOBU5iiPzljsgtJ1MEr5igg4c,14634
73
- core/plugins/factory.py,sha256=SJmITFWtc2YLGdU8kEQLL9tCqhAEadGg2Nouxz4rl5U,9018
74
- core/plugins/registry.py,sha256=a_KsQNOecTOzs4rvgQoZy2arDPUd3jqy4hLBvEjcX-k,5537
75
- core/storage/__init__.py,sha256=NspAeaBeIcbtsEZcnTzUhmgxMMDoxyhFnAFxVKqawtE,110
76
- core/storage/state_manager.py,sha256=LPjrwEtwzQsGY3Jl3cZYs7OFacm5nw9FaEaXtjlppY0,2492
77
- core/ui/__init__.py,sha256=CqoUMYHlKWQ6Xbx2RPAkna8Sdq2h8QgFlTcI2o1PMb4,219
78
- core/ui/config_merger.py,sha256=_AAzknetfacw3dHj7MpsHVtvmXGjyrc4OP-_BkW5PWc,6805
79
- core/ui/config_widgets.py,sha256=b1tTirkGkzPjiqWjZ6wDf2hKM7yn4KIfhogv6OLQjQ4,15410
80
- core/ui/live_modal_renderer.py,sha256=tSpjFcYSIfdTGOC_7SyM1x808Nb2QEYrksjHlD-KnL0,9875
81
- core/ui/modal_actions.py,sha256=3jeFxFt0XLmtC4mejkgEMpzTK_f2SZvS8ztTPmShI5A,5645
82
- core/ui/modal_overlay_renderer.py,sha256=OEUtaVZ-KPezSbEXUgFwPCUgZdo684uG6jgAgRz1lsY,12225
83
- core/ui/modal_renderer.py,sha256=zBiWGqjmVZRTmOs_Znd_p-hsIhBWRpyqSb7yZqQwNbM,24359
84
- core/ui/modal_state_manager.py,sha256=oh_OpoG2I7oAaG3RykJbaFi3586xNA5rvroxFKHdr9E,15182
85
- core/ui/widget_integration.py,sha256=c02rFwJQ3iYuzpdnWo-AqcyE-cmsgEQNtI8mnRDdjP4,8071
86
- core/ui/widgets/__init__.py,sha256=2FF0UzWwUIv8J8Ei_fcb0wZ8A-UsISZOmWBHti8vSmQ,799
87
- core/ui/widgets/base_widget.py,sha256=eaFGpVL1hCsE6BEZGSjmvDRZnB4dVpsmu0qKpDHGHcg,4328
88
- core/ui/widgets/checkbox.py,sha256=SWKFGFbgBSWoz03Bdlfhhge2AiaMqio_0a_j8sGXXUY,3038
89
- core/ui/widgets/dropdown.py,sha256=FeaxkZMIiIxYc83hmFS-Ik7H5eBTVbO4yaxmIU7E1GM,4492
90
- core/ui/widgets/label.py,sha256=H1TNVFTPzfJLcu8K6yqlTMuX9s1orE91dSvyX-MBg2M,2290
91
- core/ui/widgets/slider.py,sha256=ZuIv7ClkeeuBs2A8GHVA1AClmwJRw-Bbm-JHITBSJNA,6860
92
- core/ui/widgets/text_input.py,sha256=o3yAN70856vKzpj2hewFGo-QXYPOjRPYZH39638x67Q,7916
93
- core/utils/__init__.py,sha256=f51izmJtTxFOscZANUX2KRmMq4zAHdIwJdtiR921Csk,391
94
- core/utils/config_utils.py,sha256=9xldjhf5zb8LI9-DlKVv1A7F4SdMQj1lxfN7u3TzLvU,23163
95
- core/utils/dict_utils.py,sha256=yxsrJFaW540qvxLqxF21sEm6paxxM2-C0V4N4qOEDWE,6153
96
- core/utils/error_utils.py,sha256=JkIQk3x163rElse1MROssJROy6iHAIsfnYlLX6jfbcw,9799
97
- core/utils/key_reader.py,sha256=Krr600Y6mS0XdpAnTVRRW3UlRv2AjPL8GEpUJKYrHDY,6379
98
- core/utils/plugin_utils.py,sha256=BiiZRVHAovC30aAEdquB1GdobNS8C--lziHJ5AU2a9s,9441
99
- core/utils/prompt_renderer.py,sha256=hCqrpGcRTFmDHiPUkjYG5OhGEurmw835o3JyUD-0Qog,5049
100
- kollabor-0.4.9.dist-info/licenses/LICENSE,sha256=uWkgA9bNCoiOlyXN1KYAT8oSq6NbZ68EZDQ8nGlgHdQ,1078
101
- plugins/__init__.py,sha256=cg-G1KOnSHMYazTkYu9otwKubVdNjda1jCO9F2Y0idY,39
102
- plugins/enhanced_input_plugin.py,sha256=8Lh097j-9sz3OnmFTui2gJdQVpKl2aNW7qIPGUeD2dU,14425
103
- plugins/hook_monitoring_plugin.py,sha256=BKmoWNWdR_4oCgdTTrf2dakClQryQNrSzJoXUda_wb0,58896
104
- plugins/query_enhancer_plugin.py,sha256=FwuZbYAFuBSQfzIjfNe0hgdVowiSnowITwTc6V_8DW4,15228
105
- plugins/save_conversation_plugin.py,sha256=tz1YS6DkXu58R2w8JEWwECJfMmQtZo_vCi-7ya9dwmg,17403
106
- plugins/system_commands_plugin.py,sha256=RIUiyh8lDJxpTkUyxp5wuIViS85XKjje06zftDWV5Yg,3120
107
- plugins/tmux_plugin.py,sha256=YoXSyVMrQcb25N3xLHgWJDpOrgSv0qE4dn-Rtsh8GFY,29509
108
- plugins/workflow_enforcement_plugin.py,sha256=KaAI6eKvx7jiAixA5oKgOfO2s4W3hvgNjEkLOqVT8lw,26308
109
- plugins/enhanced_input/__init__.py,sha256=GH0OHRYY1cdqXXu-0wX_TpEQj9H5lOUBUn50S76DhFc,603
110
- plugins/enhanced_input/box_renderer.py,sha256=2f6gu1jIfsXDqnKA3pWXbqCOi2hi8bkolEbbaAvHiaw,3746
111
- plugins/enhanced_input/box_styles.py,sha256=VoPRYdCWCVaZCjnbtcX-esW9pSYAuJTQ-owv2YFhRII,5330
112
- plugins/enhanced_input/color_engine.py,sha256=vKUxLNH5NXmOZIc3Ve-joNcfGOKEMrTMjVevOFfFKlQ,5432
113
- plugins/enhanced_input/config.py,sha256=Kcsu33omW0x5UYsFLnihhLFu4U3w1VWNMTZ-RPRoKXE,5757
114
- plugins/enhanced_input/cursor_manager.py,sha256=iJoZTEUHtm--YrHRab1W_LkBsGy5Oz6Iw_h8NjnVRE0,2423
115
- plugins/enhanced_input/geometry.py,sha256=6EFPKpaq-cZlaNF62DNKT5yQxFYd8MHK4mGO8pLJws0,2511
116
- plugins/enhanced_input/state.py,sha256=hXUS66YguOasJxTgFlyr6mCtLOjsrSvGg1lWE8mCsKs,4149
117
- plugins/enhanced_input/text_processor.py,sha256=QEP7xiA4Xvsf17SHJwF-FlqppvckG4nEO9z28bP7qbQ,3380
118
- plugins/fullscreen/__init__.py,sha256=d-QsC15S8BzW-5lnVyQjalYRFxjU1fWuTUcew3FYSdY,182
119
- plugins/fullscreen/example_plugin.py,sha256=Byh3OFWfNwtebP_lJ_gvHhGn3M9WS6O93_7_iIoLQLs,12011
120
- plugins/fullscreen/matrix_plugin.py,sha256=ZecJMLn22mDcwPmMLJbe9hrf6xo1NibaEnzaYxb4J84,4048
121
- system_prompt/default.md,sha256=Ovt_rIwdOiwGx8A3HthhBcbBFj6OHPEC2FWIQxXdhcI,39047
122
- system_prompt/default_win.md,sha256=DVG4SP6S24KXbY2I5qkzgbJpQuS-3DRayEv0TPgsw_o,11487
123
- system_prompt/example_with_trender.md,sha256=DL0NcgXi-BNknSaPm2Vk9ro3tncKPYm0z-etpT9nxN0,1401
124
- kollabor-0.4.9.dist-info/METADATA,sha256=sPlBe21n9VrodSDAliqmoDirtQTfGVuHUs19cQyw7XQ,8753
125
- kollabor-0.4.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
126
- kollabor-0.4.9.dist-info/entry_points.txt,sha256=8VUD4TjPTE5aHr19bhfMiu9kX2lshLqUwRFr_8oPLos,54
127
- kollabor-0.4.9.dist-info/top_level.txt,sha256=ArYE0j-k28Od59srp4P3vjOhthTwKZ4md4dlZhvBkYw,45
128
- kollabor-0.4.9.dist-info/RECORD,,