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,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 logging
43
- import argparse
44
-
45
- # Add project root to path for imports
46
- PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
47
- if PROJECT_ROOT not in sys.path:
48
- sys.path.insert(0, PROJECT_ROOT)
49
-
50
- # Configure logging to stderr (stdout is used for MCP communication)
51
- logging.basicConfig(
52
- level=logging.INFO,
53
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
54
- stream=sys.stderr
55
- )
56
- logger = logging.getLogger(__name__)
57
-
58
-
59
- def main():
60
- """Main entry point for the Pomera MCP server."""
61
- parser = argparse.ArgumentParser(
62
- description="Pomera MCP Server - Expose text tools via Model Context Protocol"
63
- )
64
- parser.add_argument(
65
- "--debug",
66
- action="store_true",
67
- help="Enable debug logging"
68
- )
69
- parser.add_argument(
70
- "--version",
71
- action="version",
72
- version="pomera-mcp-server 1.1.1"
73
- )
74
- parser.add_argument(
75
- "--list-tools",
76
- action="store_true",
77
- help="List available tools and exit"
78
- )
79
-
80
- args = parser.parse_args()
81
-
82
- if args.debug:
83
- logging.getLogger().setLevel(logging.DEBUG)
84
- logger.debug("Debug logging enabled")
85
-
86
- # Import MCP modules
87
- try:
88
- from core.mcp.tool_registry import ToolRegistry
89
- from core.mcp.server_stdio import StdioMCPServer
90
- except ImportError as e:
91
- logger.error(f"Failed to import MCP modules: {e}")
92
- logger.error("Make sure you're running from the Pomera-AI-Commander directory")
93
- sys.exit(1)
94
-
95
- # Create tool registry
96
- try:
97
- registry = ToolRegistry()
98
- logger.info(f"Loaded {len(registry)} tools")
99
- except Exception as e:
100
- logger.error(f"Failed to create tool registry: {e}")
101
- sys.exit(1)
102
-
103
- # List tools mode
104
- if args.list_tools:
105
- print("Available Pomera MCP Tools:")
106
- print("-" * 60)
107
- for tool in registry.list_tools():
108
- print(f"\n{tool.name}")
109
- print(f" {tool.description}")
110
- if "properties" in tool.inputSchema:
111
- print(" Parameters:")
112
- for prop_name, prop_def in tool.inputSchema["properties"].items():
113
- prop_type = prop_def.get("type", "any")
114
- prop_desc = prop_def.get("description", "")
115
- required = prop_name in tool.inputSchema.get("required", [])
116
- req_marker = "*" if required else ""
117
- print(f" - {prop_name}{req_marker} ({prop_type}): {prop_desc}")
118
- return
119
-
120
- # Create and run server
121
- server = StdioMCPServer(
122
- tool_registry=registry,
123
- server_name="pomera-mcp-server",
124
- server_version="1.1.1"
125
- )
126
-
127
- logger.info("Starting Pomera MCP Server...")
128
- logger.info(f"Available tools: {', '.join(registry.get_tool_names())}")
129
-
130
- try:
131
- # Run synchronously (simpler for stdio)
132
- server.run_sync()
133
- except KeyboardInterrupt:
134
- logger.info("Server interrupted by user")
135
- except Exception as e:
136
- logger.exception(f"Server error: {e}")
137
- sys.exit(1)
138
-
139
- logger.info("Server shutdown complete")
140
-
141
-
142
- if __name__ == "__main__":
143
- main()
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
+
@@ -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.