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.
Files changed (213) 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 +1199 -1033
  9. package/core/content_hash_cache.py +508 -508
  10. package/core/context_menu.py +313 -313
  11. package/core/data_directory.py +549 -0
  12. package/core/data_validator.py +1066 -1066
  13. package/core/database_connection_manager.py +744 -744
  14. package/core/database_curl_settings_manager.py +608 -608
  15. package/core/database_promera_ai_settings_manager.py +446 -446
  16. package/core/database_schema.py +411 -411
  17. package/core/database_schema_manager.py +395 -395
  18. package/core/database_settings_manager.py +1507 -1507
  19. package/core/database_settings_manager_interface.py +456 -456
  20. package/core/dialog_manager.py +734 -734
  21. package/core/diff_utils.py +239 -0
  22. package/core/efficient_line_numbers.py +540 -510
  23. package/core/error_handler.py +746 -746
  24. package/core/error_service.py +431 -431
  25. package/core/event_consolidator.py +511 -511
  26. package/core/mcp/__init__.py +43 -43
  27. package/core/mcp/find_replace_diff.py +334 -0
  28. package/core/mcp/protocol.py +288 -288
  29. package/core/mcp/schema.py +251 -251
  30. package/core/mcp/server_stdio.py +299 -299
  31. package/core/mcp/tool_registry.py +2699 -2345
  32. package/core/memento.py +275 -0
  33. package/core/memory_efficient_text_widget.py +711 -711
  34. package/core/migration_manager.py +914 -914
  35. package/core/migration_test_suite.py +1085 -1085
  36. package/core/migration_validator.py +1143 -1143
  37. package/core/optimized_find_replace.py +714 -714
  38. package/core/optimized_pattern_engine.py +424 -424
  39. package/core/optimized_search_highlighter.py +552 -552
  40. package/core/performance_monitor.py +674 -674
  41. package/core/persistence_manager.py +712 -712
  42. package/core/progressive_stats_calculator.py +632 -632
  43. package/core/regex_pattern_cache.py +529 -529
  44. package/core/regex_pattern_library.py +350 -350
  45. package/core/search_operation_manager.py +434 -434
  46. package/core/settings_defaults_registry.py +1087 -1087
  47. package/core/settings_integrity_validator.py +1111 -1111
  48. package/core/settings_serializer.py +557 -557
  49. package/core/settings_validator.py +1823 -1823
  50. package/core/smart_stats_calculator.py +709 -709
  51. package/core/statistics_update_manager.py +619 -619
  52. package/core/stats_config_manager.py +858 -858
  53. package/core/streaming_text_handler.py +723 -723
  54. package/core/task_scheduler.py +596 -596
  55. package/core/update_pattern_library.py +168 -168
  56. package/core/visibility_monitor.py +596 -596
  57. package/core/widget_cache.py +498 -498
  58. package/mcp.json +51 -61
  59. package/migrate_data.py +127 -0
  60. package/package.json +64 -57
  61. package/pomera.py +7883 -7482
  62. package/pomera_mcp_server.py +183 -144
  63. package/requirements.txt +33 -0
  64. package/scripts/Dockerfile.alpine +43 -0
  65. package/scripts/Dockerfile.gui-test +54 -0
  66. package/scripts/Dockerfile.linux +43 -0
  67. package/scripts/Dockerfile.test-linux +80 -0
  68. package/scripts/Dockerfile.ubuntu +39 -0
  69. package/scripts/README.md +53 -0
  70. package/scripts/build-all.bat +113 -0
  71. package/scripts/build-docker.bat +53 -0
  72. package/scripts/build-docker.sh +55 -0
  73. package/scripts/build-optimized.bat +101 -0
  74. package/scripts/build.sh +78 -0
  75. package/scripts/docker-compose.test.yml +27 -0
  76. package/scripts/docker-compose.yml +32 -0
  77. package/scripts/postinstall.js +62 -0
  78. package/scripts/requirements-minimal.txt +33 -0
  79. package/scripts/test-linux-simple.bat +28 -0
  80. package/scripts/validate-release-workflow.py +450 -0
  81. package/tools/__init__.py +4 -4
  82. package/tools/ai_tools.py +2891 -2891
  83. package/tools/ascii_art_generator.py +352 -352
  84. package/tools/base64_tools.py +183 -183
  85. package/tools/base_tool.py +511 -511
  86. package/tools/case_tool.py +308 -308
  87. package/tools/column_tools.py +395 -395
  88. package/tools/cron_tool.py +884 -884
  89. package/tools/curl_history.py +600 -600
  90. package/tools/curl_processor.py +1207 -1207
  91. package/tools/curl_settings.py +502 -502
  92. package/tools/curl_tool.py +5467 -5467
  93. package/tools/diff_viewer.py +1817 -1072
  94. package/tools/email_extraction_tool.py +248 -248
  95. package/tools/email_header_analyzer.py +425 -425
  96. package/tools/extraction_tools.py +250 -250
  97. package/tools/find_replace.py +2289 -1750
  98. package/tools/folder_file_reporter.py +1463 -1463
  99. package/tools/folder_file_reporter_adapter.py +480 -480
  100. package/tools/generator_tools.py +1216 -1216
  101. package/tools/hash_generator.py +255 -255
  102. package/tools/html_tool.py +656 -656
  103. package/tools/jsonxml_tool.py +729 -729
  104. package/tools/line_tools.py +419 -419
  105. package/tools/markdown_tools.py +561 -561
  106. package/tools/mcp_widget.py +1417 -1417
  107. package/tools/notes_widget.py +978 -973
  108. package/tools/number_base_converter.py +372 -372
  109. package/tools/regex_extractor.py +571 -571
  110. package/tools/slug_generator.py +310 -310
  111. package/tools/sorter_tools.py +458 -458
  112. package/tools/string_escape_tool.py +392 -392
  113. package/tools/text_statistics_tool.py +365 -365
  114. package/tools/text_wrapper.py +430 -430
  115. package/tools/timestamp_converter.py +421 -421
  116. package/tools/tool_loader.py +710 -710
  117. package/tools/translator_tools.py +522 -522
  118. package/tools/url_link_extractor.py +261 -261
  119. package/tools/url_parser.py +204 -204
  120. package/tools/whitespace_tools.py +355 -355
  121. package/tools/word_frequency_counter.py +146 -146
  122. package/core/__pycache__/__init__.cpython-313.pyc +0 -0
  123. package/core/__pycache__/app_context.cpython-313.pyc +0 -0
  124. package/core/__pycache__/async_text_processor.cpython-313.pyc +0 -0
  125. package/core/__pycache__/backup_manager.cpython-313.pyc +0 -0
  126. package/core/__pycache__/backup_recovery_manager.cpython-313.pyc +0 -0
  127. package/core/__pycache__/content_hash_cache.cpython-313.pyc +0 -0
  128. package/core/__pycache__/context_menu.cpython-313.pyc +0 -0
  129. package/core/__pycache__/data_validator.cpython-313.pyc +0 -0
  130. package/core/__pycache__/database_connection_manager.cpython-313.pyc +0 -0
  131. package/core/__pycache__/database_curl_settings_manager.cpython-313.pyc +0 -0
  132. package/core/__pycache__/database_promera_ai_settings_manager.cpython-313.pyc +0 -0
  133. package/core/__pycache__/database_schema.cpython-313.pyc +0 -0
  134. package/core/__pycache__/database_schema_manager.cpython-313.pyc +0 -0
  135. package/core/__pycache__/database_settings_manager.cpython-313.pyc +0 -0
  136. package/core/__pycache__/database_settings_manager_interface.cpython-313.pyc +0 -0
  137. package/core/__pycache__/dialog_manager.cpython-313.pyc +0 -0
  138. package/core/__pycache__/efficient_line_numbers.cpython-313.pyc +0 -0
  139. package/core/__pycache__/error_handler.cpython-313.pyc +0 -0
  140. package/core/__pycache__/error_service.cpython-313.pyc +0 -0
  141. package/core/__pycache__/event_consolidator.cpython-313.pyc +0 -0
  142. package/core/__pycache__/memory_efficient_text_widget.cpython-313.pyc +0 -0
  143. package/core/__pycache__/migration_manager.cpython-313.pyc +0 -0
  144. package/core/__pycache__/migration_test_suite.cpython-313.pyc +0 -0
  145. package/core/__pycache__/migration_validator.cpython-313.pyc +0 -0
  146. package/core/__pycache__/optimized_find_replace.cpython-313.pyc +0 -0
  147. package/core/__pycache__/optimized_pattern_engine.cpython-313.pyc +0 -0
  148. package/core/__pycache__/optimized_search_highlighter.cpython-313.pyc +0 -0
  149. package/core/__pycache__/performance_monitor.cpython-313.pyc +0 -0
  150. package/core/__pycache__/persistence_manager.cpython-313.pyc +0 -0
  151. package/core/__pycache__/progressive_stats_calculator.cpython-313.pyc +0 -0
  152. package/core/__pycache__/regex_pattern_cache.cpython-313.pyc +0 -0
  153. package/core/__pycache__/regex_pattern_library.cpython-313.pyc +0 -0
  154. package/core/__pycache__/search_operation_manager.cpython-313.pyc +0 -0
  155. package/core/__pycache__/settings_defaults_registry.cpython-313.pyc +0 -0
  156. package/core/__pycache__/settings_integrity_validator.cpython-313.pyc +0 -0
  157. package/core/__pycache__/settings_serializer.cpython-313.pyc +0 -0
  158. package/core/__pycache__/settings_validator.cpython-313.pyc +0 -0
  159. package/core/__pycache__/smart_stats_calculator.cpython-313.pyc +0 -0
  160. package/core/__pycache__/statistics_update_manager.cpython-313.pyc +0 -0
  161. package/core/__pycache__/stats_config_manager.cpython-313.pyc +0 -0
  162. package/core/__pycache__/streaming_text_handler.cpython-313.pyc +0 -0
  163. package/core/__pycache__/task_scheduler.cpython-313.pyc +0 -0
  164. package/core/__pycache__/visibility_monitor.cpython-313.pyc +0 -0
  165. package/core/__pycache__/widget_cache.cpython-313.pyc +0 -0
  166. package/core/mcp/__pycache__/__init__.cpython-313.pyc +0 -0
  167. package/core/mcp/__pycache__/protocol.cpython-313.pyc +0 -0
  168. package/core/mcp/__pycache__/schema.cpython-313.pyc +0 -0
  169. package/core/mcp/__pycache__/server_stdio.cpython-313.pyc +0 -0
  170. package/core/mcp/__pycache__/tool_registry.cpython-313.pyc +0 -0
  171. package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  172. package/tools/__pycache__/ai_tools.cpython-313.pyc +0 -0
  173. package/tools/__pycache__/ascii_art_generator.cpython-313.pyc +0 -0
  174. package/tools/__pycache__/base64_tools.cpython-313.pyc +0 -0
  175. package/tools/__pycache__/base_tool.cpython-313.pyc +0 -0
  176. package/tools/__pycache__/case_tool.cpython-313.pyc +0 -0
  177. package/tools/__pycache__/column_tools.cpython-313.pyc +0 -0
  178. package/tools/__pycache__/cron_tool.cpython-313.pyc +0 -0
  179. package/tools/__pycache__/curl_history.cpython-313.pyc +0 -0
  180. package/tools/__pycache__/curl_processor.cpython-313.pyc +0 -0
  181. package/tools/__pycache__/curl_settings.cpython-313.pyc +0 -0
  182. package/tools/__pycache__/curl_tool.cpython-313.pyc +0 -0
  183. package/tools/__pycache__/diff_viewer.cpython-313.pyc +0 -0
  184. package/tools/__pycache__/email_extraction_tool.cpython-313.pyc +0 -0
  185. package/tools/__pycache__/email_header_analyzer.cpython-313.pyc +0 -0
  186. package/tools/__pycache__/extraction_tools.cpython-313.pyc +0 -0
  187. package/tools/__pycache__/find_replace.cpython-313.pyc +0 -0
  188. package/tools/__pycache__/folder_file_reporter.cpython-313.pyc +0 -0
  189. package/tools/__pycache__/folder_file_reporter_adapter.cpython-313.pyc +0 -0
  190. package/tools/__pycache__/generator_tools.cpython-313.pyc +0 -0
  191. package/tools/__pycache__/hash_generator.cpython-313.pyc +0 -0
  192. package/tools/__pycache__/html_tool.cpython-313.pyc +0 -0
  193. package/tools/__pycache__/huggingface_helper.cpython-313.pyc +0 -0
  194. package/tools/__pycache__/jsonxml_tool.cpython-313.pyc +0 -0
  195. package/tools/__pycache__/line_tools.cpython-313.pyc +0 -0
  196. package/tools/__pycache__/list_comparator.cpython-313.pyc +0 -0
  197. package/tools/__pycache__/markdown_tools.cpython-313.pyc +0 -0
  198. package/tools/__pycache__/mcp_widget.cpython-313.pyc +0 -0
  199. package/tools/__pycache__/notes_widget.cpython-313.pyc +0 -0
  200. package/tools/__pycache__/number_base_converter.cpython-313.pyc +0 -0
  201. package/tools/__pycache__/regex_extractor.cpython-313.pyc +0 -0
  202. package/tools/__pycache__/slug_generator.cpython-313.pyc +0 -0
  203. package/tools/__pycache__/sorter_tools.cpython-313.pyc +0 -0
  204. package/tools/__pycache__/string_escape_tool.cpython-313.pyc +0 -0
  205. package/tools/__pycache__/text_statistics_tool.cpython-313.pyc +0 -0
  206. package/tools/__pycache__/text_wrapper.cpython-313.pyc +0 -0
  207. package/tools/__pycache__/timestamp_converter.cpython-313.pyc +0 -0
  208. package/tools/__pycache__/tool_loader.cpython-313.pyc +0 -0
  209. package/tools/__pycache__/translator_tools.cpython-313.pyc +0 -0
  210. package/tools/__pycache__/url_link_extractor.cpython-313.pyc +0 -0
  211. package/tools/__pycache__/url_parser.cpython-313.pyc +0 -0
  212. package/tools/__pycache__/whitespace_tools.cpython-313.pyc +0 -0
  213. package/tools/__pycache__/word_frequency_counter.cpython-313.pyc +0 -0
@@ -1,412 +1,412 @@
1
- """
2
- Database Schema Definition for Settings Migration
3
-
4
- This module defines the complete database schema for migrating from JSON-based
5
- settings to an in-memory SQLite database system. The schema is designed to
6
- efficiently represent all settings types found in the current settings.json
7
- while maintaining data integrity and query performance.
8
-
9
- Based on comprehensive codebase analysis of 45 production Python files.
10
- """
11
-
12
- import sqlite3
13
- from typing import Dict, List, Tuple, Any
14
- from datetime import datetime
15
-
16
-
17
- class DatabaseSchema:
18
- """
19
- Defines the complete database schema for the settings migration system.
20
-
21
- This schema supports all settings categories identified in the production
22
- codebase analysis, including core application settings, tool-specific
23
- configurations, tab content, performance settings, font settings,
24
- dialog settings, and metadata tracking.
25
- """
26
-
27
- # Schema version for migration tracking
28
- SCHEMA_VERSION = "1.0"
29
-
30
- @staticmethod
31
- def get_schema_definitions() -> Dict[str, str]:
32
- """
33
- Returns all table creation SQL statements for the settings database.
34
-
35
- Returns:
36
- Dict mapping table names to their CREATE TABLE SQL statements
37
- """
38
- return {
39
- 'core_settings': DatabaseSchema._get_core_settings_schema(),
40
- 'tool_settings': DatabaseSchema._get_tool_settings_schema(),
41
- 'tab_content': DatabaseSchema._get_tab_content_schema(),
42
- 'performance_settings': DatabaseSchema._get_performance_settings_schema(),
43
- 'font_settings': DatabaseSchema._get_font_settings_schema(),
44
- 'dialog_settings': DatabaseSchema._get_dialog_settings_schema(),
45
- 'settings_metadata': DatabaseSchema._get_settings_metadata_schema(),
46
- 'vertex_ai_json': DatabaseSchema._get_vertex_ai_json_schema()
47
- }
48
-
49
- @staticmethod
50
- def get_index_definitions() -> Dict[str, List[str]]:
51
- """
52
- Returns all index creation SQL statements for performance optimization.
53
-
54
- Returns:
55
- Dict mapping table names to lists of CREATE INDEX SQL statements
56
- """
57
- return {
58
- 'core_settings': [
59
- "CREATE INDEX IF NOT EXISTS idx_core_settings_key ON core_settings(key)",
60
- "CREATE INDEX IF NOT EXISTS idx_core_settings_updated ON core_settings(updated_at)"
61
- ],
62
- 'tool_settings': [
63
- "CREATE INDEX IF NOT EXISTS idx_tool_settings_tool_name ON tool_settings(tool_name)",
64
- "CREATE INDEX IF NOT EXISTS idx_tool_settings_path ON tool_settings(tool_name, setting_path)",
65
- "CREATE INDEX IF NOT EXISTS idx_tool_settings_updated ON tool_settings(updated_at)"
66
- ],
67
- 'tab_content': [
68
- "CREATE INDEX IF NOT EXISTS idx_tab_content_type ON tab_content(tab_type)",
69
- "CREATE INDEX IF NOT EXISTS idx_tab_content_type_index ON tab_content(tab_type, tab_index)"
70
- ],
71
- 'performance_settings': [
72
- "CREATE INDEX IF NOT EXISTS idx_performance_category ON performance_settings(category)",
73
- "CREATE INDEX IF NOT EXISTS idx_performance_category_key ON performance_settings(category, setting_key)"
74
- ],
75
- 'font_settings': [
76
- "CREATE INDEX IF NOT EXISTS idx_font_settings_type ON font_settings(font_type)",
77
- "CREATE INDEX IF NOT EXISTS idx_font_settings_type_prop ON font_settings(font_type, property)"
78
- ],
79
- 'dialog_settings': [
80
- "CREATE INDEX IF NOT EXISTS idx_dialog_settings_category ON dialog_settings(category)",
81
- "CREATE INDEX IF NOT EXISTS idx_dialog_settings_cat_prop ON dialog_settings(category, property)"
82
- ],
83
- 'settings_metadata': [
84
- "CREATE INDEX IF NOT EXISTS idx_settings_metadata_key ON settings_metadata(key)"
85
- ],
86
- 'vertex_ai_json': [
87
- "CREATE INDEX IF NOT EXISTS idx_vertex_ai_json_project_id ON vertex_ai_json(project_id)",
88
- "CREATE INDEX IF NOT EXISTS idx_vertex_ai_json_updated ON vertex_ai_json(updated_at)"
89
- ]
90
- }
91
-
92
- @staticmethod
93
- def _get_core_settings_schema() -> str:
94
- """
95
- Core application settings table for top-level configuration.
96
-
97
- Stores settings like export_path, debug_level, selected_tool,
98
- active_input_tab, active_output_tab, etc.
99
- """
100
- return """
101
- CREATE TABLE IF NOT EXISTS core_settings (
102
- key TEXT PRIMARY KEY,
103
- value TEXT NOT NULL,
104
- data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'bool', 'json', 'array')),
105
- description TEXT,
106
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
107
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
108
- )
109
- """
110
-
111
- @staticmethod
112
- def _get_tool_settings_schema() -> str:
113
- """
114
- Tool-specific settings table with support for nested paths.
115
-
116
- Supports complex tool configurations like AI provider settings,
117
- cURL tool history, generator tool configurations, etc.
118
- Handles nested paths like 'async_processing.enabled' or 'Generator Tools.Strong Password Generator.length'
119
- """
120
- return """
121
- CREATE TABLE IF NOT EXISTS tool_settings (
122
- id INTEGER PRIMARY KEY AUTOINCREMENT,
123
- tool_name TEXT NOT NULL,
124
- setting_path TEXT NOT NULL,
125
- setting_value TEXT NOT NULL,
126
- data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'bool', 'json', 'array')),
127
- description TEXT,
128
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
129
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
130
- UNIQUE(tool_name, setting_path)
131
- )
132
- """
133
-
134
- @staticmethod
135
- def _get_tab_content_schema() -> str:
136
- """
137
- Tab content table for input/output tab arrays.
138
-
139
- Stores the content of input_tabs and output_tabs arrays with
140
- proper indexing for the fixed 7-tab structure.
141
- """
142
- return """
143
- CREATE TABLE IF NOT EXISTS tab_content (
144
- tab_type TEXT NOT NULL CHECK (tab_type IN ('input', 'output')),
145
- tab_index INTEGER NOT NULL CHECK (tab_index >= 0 AND tab_index < 7),
146
- content TEXT DEFAULT '',
147
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
148
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
149
- PRIMARY KEY(tab_type, tab_index)
150
- )
151
- """
152
-
153
- @staticmethod
154
- def _get_performance_settings_schema() -> str:
155
- """
156
- Performance settings table for multi-level performance configurations.
157
-
158
- Handles nested performance settings like async_processing, caching,
159
- memory_management, and ui_optimizations with their sub-settings.
160
- """
161
- return """
162
- CREATE TABLE IF NOT EXISTS performance_settings (
163
- category TEXT NOT NULL,
164
- setting_key TEXT NOT NULL,
165
- setting_value TEXT NOT NULL,
166
- data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'bool', 'json', 'array')),
167
- description TEXT,
168
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
169
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
170
- PRIMARY KEY(category, setting_key)
171
- )
172
- """
173
-
174
- @staticmethod
175
- def _get_font_settings_schema() -> str:
176
- """
177
- Font settings table with platform-specific fallback support.
178
-
179
- Stores text_font and interface_font settings with properties like
180
- family, size, fallback_family, fallback_family_mac, fallback_family_linux.
181
- """
182
- return """
183
- CREATE TABLE IF NOT EXISTS font_settings (
184
- font_type TEXT NOT NULL CHECK (font_type IN ('text_font', 'interface_font')),
185
- property TEXT NOT NULL,
186
- value TEXT NOT NULL,
187
- data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'array')),
188
- description TEXT,
189
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
190
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
191
- PRIMARY KEY(font_type, property)
192
- )
193
- """
194
-
195
- @staticmethod
196
- def _get_dialog_settings_schema() -> str:
197
- """
198
- Dialog settings table with category-based organization.
199
-
200
- Stores dialog configuration for success, confirmation, warning, and error
201
- dialogs with properties like enabled, description, examples, default_action, locked.
202
- """
203
- return """
204
- CREATE TABLE IF NOT EXISTS dialog_settings (
205
- category TEXT NOT NULL CHECK (category IN ('success', 'confirmation', 'warning', 'error')),
206
- property TEXT NOT NULL,
207
- value TEXT NOT NULL,
208
- data_type TEXT NOT NULL CHECK (data_type IN ('str', 'bool', 'json', 'array')),
209
- description TEXT,
210
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
211
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
212
- PRIMARY KEY(category, property)
213
- )
214
- """
215
-
216
- @staticmethod
217
- def _get_settings_metadata_schema() -> str:
218
- """
219
- Settings metadata table for schema versioning and migration tracking.
220
-
221
- Stores information about schema version, migration dates, backup locations,
222
- and other metadata needed for system management.
223
- """
224
- return """
225
- CREATE TABLE IF NOT EXISTS settings_metadata (
226
- key TEXT PRIMARY KEY,
227
- value TEXT NOT NULL,
228
- description TEXT,
229
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
230
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
231
- )
232
- """
233
-
234
- @staticmethod
235
- def _get_vertex_ai_json_schema() -> str:
236
- """
237
- Vertex AI service account JSON credentials table.
238
-
239
- Stores all fields from the service account JSON file with encrypted private_key.
240
- Only one record should exist at a time (singleton pattern).
241
- """
242
- return """
243
- CREATE TABLE IF NOT EXISTS vertex_ai_json (
244
- id INTEGER PRIMARY KEY AUTOINCREMENT,
245
- type TEXT NOT NULL,
246
- project_id TEXT NOT NULL,
247
- private_key_id TEXT NOT NULL,
248
- private_key TEXT NOT NULL,
249
- client_email TEXT NOT NULL,
250
- client_id TEXT NOT NULL,
251
- auth_uri TEXT NOT NULL,
252
- token_uri TEXT NOT NULL,
253
- auth_provider_x509_cert_url TEXT,
254
- client_x509_cert_url TEXT,
255
- universe_domain TEXT,
256
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
257
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
258
- )
259
- """
260
-
261
- @staticmethod
262
- def get_initial_metadata() -> List[Tuple[str, str, str]]:
263
- """
264
- Returns initial metadata entries to insert after schema creation.
265
-
266
- Returns:
267
- List of tuples (key, value, description) for initial metadata
268
- """
269
- return [
270
- ('schema_version', DatabaseSchema.SCHEMA_VERSION, 'Current database schema version'),
271
- ('created_date', datetime.now().isoformat(), 'Database creation timestamp'),
272
- ('migration_source', 'settings.json', 'Original settings source format'),
273
- ('last_backup', '', 'Last backup file path'),
274
- ('backup_interval', '300', 'Automatic backup interval in seconds')
275
- ]
276
-
277
- @staticmethod
278
- def get_data_type_mappings() -> Dict[str, str]:
279
- """
280
- Returns mapping of Python types to database data_type values.
281
-
282
- Returns:
283
- Dict mapping Python type names to database type strings
284
- """
285
- return {
286
- 'str': 'str',
287
- 'int': 'int',
288
- 'float': 'float',
289
- 'bool': 'bool',
290
- 'list': 'array',
291
- 'dict': 'json',
292
- 'NoneType': 'json' # Store None as 'null' JSON string
293
- }
294
-
295
- @staticmethod
296
- def validate_data_type(data_type: str) -> bool:
297
- """
298
- Validates that a data_type value is supported by the schema.
299
-
300
- Args:
301
- data_type: The data type string to validate
302
-
303
- Returns:
304
- True if the data type is valid, False otherwise
305
- """
306
- valid_types = {'str', 'int', 'float', 'bool', 'json', 'array'}
307
- return data_type in valid_types
308
-
309
- @staticmethod
310
- def get_table_creation_order() -> List[str]:
311
- """
312
- Returns the recommended order for creating tables to handle dependencies.
313
-
314
- Returns:
315
- List of table names in creation order
316
- """
317
- return [
318
- 'settings_metadata',
319
- 'core_settings',
320
- 'tool_settings',
321
- 'tab_content',
322
- 'performance_settings',
323
- 'font_settings',
324
- 'dialog_settings',
325
- 'vertex_ai_json'
326
- ]
327
-
328
-
329
- # Data type conversion utilities
330
- class DataTypeConverter:
331
- """
332
- Utilities for converting between Python types and database storage formats.
333
- """
334
-
335
- @staticmethod
336
- def python_to_db_type(value: Any) -> str:
337
- """
338
- Convert Python value to appropriate database data_type string.
339
-
340
- Args:
341
- value: Python value to analyze
342
-
343
- Returns:
344
- Database data_type string ('str', 'int', 'float', 'bool', 'json', 'array')
345
- """
346
- # Check bool first since bool is a subclass of int in Python
347
- if isinstance(value, bool):
348
- return 'bool'
349
- elif isinstance(value, str):
350
- return 'str'
351
- elif isinstance(value, int):
352
- return 'int'
353
- elif isinstance(value, float):
354
- return 'float'
355
- elif isinstance(value, list):
356
- return 'array'
357
- elif isinstance(value, dict):
358
- return 'json'
359
- else:
360
- return 'json' # Default to JSON for complex types
361
-
362
- @staticmethod
363
- def serialize_value(value: Any) -> str:
364
- """
365
- Serialize Python value to string for database storage.
366
-
367
- Args:
368
- value: Python value to serialize
369
-
370
- Returns:
371
- String representation suitable for database storage
372
- """
373
- import json
374
-
375
- # Check bool first since bool is a subclass of int in Python
376
- if isinstance(value, bool):
377
- return '1' if value else '0'
378
- elif isinstance(value, str):
379
- return value
380
- elif isinstance(value, (int, float)):
381
- return str(value)
382
- elif isinstance(value, (list, dict)) or value is None:
383
- return json.dumps(value, ensure_ascii=False)
384
- else:
385
- return str(value)
386
-
387
- @staticmethod
388
- def deserialize_value(value_str: str, data_type: str) -> Any:
389
- """
390
- Deserialize string value from database to Python type.
391
-
392
- Args:
393
- value_str: String value from database
394
- data_type: Database data_type string
395
-
396
- Returns:
397
- Python value in appropriate type
398
- """
399
- import json
400
-
401
- if data_type == 'str':
402
- return value_str
403
- elif data_type == 'int':
404
- return int(value_str)
405
- elif data_type == 'float':
406
- return float(value_str)
407
- elif data_type == 'bool':
408
- return value_str == '1'
409
- elif data_type in ('json', 'array'):
410
- return json.loads(value_str)
411
- else:
1
+ """
2
+ Database Schema Definition for Settings Migration
3
+
4
+ This module defines the complete database schema for migrating from JSON-based
5
+ settings to an in-memory SQLite database system. The schema is designed to
6
+ efficiently represent all settings types found in the current settings.json
7
+ while maintaining data integrity and query performance.
8
+
9
+ Based on comprehensive codebase analysis of 45 production Python files.
10
+ """
11
+
12
+ import sqlite3
13
+ from typing import Dict, List, Tuple, Any
14
+ from datetime import datetime
15
+
16
+
17
+ class DatabaseSchema:
18
+ """
19
+ Defines the complete database schema for the settings migration system.
20
+
21
+ This schema supports all settings categories identified in the production
22
+ codebase analysis, including core application settings, tool-specific
23
+ configurations, tab content, performance settings, font settings,
24
+ dialog settings, and metadata tracking.
25
+ """
26
+
27
+ # Schema version for migration tracking
28
+ SCHEMA_VERSION = "1.0"
29
+
30
+ @staticmethod
31
+ def get_schema_definitions() -> Dict[str, str]:
32
+ """
33
+ Returns all table creation SQL statements for the settings database.
34
+
35
+ Returns:
36
+ Dict mapping table names to their CREATE TABLE SQL statements
37
+ """
38
+ return {
39
+ 'core_settings': DatabaseSchema._get_core_settings_schema(),
40
+ 'tool_settings': DatabaseSchema._get_tool_settings_schema(),
41
+ 'tab_content': DatabaseSchema._get_tab_content_schema(),
42
+ 'performance_settings': DatabaseSchema._get_performance_settings_schema(),
43
+ 'font_settings': DatabaseSchema._get_font_settings_schema(),
44
+ 'dialog_settings': DatabaseSchema._get_dialog_settings_schema(),
45
+ 'settings_metadata': DatabaseSchema._get_settings_metadata_schema(),
46
+ 'vertex_ai_json': DatabaseSchema._get_vertex_ai_json_schema()
47
+ }
48
+
49
+ @staticmethod
50
+ def get_index_definitions() -> Dict[str, List[str]]:
51
+ """
52
+ Returns all index creation SQL statements for performance optimization.
53
+
54
+ Returns:
55
+ Dict mapping table names to lists of CREATE INDEX SQL statements
56
+ """
57
+ return {
58
+ 'core_settings': [
59
+ "CREATE INDEX IF NOT EXISTS idx_core_settings_key ON core_settings(key)",
60
+ "CREATE INDEX IF NOT EXISTS idx_core_settings_updated ON core_settings(updated_at)"
61
+ ],
62
+ 'tool_settings': [
63
+ "CREATE INDEX IF NOT EXISTS idx_tool_settings_tool_name ON tool_settings(tool_name)",
64
+ "CREATE INDEX IF NOT EXISTS idx_tool_settings_path ON tool_settings(tool_name, setting_path)",
65
+ "CREATE INDEX IF NOT EXISTS idx_tool_settings_updated ON tool_settings(updated_at)"
66
+ ],
67
+ 'tab_content': [
68
+ "CREATE INDEX IF NOT EXISTS idx_tab_content_type ON tab_content(tab_type)",
69
+ "CREATE INDEX IF NOT EXISTS idx_tab_content_type_index ON tab_content(tab_type, tab_index)"
70
+ ],
71
+ 'performance_settings': [
72
+ "CREATE INDEX IF NOT EXISTS idx_performance_category ON performance_settings(category)",
73
+ "CREATE INDEX IF NOT EXISTS idx_performance_category_key ON performance_settings(category, setting_key)"
74
+ ],
75
+ 'font_settings': [
76
+ "CREATE INDEX IF NOT EXISTS idx_font_settings_type ON font_settings(font_type)",
77
+ "CREATE INDEX IF NOT EXISTS idx_font_settings_type_prop ON font_settings(font_type, property)"
78
+ ],
79
+ 'dialog_settings': [
80
+ "CREATE INDEX IF NOT EXISTS idx_dialog_settings_category ON dialog_settings(category)",
81
+ "CREATE INDEX IF NOT EXISTS idx_dialog_settings_cat_prop ON dialog_settings(category, property)"
82
+ ],
83
+ 'settings_metadata': [
84
+ "CREATE INDEX IF NOT EXISTS idx_settings_metadata_key ON settings_metadata(key)"
85
+ ],
86
+ 'vertex_ai_json': [
87
+ "CREATE INDEX IF NOT EXISTS idx_vertex_ai_json_project_id ON vertex_ai_json(project_id)",
88
+ "CREATE INDEX IF NOT EXISTS idx_vertex_ai_json_updated ON vertex_ai_json(updated_at)"
89
+ ]
90
+ }
91
+
92
+ @staticmethod
93
+ def _get_core_settings_schema() -> str:
94
+ """
95
+ Core application settings table for top-level configuration.
96
+
97
+ Stores settings like export_path, debug_level, selected_tool,
98
+ active_input_tab, active_output_tab, etc.
99
+ """
100
+ return """
101
+ CREATE TABLE IF NOT EXISTS core_settings (
102
+ key TEXT PRIMARY KEY,
103
+ value TEXT NOT NULL,
104
+ data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'bool', 'json', 'array')),
105
+ description TEXT,
106
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
107
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
108
+ )
109
+ """
110
+
111
+ @staticmethod
112
+ def _get_tool_settings_schema() -> str:
113
+ """
114
+ Tool-specific settings table with support for nested paths.
115
+
116
+ Supports complex tool configurations like AI provider settings,
117
+ cURL tool history, generator tool configurations, etc.
118
+ Handles nested paths like 'async_processing.enabled' or 'Generator Tools.Strong Password Generator.length'
119
+ """
120
+ return """
121
+ CREATE TABLE IF NOT EXISTS tool_settings (
122
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
123
+ tool_name TEXT NOT NULL,
124
+ setting_path TEXT NOT NULL,
125
+ setting_value TEXT NOT NULL,
126
+ data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'bool', 'json', 'array')),
127
+ description TEXT,
128
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
129
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
130
+ UNIQUE(tool_name, setting_path)
131
+ )
132
+ """
133
+
134
+ @staticmethod
135
+ def _get_tab_content_schema() -> str:
136
+ """
137
+ Tab content table for input/output tab arrays.
138
+
139
+ Stores the content of input_tabs and output_tabs arrays with
140
+ proper indexing for the fixed 7-tab structure.
141
+ """
142
+ return """
143
+ CREATE TABLE IF NOT EXISTS tab_content (
144
+ tab_type TEXT NOT NULL CHECK (tab_type IN ('input', 'output')),
145
+ tab_index INTEGER NOT NULL CHECK (tab_index >= 0 AND tab_index < 7),
146
+ content TEXT DEFAULT '',
147
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
148
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
149
+ PRIMARY KEY(tab_type, tab_index)
150
+ )
151
+ """
152
+
153
+ @staticmethod
154
+ def _get_performance_settings_schema() -> str:
155
+ """
156
+ Performance settings table for multi-level performance configurations.
157
+
158
+ Handles nested performance settings like async_processing, caching,
159
+ memory_management, and ui_optimizations with their sub-settings.
160
+ """
161
+ return """
162
+ CREATE TABLE IF NOT EXISTS performance_settings (
163
+ category TEXT NOT NULL,
164
+ setting_key TEXT NOT NULL,
165
+ setting_value TEXT NOT NULL,
166
+ data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'bool', 'json', 'array')),
167
+ description TEXT,
168
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
169
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
170
+ PRIMARY KEY(category, setting_key)
171
+ )
172
+ """
173
+
174
+ @staticmethod
175
+ def _get_font_settings_schema() -> str:
176
+ """
177
+ Font settings table with platform-specific fallback support.
178
+
179
+ Stores text_font and interface_font settings with properties like
180
+ family, size, fallback_family, fallback_family_mac, fallback_family_linux.
181
+ """
182
+ return """
183
+ CREATE TABLE IF NOT EXISTS font_settings (
184
+ font_type TEXT NOT NULL CHECK (font_type IN ('text_font', 'interface_font')),
185
+ property TEXT NOT NULL,
186
+ value TEXT NOT NULL,
187
+ data_type TEXT NOT NULL CHECK (data_type IN ('str', 'int', 'float', 'array')),
188
+ description TEXT,
189
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
190
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
191
+ PRIMARY KEY(font_type, property)
192
+ )
193
+ """
194
+
195
+ @staticmethod
196
+ def _get_dialog_settings_schema() -> str:
197
+ """
198
+ Dialog settings table with category-based organization.
199
+
200
+ Stores dialog configuration for success, confirmation, warning, and error
201
+ dialogs with properties like enabled, description, examples, default_action, locked.
202
+ """
203
+ return """
204
+ CREATE TABLE IF NOT EXISTS dialog_settings (
205
+ category TEXT NOT NULL CHECK (category IN ('success', 'confirmation', 'warning', 'error')),
206
+ property TEXT NOT NULL,
207
+ value TEXT NOT NULL,
208
+ data_type TEXT NOT NULL CHECK (data_type IN ('str', 'bool', 'json', 'array')),
209
+ description TEXT,
210
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
211
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
212
+ PRIMARY KEY(category, property)
213
+ )
214
+ """
215
+
216
+ @staticmethod
217
+ def _get_settings_metadata_schema() -> str:
218
+ """
219
+ Settings metadata table for schema versioning and migration tracking.
220
+
221
+ Stores information about schema version, migration dates, backup locations,
222
+ and other metadata needed for system management.
223
+ """
224
+ return """
225
+ CREATE TABLE IF NOT EXISTS settings_metadata (
226
+ key TEXT PRIMARY KEY,
227
+ value TEXT NOT NULL,
228
+ description TEXT,
229
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
230
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
231
+ )
232
+ """
233
+
234
+ @staticmethod
235
+ def _get_vertex_ai_json_schema() -> str:
236
+ """
237
+ Vertex AI service account JSON credentials table.
238
+
239
+ Stores all fields from the service account JSON file with encrypted private_key.
240
+ Only one record should exist at a time (singleton pattern).
241
+ """
242
+ return """
243
+ CREATE TABLE IF NOT EXISTS vertex_ai_json (
244
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
245
+ type TEXT NOT NULL,
246
+ project_id TEXT NOT NULL,
247
+ private_key_id TEXT NOT NULL,
248
+ private_key TEXT NOT NULL,
249
+ client_email TEXT NOT NULL,
250
+ client_id TEXT NOT NULL,
251
+ auth_uri TEXT NOT NULL,
252
+ token_uri TEXT NOT NULL,
253
+ auth_provider_x509_cert_url TEXT,
254
+ client_x509_cert_url TEXT,
255
+ universe_domain TEXT,
256
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
257
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
258
+ )
259
+ """
260
+
261
+ @staticmethod
262
+ def get_initial_metadata() -> List[Tuple[str, str, str]]:
263
+ """
264
+ Returns initial metadata entries to insert after schema creation.
265
+
266
+ Returns:
267
+ List of tuples (key, value, description) for initial metadata
268
+ """
269
+ return [
270
+ ('schema_version', DatabaseSchema.SCHEMA_VERSION, 'Current database schema version'),
271
+ ('created_date', datetime.now().isoformat(), 'Database creation timestamp'),
272
+ ('migration_source', 'settings.json', 'Original settings source format'),
273
+ ('last_backup', '', 'Last backup file path'),
274
+ ('backup_interval', '300', 'Automatic backup interval in seconds')
275
+ ]
276
+
277
+ @staticmethod
278
+ def get_data_type_mappings() -> Dict[str, str]:
279
+ """
280
+ Returns mapping of Python types to database data_type values.
281
+
282
+ Returns:
283
+ Dict mapping Python type names to database type strings
284
+ """
285
+ return {
286
+ 'str': 'str',
287
+ 'int': 'int',
288
+ 'float': 'float',
289
+ 'bool': 'bool',
290
+ 'list': 'array',
291
+ 'dict': 'json',
292
+ 'NoneType': 'json' # Store None as 'null' JSON string
293
+ }
294
+
295
+ @staticmethod
296
+ def validate_data_type(data_type: str) -> bool:
297
+ """
298
+ Validates that a data_type value is supported by the schema.
299
+
300
+ Args:
301
+ data_type: The data type string to validate
302
+
303
+ Returns:
304
+ True if the data type is valid, False otherwise
305
+ """
306
+ valid_types = {'str', 'int', 'float', 'bool', 'json', 'array'}
307
+ return data_type in valid_types
308
+
309
+ @staticmethod
310
+ def get_table_creation_order() -> List[str]:
311
+ """
312
+ Returns the recommended order for creating tables to handle dependencies.
313
+
314
+ Returns:
315
+ List of table names in creation order
316
+ """
317
+ return [
318
+ 'settings_metadata',
319
+ 'core_settings',
320
+ 'tool_settings',
321
+ 'tab_content',
322
+ 'performance_settings',
323
+ 'font_settings',
324
+ 'dialog_settings',
325
+ 'vertex_ai_json'
326
+ ]
327
+
328
+
329
+ # Data type conversion utilities
330
+ class DataTypeConverter:
331
+ """
332
+ Utilities for converting between Python types and database storage formats.
333
+ """
334
+
335
+ @staticmethod
336
+ def python_to_db_type(value: Any) -> str:
337
+ """
338
+ Convert Python value to appropriate database data_type string.
339
+
340
+ Args:
341
+ value: Python value to analyze
342
+
343
+ Returns:
344
+ Database data_type string ('str', 'int', 'float', 'bool', 'json', 'array')
345
+ """
346
+ # Check bool first since bool is a subclass of int in Python
347
+ if isinstance(value, bool):
348
+ return 'bool'
349
+ elif isinstance(value, str):
350
+ return 'str'
351
+ elif isinstance(value, int):
352
+ return 'int'
353
+ elif isinstance(value, float):
354
+ return 'float'
355
+ elif isinstance(value, list):
356
+ return 'array'
357
+ elif isinstance(value, dict):
358
+ return 'json'
359
+ else:
360
+ return 'json' # Default to JSON for complex types
361
+
362
+ @staticmethod
363
+ def serialize_value(value: Any) -> str:
364
+ """
365
+ Serialize Python value to string for database storage.
366
+
367
+ Args:
368
+ value: Python value to serialize
369
+
370
+ Returns:
371
+ String representation suitable for database storage
372
+ """
373
+ import json
374
+
375
+ # Check bool first since bool is a subclass of int in Python
376
+ if isinstance(value, bool):
377
+ return '1' if value else '0'
378
+ elif isinstance(value, str):
379
+ return value
380
+ elif isinstance(value, (int, float)):
381
+ return str(value)
382
+ elif isinstance(value, (list, dict)) or value is None:
383
+ return json.dumps(value, ensure_ascii=False)
384
+ else:
385
+ return str(value)
386
+
387
+ @staticmethod
388
+ def deserialize_value(value_str: str, data_type: str) -> Any:
389
+ """
390
+ Deserialize string value from database to Python type.
391
+
392
+ Args:
393
+ value_str: String value from database
394
+ data_type: Database data_type string
395
+
396
+ Returns:
397
+ Python value in appropriate type
398
+ """
399
+ import json
400
+
401
+ if data_type == 'str':
402
+ return value_str
403
+ elif data_type == 'int':
404
+ return int(value_str)
405
+ elif data_type == 'float':
406
+ return float(value_str)
407
+ elif data_type == 'bool':
408
+ return value_str == '1'
409
+ elif data_type in ('json', 'array'):
410
+ return json.loads(value_str)
411
+ else:
412
412
  return value_str # Fallback to string