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
package/pomera_mcp_server.py
CHANGED
|
@@ -1,144 +1,183 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Pomera MCP Server - Exposes Pomera text tools via Model Context Protocol
|
|
4
|
-
|
|
5
|
-
This is a standalone MCP server that exposes Pomera's text manipulation tools
|
|
6
|
-
to external AI assistants like Claude Desktop, Cursor, and other MCP clients.
|
|
7
|
-
|
|
8
|
-
Usage:
|
|
9
|
-
python pomera_mcp_server.py
|
|
10
|
-
|
|
11
|
-
Configuration for Claude Desktop (claude_desktop_config.json):
|
|
12
|
-
{
|
|
13
|
-
"mcpServers": {
|
|
14
|
-
"pomera": {
|
|
15
|
-
"command": "python",
|
|
16
|
-
"args": ["C:/path/to/Pomera-AI-Commander/pomera_mcp_server.py"]
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
Configuration for Cursor (.cursor/mcp.json):
|
|
22
|
-
{
|
|
23
|
-
"mcpServers": {
|
|
24
|
-
"pomera": {
|
|
25
|
-
"command": "python",
|
|
26
|
-
"args": ["C:/path/to/Pomera-AI-Commander/pomera_mcp_server.py"]
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
Available Tools:
|
|
32
|
-
- pomera_case_transform: Transform text case (sentence, lower, upper, title)
|
|
33
|
-
- pomera_base64: Encode/decode Base64
|
|
34
|
-
- pomera_hash: Generate MD5, SHA-1, SHA-256, SHA-512, CRC32 hashes
|
|
35
|
-
|
|
36
|
-
Author: Pomera AI Commander
|
|
37
|
-
License: MIT
|
|
38
|
-
"""
|
|
39
|
-
|
|
40
|
-
import sys
|
|
41
|
-
import os
|
|
42
|
-
import
|
|
43
|
-
import
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
logging
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Pomera MCP Server - Exposes Pomera text tools via Model Context Protocol
|
|
4
|
+
|
|
5
|
+
This is a standalone MCP server that exposes Pomera's text manipulation tools
|
|
6
|
+
to external AI assistants like Claude Desktop, Cursor, and other MCP clients.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python pomera_mcp_server.py
|
|
10
|
+
|
|
11
|
+
Configuration for Claude Desktop (claude_desktop_config.json):
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"pomera": {
|
|
15
|
+
"command": "python",
|
|
16
|
+
"args": ["C:/path/to/Pomera-AI-Commander/pomera_mcp_server.py"]
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
Configuration for Cursor (.cursor/mcp.json):
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"pomera": {
|
|
25
|
+
"command": "python",
|
|
26
|
+
"args": ["C:/path/to/Pomera-AI-Commander/pomera_mcp_server.py"]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
Available Tools:
|
|
32
|
+
- pomera_case_transform: Transform text case (sentence, lower, upper, title)
|
|
33
|
+
- pomera_base64: Encode/decode Base64
|
|
34
|
+
- pomera_hash: Generate MD5, SHA-1, SHA-256, SHA-512, CRC32 hashes
|
|
35
|
+
|
|
36
|
+
Author: Pomera AI Commander
|
|
37
|
+
License: MIT
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
import sys
|
|
41
|
+
import os
|
|
42
|
+
import json
|
|
43
|
+
import logging
|
|
44
|
+
import argparse
|
|
45
|
+
|
|
46
|
+
# Add project root to path for imports
|
|
47
|
+
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
|
|
48
|
+
if PROJECT_ROOT not in sys.path:
|
|
49
|
+
sys.path.insert(0, PROJECT_ROOT)
|
|
50
|
+
|
|
51
|
+
# Configure logging to stderr (stdout is used for MCP communication)
|
|
52
|
+
logging.basicConfig(
|
|
53
|
+
level=logging.INFO,
|
|
54
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
55
|
+
stream=sys.stderr
|
|
56
|
+
)
|
|
57
|
+
logger = logging.getLogger(__name__)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def main():
|
|
61
|
+
"""Main entry point for the Pomera MCP server."""
|
|
62
|
+
parser = argparse.ArgumentParser(
|
|
63
|
+
description="Pomera MCP Server - Expose text tools via Model Context Protocol"
|
|
64
|
+
)
|
|
65
|
+
parser.add_argument(
|
|
66
|
+
"--debug",
|
|
67
|
+
action="store_true",
|
|
68
|
+
help="Enable debug logging"
|
|
69
|
+
)
|
|
70
|
+
parser.add_argument(
|
|
71
|
+
"--version",
|
|
72
|
+
action="version",
|
|
73
|
+
version="pomera-mcp-server 1.2.2"
|
|
74
|
+
)
|
|
75
|
+
parser.add_argument(
|
|
76
|
+
"--list-tools",
|
|
77
|
+
action="store_true",
|
|
78
|
+
help="List available tools and exit"
|
|
79
|
+
)
|
|
80
|
+
parser.add_argument(
|
|
81
|
+
"--call",
|
|
82
|
+
metavar="TOOL_NAME",
|
|
83
|
+
help="Call a tool directly and exit (bypasses MCP protocol)"
|
|
84
|
+
)
|
|
85
|
+
parser.add_argument(
|
|
86
|
+
"--args",
|
|
87
|
+
metavar="JSON",
|
|
88
|
+
default="{}",
|
|
89
|
+
help="JSON arguments for --call (default: {})"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
args = parser.parse_args()
|
|
93
|
+
|
|
94
|
+
if args.debug:
|
|
95
|
+
logging.getLogger().setLevel(logging.DEBUG)
|
|
96
|
+
logger.debug("Debug logging enabled")
|
|
97
|
+
|
|
98
|
+
# Import MCP modules
|
|
99
|
+
try:
|
|
100
|
+
from core.mcp.tool_registry import ToolRegistry
|
|
101
|
+
from core.mcp.server_stdio import StdioMCPServer
|
|
102
|
+
except ImportError as e:
|
|
103
|
+
logger.error(f"Failed to import MCP modules: {e}")
|
|
104
|
+
logger.error("Make sure you're running from the Pomera-AI-Commander directory")
|
|
105
|
+
sys.exit(1)
|
|
106
|
+
|
|
107
|
+
# Create tool registry
|
|
108
|
+
try:
|
|
109
|
+
registry = ToolRegistry()
|
|
110
|
+
logger.info(f"Loaded {len(registry)} tools")
|
|
111
|
+
except Exception as e:
|
|
112
|
+
logger.error(f"Failed to create tool registry: {e}")
|
|
113
|
+
sys.exit(1)
|
|
114
|
+
|
|
115
|
+
# List tools mode
|
|
116
|
+
if args.list_tools:
|
|
117
|
+
print("Available Pomera MCP Tools:")
|
|
118
|
+
print("-" * 60)
|
|
119
|
+
for tool in registry.list_tools():
|
|
120
|
+
print(f"\n{tool.name}")
|
|
121
|
+
print(f" {tool.description}")
|
|
122
|
+
if "properties" in tool.inputSchema:
|
|
123
|
+
print(" Parameters:")
|
|
124
|
+
for prop_name, prop_def in tool.inputSchema["properties"].items():
|
|
125
|
+
prop_type = prop_def.get("type", "any")
|
|
126
|
+
prop_desc = prop_def.get("description", "")
|
|
127
|
+
required = prop_name in tool.inputSchema.get("required", [])
|
|
128
|
+
req_marker = "*" if required else ""
|
|
129
|
+
print(f" - {prop_name}{req_marker} ({prop_type}): {prop_desc}")
|
|
130
|
+
return
|
|
131
|
+
|
|
132
|
+
# One-shot call mode
|
|
133
|
+
if args.call:
|
|
134
|
+
try:
|
|
135
|
+
tool_args = json.loads(args.args)
|
|
136
|
+
except json.JSONDecodeError as e:
|
|
137
|
+
print(f"Error: Invalid JSON in --args: {e}", file=sys.stderr)
|
|
138
|
+
sys.exit(1)
|
|
139
|
+
|
|
140
|
+
if args.call not in registry:
|
|
141
|
+
print(f"Error: Unknown tool '{args.call}'", file=sys.stderr)
|
|
142
|
+
print(f"Available tools: {', '.join(registry.get_tool_names())}", file=sys.stderr)
|
|
143
|
+
sys.exit(1)
|
|
144
|
+
|
|
145
|
+
try:
|
|
146
|
+
result = registry.execute(args.call, tool_args)
|
|
147
|
+
output = result.to_dict()
|
|
148
|
+
# For simple text results, just print the text
|
|
149
|
+
if len(output.get('content', [])) == 1 and output['content'][0].get('type') == 'text':
|
|
150
|
+
print(output['content'][0]['text'])
|
|
151
|
+
else:
|
|
152
|
+
print(json.dumps(output, indent=2, ensure_ascii=False))
|
|
153
|
+
sys.exit(1 if result.isError else 0)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
print(f"Error executing tool: {e}", file=sys.stderr)
|
|
156
|
+
sys.exit(1)
|
|
157
|
+
return
|
|
158
|
+
|
|
159
|
+
# Create and run server
|
|
160
|
+
server = StdioMCPServer(
|
|
161
|
+
tool_registry=registry,
|
|
162
|
+
server_name="pomera-mcp-server",
|
|
163
|
+
server_version="1.2.2"
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
logger.info("Starting Pomera MCP Server...")
|
|
167
|
+
logger.info(f"Available tools: {', '.join(registry.get_tool_names())}")
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
# Run synchronously (simpler for stdio)
|
|
171
|
+
server.run_sync()
|
|
172
|
+
except KeyboardInterrupt:
|
|
173
|
+
logger.info("Server interrupted by user")
|
|
174
|
+
except Exception as e:
|
|
175
|
+
logger.exception(f"Server error: {e}")
|
|
176
|
+
sys.exit(1)
|
|
177
|
+
|
|
178
|
+
logger.info("Server shutdown complete")
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
if __name__ == "__main__":
|
|
182
|
+
main()
|
|
183
|
+
|
package/requirements.txt
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Core dependencies for Pomera AI Commander
|
|
2
|
+
requests>=2.25.0
|
|
3
|
+
reportlab>=3.6.0
|
|
4
|
+
python-docx>=0.8.11
|
|
5
|
+
aiohttp>=3.9.0
|
|
6
|
+
platformdirs>=4.0.0
|
|
7
|
+
|
|
8
|
+
# AI Tools dependencies
|
|
9
|
+
huggingface-hub>=0.16.0
|
|
10
|
+
google-auth>=2.23.0
|
|
11
|
+
google-auth-oauthlib>=1.1.0
|
|
12
|
+
google-auth-httplib2>=0.1.1
|
|
13
|
+
|
|
14
|
+
# Google AI SDK (recommended for better error handling and streaming)
|
|
15
|
+
google-genai>=1.0.0
|
|
16
|
+
|
|
17
|
+
# Azure AI SDK (recommended - Microsoft recommends migrating to this)
|
|
18
|
+
azure-ai-inference>=1.0.0b1
|
|
19
|
+
azure-core>=1.30.0
|
|
20
|
+
|
|
21
|
+
# Retry logic with exponential backoff
|
|
22
|
+
tenacity>=8.2.0
|
|
23
|
+
|
|
24
|
+
# Optional audio dependencies (for advanced features)
|
|
25
|
+
# Uncomment if you need audio processing capabilities
|
|
26
|
+
# pyaudio>=0.2.11
|
|
27
|
+
# numpy>=1.21.0
|
|
28
|
+
|
|
29
|
+
# Performance monitoring (optional)
|
|
30
|
+
# psutil>=5.8.0
|
|
31
|
+
|
|
32
|
+
# Development and build tools
|
|
33
|
+
pyinstaller>=5.0.0
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Alpine Linux build - creates smaller, more portable executables
|
|
2
|
+
FROM python:3.11-alpine
|
|
3
|
+
|
|
4
|
+
# Install build dependencies
|
|
5
|
+
RUN apk add --no-cache \
|
|
6
|
+
gcc \
|
|
7
|
+
musl-dev \
|
|
8
|
+
libffi-dev \
|
|
9
|
+
g++ \
|
|
10
|
+
make
|
|
11
|
+
|
|
12
|
+
# Set working directory
|
|
13
|
+
WORKDIR /app
|
|
14
|
+
|
|
15
|
+
# Copy requirements and install dependencies
|
|
16
|
+
COPY requirements.txt .
|
|
17
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
18
|
+
|
|
19
|
+
# Install additional AI SDK dependencies (may fail gracefully)
|
|
20
|
+
RUN pip install --no-cache-dir google-genai>=1.0.0 || echo "google-genai installation skipped"
|
|
21
|
+
RUN pip install --no-cache-dir azure-ai-inference>=1.0.0b1 azure-core>=1.30.0 || echo "azure-ai-inference installation skipped"
|
|
22
|
+
RUN pip install --no-cache-dir tenacity>=8.2.0 || echo "tenacity installation skipped"
|
|
23
|
+
RUN pip install --no-cache-dir aiohttp>=3.9.0 || echo "aiohttp installation skipped"
|
|
24
|
+
|
|
25
|
+
# Copy source code
|
|
26
|
+
COPY . .
|
|
27
|
+
|
|
28
|
+
# Build static executable with enhanced options
|
|
29
|
+
RUN pyinstaller \
|
|
30
|
+
--onefile \
|
|
31
|
+
--name pomera-linux-alpine \
|
|
32
|
+
--strip \
|
|
33
|
+
--noupx \
|
|
34
|
+
--clean \
|
|
35
|
+
--noconfirm \
|
|
36
|
+
pomera.py
|
|
37
|
+
|
|
38
|
+
# Copy to output
|
|
39
|
+
RUN mkdir -p /output && \
|
|
40
|
+
cp dist/pomera-linux-alpine /output/ && \
|
|
41
|
+
chmod +x /output/pomera-linux-alpine
|
|
42
|
+
|
|
43
|
+
CMD ["cp", "/output/pomera-linux-alpine", "/output/"]
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Lightweight Linux GUI for testing executables
|
|
2
|
+
FROM ubuntu:22.04
|
|
3
|
+
|
|
4
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
5
|
+
|
|
6
|
+
# Install minimal GUI and VNC
|
|
7
|
+
RUN apt-get update && apt-get install -y \
|
|
8
|
+
xfce4-session \
|
|
9
|
+
xfce4-panel \
|
|
10
|
+
xfce4-terminal \
|
|
11
|
+
xfwm4 \
|
|
12
|
+
thunar \
|
|
13
|
+
tightvncserver \
|
|
14
|
+
novnc \
|
|
15
|
+
websockify \
|
|
16
|
+
python3 \
|
|
17
|
+
python3-tk \
|
|
18
|
+
file \
|
|
19
|
+
&& apt-get clean
|
|
20
|
+
|
|
21
|
+
# Create test user
|
|
22
|
+
RUN useradd -m -s /bin/bash tester
|
|
23
|
+
RUN echo 'tester:test123' | chpasswd
|
|
24
|
+
|
|
25
|
+
# Setup VNC for tester
|
|
26
|
+
USER tester
|
|
27
|
+
WORKDIR /home/tester
|
|
28
|
+
|
|
29
|
+
RUN mkdir -p ~/.vnc
|
|
30
|
+
RUN echo 'test123' | vncpasswd -f > ~/.vnc/passwd
|
|
31
|
+
RUN chmod 600 ~/.vnc/passwd
|
|
32
|
+
|
|
33
|
+
# VNC startup script
|
|
34
|
+
RUN echo '#!/bin/bash' > ~/.vnc/xstartup && \
|
|
35
|
+
echo 'export XKL_XMODMAP_DISABLE=1' >> ~/.vnc/xstartup && \
|
|
36
|
+
echo 'unset SESSION_MANAGER' >> ~/.vnc/xstartup && \
|
|
37
|
+
echo 'unset DBUS_SESSION_BUS_ADDRESS' >> ~/.vnc/xstartup && \
|
|
38
|
+
echo 'startxfce4 &' >> ~/.vnc/xstartup && \
|
|
39
|
+
chmod +x ~/.vnc/xstartup
|
|
40
|
+
|
|
41
|
+
# Create app directory
|
|
42
|
+
RUN mkdir -p ~/app
|
|
43
|
+
|
|
44
|
+
USER root
|
|
45
|
+
|
|
46
|
+
# Start script
|
|
47
|
+
RUN echo '#!/bin/bash' > /start.sh && \
|
|
48
|
+
echo 'su - tester -c "vncserver :1 -geometry 1280x720 -depth 24"' >> /start.sh && \
|
|
49
|
+
echo 'websockify --web=/usr/share/novnc/ 6080 localhost:5901' >> /start.sh && \
|
|
50
|
+
chmod +x /start.sh
|
|
51
|
+
|
|
52
|
+
EXPOSE 6080
|
|
53
|
+
|
|
54
|
+
CMD ["/start.sh"]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Dockerfile for building Linux executables
|
|
2
|
+
FROM python:3.11-slim
|
|
3
|
+
|
|
4
|
+
# Install system dependencies
|
|
5
|
+
RUN apt-get update && apt-get install -y \
|
|
6
|
+
gcc \
|
|
7
|
+
g++ \
|
|
8
|
+
libc6-dev \
|
|
9
|
+
libffi-dev \
|
|
10
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
11
|
+
|
|
12
|
+
# Set working directory
|
|
13
|
+
WORKDIR /app
|
|
14
|
+
|
|
15
|
+
# Copy requirements first for better caching
|
|
16
|
+
COPY requirements.txt .
|
|
17
|
+
|
|
18
|
+
# Install Python dependencies
|
|
19
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
20
|
+
|
|
21
|
+
# Install additional AI SDK dependencies (may fail gracefully)
|
|
22
|
+
RUN pip install --no-cache-dir google-genai>=1.0.0 || echo "google-genai installation skipped"
|
|
23
|
+
RUN pip install --no-cache-dir azure-ai-inference>=1.0.0b1 azure-core>=1.30.0 || echo "azure-ai-inference installation skipped"
|
|
24
|
+
RUN pip install --no-cache-dir tenacity>=8.2.0 || echo "tenacity installation skipped"
|
|
25
|
+
RUN pip install --no-cache-dir aiohttp>=3.9.0 || echo "aiohttp installation skipped"
|
|
26
|
+
|
|
27
|
+
# Copy source code
|
|
28
|
+
COPY . .
|
|
29
|
+
|
|
30
|
+
# Build the executable
|
|
31
|
+
RUN pyinstaller --onefile --name pomera-linux pomera.py
|
|
32
|
+
|
|
33
|
+
# Create output directory
|
|
34
|
+
RUN mkdir -p /output
|
|
35
|
+
|
|
36
|
+
# Copy executable to output
|
|
37
|
+
RUN cp dist/pomera-linux /output/
|
|
38
|
+
|
|
39
|
+
# Set executable permissions
|
|
40
|
+
RUN chmod +x /output/pomera-linux
|
|
41
|
+
|
|
42
|
+
# Default command
|
|
43
|
+
CMD ["cp", "/output/pomera-linux", "/host-output/"]
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Dockerfile for testing Linux executable with GUI
|
|
2
|
+
FROM ubuntu:22.04
|
|
3
|
+
|
|
4
|
+
# Avoid interactive prompts during package installation
|
|
5
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
6
|
+
|
|
7
|
+
# Install minimal desktop environment and VNC server
|
|
8
|
+
RUN apt-get update && apt-get install -y \
|
|
9
|
+
xfce4 \
|
|
10
|
+
xfce4-goodies \
|
|
11
|
+
tightvncserver \
|
|
12
|
+
novnc \
|
|
13
|
+
websockify \
|
|
14
|
+
supervisor \
|
|
15
|
+
dbus-x11 \
|
|
16
|
+
firefox \
|
|
17
|
+
xterm \
|
|
18
|
+
nano \
|
|
19
|
+
wget \
|
|
20
|
+
curl \
|
|
21
|
+
python3 \
|
|
22
|
+
python3-tk \
|
|
23
|
+
&& apt-get clean \
|
|
24
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
25
|
+
|
|
26
|
+
# Create a user for VNC
|
|
27
|
+
RUN useradd -m -s /bin/bash testuser
|
|
28
|
+
RUN echo 'testuser:password' | chpasswd
|
|
29
|
+
|
|
30
|
+
# Set up VNC for the user
|
|
31
|
+
USER testuser
|
|
32
|
+
WORKDIR /home/testuser
|
|
33
|
+
|
|
34
|
+
# Set VNC password
|
|
35
|
+
RUN mkdir -p ~/.vnc
|
|
36
|
+
RUN echo 'password' | vncpasswd -f > ~/.vnc/passwd
|
|
37
|
+
RUN chmod 600 ~/.vnc/passwd
|
|
38
|
+
|
|
39
|
+
# Create VNC startup script
|
|
40
|
+
RUN echo '#!/bin/bash' > ~/.vnc/xstartup
|
|
41
|
+
RUN echo 'xrdb $HOME/.Xresources' >> ~/.vnc/xstartup
|
|
42
|
+
RUN echo 'startxfce4 &' >> ~/.vnc/xstartup
|
|
43
|
+
RUN chmod +x ~/.vnc/xstartup
|
|
44
|
+
|
|
45
|
+
# Switch back to root for supervisor setup
|
|
46
|
+
USER root
|
|
47
|
+
|
|
48
|
+
# Create supervisor configuration
|
|
49
|
+
RUN mkdir -p /var/log/supervisor
|
|
50
|
+
COPY <<EOF /etc/supervisor/conf.d/supervisord.conf
|
|
51
|
+
[supervisord]
|
|
52
|
+
nodaemon=true
|
|
53
|
+
user=root
|
|
54
|
+
|
|
55
|
+
[program:vnc]
|
|
56
|
+
command=/usr/bin/vncserver :1 -geometry 1024x768 -depth 24
|
|
57
|
+
user=testuser
|
|
58
|
+
autostart=true
|
|
59
|
+
autorestart=true
|
|
60
|
+
stdout_logfile=/var/log/supervisor/vnc.log
|
|
61
|
+
stderr_logfile=/var/log/supervisor/vnc.log
|
|
62
|
+
|
|
63
|
+
[program:novnc]
|
|
64
|
+
command=/usr/share/novnc/utils/launch.sh --vnc localhost:5901 --listen 6080
|
|
65
|
+
user=testuser
|
|
66
|
+
autostart=true
|
|
67
|
+
autorestart=true
|
|
68
|
+
stdout_logfile=/var/log/supervisor/novnc.log
|
|
69
|
+
stderr_logfile=/var/log/supervisor/novnc.log
|
|
70
|
+
EOF
|
|
71
|
+
|
|
72
|
+
# Create directory for the executable
|
|
73
|
+
RUN mkdir -p /home/testuser/app
|
|
74
|
+
RUN chown testuser:testuser /home/testuser/app
|
|
75
|
+
|
|
76
|
+
# Expose VNC and noVNC ports
|
|
77
|
+
EXPOSE 5901 6080
|
|
78
|
+
|
|
79
|
+
# Start supervisor
|
|
80
|
+
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Ubuntu build - good compatibility with most Linux systems
|
|
2
|
+
FROM ubuntu:22.04
|
|
3
|
+
|
|
4
|
+
# Install Python and build dependencies
|
|
5
|
+
RUN apt-get update && apt-get install -y \
|
|
6
|
+
python3 \
|
|
7
|
+
python3-pip \
|
|
8
|
+
python3-dev \
|
|
9
|
+
gcc \
|
|
10
|
+
g++ \
|
|
11
|
+
libc6-dev \
|
|
12
|
+
libffi-dev \
|
|
13
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
14
|
+
|
|
15
|
+
# Set working directory
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
|
|
18
|
+
# Copy requirements and install dependencies
|
|
19
|
+
COPY requirements.txt .
|
|
20
|
+
RUN pip3 install --no-cache-dir -r requirements.txt
|
|
21
|
+
|
|
22
|
+
# Install additional AI SDK dependencies (may fail gracefully)
|
|
23
|
+
RUN pip3 install --no-cache-dir google-genai>=1.0.0 || echo "google-genai installation skipped"
|
|
24
|
+
RUN pip3 install --no-cache-dir azure-ai-inference>=1.0.0b1 azure-core>=1.30.0 || echo "azure-ai-inference installation skipped"
|
|
25
|
+
RUN pip3 install --no-cache-dir tenacity>=8.2.0 || echo "tenacity installation skipped"
|
|
26
|
+
RUN pip3 install --no-cache-dir aiohttp>=3.9.0 || echo "aiohttp installation skipped"
|
|
27
|
+
|
|
28
|
+
# Copy source code
|
|
29
|
+
COPY . .
|
|
30
|
+
|
|
31
|
+
# Build executable
|
|
32
|
+
RUN pyinstaller --onefile --name pomera-linux-ubuntu pomera.py
|
|
33
|
+
|
|
34
|
+
# Copy to output
|
|
35
|
+
RUN mkdir -p /output && \
|
|
36
|
+
cp dist/pomera-linux-ubuntu /output/ && \
|
|
37
|
+
chmod +x /output/pomera-linux-ubuntu
|
|
38
|
+
|
|
39
|
+
CMD ["cp", "/output/pomera-linux-ubuntu", "/output/"]
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Build Scripts and Tools
|
|
2
|
+
|
|
3
|
+
This directory contains all build scripts, Docker files, and build-related tools for Pomera AI Commander.
|
|
4
|
+
|
|
5
|
+
## Build Scripts
|
|
6
|
+
|
|
7
|
+
### Local Builds
|
|
8
|
+
- `build.bat` / `build.sh` - Standard local build (onedir)
|
|
9
|
+
- `build-optimized.bat` - Optimized build with maximum size reduction
|
|
10
|
+
- `build-all.bat` - Interactive menu for all build types
|
|
11
|
+
|
|
12
|
+
### Docker Builds
|
|
13
|
+
- `build-docker.bat` / `build-docker.sh` - Simple Docker Linux build
|
|
14
|
+
- `docker-compose.yml` - Multi-variant Docker builds
|
|
15
|
+
|
|
16
|
+
## Docker Files
|
|
17
|
+
- `Dockerfile.linux` - Basic Linux build (Python slim)
|
|
18
|
+
- `Dockerfile.ubuntu` - Ubuntu-based build (high compatibility)
|
|
19
|
+
- `Dockerfile.alpine` - Alpine-based build (smaller size)
|
|
20
|
+
|
|
21
|
+
## Configuration Files
|
|
22
|
+
- `requirements-minimal.txt` - Minimal dependencies for optimized builds
|
|
23
|
+
|
|
24
|
+
## Testing and Validation
|
|
25
|
+
- `validate-release-workflow.py` - Release workflow validation script
|
|
26
|
+
- `test-linux-simple.bat` - Simple Linux testing script
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
### Quick Start
|
|
31
|
+
```bash
|
|
32
|
+
# Windows - Standard build
|
|
33
|
+
scripts\build.bat
|
|
34
|
+
|
|
35
|
+
# Windows - Optimized build
|
|
36
|
+
scripts\build-optimized.bat
|
|
37
|
+
|
|
38
|
+
# Linux/macOS - Standard build
|
|
39
|
+
chmod +x scripts/build.sh
|
|
40
|
+
./scripts/build.sh
|
|
41
|
+
|
|
42
|
+
# Docker build (any platform)
|
|
43
|
+
./scripts/build-docker.sh
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Docker Multi-Platform
|
|
47
|
+
```bash
|
|
48
|
+
cd scripts
|
|
49
|
+
docker-compose up build-ubuntu # Ubuntu variant
|
|
50
|
+
docker-compose up build-alpine # Alpine variant
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
See the main [BUILD.md](../BUILD.md) for detailed documentation.
|