pomera-ai-commander 0.1.0 → 1.2.1

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 (191) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +105 -680
  3. package/bin/pomera-ai-commander.js +62 -62
  4. package/core/__init__.py +65 -65
  5. package/core/app_context.py +482 -482
  6. package/core/async_text_processor.py +421 -421
  7. package/core/backup_manager.py +655 -655
  8. package/core/backup_recovery_manager.py +1033 -1033
  9. package/core/content_hash_cache.py +508 -508
  10. package/core/context_menu.py +313 -313
  11. package/core/data_validator.py +1066 -1066
  12. package/core/database_connection_manager.py +744 -744
  13. package/core/database_curl_settings_manager.py +608 -608
  14. package/core/database_promera_ai_settings_manager.py +446 -446
  15. package/core/database_schema.py +411 -411
  16. package/core/database_schema_manager.py +395 -395
  17. package/core/database_settings_manager.py +1507 -1507
  18. package/core/database_settings_manager_interface.py +456 -456
  19. package/core/dialog_manager.py +734 -734
  20. package/core/efficient_line_numbers.py +510 -510
  21. package/core/error_handler.py +746 -746
  22. package/core/error_service.py +431 -431
  23. package/core/event_consolidator.py +511 -511
  24. package/core/mcp/__init__.py +43 -43
  25. package/core/mcp/protocol.py +288 -288
  26. package/core/mcp/schema.py +251 -251
  27. package/core/mcp/server_stdio.py +299 -299
  28. package/core/mcp/tool_registry.py +2372 -2345
  29. package/core/memory_efficient_text_widget.py +711 -711
  30. package/core/migration_manager.py +914 -914
  31. package/core/migration_test_suite.py +1085 -1085
  32. package/core/migration_validator.py +1143 -1143
  33. package/core/optimized_find_replace.py +714 -714
  34. package/core/optimized_pattern_engine.py +424 -424
  35. package/core/optimized_search_highlighter.py +552 -552
  36. package/core/performance_monitor.py +674 -674
  37. package/core/persistence_manager.py +712 -712
  38. package/core/progressive_stats_calculator.py +632 -632
  39. package/core/regex_pattern_cache.py +529 -529
  40. package/core/regex_pattern_library.py +350 -350
  41. package/core/search_operation_manager.py +434 -434
  42. package/core/settings_defaults_registry.py +1087 -1087
  43. package/core/settings_integrity_validator.py +1111 -1111
  44. package/core/settings_serializer.py +557 -557
  45. package/core/settings_validator.py +1823 -1823
  46. package/core/smart_stats_calculator.py +709 -709
  47. package/core/statistics_update_manager.py +619 -619
  48. package/core/stats_config_manager.py +858 -858
  49. package/core/streaming_text_handler.py +723 -723
  50. package/core/task_scheduler.py +596 -596
  51. package/core/update_pattern_library.py +168 -168
  52. package/core/visibility_monitor.py +596 -596
  53. package/core/widget_cache.py +498 -498
  54. package/mcp.json +51 -61
  55. package/package.json +61 -57
  56. package/pomera.py +7482 -7482
  57. package/pomera_mcp_server.py +183 -144
  58. package/requirements.txt +32 -0
  59. package/tools/__init__.py +4 -4
  60. package/tools/ai_tools.py +2891 -2891
  61. package/tools/ascii_art_generator.py +352 -352
  62. package/tools/base64_tools.py +183 -183
  63. package/tools/base_tool.py +511 -511
  64. package/tools/case_tool.py +308 -308
  65. package/tools/column_tools.py +395 -395
  66. package/tools/cron_tool.py +884 -884
  67. package/tools/curl_history.py +600 -600
  68. package/tools/curl_processor.py +1207 -1207
  69. package/tools/curl_settings.py +502 -502
  70. package/tools/curl_tool.py +5467 -5467
  71. package/tools/diff_viewer.py +1071 -1071
  72. package/tools/email_extraction_tool.py +248 -248
  73. package/tools/email_header_analyzer.py +425 -425
  74. package/tools/extraction_tools.py +250 -250
  75. package/tools/find_replace.py +1750 -1750
  76. package/tools/folder_file_reporter.py +1463 -1463
  77. package/tools/folder_file_reporter_adapter.py +480 -480
  78. package/tools/generator_tools.py +1216 -1216
  79. package/tools/hash_generator.py +255 -255
  80. package/tools/html_tool.py +656 -656
  81. package/tools/jsonxml_tool.py +729 -729
  82. package/tools/line_tools.py +419 -419
  83. package/tools/markdown_tools.py +561 -561
  84. package/tools/mcp_widget.py +1417 -1417
  85. package/tools/notes_widget.py +973 -973
  86. package/tools/number_base_converter.py +372 -372
  87. package/tools/regex_extractor.py +571 -571
  88. package/tools/slug_generator.py +310 -310
  89. package/tools/sorter_tools.py +458 -458
  90. package/tools/string_escape_tool.py +392 -392
  91. package/tools/text_statistics_tool.py +365 -365
  92. package/tools/text_wrapper.py +430 -430
  93. package/tools/timestamp_converter.py +421 -421
  94. package/tools/tool_loader.py +710 -710
  95. package/tools/translator_tools.py +522 -522
  96. package/tools/url_link_extractor.py +261 -261
  97. package/tools/url_parser.py +204 -204
  98. package/tools/whitespace_tools.py +355 -355
  99. package/tools/word_frequency_counter.py +146 -146
  100. package/core/__pycache__/__init__.cpython-313.pyc +0 -0
  101. package/core/__pycache__/app_context.cpython-313.pyc +0 -0
  102. package/core/__pycache__/async_text_processor.cpython-313.pyc +0 -0
  103. package/core/__pycache__/backup_manager.cpython-313.pyc +0 -0
  104. package/core/__pycache__/backup_recovery_manager.cpython-313.pyc +0 -0
  105. package/core/__pycache__/content_hash_cache.cpython-313.pyc +0 -0
  106. package/core/__pycache__/context_menu.cpython-313.pyc +0 -0
  107. package/core/__pycache__/data_validator.cpython-313.pyc +0 -0
  108. package/core/__pycache__/database_connection_manager.cpython-313.pyc +0 -0
  109. package/core/__pycache__/database_curl_settings_manager.cpython-313.pyc +0 -0
  110. package/core/__pycache__/database_promera_ai_settings_manager.cpython-313.pyc +0 -0
  111. package/core/__pycache__/database_schema.cpython-313.pyc +0 -0
  112. package/core/__pycache__/database_schema_manager.cpython-313.pyc +0 -0
  113. package/core/__pycache__/database_settings_manager.cpython-313.pyc +0 -0
  114. package/core/__pycache__/database_settings_manager_interface.cpython-313.pyc +0 -0
  115. package/core/__pycache__/dialog_manager.cpython-313.pyc +0 -0
  116. package/core/__pycache__/efficient_line_numbers.cpython-313.pyc +0 -0
  117. package/core/__pycache__/error_handler.cpython-313.pyc +0 -0
  118. package/core/__pycache__/error_service.cpython-313.pyc +0 -0
  119. package/core/__pycache__/event_consolidator.cpython-313.pyc +0 -0
  120. package/core/__pycache__/memory_efficient_text_widget.cpython-313.pyc +0 -0
  121. package/core/__pycache__/migration_manager.cpython-313.pyc +0 -0
  122. package/core/__pycache__/migration_test_suite.cpython-313.pyc +0 -0
  123. package/core/__pycache__/migration_validator.cpython-313.pyc +0 -0
  124. package/core/__pycache__/optimized_find_replace.cpython-313.pyc +0 -0
  125. package/core/__pycache__/optimized_pattern_engine.cpython-313.pyc +0 -0
  126. package/core/__pycache__/optimized_search_highlighter.cpython-313.pyc +0 -0
  127. package/core/__pycache__/performance_monitor.cpython-313.pyc +0 -0
  128. package/core/__pycache__/persistence_manager.cpython-313.pyc +0 -0
  129. package/core/__pycache__/progressive_stats_calculator.cpython-313.pyc +0 -0
  130. package/core/__pycache__/regex_pattern_cache.cpython-313.pyc +0 -0
  131. package/core/__pycache__/regex_pattern_library.cpython-313.pyc +0 -0
  132. package/core/__pycache__/search_operation_manager.cpython-313.pyc +0 -0
  133. package/core/__pycache__/settings_defaults_registry.cpython-313.pyc +0 -0
  134. package/core/__pycache__/settings_integrity_validator.cpython-313.pyc +0 -0
  135. package/core/__pycache__/settings_serializer.cpython-313.pyc +0 -0
  136. package/core/__pycache__/settings_validator.cpython-313.pyc +0 -0
  137. package/core/__pycache__/smart_stats_calculator.cpython-313.pyc +0 -0
  138. package/core/__pycache__/statistics_update_manager.cpython-313.pyc +0 -0
  139. package/core/__pycache__/stats_config_manager.cpython-313.pyc +0 -0
  140. package/core/__pycache__/streaming_text_handler.cpython-313.pyc +0 -0
  141. package/core/__pycache__/task_scheduler.cpython-313.pyc +0 -0
  142. package/core/__pycache__/visibility_monitor.cpython-313.pyc +0 -0
  143. package/core/__pycache__/widget_cache.cpython-313.pyc +0 -0
  144. package/core/mcp/__pycache__/__init__.cpython-313.pyc +0 -0
  145. package/core/mcp/__pycache__/protocol.cpython-313.pyc +0 -0
  146. package/core/mcp/__pycache__/schema.cpython-313.pyc +0 -0
  147. package/core/mcp/__pycache__/server_stdio.cpython-313.pyc +0 -0
  148. package/core/mcp/__pycache__/tool_registry.cpython-313.pyc +0 -0
  149. package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  150. package/tools/__pycache__/ai_tools.cpython-313.pyc +0 -0
  151. package/tools/__pycache__/ascii_art_generator.cpython-313.pyc +0 -0
  152. package/tools/__pycache__/base64_tools.cpython-313.pyc +0 -0
  153. package/tools/__pycache__/base_tool.cpython-313.pyc +0 -0
  154. package/tools/__pycache__/case_tool.cpython-313.pyc +0 -0
  155. package/tools/__pycache__/column_tools.cpython-313.pyc +0 -0
  156. package/tools/__pycache__/cron_tool.cpython-313.pyc +0 -0
  157. package/tools/__pycache__/curl_history.cpython-313.pyc +0 -0
  158. package/tools/__pycache__/curl_processor.cpython-313.pyc +0 -0
  159. package/tools/__pycache__/curl_settings.cpython-313.pyc +0 -0
  160. package/tools/__pycache__/curl_tool.cpython-313.pyc +0 -0
  161. package/tools/__pycache__/diff_viewer.cpython-313.pyc +0 -0
  162. package/tools/__pycache__/email_extraction_tool.cpython-313.pyc +0 -0
  163. package/tools/__pycache__/email_header_analyzer.cpython-313.pyc +0 -0
  164. package/tools/__pycache__/extraction_tools.cpython-313.pyc +0 -0
  165. package/tools/__pycache__/find_replace.cpython-313.pyc +0 -0
  166. package/tools/__pycache__/folder_file_reporter.cpython-313.pyc +0 -0
  167. package/tools/__pycache__/folder_file_reporter_adapter.cpython-313.pyc +0 -0
  168. package/tools/__pycache__/generator_tools.cpython-313.pyc +0 -0
  169. package/tools/__pycache__/hash_generator.cpython-313.pyc +0 -0
  170. package/tools/__pycache__/html_tool.cpython-313.pyc +0 -0
  171. package/tools/__pycache__/huggingface_helper.cpython-313.pyc +0 -0
  172. package/tools/__pycache__/jsonxml_tool.cpython-313.pyc +0 -0
  173. package/tools/__pycache__/line_tools.cpython-313.pyc +0 -0
  174. package/tools/__pycache__/list_comparator.cpython-313.pyc +0 -0
  175. package/tools/__pycache__/markdown_tools.cpython-313.pyc +0 -0
  176. package/tools/__pycache__/mcp_widget.cpython-313.pyc +0 -0
  177. package/tools/__pycache__/notes_widget.cpython-313.pyc +0 -0
  178. package/tools/__pycache__/number_base_converter.cpython-313.pyc +0 -0
  179. package/tools/__pycache__/regex_extractor.cpython-313.pyc +0 -0
  180. package/tools/__pycache__/slug_generator.cpython-313.pyc +0 -0
  181. package/tools/__pycache__/sorter_tools.cpython-313.pyc +0 -0
  182. package/tools/__pycache__/string_escape_tool.cpython-313.pyc +0 -0
  183. package/tools/__pycache__/text_statistics_tool.cpython-313.pyc +0 -0
  184. package/tools/__pycache__/text_wrapper.cpython-313.pyc +0 -0
  185. package/tools/__pycache__/timestamp_converter.cpython-313.pyc +0 -0
  186. package/tools/__pycache__/tool_loader.cpython-313.pyc +0 -0
  187. package/tools/__pycache__/translator_tools.cpython-313.pyc +0 -0
  188. package/tools/__pycache__/url_link_extractor.cpython-313.pyc +0 -0
  189. package/tools/__pycache__/url_parser.cpython-313.pyc +0 -0
  190. package/tools/__pycache__/whitespace_tools.cpython-313.pyc +0 -0
  191. package/tools/__pycache__/word_frequency_counter.cpython-313.pyc +0 -0
@@ -1,457 +1,457 @@
1
- """
2
- Database Settings Manager Interface Compatibility Layer
3
-
4
- This module provides interface compatibility classes that ensure all existing
5
- settings manager interfaces work with the database backend without requiring
6
- code changes in the tools that use them.
7
-
8
- Author: Pomera AI Commander
9
- """
10
-
11
- import logging
12
- from typing import Dict, List, Any, Optional
13
- from abc import ABC, abstractmethod
14
-
15
- from .database_settings_manager import DatabaseSettingsManager
16
- from .database_curl_settings_manager import DatabaseCurlSettingsManager
17
- from .database_promera_ai_settings_manager import DatabasePromeraAISettingsManager, DatabaseDialogSettingsAdapter
18
-
19
-
20
- class SettingsManagerInterface(ABC):
21
- """
22
- Abstract base class defining the settings manager interface expected by tools.
23
-
24
- This interface ensures compatibility with existing tool code while allowing
25
- different backend implementations (JSON file, database, etc.).
26
- """
27
-
28
- @abstractmethod
29
- def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
30
- """Get settings for a specific tool."""
31
- pass
32
-
33
- @abstractmethod
34
- def save_settings(self):
35
- """Save current settings to persistent storage."""
36
- pass
37
-
38
- @abstractmethod
39
- def get_pattern_library(self) -> List[Dict[str, str]]:
40
- """Get the regex pattern library."""
41
- pass
42
-
43
-
44
- class DatabaseSettingsManagerAdapter(SettingsManagerInterface):
45
- """
46
- Adapter that provides the SettingsManager interface using database backend.
47
-
48
- This adapter ensures that existing tools like FindReplaceWidget can work
49
- with the database backend without any code changes.
50
- """
51
-
52
- def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
53
- """
54
- Initialize the settings manager adapter.
55
-
56
- Args:
57
- database_settings_manager: DatabaseSettingsManager instance
58
- logger: Optional logger instance
59
- """
60
- self.database_manager = database_settings_manager
61
- self.promera_ai_manager = DatabasePromeraAISettingsManager(database_settings_manager, logger)
62
- self.logger = logger or logging.getLogger(__name__)
63
-
64
- def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
65
- """
66
- Get settings for a specific tool.
67
-
68
- Args:
69
- tool_name: Name of the tool
70
-
71
- Returns:
72
- Dictionary of tool settings
73
- """
74
- return self.promera_ai_manager.get_tool_settings(tool_name)
75
-
76
- def save_settings(self):
77
- """Save current settings to persistent storage."""
78
- self.promera_ai_manager.save_settings()
79
-
80
- def get_pattern_library(self) -> List[Dict[str, str]]:
81
- """
82
- Get the regex pattern library.
83
-
84
- Returns:
85
- List of pattern dictionaries
86
- """
87
- return self.promera_ai_manager.get_pattern_library()
88
-
89
- # Additional methods for enhanced functionality
90
-
91
- def set_tool_setting(self, tool_name: str, key: str, value: Any) -> None:
92
- """Set a specific tool setting."""
93
- self.promera_ai_manager.set_tool_setting(tool_name, key, value)
94
-
95
- def get_tool_setting(self, tool_name: str, key: str, default: Any = None) -> Any:
96
- """Get a specific tool setting."""
97
- return self.promera_ai_manager.get_tool_setting(tool_name, key, default)
98
-
99
- def get_setting(self, key: str, default: Any = None) -> Any:
100
- """Get a core application setting."""
101
- return self.promera_ai_manager.get_setting(key, default)
102
-
103
- def set_setting(self, key: str, value: Any) -> None:
104
- """Set a core application setting."""
105
- self.promera_ai_manager.set_setting(key, value)
106
-
107
-
108
- class DatabaseSettingsManagerFactory:
109
- """
110
- Factory class for creating database-compatible settings managers.
111
-
112
- This factory provides a centralized way to create all the different types
113
- of settings managers needed by the application while ensuring they all
114
- use the same database backend.
115
- """
116
-
117
- def __init__(self, db_path: str = ":memory:", backup_path: Optional[str] = None,
118
- json_settings_path: str = "settings.json", logger=None):
119
- """
120
- Initialize the settings manager factory.
121
-
122
- Args:
123
- db_path: Path to SQLite database file
124
- backup_path: Path for automatic backups
125
- json_settings_path: Path to JSON settings file for migration
126
- logger: Optional logger instance
127
- """
128
- self.db_path = db_path
129
- self.backup_path = backup_path
130
- self.json_settings_path = json_settings_path
131
- self.logger = logger or logging.getLogger(__name__)
132
-
133
- # Create the main database settings manager
134
- self.database_manager = DatabaseSettingsManager(
135
- db_path=db_path,
136
- backup_path=backup_path,
137
- json_settings_path=json_settings_path
138
- )
139
-
140
- # Cache for created managers
141
- self._managers_cache = {}
142
-
143
- def get_main_settings_manager(self) -> DatabaseSettingsManager:
144
- """
145
- Get the main database settings manager.
146
-
147
- Returns:
148
- DatabaseSettingsManager instance
149
- """
150
- return self.database_manager
151
-
152
- def get_curl_settings_manager(self) -> DatabaseCurlSettingsManager:
153
- """
154
- Get a cURL-specific settings manager.
155
-
156
- Returns:
157
- DatabaseCurlSettingsManager instance
158
- """
159
- if 'curl' not in self._managers_cache:
160
- self._managers_cache['curl'] = DatabaseCurlSettingsManager(
161
- self.database_manager, self.logger
162
- )
163
- return self._managers_cache['curl']
164
-
165
- def get_promera_ai_settings_manager(self) -> DatabasePromeraAISettingsManager:
166
- """
167
- Get a PromeraAI-compatible settings manager.
168
-
169
- Returns:
170
- DatabasePromeraAISettingsManager instance
171
- """
172
- if 'promera_ai' not in self._managers_cache:
173
- self._managers_cache['promera_ai'] = DatabasePromeraAISettingsManager(
174
- self.database_manager, self.logger
175
- )
176
- return self._managers_cache['promera_ai']
177
-
178
- def get_settings_manager_adapter(self) -> DatabaseSettingsManagerAdapter:
179
- """
180
- Get a settings manager adapter for tool compatibility.
181
-
182
- Returns:
183
- DatabaseSettingsManagerAdapter instance
184
- """
185
- if 'adapter' not in self._managers_cache:
186
- self._managers_cache['adapter'] = DatabaseSettingsManagerAdapter(
187
- self.database_manager, self.logger
188
- )
189
- return self._managers_cache['adapter']
190
-
191
- def get_dialog_settings_adapter(self) -> DatabaseDialogSettingsAdapter:
192
- """
193
- Get a dialog settings adapter.
194
-
195
- Returns:
196
- DatabaseDialogSettingsAdapter instance
197
- """
198
- if 'dialog' not in self._managers_cache:
199
- self._managers_cache['dialog'] = DatabaseDialogSettingsAdapter(
200
- self.database_manager, self.logger
201
- )
202
- return self._managers_cache['dialog']
203
-
204
- def create_tool_specific_manager(self, tool_name: str) -> 'ToolSpecificSettingsManager':
205
- """
206
- Create a tool-specific settings manager.
207
-
208
- Args:
209
- tool_name: Name of the tool
210
-
211
- Returns:
212
- ToolSpecificSettingsManager instance
213
- """
214
- return ToolSpecificSettingsManager(self.database_manager, tool_name, self.logger)
215
-
216
- def close_all(self) -> None:
217
- """Close all settings managers and cleanup resources."""
218
- try:
219
- self.database_manager.close()
220
- self._managers_cache.clear()
221
- self.logger.info("All settings managers closed")
222
- except Exception as e:
223
- self.logger.error(f"Error closing settings managers: {e}")
224
-
225
-
226
- class ToolSpecificSettingsManager:
227
- """
228
- A tool-specific settings manager that provides a focused interface
229
- for individual tools to manage their settings.
230
- """
231
-
232
- def __init__(self, database_settings_manager: DatabaseSettingsManager,
233
- tool_name: str, logger=None):
234
- """
235
- Initialize the tool-specific settings manager.
236
-
237
- Args:
238
- database_settings_manager: DatabaseSettingsManager instance
239
- tool_name: Name of the tool this manager is for
240
- logger: Optional logger instance
241
- """
242
- self.database_manager = database_settings_manager
243
- self.tool_name = tool_name
244
- self.logger = logger or logging.getLogger(__name__)
245
-
246
- def get_settings(self) -> Dict[str, Any]:
247
- """
248
- Get all settings for this tool.
249
-
250
- Returns:
251
- Dictionary of tool settings
252
- """
253
- return self.database_manager.get_tool_settings(self.tool_name)
254
-
255
- def get_setting(self, key: str, default: Any = None) -> Any:
256
- """
257
- Get a specific setting for this tool.
258
-
259
- Args:
260
- key: Setting key
261
- default: Default value if not found
262
-
263
- Returns:
264
- Setting value or default
265
- """
266
- settings = self.get_settings()
267
- return settings.get(key, default)
268
-
269
- def set_setting(self, key: str, value: Any) -> None:
270
- """
271
- Set a specific setting for this tool.
272
-
273
- Args:
274
- key: Setting key
275
- value: Setting value
276
- """
277
- self.database_manager.set_tool_setting(self.tool_name, key, value)
278
-
279
- def update_settings(self, settings_update: Dict[str, Any]) -> None:
280
- """
281
- Update multiple settings for this tool.
282
-
283
- Args:
284
- settings_update: Dictionary of setting updates
285
- """
286
- for key, value in settings_update.items():
287
- self.set_setting(key, value)
288
-
289
- def reset_to_defaults(self, defaults: Dict[str, Any]) -> None:
290
- """
291
- Reset tool settings to provided defaults.
292
-
293
- Args:
294
- defaults: Dictionary of default settings
295
- """
296
- # Clear existing settings for this tool
297
- current_settings = self.get_settings()
298
- for key in current_settings.keys():
299
- if key not in defaults:
300
- # Remove settings that are no longer in defaults
301
- # Note: This would require implementing a delete method
302
- pass
303
-
304
- # Set all default values
305
- self.update_settings(defaults)
306
-
307
- def export_settings(self, filepath: str) -> bool:
308
- """
309
- Export this tool's settings to a file.
310
-
311
- Args:
312
- filepath: Target file path
313
-
314
- Returns:
315
- True if successful, False otherwise
316
- """
317
- try:
318
- import json
319
- settings = self.get_settings()
320
-
321
- with open(filepath, 'w', encoding='utf-8') as f:
322
- json.dump({self.tool_name: settings}, f, indent=4, ensure_ascii=False)
323
-
324
- self.logger.info(f"Tool settings for {self.tool_name} exported to {filepath}")
325
- return True
326
-
327
- except Exception as e:
328
- self.logger.error(f"Error exporting tool settings for {self.tool_name}: {e}")
329
- return False
330
-
331
- def import_settings(self, filepath: str) -> bool:
332
- """
333
- Import this tool's settings from a file.
334
-
335
- Args:
336
- filepath: Source file path
337
-
338
- Returns:
339
- True if successful, False otherwise
340
- """
341
- try:
342
- import json
343
- import os
344
-
345
- if not os.path.exists(filepath):
346
- self.logger.error(f"Import file not found: {filepath}")
347
- return False
348
-
349
- with open(filepath, 'r', encoding='utf-8') as f:
350
- imported_data = json.load(f)
351
-
352
- # Handle different import formats
353
- if self.tool_name in imported_data:
354
- settings = imported_data[self.tool_name]
355
- elif isinstance(imported_data, dict):
356
- # Assume the entire file is settings for this tool
357
- settings = imported_data
358
- else:
359
- self.logger.error("Invalid import file format")
360
- return False
361
-
362
- self.update_settings(settings)
363
- self.logger.info(f"Tool settings for {self.tool_name} imported from {filepath}")
364
- return True
365
-
366
- except Exception as e:
367
- self.logger.error(f"Error importing tool settings for {self.tool_name}: {e}")
368
- return False
369
-
370
-
371
- # Convenience functions for backward compatibility
372
-
373
- def create_find_replace_settings_manager(database_settings_manager: DatabaseSettingsManager,
374
- logger=None) -> DatabaseSettingsManagerAdapter:
375
- """
376
- Create a settings manager compatible with FindReplaceWidget.
377
-
378
- Args:
379
- database_settings_manager: DatabaseSettingsManager instance
380
- logger: Optional logger instance
381
-
382
- Returns:
383
- DatabaseSettingsManagerAdapter instance
384
- """
385
- return DatabaseSettingsManagerAdapter(database_settings_manager, logger)
386
-
387
-
388
- def create_legacy_settings_manager(database_settings_manager: DatabaseSettingsManager,
389
- logger=None) -> DatabasePromeraAISettingsManager:
390
- """
391
- Create a legacy-compatible settings manager.
392
-
393
- This function provides backward compatibility for code that expects
394
- the original PromeraAISettingsManager interface.
395
-
396
- Args:
397
- database_settings_manager: DatabaseSettingsManager instance
398
- logger: Optional logger instance
399
-
400
- Returns:
401
- DatabasePromeraAISettingsManager instance
402
- """
403
- return DatabasePromeraAISettingsManager(database_settings_manager, logger)
404
-
405
-
406
- # Global factory instance for easy access
407
- _global_factory: Optional[DatabaseSettingsManagerFactory] = None
408
-
409
-
410
- def initialize_global_settings_factory(db_path: str = ":memory:",
411
- backup_path: Optional[str] = None,
412
- json_settings_path: str = "settings.json",
413
- logger=None) -> DatabaseSettingsManagerFactory:
414
- """
415
- Initialize the global settings manager factory.
416
-
417
- Args:
418
- db_path: Path to SQLite database file
419
- backup_path: Path for automatic backups
420
- json_settings_path: Path to JSON settings file for migration
421
- logger: Optional logger instance
422
-
423
- Returns:
424
- DatabaseSettingsManagerFactory instance
425
- """
426
- global _global_factory
427
- _global_factory = DatabaseSettingsManagerFactory(
428
- db_path=db_path,
429
- backup_path=backup_path,
430
- json_settings_path=json_settings_path,
431
- logger=logger
432
- )
433
- return _global_factory
434
-
435
-
436
- def get_global_settings_factory() -> DatabaseSettingsManagerFactory:
437
- """
438
- Get the global settings manager factory.
439
-
440
- Returns:
441
- DatabaseSettingsManagerFactory instance
442
-
443
- Raises:
444
- RuntimeError: If factory not initialized
445
- """
446
- global _global_factory
447
- if _global_factory is None:
448
- raise RuntimeError("Global settings factory not initialized. Call initialize_global_settings_factory() first.")
449
- return _global_factory
450
-
451
-
452
- def close_global_settings_factory() -> None:
453
- """Close the global settings manager factory."""
454
- global _global_factory
455
- if _global_factory is not None:
456
- _global_factory.close_all()
1
+ """
2
+ Database Settings Manager Interface Compatibility Layer
3
+
4
+ This module provides interface compatibility classes that ensure all existing
5
+ settings manager interfaces work with the database backend without requiring
6
+ code changes in the tools that use them.
7
+
8
+ Author: Pomera AI Commander
9
+ """
10
+
11
+ import logging
12
+ from typing import Dict, List, Any, Optional
13
+ from abc import ABC, abstractmethod
14
+
15
+ from .database_settings_manager import DatabaseSettingsManager
16
+ from .database_curl_settings_manager import DatabaseCurlSettingsManager
17
+ from .database_promera_ai_settings_manager import DatabasePromeraAISettingsManager, DatabaseDialogSettingsAdapter
18
+
19
+
20
+ class SettingsManagerInterface(ABC):
21
+ """
22
+ Abstract base class defining the settings manager interface expected by tools.
23
+
24
+ This interface ensures compatibility with existing tool code while allowing
25
+ different backend implementations (JSON file, database, etc.).
26
+ """
27
+
28
+ @abstractmethod
29
+ def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
30
+ """Get settings for a specific tool."""
31
+ pass
32
+
33
+ @abstractmethod
34
+ def save_settings(self):
35
+ """Save current settings to persistent storage."""
36
+ pass
37
+
38
+ @abstractmethod
39
+ def get_pattern_library(self) -> List[Dict[str, str]]:
40
+ """Get the regex pattern library."""
41
+ pass
42
+
43
+
44
+ class DatabaseSettingsManagerAdapter(SettingsManagerInterface):
45
+ """
46
+ Adapter that provides the SettingsManager interface using database backend.
47
+
48
+ This adapter ensures that existing tools like FindReplaceWidget can work
49
+ with the database backend without any code changes.
50
+ """
51
+
52
+ def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
53
+ """
54
+ Initialize the settings manager adapter.
55
+
56
+ Args:
57
+ database_settings_manager: DatabaseSettingsManager instance
58
+ logger: Optional logger instance
59
+ """
60
+ self.database_manager = database_settings_manager
61
+ self.promera_ai_manager = DatabasePromeraAISettingsManager(database_settings_manager, logger)
62
+ self.logger = logger or logging.getLogger(__name__)
63
+
64
+ def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
65
+ """
66
+ Get settings for a specific tool.
67
+
68
+ Args:
69
+ tool_name: Name of the tool
70
+
71
+ Returns:
72
+ Dictionary of tool settings
73
+ """
74
+ return self.promera_ai_manager.get_tool_settings(tool_name)
75
+
76
+ def save_settings(self):
77
+ """Save current settings to persistent storage."""
78
+ self.promera_ai_manager.save_settings()
79
+
80
+ def get_pattern_library(self) -> List[Dict[str, str]]:
81
+ """
82
+ Get the regex pattern library.
83
+
84
+ Returns:
85
+ List of pattern dictionaries
86
+ """
87
+ return self.promera_ai_manager.get_pattern_library()
88
+
89
+ # Additional methods for enhanced functionality
90
+
91
+ def set_tool_setting(self, tool_name: str, key: str, value: Any) -> None:
92
+ """Set a specific tool setting."""
93
+ self.promera_ai_manager.set_tool_setting(tool_name, key, value)
94
+
95
+ def get_tool_setting(self, tool_name: str, key: str, default: Any = None) -> Any:
96
+ """Get a specific tool setting."""
97
+ return self.promera_ai_manager.get_tool_setting(tool_name, key, default)
98
+
99
+ def get_setting(self, key: str, default: Any = None) -> Any:
100
+ """Get a core application setting."""
101
+ return self.promera_ai_manager.get_setting(key, default)
102
+
103
+ def set_setting(self, key: str, value: Any) -> None:
104
+ """Set a core application setting."""
105
+ self.promera_ai_manager.set_setting(key, value)
106
+
107
+
108
+ class DatabaseSettingsManagerFactory:
109
+ """
110
+ Factory class for creating database-compatible settings managers.
111
+
112
+ This factory provides a centralized way to create all the different types
113
+ of settings managers needed by the application while ensuring they all
114
+ use the same database backend.
115
+ """
116
+
117
+ def __init__(self, db_path: str = ":memory:", backup_path: Optional[str] = None,
118
+ json_settings_path: str = "settings.json", logger=None):
119
+ """
120
+ Initialize the settings manager factory.
121
+
122
+ Args:
123
+ db_path: Path to SQLite database file
124
+ backup_path: Path for automatic backups
125
+ json_settings_path: Path to JSON settings file for migration
126
+ logger: Optional logger instance
127
+ """
128
+ self.db_path = db_path
129
+ self.backup_path = backup_path
130
+ self.json_settings_path = json_settings_path
131
+ self.logger = logger or logging.getLogger(__name__)
132
+
133
+ # Create the main database settings manager
134
+ self.database_manager = DatabaseSettingsManager(
135
+ db_path=db_path,
136
+ backup_path=backup_path,
137
+ json_settings_path=json_settings_path
138
+ )
139
+
140
+ # Cache for created managers
141
+ self._managers_cache = {}
142
+
143
+ def get_main_settings_manager(self) -> DatabaseSettingsManager:
144
+ """
145
+ Get the main database settings manager.
146
+
147
+ Returns:
148
+ DatabaseSettingsManager instance
149
+ """
150
+ return self.database_manager
151
+
152
+ def get_curl_settings_manager(self) -> DatabaseCurlSettingsManager:
153
+ """
154
+ Get a cURL-specific settings manager.
155
+
156
+ Returns:
157
+ DatabaseCurlSettingsManager instance
158
+ """
159
+ if 'curl' not in self._managers_cache:
160
+ self._managers_cache['curl'] = DatabaseCurlSettingsManager(
161
+ self.database_manager, self.logger
162
+ )
163
+ return self._managers_cache['curl']
164
+
165
+ def get_promera_ai_settings_manager(self) -> DatabasePromeraAISettingsManager:
166
+ """
167
+ Get a PromeraAI-compatible settings manager.
168
+
169
+ Returns:
170
+ DatabasePromeraAISettingsManager instance
171
+ """
172
+ if 'promera_ai' not in self._managers_cache:
173
+ self._managers_cache['promera_ai'] = DatabasePromeraAISettingsManager(
174
+ self.database_manager, self.logger
175
+ )
176
+ return self._managers_cache['promera_ai']
177
+
178
+ def get_settings_manager_adapter(self) -> DatabaseSettingsManagerAdapter:
179
+ """
180
+ Get a settings manager adapter for tool compatibility.
181
+
182
+ Returns:
183
+ DatabaseSettingsManagerAdapter instance
184
+ """
185
+ if 'adapter' not in self._managers_cache:
186
+ self._managers_cache['adapter'] = DatabaseSettingsManagerAdapter(
187
+ self.database_manager, self.logger
188
+ )
189
+ return self._managers_cache['adapter']
190
+
191
+ def get_dialog_settings_adapter(self) -> DatabaseDialogSettingsAdapter:
192
+ """
193
+ Get a dialog settings adapter.
194
+
195
+ Returns:
196
+ DatabaseDialogSettingsAdapter instance
197
+ """
198
+ if 'dialog' not in self._managers_cache:
199
+ self._managers_cache['dialog'] = DatabaseDialogSettingsAdapter(
200
+ self.database_manager, self.logger
201
+ )
202
+ return self._managers_cache['dialog']
203
+
204
+ def create_tool_specific_manager(self, tool_name: str) -> 'ToolSpecificSettingsManager':
205
+ """
206
+ Create a tool-specific settings manager.
207
+
208
+ Args:
209
+ tool_name: Name of the tool
210
+
211
+ Returns:
212
+ ToolSpecificSettingsManager instance
213
+ """
214
+ return ToolSpecificSettingsManager(self.database_manager, tool_name, self.logger)
215
+
216
+ def close_all(self) -> None:
217
+ """Close all settings managers and cleanup resources."""
218
+ try:
219
+ self.database_manager.close()
220
+ self._managers_cache.clear()
221
+ self.logger.info("All settings managers closed")
222
+ except Exception as e:
223
+ self.logger.error(f"Error closing settings managers: {e}")
224
+
225
+
226
+ class ToolSpecificSettingsManager:
227
+ """
228
+ A tool-specific settings manager that provides a focused interface
229
+ for individual tools to manage their settings.
230
+ """
231
+
232
+ def __init__(self, database_settings_manager: DatabaseSettingsManager,
233
+ tool_name: str, logger=None):
234
+ """
235
+ Initialize the tool-specific settings manager.
236
+
237
+ Args:
238
+ database_settings_manager: DatabaseSettingsManager instance
239
+ tool_name: Name of the tool this manager is for
240
+ logger: Optional logger instance
241
+ """
242
+ self.database_manager = database_settings_manager
243
+ self.tool_name = tool_name
244
+ self.logger = logger or logging.getLogger(__name__)
245
+
246
+ def get_settings(self) -> Dict[str, Any]:
247
+ """
248
+ Get all settings for this tool.
249
+
250
+ Returns:
251
+ Dictionary of tool settings
252
+ """
253
+ return self.database_manager.get_tool_settings(self.tool_name)
254
+
255
+ def get_setting(self, key: str, default: Any = None) -> Any:
256
+ """
257
+ Get a specific setting for this tool.
258
+
259
+ Args:
260
+ key: Setting key
261
+ default: Default value if not found
262
+
263
+ Returns:
264
+ Setting value or default
265
+ """
266
+ settings = self.get_settings()
267
+ return settings.get(key, default)
268
+
269
+ def set_setting(self, key: str, value: Any) -> None:
270
+ """
271
+ Set a specific setting for this tool.
272
+
273
+ Args:
274
+ key: Setting key
275
+ value: Setting value
276
+ """
277
+ self.database_manager.set_tool_setting(self.tool_name, key, value)
278
+
279
+ def update_settings(self, settings_update: Dict[str, Any]) -> None:
280
+ """
281
+ Update multiple settings for this tool.
282
+
283
+ Args:
284
+ settings_update: Dictionary of setting updates
285
+ """
286
+ for key, value in settings_update.items():
287
+ self.set_setting(key, value)
288
+
289
+ def reset_to_defaults(self, defaults: Dict[str, Any]) -> None:
290
+ """
291
+ Reset tool settings to provided defaults.
292
+
293
+ Args:
294
+ defaults: Dictionary of default settings
295
+ """
296
+ # Clear existing settings for this tool
297
+ current_settings = self.get_settings()
298
+ for key in current_settings.keys():
299
+ if key not in defaults:
300
+ # Remove settings that are no longer in defaults
301
+ # Note: This would require implementing a delete method
302
+ pass
303
+
304
+ # Set all default values
305
+ self.update_settings(defaults)
306
+
307
+ def export_settings(self, filepath: str) -> bool:
308
+ """
309
+ Export this tool's settings to a file.
310
+
311
+ Args:
312
+ filepath: Target file path
313
+
314
+ Returns:
315
+ True if successful, False otherwise
316
+ """
317
+ try:
318
+ import json
319
+ settings = self.get_settings()
320
+
321
+ with open(filepath, 'w', encoding='utf-8') as f:
322
+ json.dump({self.tool_name: settings}, f, indent=4, ensure_ascii=False)
323
+
324
+ self.logger.info(f"Tool settings for {self.tool_name} exported to {filepath}")
325
+ return True
326
+
327
+ except Exception as e:
328
+ self.logger.error(f"Error exporting tool settings for {self.tool_name}: {e}")
329
+ return False
330
+
331
+ def import_settings(self, filepath: str) -> bool:
332
+ """
333
+ Import this tool's settings from a file.
334
+
335
+ Args:
336
+ filepath: Source file path
337
+
338
+ Returns:
339
+ True if successful, False otherwise
340
+ """
341
+ try:
342
+ import json
343
+ import os
344
+
345
+ if not os.path.exists(filepath):
346
+ self.logger.error(f"Import file not found: {filepath}")
347
+ return False
348
+
349
+ with open(filepath, 'r', encoding='utf-8') as f:
350
+ imported_data = json.load(f)
351
+
352
+ # Handle different import formats
353
+ if self.tool_name in imported_data:
354
+ settings = imported_data[self.tool_name]
355
+ elif isinstance(imported_data, dict):
356
+ # Assume the entire file is settings for this tool
357
+ settings = imported_data
358
+ else:
359
+ self.logger.error("Invalid import file format")
360
+ return False
361
+
362
+ self.update_settings(settings)
363
+ self.logger.info(f"Tool settings for {self.tool_name} imported from {filepath}")
364
+ return True
365
+
366
+ except Exception as e:
367
+ self.logger.error(f"Error importing tool settings for {self.tool_name}: {e}")
368
+ return False
369
+
370
+
371
+ # Convenience functions for backward compatibility
372
+
373
+ def create_find_replace_settings_manager(database_settings_manager: DatabaseSettingsManager,
374
+ logger=None) -> DatabaseSettingsManagerAdapter:
375
+ """
376
+ Create a settings manager compatible with FindReplaceWidget.
377
+
378
+ Args:
379
+ database_settings_manager: DatabaseSettingsManager instance
380
+ logger: Optional logger instance
381
+
382
+ Returns:
383
+ DatabaseSettingsManagerAdapter instance
384
+ """
385
+ return DatabaseSettingsManagerAdapter(database_settings_manager, logger)
386
+
387
+
388
+ def create_legacy_settings_manager(database_settings_manager: DatabaseSettingsManager,
389
+ logger=None) -> DatabasePromeraAISettingsManager:
390
+ """
391
+ Create a legacy-compatible settings manager.
392
+
393
+ This function provides backward compatibility for code that expects
394
+ the original PromeraAISettingsManager interface.
395
+
396
+ Args:
397
+ database_settings_manager: DatabaseSettingsManager instance
398
+ logger: Optional logger instance
399
+
400
+ Returns:
401
+ DatabasePromeraAISettingsManager instance
402
+ """
403
+ return DatabasePromeraAISettingsManager(database_settings_manager, logger)
404
+
405
+
406
+ # Global factory instance for easy access
407
+ _global_factory: Optional[DatabaseSettingsManagerFactory] = None
408
+
409
+
410
+ def initialize_global_settings_factory(db_path: str = ":memory:",
411
+ backup_path: Optional[str] = None,
412
+ json_settings_path: str = "settings.json",
413
+ logger=None) -> DatabaseSettingsManagerFactory:
414
+ """
415
+ Initialize the global settings manager factory.
416
+
417
+ Args:
418
+ db_path: Path to SQLite database file
419
+ backup_path: Path for automatic backups
420
+ json_settings_path: Path to JSON settings file for migration
421
+ logger: Optional logger instance
422
+
423
+ Returns:
424
+ DatabaseSettingsManagerFactory instance
425
+ """
426
+ global _global_factory
427
+ _global_factory = DatabaseSettingsManagerFactory(
428
+ db_path=db_path,
429
+ backup_path=backup_path,
430
+ json_settings_path=json_settings_path,
431
+ logger=logger
432
+ )
433
+ return _global_factory
434
+
435
+
436
+ def get_global_settings_factory() -> DatabaseSettingsManagerFactory:
437
+ """
438
+ Get the global settings manager factory.
439
+
440
+ Returns:
441
+ DatabaseSettingsManagerFactory instance
442
+
443
+ Raises:
444
+ RuntimeError: If factory not initialized
445
+ """
446
+ global _global_factory
447
+ if _global_factory is None:
448
+ raise RuntimeError("Global settings factory not initialized. Call initialize_global_settings_factory() first.")
449
+ return _global_factory
450
+
451
+
452
+ def close_global_settings_factory() -> None:
453
+ """Close the global settings manager factory."""
454
+ global _global_factory
455
+ if _global_factory is not None:
456
+ _global_factory.close_all()
457
457
  _global_factory = None