mantatech-sdk 0.5b0.dev65__py3-none-any.whl

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 (54) hide show
  1. manta/__init__.light.py +22 -0
  2. manta/__init__.py +83 -0
  3. manta/__main__.py +21 -0
  4. manta/apis/__init__.py +7 -0
  5. manta/apis/async_user_api.py +6458 -0
  6. manta/apis/graph.py +498 -0
  7. manta/apis/module.py +316 -0
  8. manta/apis/results.py +251 -0
  9. manta/apis/swarm.py +206 -0
  10. manta/apis/user_api.py +1016 -0
  11. manta/cli/__init__.py +1 -0
  12. manta/cli/commands/__init__.py +1 -0
  13. manta/cli/commands/base_handler.py +229 -0
  14. manta/cli/commands/doc.py +192 -0
  15. manta/cli/commands/install.py +346 -0
  16. manta/cli/commands/sdk.py +9 -0
  17. manta/cli/commands/sdk_cluster.py +211 -0
  18. manta/cli/commands/sdk_config.py +347 -0
  19. manta/cli/commands/sdk_globals.py +280 -0
  20. manta/cli/commands/sdk_logs.py +174 -0
  21. manta/cli/commands/sdk_main.py +167 -0
  22. manta/cli/commands/sdk_module.py +516 -0
  23. manta/cli/commands/sdk_nodes.py +168 -0
  24. manta/cli/commands/sdk_original.py +3873 -0
  25. manta/cli/commands/sdk_results.py +265 -0
  26. manta/cli/commands/sdk_swarm.py +454 -0
  27. manta/cli/commands/sdk_user.py +234 -0
  28. manta/cli/commands/status.py +292 -0
  29. manta/cli/component_detector.py +112 -0
  30. manta/cli/config_manager.py +445 -0
  31. manta/cli/main.py +265 -0
  32. manta/cli/utils/__init__.py +27 -0
  33. manta/cli/utils/converters.py +140 -0
  34. manta/clients/cluster_management_client.py +486 -0
  35. manta/clients/local_client.py +149 -0
  36. manta/clients/module_management_client.py +217 -0
  37. manta/clients/swarm_management_client.py +562 -0
  38. manta/clients/user_management_client.py +395 -0
  39. manta/clients/world_client.py +195 -0
  40. manta/light/__init__.py +31 -0
  41. manta/light/globals.py +245 -0
  42. manta/light/local.py +407 -0
  43. manta/light/logging_config.py +39 -0
  44. manta/light/path.py +116 -0
  45. manta/light/results.py +236 -0
  46. manta/light/task.py +100 -0
  47. manta/light/utils.py +217 -0
  48. manta/light/world.py +177 -0
  49. mantatech_sdk-0.5b0.dev65.dist-info/METADATA +1039 -0
  50. mantatech_sdk-0.5b0.dev65.dist-info/RECORD +54 -0
  51. mantatech_sdk-0.5b0.dev65.dist-info/WHEEL +5 -0
  52. mantatech_sdk-0.5b0.dev65.dist-info/entry_points.txt +2 -0
  53. mantatech_sdk-0.5b0.dev65.dist-info/licenses/LICENSE +683 -0
  54. mantatech_sdk-0.5b0.dev65.dist-info/top_level.txt +1 -0
@@ -0,0 +1,174 @@
1
+ """SDK log retrieval and streaming commands."""
2
+
3
+ import signal
4
+ import time
5
+ from typing import Optional
6
+
7
+ from rich.table import Table
8
+
9
+ from .base_handler import BaseSDKHandler
10
+ from ..utils.converters import enum_to_string, LOG_SEVERITY_MAP
11
+
12
+
13
+ class SDKLogsHandler(BaseSDKHandler):
14
+ """Handle log-related SDK commands."""
15
+
16
+ def add_subparsers(self, parent_parser):
17
+ """Add logs command subparsers."""
18
+ self.parser = parent_parser # Store parser reference
19
+ subparsers = parent_parser.add_subparsers(
20
+ dest="logs_command", help="Log commands"
21
+ )
22
+
23
+ # Get logs command
24
+ get_parser = subparsers.add_parser("get", help="Get logs for a swarm or task")
25
+ get_parser.add_argument("target_id", help="Swarm ID or Task ID to get logs for")
26
+ get_parser.add_argument(
27
+ "--type",
28
+ choices=["swarm", "task"],
29
+ default="swarm",
30
+ help="Type of target (default: swarm)",
31
+ )
32
+ get_parser.add_argument("--lines", type=int, help="Number of lines to retrieve")
33
+
34
+ # Stream logs command
35
+ stream_parser = subparsers.add_parser("stream", help="Stream logs in real-time")
36
+ stream_parser.add_argument(
37
+ "target_id", help="Swarm ID or Task ID to stream logs for"
38
+ )
39
+ stream_parser.add_argument(
40
+ "--type",
41
+ choices=["swarm", "task"],
42
+ default="swarm",
43
+ help="Type of target (default: swarm)",
44
+ )
45
+
46
+ # Add profile override to all subcommands
47
+ for parser in [get_parser, stream_parser]:
48
+ parser.add_argument("--profile", help="Use specific profile")
49
+
50
+ def handle(self, args) -> int:
51
+ """Handle logs commands."""
52
+ if not args.logs_command:
53
+ if hasattr(self, "parser"):
54
+ self.parser.print_help()
55
+ return 0 # Return 0 for help display
56
+
57
+ if args.logs_command == "get":
58
+ return self.get_logs(
59
+ args.target_id,
60
+ getattr(args, "type", "swarm"),
61
+ getattr(args, "lines", None),
62
+ )
63
+ elif args.logs_command == "stream":
64
+ return self.stream_logs(args.target_id, getattr(args, "type", "swarm"))
65
+ else:
66
+ self.print_error(f"Unknown logs command: {args.logs_command}")
67
+ return 1
68
+
69
+ def get_logs(
70
+ self, target_id: str, log_type: str = "swarm", lines: Optional[int] = None
71
+ ) -> int:
72
+ """Get logs for a swarm or task."""
73
+ api = self._get_user_api()
74
+ if not api:
75
+ return 1
76
+
77
+ try:
78
+
79
+ async def run():
80
+ if log_type == "swarm":
81
+ return await api.get_swarm_logs(target_id, lines=lines)
82
+ else:
83
+ return await api.get_task_logs(target_id, lines=lines)
84
+
85
+ logs = self._run_with_progress(
86
+ run, f"Fetching logs for {log_type} {target_id}..."
87
+ )
88
+
89
+ if logs is None:
90
+ return 1
91
+
92
+ if not logs:
93
+ self.print("No logs found.")
94
+ return 0
95
+
96
+ # Display logs
97
+ table = Table(title=f"Logs for {log_type.title()}: {target_id}")
98
+ table.add_column("Timestamp", style="cyan")
99
+ table.add_column("Level", style="blue")
100
+ table.add_column("Message", style="white")
101
+
102
+ for log_entry in logs:
103
+ # Convert log level if it's an enum
104
+ level = log_entry.get("level", "INFO")
105
+ if isinstance(level, int):
106
+ level = enum_to_string(level, LOG_SEVERITY_MAP)
107
+
108
+ table.add_row(
109
+ log_entry.get("timestamp", "Unknown"),
110
+ level,
111
+ log_entry.get("message", ""),
112
+ )
113
+
114
+ self.console.print(table)
115
+
116
+ return 0
117
+
118
+ except Exception as e:
119
+ self.print_error(f"Failed to get logs: {e}")
120
+ return 1
121
+
122
+ def stream_logs(self, target_id: str, log_type: str = "swarm") -> int:
123
+ """Stream logs in real-time."""
124
+ api = self._get_user_api()
125
+ if not api:
126
+ return 1
127
+
128
+ self.print(f"Streaming logs for {log_type}: {target_id}")
129
+ self.print("Press Ctrl+C to stop streaming...")
130
+
131
+ try:
132
+ # Set up signal handler for graceful shutdown
133
+ shutdown_flag = False
134
+
135
+ def signal_handler(sig, frame):
136
+ nonlocal shutdown_flag
137
+ shutdown_flag = True
138
+
139
+ signal.signal(signal.SIGINT, signal_handler)
140
+
141
+ last_log_count = 0
142
+
143
+ while not shutdown_flag:
144
+ try:
145
+
146
+ async def get_logs():
147
+ if log_type == "swarm":
148
+ return await api.get_swarm_logs(target_id)
149
+ else:
150
+ return await api.get_task_logs(target_id)
151
+
152
+ logs = self._run_async(get_logs())
153
+
154
+ # Show new logs since last check
155
+ if logs and len(logs) > last_log_count:
156
+ new_logs = logs[last_log_count:]
157
+
158
+ for log_entry in new_logs:
159
+ timestamp = log_entry.get("timestamp", "unknown")
160
+ level = log_entry.get("level", "INFO")
161
+ message = log_entry.get("message", "")
162
+ self.print(f"[{timestamp}] {level}: {message}")
163
+
164
+ last_log_count = len(logs)
165
+
166
+ time.sleep(2) # Poll every 2 seconds for logs
167
+
168
+ except KeyboardInterrupt:
169
+ self.print("\nLog streaming stopped.")
170
+ return 130 # KeyboardInterrupt exit code
171
+
172
+ except Exception as e:
173
+ self.print_error(f"Log streaming failed: {e}")
174
+ return 1
@@ -0,0 +1,167 @@
1
+ """Main SDK commands class that delegates to modular command handlers."""
2
+
3
+ from typing import Optional
4
+
5
+ from rich.console import Console
6
+
7
+ from ..config_manager import SDKConfigManager
8
+
9
+ # User commands removed - unified into config commands
10
+ from .sdk_module import SDKModuleHandler
11
+ from .sdk_swarm import SDKSwarmHandler
12
+ from .sdk_cluster import SDKClusterHandler
13
+ from .sdk_results import SDKResultsHandler
14
+ from .sdk_globals import SDKGlobalsHandler
15
+
16
+ # Removed SDKNodesHandler - node operations should use 'manta node' commands
17
+ from .sdk_logs import SDKLogsHandler
18
+ from .sdk_config import SDKConfigHandler
19
+
20
+
21
+ class SDKCommands:
22
+ """Main SDK commands class that delegates to modular handlers."""
23
+
24
+ def __init__(self, console: Optional[Console] = None):
25
+ """Initialize with optional console (for backwards compatibility with CLI)."""
26
+ self.console = console or Console()
27
+
28
+ # Initialize config manager - will be properly instantiated when needed
29
+ self.config_manager = None
30
+
31
+ # Initialize handlers - will be created lazily
32
+ self._handlers = {}
33
+
34
+ def _ensure_managers(self):
35
+ """Ensure config manager is initialized."""
36
+ if self.config_manager is None:
37
+ self.config_manager = SDKConfigManager()
38
+
39
+ def _get_handler(self, handler_name: str):
40
+ """Get or create a command handler."""
41
+ if handler_name not in self._handlers:
42
+ self._ensure_managers()
43
+
44
+ handler_classes = {
45
+ # 'user' removed - unified into config
46
+ "module": SDKModuleHandler,
47
+ "swarm": SDKSwarmHandler,
48
+ "cluster": SDKClusterHandler,
49
+ "results": SDKResultsHandler,
50
+ "globals": SDKGlobalsHandler,
51
+ "logs": SDKLogsHandler,
52
+ "config": SDKConfigHandler,
53
+ }
54
+
55
+ if handler_name not in handler_classes:
56
+ raise ValueError(f"Unknown handler: {handler_name}")
57
+
58
+ handler_class = handler_classes[handler_name]
59
+ self._handlers[handler_name] = handler_class(
60
+ self.console, self.config_manager
61
+ )
62
+
63
+ return self._handlers[handler_name]
64
+
65
+ def handle(self, args) -> int:
66
+ """Handle SDK commands by delegating to appropriate handlers."""
67
+ # Extract the primary command
68
+ if hasattr(args, "sdk_command"):
69
+ command = args.sdk_command
70
+ else:
71
+ # Fallback for direct usage
72
+ command = getattr(args, "command", None)
73
+
74
+ if not command:
75
+ self.console.print("[red]Error:[/red] No command specified")
76
+ return 1
77
+
78
+ # Set config override if specified
79
+ config_override = getattr(args, "config", None)
80
+
81
+ # Map commands to handlers
82
+ command_mapping = {
83
+ # 'user' removed - unified into config
84
+ "cluster": "cluster",
85
+ "module": "module",
86
+ "swarm": "swarm",
87
+ "results": "results",
88
+ "globals": "globals",
89
+ "logs": "logs",
90
+ "config": "config",
91
+ }
92
+
93
+ handler_name = command_mapping.get(command)
94
+ if not handler_name:
95
+ self.console.print(f"[red]Error:[/red] Unknown SDK command: {command}")
96
+ return 1
97
+
98
+ try:
99
+ handler = self._get_handler(handler_name)
100
+
101
+ # Set config override if specified
102
+ if config_override:
103
+ handler.set_profile_override(config_override)
104
+
105
+ return handler.handle(args)
106
+
107
+ except Exception as e:
108
+ self.console.print(f"[red]Error:[/red] Failed to execute command: {e}")
109
+ return 1
110
+
111
+ def add_subparsers(self, parent_parser):
112
+ """Add all SDK subcommands to the parent parser."""
113
+ # Ensure managers are initialized for handler creation
114
+ self._ensure_managers()
115
+
116
+ # User commands removed - unified into config
117
+
118
+ # Module commands
119
+ module_parser = parent_parser.add_parser(
120
+ "module", help="Module management operations"
121
+ )
122
+ module_handler = self._get_handler("module")
123
+ module_handler.add_subparsers(module_parser)
124
+
125
+ # Swarm commands
126
+ swarm_parser = parent_parser.add_parser(
127
+ "swarm", help="Swarm deployment and management"
128
+ )
129
+ swarm_handler = self._get_handler("swarm")
130
+ swarm_handler.add_subparsers(swarm_parser)
131
+
132
+ # Cluster commands
133
+ cluster_parser = parent_parser.add_parser(
134
+ "cluster", help="Cluster information and management"
135
+ )
136
+ cluster_handler = self._get_handler("cluster")
137
+ cluster_handler.add_subparsers(cluster_parser)
138
+
139
+ # Results commands
140
+ results_parser = parent_parser.add_parser(
141
+ "results", help="Results retrieval and management"
142
+ )
143
+ results_handler = self._get_handler("results")
144
+ results_handler.add_subparsers(results_parser)
145
+
146
+ # Globals commands
147
+ globals_parser = parent_parser.add_parser(
148
+ "globals", help="Globals retrieval and management"
149
+ )
150
+ globals_handler = self._get_handler("globals")
151
+ globals_handler.add_subparsers(globals_parser)
152
+
153
+ # Node commands removed - use 'manta node' instead
154
+
155
+ # Logs commands
156
+ logs_parser = parent_parser.add_parser(
157
+ "logs", help="Log retrieval and streaming"
158
+ )
159
+ logs_handler = self._get_handler("logs")
160
+ logs_handler.add_subparsers(logs_parser)
161
+
162
+ # Config commands
163
+ config_parser = parent_parser.add_parser(
164
+ "config", help="Configuration management"
165
+ )
166
+ config_handler = self._get_handler("config")
167
+ config_handler.add_subparsers(config_parser)