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,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