pomera-ai-commander 1.1.1 → 1.2.2
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.
- package/LICENSE +21 -21
- package/README.md +105 -680
- package/bin/pomera-ai-commander.js +62 -62
- package/core/__init__.py +65 -65
- package/core/app_context.py +482 -482
- package/core/async_text_processor.py +421 -421
- package/core/backup_manager.py +655 -655
- package/core/backup_recovery_manager.py +1199 -1033
- package/core/content_hash_cache.py +508 -508
- package/core/context_menu.py +313 -313
- package/core/data_directory.py +549 -0
- package/core/data_validator.py +1066 -1066
- package/core/database_connection_manager.py +744 -744
- package/core/database_curl_settings_manager.py +608 -608
- package/core/database_promera_ai_settings_manager.py +446 -446
- package/core/database_schema.py +411 -411
- package/core/database_schema_manager.py +395 -395
- package/core/database_settings_manager.py +1507 -1507
- package/core/database_settings_manager_interface.py +456 -456
- package/core/dialog_manager.py +734 -734
- package/core/diff_utils.py +239 -0
- package/core/efficient_line_numbers.py +540 -510
- package/core/error_handler.py +746 -746
- package/core/error_service.py +431 -431
- package/core/event_consolidator.py +511 -511
- package/core/mcp/__init__.py +43 -43
- package/core/mcp/find_replace_diff.py +334 -0
- package/core/mcp/protocol.py +288 -288
- package/core/mcp/schema.py +251 -251
- package/core/mcp/server_stdio.py +299 -299
- package/core/mcp/tool_registry.py +2699 -2345
- package/core/memento.py +275 -0
- package/core/memory_efficient_text_widget.py +711 -711
- package/core/migration_manager.py +914 -914
- package/core/migration_test_suite.py +1085 -1085
- package/core/migration_validator.py +1143 -1143
- package/core/optimized_find_replace.py +714 -714
- package/core/optimized_pattern_engine.py +424 -424
- package/core/optimized_search_highlighter.py +552 -552
- package/core/performance_monitor.py +674 -674
- package/core/persistence_manager.py +712 -712
- package/core/progressive_stats_calculator.py +632 -632
- package/core/regex_pattern_cache.py +529 -529
- package/core/regex_pattern_library.py +350 -350
- package/core/search_operation_manager.py +434 -434
- package/core/settings_defaults_registry.py +1087 -1087
- package/core/settings_integrity_validator.py +1111 -1111
- package/core/settings_serializer.py +557 -557
- package/core/settings_validator.py +1823 -1823
- package/core/smart_stats_calculator.py +709 -709
- package/core/statistics_update_manager.py +619 -619
- package/core/stats_config_manager.py +858 -858
- package/core/streaming_text_handler.py +723 -723
- package/core/task_scheduler.py +596 -596
- package/core/update_pattern_library.py +168 -168
- package/core/visibility_monitor.py +596 -596
- package/core/widget_cache.py +498 -498
- package/mcp.json +51 -61
- package/migrate_data.py +127 -0
- package/package.json +64 -57
- package/pomera.py +7883 -7482
- package/pomera_mcp_server.py +183 -144
- package/requirements.txt +33 -0
- package/scripts/Dockerfile.alpine +43 -0
- package/scripts/Dockerfile.gui-test +54 -0
- package/scripts/Dockerfile.linux +43 -0
- package/scripts/Dockerfile.test-linux +80 -0
- package/scripts/Dockerfile.ubuntu +39 -0
- package/scripts/README.md +53 -0
- package/scripts/build-all.bat +113 -0
- package/scripts/build-docker.bat +53 -0
- package/scripts/build-docker.sh +55 -0
- package/scripts/build-optimized.bat +101 -0
- package/scripts/build.sh +78 -0
- package/scripts/docker-compose.test.yml +27 -0
- package/scripts/docker-compose.yml +32 -0
- package/scripts/postinstall.js +62 -0
- package/scripts/requirements-minimal.txt +33 -0
- package/scripts/test-linux-simple.bat +28 -0
- package/scripts/validate-release-workflow.py +450 -0
- package/tools/__init__.py +4 -4
- package/tools/ai_tools.py +2891 -2891
- package/tools/ascii_art_generator.py +352 -352
- package/tools/base64_tools.py +183 -183
- package/tools/base_tool.py +511 -511
- package/tools/case_tool.py +308 -308
- package/tools/column_tools.py +395 -395
- package/tools/cron_tool.py +884 -884
- package/tools/curl_history.py +600 -600
- package/tools/curl_processor.py +1207 -1207
- package/tools/curl_settings.py +502 -502
- package/tools/curl_tool.py +5467 -5467
- package/tools/diff_viewer.py +1817 -1072
- package/tools/email_extraction_tool.py +248 -248
- package/tools/email_header_analyzer.py +425 -425
- package/tools/extraction_tools.py +250 -250
- package/tools/find_replace.py +2289 -1750
- package/tools/folder_file_reporter.py +1463 -1463
- package/tools/folder_file_reporter_adapter.py +480 -480
- package/tools/generator_tools.py +1216 -1216
- package/tools/hash_generator.py +255 -255
- package/tools/html_tool.py +656 -656
- package/tools/jsonxml_tool.py +729 -729
- package/tools/line_tools.py +419 -419
- package/tools/markdown_tools.py +561 -561
- package/tools/mcp_widget.py +1417 -1417
- package/tools/notes_widget.py +978 -973
- package/tools/number_base_converter.py +372 -372
- package/tools/regex_extractor.py +571 -571
- package/tools/slug_generator.py +310 -310
- package/tools/sorter_tools.py +458 -458
- package/tools/string_escape_tool.py +392 -392
- package/tools/text_statistics_tool.py +365 -365
- package/tools/text_wrapper.py +430 -430
- package/tools/timestamp_converter.py +421 -421
- package/tools/tool_loader.py +710 -710
- package/tools/translator_tools.py +522 -522
- package/tools/url_link_extractor.py +261 -261
- package/tools/url_parser.py +204 -204
- package/tools/whitespace_tools.py +355 -355
- package/tools/word_frequency_counter.py +146 -146
- package/core/__pycache__/__init__.cpython-313.pyc +0 -0
- package/core/__pycache__/app_context.cpython-313.pyc +0 -0
- package/core/__pycache__/async_text_processor.cpython-313.pyc +0 -0
- package/core/__pycache__/backup_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/backup_recovery_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/content_hash_cache.cpython-313.pyc +0 -0
- package/core/__pycache__/context_menu.cpython-313.pyc +0 -0
- package/core/__pycache__/data_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/database_connection_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_curl_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_promera_ai_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_schema.cpython-313.pyc +0 -0
- package/core/__pycache__/database_schema_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_settings_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/database_settings_manager_interface.cpython-313.pyc +0 -0
- package/core/__pycache__/dialog_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/efficient_line_numbers.cpython-313.pyc +0 -0
- package/core/__pycache__/error_handler.cpython-313.pyc +0 -0
- package/core/__pycache__/error_service.cpython-313.pyc +0 -0
- package/core/__pycache__/event_consolidator.cpython-313.pyc +0 -0
- package/core/__pycache__/memory_efficient_text_widget.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_test_suite.cpython-313.pyc +0 -0
- package/core/__pycache__/migration_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_find_replace.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_pattern_engine.cpython-313.pyc +0 -0
- package/core/__pycache__/optimized_search_highlighter.cpython-313.pyc +0 -0
- package/core/__pycache__/performance_monitor.cpython-313.pyc +0 -0
- package/core/__pycache__/persistence_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/progressive_stats_calculator.cpython-313.pyc +0 -0
- package/core/__pycache__/regex_pattern_cache.cpython-313.pyc +0 -0
- package/core/__pycache__/regex_pattern_library.cpython-313.pyc +0 -0
- package/core/__pycache__/search_operation_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_defaults_registry.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_integrity_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_serializer.cpython-313.pyc +0 -0
- package/core/__pycache__/settings_validator.cpython-313.pyc +0 -0
- package/core/__pycache__/smart_stats_calculator.cpython-313.pyc +0 -0
- package/core/__pycache__/statistics_update_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/stats_config_manager.cpython-313.pyc +0 -0
- package/core/__pycache__/streaming_text_handler.cpython-313.pyc +0 -0
- package/core/__pycache__/task_scheduler.cpython-313.pyc +0 -0
- package/core/__pycache__/visibility_monitor.cpython-313.pyc +0 -0
- package/core/__pycache__/widget_cache.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/__init__.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/protocol.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/schema.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/server_stdio.cpython-313.pyc +0 -0
- package/core/mcp/__pycache__/tool_registry.cpython-313.pyc +0 -0
- package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
- package/tools/__pycache__/ai_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/ascii_art_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/base64_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/base_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/case_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/column_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/cron_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_history.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_processor.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_settings.cpython-313.pyc +0 -0
- package/tools/__pycache__/curl_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/diff_viewer.cpython-313.pyc +0 -0
- package/tools/__pycache__/email_extraction_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/email_header_analyzer.cpython-313.pyc +0 -0
- package/tools/__pycache__/extraction_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/find_replace.cpython-313.pyc +0 -0
- package/tools/__pycache__/folder_file_reporter.cpython-313.pyc +0 -0
- package/tools/__pycache__/folder_file_reporter_adapter.cpython-313.pyc +0 -0
- package/tools/__pycache__/generator_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/hash_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/html_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/huggingface_helper.cpython-313.pyc +0 -0
- package/tools/__pycache__/jsonxml_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/line_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/list_comparator.cpython-313.pyc +0 -0
- package/tools/__pycache__/markdown_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/mcp_widget.cpython-313.pyc +0 -0
- package/tools/__pycache__/notes_widget.cpython-313.pyc +0 -0
- package/tools/__pycache__/number_base_converter.cpython-313.pyc +0 -0
- package/tools/__pycache__/regex_extractor.cpython-313.pyc +0 -0
- package/tools/__pycache__/slug_generator.cpython-313.pyc +0 -0
- package/tools/__pycache__/sorter_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/string_escape_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/text_statistics_tool.cpython-313.pyc +0 -0
- package/tools/__pycache__/text_wrapper.cpython-313.pyc +0 -0
- package/tools/__pycache__/timestamp_converter.cpython-313.pyc +0 -0
- package/tools/__pycache__/tool_loader.cpython-313.pyc +0 -0
- package/tools/__pycache__/translator_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/url_link_extractor.cpython-313.pyc +0 -0
- package/tools/__pycache__/url_parser.cpython-313.pyc +0 -0
- package/tools/__pycache__/whitespace_tools.cpython-313.pyc +0 -0
- package/tools/__pycache__/word_frequency_counter.cpython-313.pyc +0 -0
|
@@ -1,447 +1,447 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Database-Compatible PromeraAI Settings Management Module
|
|
3
|
-
|
|
4
|
-
This module provides an updated PromeraAISettingsManager that works with the database backend
|
|
5
|
-
while maintaining full backward compatibility with the existing interface used by Find & Replace.
|
|
6
|
-
|
|
7
|
-
Author: Pomera AI Commander
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
from typing import Dict, List, Any
|
|
12
|
-
|
|
13
|
-
from .database_settings_manager import DatabaseSettingsManager
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class DatabasePromeraAISettingsManager:
|
|
17
|
-
"""
|
|
18
|
-
Database-compatible settings manager implementation for Find & Replace widget.
|
|
19
|
-
|
|
20
|
-
This class maintains the same interface as the original PromeraAISettingsManager
|
|
21
|
-
but uses the database backend for improved concurrency and data integrity.
|
|
22
|
-
|
|
23
|
-
Provides the SettingsManager interface expected by FindReplaceWidget and other tools.
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
|
|
27
|
-
"""
|
|
28
|
-
Initialize the database-compatible PromeraAI settings manager.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
32
|
-
logger: Optional logger instance
|
|
33
|
-
"""
|
|
34
|
-
self.database_manager = database_settings_manager
|
|
35
|
-
self.logger = logger or logging.getLogger(__name__)
|
|
36
|
-
|
|
37
|
-
def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
|
|
38
|
-
"""
|
|
39
|
-
Get settings for a specific tool.
|
|
40
|
-
|
|
41
|
-
Args:
|
|
42
|
-
tool_name: Name of the tool
|
|
43
|
-
|
|
44
|
-
Returns:
|
|
45
|
-
Dictionary of tool settings
|
|
46
|
-
"""
|
|
47
|
-
try:
|
|
48
|
-
return self.database_manager.get_tool_settings(tool_name)
|
|
49
|
-
except Exception as e:
|
|
50
|
-
self.logger.error(f"Error getting tool settings for {tool_name}: {e}")
|
|
51
|
-
return {}
|
|
52
|
-
|
|
53
|
-
def save_settings(self):
|
|
54
|
-
"""
|
|
55
|
-
Save current settings to persistent storage.
|
|
56
|
-
|
|
57
|
-
Since the database backend automatically persists changes, this method
|
|
58
|
-
ensures any pending changes are committed and triggers a backup if needed.
|
|
59
|
-
"""
|
|
60
|
-
try:
|
|
61
|
-
# Force a backup to disk if using in-memory database
|
|
62
|
-
if self.database_manager.db_path == ":memory:":
|
|
63
|
-
self.database_manager.connection_manager.backup_to_disk()
|
|
64
|
-
|
|
65
|
-
self.logger.debug("Settings saved via database backend")
|
|
66
|
-
|
|
67
|
-
except Exception as e:
|
|
68
|
-
self.logger.error(f"Error saving settings: {e}")
|
|
69
|
-
|
|
70
|
-
def get_pattern_library(self) -> List[Dict[str, str]]:
|
|
71
|
-
"""
|
|
72
|
-
Get the regex pattern library.
|
|
73
|
-
|
|
74
|
-
Returns:
|
|
75
|
-
List of pattern dictionaries with find, replace, and purpose keys
|
|
76
|
-
"""
|
|
77
|
-
try:
|
|
78
|
-
# Check if pattern library exists in settings
|
|
79
|
-
all_settings = self.database_manager.load_settings()
|
|
80
|
-
|
|
81
|
-
if ("pattern_library" not in all_settings or
|
|
82
|
-
len(all_settings.get("pattern_library", [])) < 10):
|
|
83
|
-
|
|
84
|
-
# Try to import and use the comprehensive pattern library
|
|
85
|
-
try:
|
|
86
|
-
from core.regex_pattern_library import RegexPatternLibrary
|
|
87
|
-
library = RegexPatternLibrary()
|
|
88
|
-
pattern_library = library._convert_to_settings_format()
|
|
89
|
-
|
|
90
|
-
# Save to database
|
|
91
|
-
self.database_manager.set_setting("pattern_library", pattern_library)
|
|
92
|
-
|
|
93
|
-
self.logger.info(f"Loaded comprehensive pattern library with {len(pattern_library)} patterns")
|
|
94
|
-
return pattern_library
|
|
95
|
-
|
|
96
|
-
except ImportError:
|
|
97
|
-
# Fallback to basic patterns if comprehensive library is not available
|
|
98
|
-
basic_patterns = [
|
|
99
|
-
{"find": "\\d+", "replace": "NUMBER", "purpose": "Match any number"},
|
|
100
|
-
{"find": "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}", "replace": "[EMAIL]", "purpose": "Match email addresses"},
|
|
101
|
-
{"find": "\\b\\d{3}-\\d{3}-\\d{4}\\b", "replace": "XXX-XXX-XXXX", "purpose": "Match phone numbers (XXX-XXX-XXXX format)"},
|
|
102
|
-
{"find": "https?://[\\w\\.-]+\\.[a-zA-Z]{2,}[\\w\\.-]*/?[\\w\\.-]*", "replace": "[URL]", "purpose": "Match HTTP/HTTPS URLs"},
|
|
103
|
-
{"find": "\\b[A-Z]{2,}\\b", "replace": "[ACRONYM]", "purpose": "Match acronyms (2+ uppercase letters)"},
|
|
104
|
-
{"find": "\\$\\d+(?:\\.\\d{2})?", "replace": "$XX.XX", "purpose": "Match currency amounts"},
|
|
105
|
-
{"find": "\\b\\d{1,2}/\\d{1,2}/\\d{4}\\b", "replace": "MM/DD/YYYY", "purpose": "Match dates (MM/DD/YYYY format)"},
|
|
106
|
-
{"find": "\\b\\d{4}-\\d{2}-\\d{2}\\b", "replace": "YYYY-MM-DD", "purpose": "Match dates (YYYY-MM-DD format)"},
|
|
107
|
-
{"find": "\\b[A-Z][a-z]+ [A-Z][a-z]+\\b", "replace": "[NAME]", "purpose": "Match proper names (First Last)"},
|
|
108
|
-
{"find": "\\b\\w+@\\w+\\.\\w+\\b", "replace": "[EMAIL]", "purpose": "Match simple email addresses"}
|
|
109
|
-
]
|
|
110
|
-
|
|
111
|
-
# Save to database
|
|
112
|
-
self.database_manager.set_setting("pattern_library", basic_patterns)
|
|
113
|
-
|
|
114
|
-
self.logger.warning("Comprehensive pattern library not available, using basic patterns")
|
|
115
|
-
return basic_patterns
|
|
116
|
-
|
|
117
|
-
return all_settings.get("pattern_library", [])
|
|
118
|
-
|
|
119
|
-
except Exception as e:
|
|
120
|
-
self.logger.error(f"Error getting pattern library: {e}")
|
|
121
|
-
# Return minimal fallback patterns
|
|
122
|
-
return [
|
|
123
|
-
{"find": "\\d+", "replace": "NUMBER", "purpose": "Match any number"},
|
|
124
|
-
{"find": "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}", "replace": "[EMAIL]", "purpose": "Match email addresses"},
|
|
125
|
-
{"find": "\\b\\d{3}-\\d{3}-\\d{4}\\b", "replace": "XXX-XXX-XXXX", "purpose": "Match phone numbers"}
|
|
126
|
-
]
|
|
127
|
-
|
|
128
|
-
def set_tool_setting(self, tool_name: str, key: str, value: Any) -> None:
|
|
129
|
-
"""
|
|
130
|
-
Set a specific tool setting.
|
|
131
|
-
|
|
132
|
-
Args:
|
|
133
|
-
tool_name: Name of the tool
|
|
134
|
-
key: Setting key
|
|
135
|
-
value: Setting value
|
|
136
|
-
"""
|
|
137
|
-
try:
|
|
138
|
-
self.database_manager.set_tool_setting(tool_name, key, value)
|
|
139
|
-
except Exception as e:
|
|
140
|
-
self.logger.error(f"Error setting tool setting {tool_name}.{key}: {e}")
|
|
141
|
-
|
|
142
|
-
def get_tool_setting(self, tool_name: str, key: str, default: Any = None) -> Any:
|
|
143
|
-
"""
|
|
144
|
-
Get a specific tool setting.
|
|
145
|
-
|
|
146
|
-
Args:
|
|
147
|
-
tool_name: Name of the tool
|
|
148
|
-
key: Setting key
|
|
149
|
-
default: Default value if not found
|
|
150
|
-
|
|
151
|
-
Returns:
|
|
152
|
-
Setting value or default
|
|
153
|
-
"""
|
|
154
|
-
try:
|
|
155
|
-
tool_settings = self.get_tool_settings(tool_name)
|
|
156
|
-
return tool_settings.get(key, default)
|
|
157
|
-
except Exception as e:
|
|
158
|
-
self.logger.error(f"Error getting tool setting {tool_name}.{key}: {e}")
|
|
159
|
-
return default
|
|
160
|
-
|
|
161
|
-
def update_tool_settings(self, tool_name: str, settings_update: Dict[str, Any]) -> None:
|
|
162
|
-
"""
|
|
163
|
-
Update multiple settings for a tool.
|
|
164
|
-
|
|
165
|
-
Args:
|
|
166
|
-
tool_name: Name of the tool
|
|
167
|
-
settings_update: Dictionary of setting updates
|
|
168
|
-
"""
|
|
169
|
-
try:
|
|
170
|
-
for key, value in settings_update.items():
|
|
171
|
-
self.database_manager.set_tool_setting(tool_name, key, value)
|
|
172
|
-
except Exception as e:
|
|
173
|
-
self.logger.error(f"Error updating tool settings for {tool_name}: {e}")
|
|
174
|
-
|
|
175
|
-
def get_setting(self, key: str, default: Any = None) -> Any:
|
|
176
|
-
"""
|
|
177
|
-
Get a core application setting.
|
|
178
|
-
|
|
179
|
-
Args:
|
|
180
|
-
key: Setting key
|
|
181
|
-
default: Default value if not found
|
|
182
|
-
|
|
183
|
-
Returns:
|
|
184
|
-
Setting value or default
|
|
185
|
-
"""
|
|
186
|
-
try:
|
|
187
|
-
return self.database_manager.get_setting(key, default)
|
|
188
|
-
except Exception as e:
|
|
189
|
-
self.logger.error(f"Error getting setting {key}: {e}")
|
|
190
|
-
return default
|
|
191
|
-
|
|
192
|
-
def set_setting(self, key: str, value: Any) -> None:
|
|
193
|
-
"""
|
|
194
|
-
Set a core application setting.
|
|
195
|
-
|
|
196
|
-
Args:
|
|
197
|
-
key: Setting key
|
|
198
|
-
value: Setting value
|
|
199
|
-
"""
|
|
200
|
-
try:
|
|
201
|
-
self.database_manager.set_setting(key, value)
|
|
202
|
-
except Exception as e:
|
|
203
|
-
self.logger.error(f"Error setting {key}: {e}")
|
|
204
|
-
|
|
205
|
-
def get_all_settings(self) -> Dict[str, Any]:
|
|
206
|
-
"""
|
|
207
|
-
Get all settings as a dictionary.
|
|
208
|
-
|
|
209
|
-
Returns:
|
|
210
|
-
Complete settings dictionary
|
|
211
|
-
"""
|
|
212
|
-
try:
|
|
213
|
-
return self.database_manager.load_settings()
|
|
214
|
-
except Exception as e:
|
|
215
|
-
self.logger.error(f"Error getting all settings: {e}")
|
|
216
|
-
return {}
|
|
217
|
-
|
|
218
|
-
def export_settings(self, filepath: str) -> bool:
|
|
219
|
-
"""
|
|
220
|
-
Export settings to JSON file.
|
|
221
|
-
|
|
222
|
-
Args:
|
|
223
|
-
filepath: Target file path
|
|
224
|
-
|
|
225
|
-
Returns:
|
|
226
|
-
True if successful, False otherwise
|
|
227
|
-
"""
|
|
228
|
-
try:
|
|
229
|
-
return self.database_manager.export_to_json(filepath)
|
|
230
|
-
except Exception as e:
|
|
231
|
-
self.logger.error(f"Error exporting settings: {e}")
|
|
232
|
-
return False
|
|
233
|
-
|
|
234
|
-
def import_settings(self, filepath: str) -> bool:
|
|
235
|
-
"""
|
|
236
|
-
Import settings from JSON file.
|
|
237
|
-
|
|
238
|
-
Args:
|
|
239
|
-
filepath: Source file path
|
|
240
|
-
|
|
241
|
-
Returns:
|
|
242
|
-
True if successful, False otherwise
|
|
243
|
-
"""
|
|
244
|
-
try:
|
|
245
|
-
return self.database_manager.import_from_json(filepath)
|
|
246
|
-
except Exception as e:
|
|
247
|
-
self.logger.error(f"Error importing settings: {e}")
|
|
248
|
-
return False
|
|
249
|
-
|
|
250
|
-
# Additional methods for enhanced functionality
|
|
251
|
-
|
|
252
|
-
def get_history_for_tool(self, tool_name: str, history_key: str = "history") -> List[Any]:
|
|
253
|
-
"""
|
|
254
|
-
Get history data for a specific tool.
|
|
255
|
-
|
|
256
|
-
Args:
|
|
257
|
-
tool_name: Name of the tool
|
|
258
|
-
history_key: Key for history data (default: "history")
|
|
259
|
-
|
|
260
|
-
Returns:
|
|
261
|
-
List of history entries
|
|
262
|
-
"""
|
|
263
|
-
try:
|
|
264
|
-
tool_settings = self.get_tool_settings(tool_name)
|
|
265
|
-
return tool_settings.get(history_key, [])
|
|
266
|
-
except Exception as e:
|
|
267
|
-
self.logger.error(f"Error getting history for {tool_name}: {e}")
|
|
268
|
-
return []
|
|
269
|
-
|
|
270
|
-
def add_to_tool_history(self, tool_name: str, entry: Any, history_key: str = "history", max_items: int = 100) -> None:
|
|
271
|
-
"""
|
|
272
|
-
Add an entry to a tool's history.
|
|
273
|
-
|
|
274
|
-
Args:
|
|
275
|
-
tool_name: Name of the tool
|
|
276
|
-
entry: History entry to add
|
|
277
|
-
history_key: Key for history data (default: "history")
|
|
278
|
-
max_items: Maximum number of history items to keep
|
|
279
|
-
"""
|
|
280
|
-
try:
|
|
281
|
-
history = self.get_history_for_tool(tool_name, history_key)
|
|
282
|
-
|
|
283
|
-
# Add to beginning of history
|
|
284
|
-
if entry not in history:
|
|
285
|
-
history.insert(0, entry)
|
|
286
|
-
|
|
287
|
-
# Limit history size
|
|
288
|
-
if len(history) > max_items:
|
|
289
|
-
history = history[:max_items]
|
|
290
|
-
|
|
291
|
-
# Save back to database
|
|
292
|
-
self.set_tool_setting(tool_name, history_key, history)
|
|
293
|
-
|
|
294
|
-
except Exception as e:
|
|
295
|
-
self.logger.error(f"Error adding to tool history for {tool_name}: {e}")
|
|
296
|
-
|
|
297
|
-
def clear_tool_history(self, tool_name: str, history_key: str = "history") -> None:
|
|
298
|
-
"""
|
|
299
|
-
Clear history for a specific tool.
|
|
300
|
-
|
|
301
|
-
Args:
|
|
302
|
-
tool_name: Name of the tool
|
|
303
|
-
history_key: Key for history data (default: "history")
|
|
304
|
-
"""
|
|
305
|
-
try:
|
|
306
|
-
self.set_tool_setting(tool_name, history_key, [])
|
|
307
|
-
except Exception as e:
|
|
308
|
-
self.logger.error(f"Error clearing tool history for {tool_name}: {e}")
|
|
309
|
-
|
|
310
|
-
# Backward compatibility properties
|
|
311
|
-
|
|
312
|
-
@property
|
|
313
|
-
def app(self):
|
|
314
|
-
"""
|
|
315
|
-
Provide app-like interface for backward compatibility.
|
|
316
|
-
|
|
317
|
-
Some existing code may access settings_manager.app.settings.
|
|
318
|
-
This property provides a minimal interface to support that pattern.
|
|
319
|
-
"""
|
|
320
|
-
return self
|
|
321
|
-
|
|
322
|
-
@property
|
|
323
|
-
def settings(self) -> Dict[str, Any]:
|
|
324
|
-
"""
|
|
325
|
-
Provide direct settings access for backward compatibility.
|
|
326
|
-
|
|
327
|
-
Returns:
|
|
328
|
-
Settings dictionary proxy
|
|
329
|
-
"""
|
|
330
|
-
return self.database_manager.settings
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
class DatabaseDialogSettingsAdapter:
|
|
334
|
-
"""
|
|
335
|
-
Database-compatible adapter class to provide dialog settings interface to DialogManager.
|
|
336
|
-
|
|
337
|
-
This adapter bridges the gap between the database settings system and the DialogManager's
|
|
338
|
-
requirements, providing a clean interface for dialog configuration management.
|
|
339
|
-
"""
|
|
340
|
-
|
|
341
|
-
def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
|
|
342
|
-
"""
|
|
343
|
-
Initialize the dialog settings adapter.
|
|
344
|
-
|
|
345
|
-
Args:
|
|
346
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
347
|
-
logger: Optional logger instance
|
|
348
|
-
"""
|
|
349
|
-
self.database_manager = database_settings_manager
|
|
350
|
-
self.logger = logger or logging.getLogger(__name__)
|
|
351
|
-
|
|
352
|
-
def get_dialog_setting(self, category: str, setting: str, default: Any = None) -> Any:
|
|
353
|
-
"""
|
|
354
|
-
Get a dialog setting value.
|
|
355
|
-
|
|
356
|
-
Args:
|
|
357
|
-
category: Dialog category (success, confirmation, warning, error)
|
|
358
|
-
setting: Setting name (enabled, description, etc.)
|
|
359
|
-
default: Default value if not found
|
|
360
|
-
|
|
361
|
-
Returns:
|
|
362
|
-
Setting value or default
|
|
363
|
-
"""
|
|
364
|
-
try:
|
|
365
|
-
dialog_settings = self.database_manager.get_setting("dialog_settings", {})
|
|
366
|
-
return dialog_settings.get(category, {}).get(setting, default)
|
|
367
|
-
except Exception as e:
|
|
368
|
-
self.logger.error(f"Error getting dialog setting {category}.{setting}: {e}")
|
|
369
|
-
return default
|
|
370
|
-
|
|
371
|
-
def set_dialog_setting(self, category: str, setting: str, value: Any) -> None:
|
|
372
|
-
"""
|
|
373
|
-
Set a dialog setting value.
|
|
374
|
-
|
|
375
|
-
Args:
|
|
376
|
-
category: Dialog category
|
|
377
|
-
setting: Setting name
|
|
378
|
-
value: Setting value
|
|
379
|
-
"""
|
|
380
|
-
try:
|
|
381
|
-
dialog_settings = self.database_manager.get_setting("dialog_settings", {})
|
|
382
|
-
|
|
383
|
-
if category not in dialog_settings:
|
|
384
|
-
dialog_settings[category] = {}
|
|
385
|
-
|
|
386
|
-
dialog_settings[category][setting] = value
|
|
387
|
-
self.database_manager.set_setting("dialog_settings", dialog_settings)
|
|
388
|
-
|
|
389
|
-
except Exception as e:
|
|
390
|
-
self.logger.error(f"Error setting dialog setting {category}.{setting}: {e}")
|
|
391
|
-
|
|
392
|
-
def is_dialog_enabled(self, category: str) -> bool:
|
|
393
|
-
"""
|
|
394
|
-
Check if dialogs are enabled for a category.
|
|
395
|
-
|
|
396
|
-
Args:
|
|
397
|
-
category: Dialog category
|
|
398
|
-
|
|
399
|
-
Returns:
|
|
400
|
-
True if enabled, False otherwise
|
|
401
|
-
"""
|
|
402
|
-
return self.get_dialog_setting(category, "enabled", True)
|
|
403
|
-
|
|
404
|
-
def get_all_dialog_settings(self) -> Dict[str, Any]:
|
|
405
|
-
"""
|
|
406
|
-
Get all dialog settings.
|
|
407
|
-
|
|
408
|
-
Returns:
|
|
409
|
-
Dictionary of all dialog settings
|
|
410
|
-
"""
|
|
411
|
-
try:
|
|
412
|
-
return self.database_manager.get_setting("dialog_settings", {})
|
|
413
|
-
except Exception as e:
|
|
414
|
-
self.logger.error(f"Error getting all dialog settings: {e}")
|
|
415
|
-
return {}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
# Factory functions for creating database-compatible settings managers
|
|
419
|
-
|
|
420
|
-
def create_database_promera_ai_settings_manager(database_settings_manager: DatabaseSettingsManager,
|
|
421
|
-
logger=None) -> DatabasePromeraAISettingsManager:
|
|
422
|
-
"""
|
|
423
|
-
Create a database-compatible PromeraAI settings manager.
|
|
424
|
-
|
|
425
|
-
Args:
|
|
426
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
427
|
-
logger: Optional logger instance
|
|
428
|
-
|
|
429
|
-
Returns:
|
|
430
|
-
DatabasePromeraAISettingsManager instance
|
|
431
|
-
"""
|
|
432
|
-
return DatabasePromeraAISettingsManager(database_settings_manager, logger)
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
def create_database_dialog_settings_adapter(database_settings_manager: DatabaseSettingsManager,
|
|
436
|
-
logger=None) -> DatabaseDialogSettingsAdapter:
|
|
437
|
-
"""
|
|
438
|
-
Create a database-compatible dialog settings adapter.
|
|
439
|
-
|
|
440
|
-
Args:
|
|
441
|
-
database_settings_manager: DatabaseSettingsManager instance
|
|
442
|
-
logger: Optional logger instance
|
|
443
|
-
|
|
444
|
-
Returns:
|
|
445
|
-
DatabaseDialogSettingsAdapter instance
|
|
446
|
-
"""
|
|
1
|
+
"""
|
|
2
|
+
Database-Compatible PromeraAI Settings Management Module
|
|
3
|
+
|
|
4
|
+
This module provides an updated PromeraAISettingsManager that works with the database backend
|
|
5
|
+
while maintaining full backward compatibility with the existing interface used by Find & Replace.
|
|
6
|
+
|
|
7
|
+
Author: Pomera AI Commander
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from typing import Dict, List, Any
|
|
12
|
+
|
|
13
|
+
from .database_settings_manager import DatabaseSettingsManager
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DatabasePromeraAISettingsManager:
|
|
17
|
+
"""
|
|
18
|
+
Database-compatible settings manager implementation for Find & Replace widget.
|
|
19
|
+
|
|
20
|
+
This class maintains the same interface as the original PromeraAISettingsManager
|
|
21
|
+
but uses the database backend for improved concurrency and data integrity.
|
|
22
|
+
|
|
23
|
+
Provides the SettingsManager interface expected by FindReplaceWidget and other tools.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
|
|
27
|
+
"""
|
|
28
|
+
Initialize the database-compatible PromeraAI settings manager.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
32
|
+
logger: Optional logger instance
|
|
33
|
+
"""
|
|
34
|
+
self.database_manager = database_settings_manager
|
|
35
|
+
self.logger = logger or logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
def get_tool_settings(self, tool_name: str) -> Dict[str, Any]:
|
|
38
|
+
"""
|
|
39
|
+
Get settings for a specific tool.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
tool_name: Name of the tool
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Dictionary of tool settings
|
|
46
|
+
"""
|
|
47
|
+
try:
|
|
48
|
+
return self.database_manager.get_tool_settings(tool_name)
|
|
49
|
+
except Exception as e:
|
|
50
|
+
self.logger.error(f"Error getting tool settings for {tool_name}: {e}")
|
|
51
|
+
return {}
|
|
52
|
+
|
|
53
|
+
def save_settings(self):
|
|
54
|
+
"""
|
|
55
|
+
Save current settings to persistent storage.
|
|
56
|
+
|
|
57
|
+
Since the database backend automatically persists changes, this method
|
|
58
|
+
ensures any pending changes are committed and triggers a backup if needed.
|
|
59
|
+
"""
|
|
60
|
+
try:
|
|
61
|
+
# Force a backup to disk if using in-memory database
|
|
62
|
+
if self.database_manager.db_path == ":memory:":
|
|
63
|
+
self.database_manager.connection_manager.backup_to_disk()
|
|
64
|
+
|
|
65
|
+
self.logger.debug("Settings saved via database backend")
|
|
66
|
+
|
|
67
|
+
except Exception as e:
|
|
68
|
+
self.logger.error(f"Error saving settings: {e}")
|
|
69
|
+
|
|
70
|
+
def get_pattern_library(self) -> List[Dict[str, str]]:
|
|
71
|
+
"""
|
|
72
|
+
Get the regex pattern library.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
List of pattern dictionaries with find, replace, and purpose keys
|
|
76
|
+
"""
|
|
77
|
+
try:
|
|
78
|
+
# Check if pattern library exists in settings
|
|
79
|
+
all_settings = self.database_manager.load_settings()
|
|
80
|
+
|
|
81
|
+
if ("pattern_library" not in all_settings or
|
|
82
|
+
len(all_settings.get("pattern_library", [])) < 10):
|
|
83
|
+
|
|
84
|
+
# Try to import and use the comprehensive pattern library
|
|
85
|
+
try:
|
|
86
|
+
from core.regex_pattern_library import RegexPatternLibrary
|
|
87
|
+
library = RegexPatternLibrary()
|
|
88
|
+
pattern_library = library._convert_to_settings_format()
|
|
89
|
+
|
|
90
|
+
# Save to database
|
|
91
|
+
self.database_manager.set_setting("pattern_library", pattern_library)
|
|
92
|
+
|
|
93
|
+
self.logger.info(f"Loaded comprehensive pattern library with {len(pattern_library)} patterns")
|
|
94
|
+
return pattern_library
|
|
95
|
+
|
|
96
|
+
except ImportError:
|
|
97
|
+
# Fallback to basic patterns if comprehensive library is not available
|
|
98
|
+
basic_patterns = [
|
|
99
|
+
{"find": "\\d+", "replace": "NUMBER", "purpose": "Match any number"},
|
|
100
|
+
{"find": "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}", "replace": "[EMAIL]", "purpose": "Match email addresses"},
|
|
101
|
+
{"find": "\\b\\d{3}-\\d{3}-\\d{4}\\b", "replace": "XXX-XXX-XXXX", "purpose": "Match phone numbers (XXX-XXX-XXXX format)"},
|
|
102
|
+
{"find": "https?://[\\w\\.-]+\\.[a-zA-Z]{2,}[\\w\\.-]*/?[\\w\\.-]*", "replace": "[URL]", "purpose": "Match HTTP/HTTPS URLs"},
|
|
103
|
+
{"find": "\\b[A-Z]{2,}\\b", "replace": "[ACRONYM]", "purpose": "Match acronyms (2+ uppercase letters)"},
|
|
104
|
+
{"find": "\\$\\d+(?:\\.\\d{2})?", "replace": "$XX.XX", "purpose": "Match currency amounts"},
|
|
105
|
+
{"find": "\\b\\d{1,2}/\\d{1,2}/\\d{4}\\b", "replace": "MM/DD/YYYY", "purpose": "Match dates (MM/DD/YYYY format)"},
|
|
106
|
+
{"find": "\\b\\d{4}-\\d{2}-\\d{2}\\b", "replace": "YYYY-MM-DD", "purpose": "Match dates (YYYY-MM-DD format)"},
|
|
107
|
+
{"find": "\\b[A-Z][a-z]+ [A-Z][a-z]+\\b", "replace": "[NAME]", "purpose": "Match proper names (First Last)"},
|
|
108
|
+
{"find": "\\b\\w+@\\w+\\.\\w+\\b", "replace": "[EMAIL]", "purpose": "Match simple email addresses"}
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
# Save to database
|
|
112
|
+
self.database_manager.set_setting("pattern_library", basic_patterns)
|
|
113
|
+
|
|
114
|
+
self.logger.warning("Comprehensive pattern library not available, using basic patterns")
|
|
115
|
+
return basic_patterns
|
|
116
|
+
|
|
117
|
+
return all_settings.get("pattern_library", [])
|
|
118
|
+
|
|
119
|
+
except Exception as e:
|
|
120
|
+
self.logger.error(f"Error getting pattern library: {e}")
|
|
121
|
+
# Return minimal fallback patterns
|
|
122
|
+
return [
|
|
123
|
+
{"find": "\\d+", "replace": "NUMBER", "purpose": "Match any number"},
|
|
124
|
+
{"find": "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}", "replace": "[EMAIL]", "purpose": "Match email addresses"},
|
|
125
|
+
{"find": "\\b\\d{3}-\\d{3}-\\d{4}\\b", "replace": "XXX-XXX-XXXX", "purpose": "Match phone numbers"}
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
def set_tool_setting(self, tool_name: str, key: str, value: Any) -> None:
|
|
129
|
+
"""
|
|
130
|
+
Set a specific tool setting.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
tool_name: Name of the tool
|
|
134
|
+
key: Setting key
|
|
135
|
+
value: Setting value
|
|
136
|
+
"""
|
|
137
|
+
try:
|
|
138
|
+
self.database_manager.set_tool_setting(tool_name, key, value)
|
|
139
|
+
except Exception as e:
|
|
140
|
+
self.logger.error(f"Error setting tool setting {tool_name}.{key}: {e}")
|
|
141
|
+
|
|
142
|
+
def get_tool_setting(self, tool_name: str, key: str, default: Any = None) -> Any:
|
|
143
|
+
"""
|
|
144
|
+
Get a specific tool setting.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
tool_name: Name of the tool
|
|
148
|
+
key: Setting key
|
|
149
|
+
default: Default value if not found
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
Setting value or default
|
|
153
|
+
"""
|
|
154
|
+
try:
|
|
155
|
+
tool_settings = self.get_tool_settings(tool_name)
|
|
156
|
+
return tool_settings.get(key, default)
|
|
157
|
+
except Exception as e:
|
|
158
|
+
self.logger.error(f"Error getting tool setting {tool_name}.{key}: {e}")
|
|
159
|
+
return default
|
|
160
|
+
|
|
161
|
+
def update_tool_settings(self, tool_name: str, settings_update: Dict[str, Any]) -> None:
|
|
162
|
+
"""
|
|
163
|
+
Update multiple settings for a tool.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
tool_name: Name of the tool
|
|
167
|
+
settings_update: Dictionary of setting updates
|
|
168
|
+
"""
|
|
169
|
+
try:
|
|
170
|
+
for key, value in settings_update.items():
|
|
171
|
+
self.database_manager.set_tool_setting(tool_name, key, value)
|
|
172
|
+
except Exception as e:
|
|
173
|
+
self.logger.error(f"Error updating tool settings for {tool_name}: {e}")
|
|
174
|
+
|
|
175
|
+
def get_setting(self, key: str, default: Any = None) -> Any:
|
|
176
|
+
"""
|
|
177
|
+
Get a core application setting.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
key: Setting key
|
|
181
|
+
default: Default value if not found
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Setting value or default
|
|
185
|
+
"""
|
|
186
|
+
try:
|
|
187
|
+
return self.database_manager.get_setting(key, default)
|
|
188
|
+
except Exception as e:
|
|
189
|
+
self.logger.error(f"Error getting setting {key}: {e}")
|
|
190
|
+
return default
|
|
191
|
+
|
|
192
|
+
def set_setting(self, key: str, value: Any) -> None:
|
|
193
|
+
"""
|
|
194
|
+
Set a core application setting.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
key: Setting key
|
|
198
|
+
value: Setting value
|
|
199
|
+
"""
|
|
200
|
+
try:
|
|
201
|
+
self.database_manager.set_setting(key, value)
|
|
202
|
+
except Exception as e:
|
|
203
|
+
self.logger.error(f"Error setting {key}: {e}")
|
|
204
|
+
|
|
205
|
+
def get_all_settings(self) -> Dict[str, Any]:
|
|
206
|
+
"""
|
|
207
|
+
Get all settings as a dictionary.
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
Complete settings dictionary
|
|
211
|
+
"""
|
|
212
|
+
try:
|
|
213
|
+
return self.database_manager.load_settings()
|
|
214
|
+
except Exception as e:
|
|
215
|
+
self.logger.error(f"Error getting all settings: {e}")
|
|
216
|
+
return {}
|
|
217
|
+
|
|
218
|
+
def export_settings(self, filepath: str) -> bool:
|
|
219
|
+
"""
|
|
220
|
+
Export settings to JSON file.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
filepath: Target file path
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
True if successful, False otherwise
|
|
227
|
+
"""
|
|
228
|
+
try:
|
|
229
|
+
return self.database_manager.export_to_json(filepath)
|
|
230
|
+
except Exception as e:
|
|
231
|
+
self.logger.error(f"Error exporting settings: {e}")
|
|
232
|
+
return False
|
|
233
|
+
|
|
234
|
+
def import_settings(self, filepath: str) -> bool:
|
|
235
|
+
"""
|
|
236
|
+
Import settings from JSON file.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
filepath: Source file path
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
True if successful, False otherwise
|
|
243
|
+
"""
|
|
244
|
+
try:
|
|
245
|
+
return self.database_manager.import_from_json(filepath)
|
|
246
|
+
except Exception as e:
|
|
247
|
+
self.logger.error(f"Error importing settings: {e}")
|
|
248
|
+
return False
|
|
249
|
+
|
|
250
|
+
# Additional methods for enhanced functionality
|
|
251
|
+
|
|
252
|
+
def get_history_for_tool(self, tool_name: str, history_key: str = "history") -> List[Any]:
|
|
253
|
+
"""
|
|
254
|
+
Get history data for a specific tool.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
tool_name: Name of the tool
|
|
258
|
+
history_key: Key for history data (default: "history")
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
List of history entries
|
|
262
|
+
"""
|
|
263
|
+
try:
|
|
264
|
+
tool_settings = self.get_tool_settings(tool_name)
|
|
265
|
+
return tool_settings.get(history_key, [])
|
|
266
|
+
except Exception as e:
|
|
267
|
+
self.logger.error(f"Error getting history for {tool_name}: {e}")
|
|
268
|
+
return []
|
|
269
|
+
|
|
270
|
+
def add_to_tool_history(self, tool_name: str, entry: Any, history_key: str = "history", max_items: int = 100) -> None:
|
|
271
|
+
"""
|
|
272
|
+
Add an entry to a tool's history.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
tool_name: Name of the tool
|
|
276
|
+
entry: History entry to add
|
|
277
|
+
history_key: Key for history data (default: "history")
|
|
278
|
+
max_items: Maximum number of history items to keep
|
|
279
|
+
"""
|
|
280
|
+
try:
|
|
281
|
+
history = self.get_history_for_tool(tool_name, history_key)
|
|
282
|
+
|
|
283
|
+
# Add to beginning of history
|
|
284
|
+
if entry not in history:
|
|
285
|
+
history.insert(0, entry)
|
|
286
|
+
|
|
287
|
+
# Limit history size
|
|
288
|
+
if len(history) > max_items:
|
|
289
|
+
history = history[:max_items]
|
|
290
|
+
|
|
291
|
+
# Save back to database
|
|
292
|
+
self.set_tool_setting(tool_name, history_key, history)
|
|
293
|
+
|
|
294
|
+
except Exception as e:
|
|
295
|
+
self.logger.error(f"Error adding to tool history for {tool_name}: {e}")
|
|
296
|
+
|
|
297
|
+
def clear_tool_history(self, tool_name: str, history_key: str = "history") -> None:
|
|
298
|
+
"""
|
|
299
|
+
Clear history for a specific tool.
|
|
300
|
+
|
|
301
|
+
Args:
|
|
302
|
+
tool_name: Name of the tool
|
|
303
|
+
history_key: Key for history data (default: "history")
|
|
304
|
+
"""
|
|
305
|
+
try:
|
|
306
|
+
self.set_tool_setting(tool_name, history_key, [])
|
|
307
|
+
except Exception as e:
|
|
308
|
+
self.logger.error(f"Error clearing tool history for {tool_name}: {e}")
|
|
309
|
+
|
|
310
|
+
# Backward compatibility properties
|
|
311
|
+
|
|
312
|
+
@property
|
|
313
|
+
def app(self):
|
|
314
|
+
"""
|
|
315
|
+
Provide app-like interface for backward compatibility.
|
|
316
|
+
|
|
317
|
+
Some existing code may access settings_manager.app.settings.
|
|
318
|
+
This property provides a minimal interface to support that pattern.
|
|
319
|
+
"""
|
|
320
|
+
return self
|
|
321
|
+
|
|
322
|
+
@property
|
|
323
|
+
def settings(self) -> Dict[str, Any]:
|
|
324
|
+
"""
|
|
325
|
+
Provide direct settings access for backward compatibility.
|
|
326
|
+
|
|
327
|
+
Returns:
|
|
328
|
+
Settings dictionary proxy
|
|
329
|
+
"""
|
|
330
|
+
return self.database_manager.settings
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
class DatabaseDialogSettingsAdapter:
|
|
334
|
+
"""
|
|
335
|
+
Database-compatible adapter class to provide dialog settings interface to DialogManager.
|
|
336
|
+
|
|
337
|
+
This adapter bridges the gap between the database settings system and the DialogManager's
|
|
338
|
+
requirements, providing a clean interface for dialog configuration management.
|
|
339
|
+
"""
|
|
340
|
+
|
|
341
|
+
def __init__(self, database_settings_manager: DatabaseSettingsManager, logger=None):
|
|
342
|
+
"""
|
|
343
|
+
Initialize the dialog settings adapter.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
347
|
+
logger: Optional logger instance
|
|
348
|
+
"""
|
|
349
|
+
self.database_manager = database_settings_manager
|
|
350
|
+
self.logger = logger or logging.getLogger(__name__)
|
|
351
|
+
|
|
352
|
+
def get_dialog_setting(self, category: str, setting: str, default: Any = None) -> Any:
|
|
353
|
+
"""
|
|
354
|
+
Get a dialog setting value.
|
|
355
|
+
|
|
356
|
+
Args:
|
|
357
|
+
category: Dialog category (success, confirmation, warning, error)
|
|
358
|
+
setting: Setting name (enabled, description, etc.)
|
|
359
|
+
default: Default value if not found
|
|
360
|
+
|
|
361
|
+
Returns:
|
|
362
|
+
Setting value or default
|
|
363
|
+
"""
|
|
364
|
+
try:
|
|
365
|
+
dialog_settings = self.database_manager.get_setting("dialog_settings", {})
|
|
366
|
+
return dialog_settings.get(category, {}).get(setting, default)
|
|
367
|
+
except Exception as e:
|
|
368
|
+
self.logger.error(f"Error getting dialog setting {category}.{setting}: {e}")
|
|
369
|
+
return default
|
|
370
|
+
|
|
371
|
+
def set_dialog_setting(self, category: str, setting: str, value: Any) -> None:
|
|
372
|
+
"""
|
|
373
|
+
Set a dialog setting value.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
category: Dialog category
|
|
377
|
+
setting: Setting name
|
|
378
|
+
value: Setting value
|
|
379
|
+
"""
|
|
380
|
+
try:
|
|
381
|
+
dialog_settings = self.database_manager.get_setting("dialog_settings", {})
|
|
382
|
+
|
|
383
|
+
if category not in dialog_settings:
|
|
384
|
+
dialog_settings[category] = {}
|
|
385
|
+
|
|
386
|
+
dialog_settings[category][setting] = value
|
|
387
|
+
self.database_manager.set_setting("dialog_settings", dialog_settings)
|
|
388
|
+
|
|
389
|
+
except Exception as e:
|
|
390
|
+
self.logger.error(f"Error setting dialog setting {category}.{setting}: {e}")
|
|
391
|
+
|
|
392
|
+
def is_dialog_enabled(self, category: str) -> bool:
|
|
393
|
+
"""
|
|
394
|
+
Check if dialogs are enabled for a category.
|
|
395
|
+
|
|
396
|
+
Args:
|
|
397
|
+
category: Dialog category
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
True if enabled, False otherwise
|
|
401
|
+
"""
|
|
402
|
+
return self.get_dialog_setting(category, "enabled", True)
|
|
403
|
+
|
|
404
|
+
def get_all_dialog_settings(self) -> Dict[str, Any]:
|
|
405
|
+
"""
|
|
406
|
+
Get all dialog settings.
|
|
407
|
+
|
|
408
|
+
Returns:
|
|
409
|
+
Dictionary of all dialog settings
|
|
410
|
+
"""
|
|
411
|
+
try:
|
|
412
|
+
return self.database_manager.get_setting("dialog_settings", {})
|
|
413
|
+
except Exception as e:
|
|
414
|
+
self.logger.error(f"Error getting all dialog settings: {e}")
|
|
415
|
+
return {}
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
# Factory functions for creating database-compatible settings managers
|
|
419
|
+
|
|
420
|
+
def create_database_promera_ai_settings_manager(database_settings_manager: DatabaseSettingsManager,
|
|
421
|
+
logger=None) -> DatabasePromeraAISettingsManager:
|
|
422
|
+
"""
|
|
423
|
+
Create a database-compatible PromeraAI settings manager.
|
|
424
|
+
|
|
425
|
+
Args:
|
|
426
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
427
|
+
logger: Optional logger instance
|
|
428
|
+
|
|
429
|
+
Returns:
|
|
430
|
+
DatabasePromeraAISettingsManager instance
|
|
431
|
+
"""
|
|
432
|
+
return DatabasePromeraAISettingsManager(database_settings_manager, logger)
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def create_database_dialog_settings_adapter(database_settings_manager: DatabaseSettingsManager,
|
|
436
|
+
logger=None) -> DatabaseDialogSettingsAdapter:
|
|
437
|
+
"""
|
|
438
|
+
Create a database-compatible dialog settings adapter.
|
|
439
|
+
|
|
440
|
+
Args:
|
|
441
|
+
database_settings_manager: DatabaseSettingsManager instance
|
|
442
|
+
logger: Optional logger instance
|
|
443
|
+
|
|
444
|
+
Returns:
|
|
445
|
+
DatabaseDialogSettingsAdapter instance
|
|
446
|
+
"""
|
|
447
447
|
return DatabaseDialogSettingsAdapter(database_settings_manager, logger)
|