mcli-framework 7.0.0__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.

Potentially problematic release.


This version of mcli-framework might be problematic. Click here for more details.

Files changed (186) hide show
  1. mcli/app/chat_cmd.py +42 -0
  2. mcli/app/commands_cmd.py +226 -0
  3. mcli/app/completion_cmd.py +216 -0
  4. mcli/app/completion_helpers.py +288 -0
  5. mcli/app/cron_test_cmd.py +697 -0
  6. mcli/app/logs_cmd.py +419 -0
  7. mcli/app/main.py +492 -0
  8. mcli/app/model/model.py +1060 -0
  9. mcli/app/model_cmd.py +227 -0
  10. mcli/app/redis_cmd.py +269 -0
  11. mcli/app/video/video.py +1114 -0
  12. mcli/app/visual_cmd.py +303 -0
  13. mcli/chat/chat.py +2409 -0
  14. mcli/chat/command_rag.py +514 -0
  15. mcli/chat/enhanced_chat.py +652 -0
  16. mcli/chat/system_controller.py +1010 -0
  17. mcli/chat/system_integration.py +1016 -0
  18. mcli/cli.py +25 -0
  19. mcli/config.toml +20 -0
  20. mcli/lib/api/api.py +586 -0
  21. mcli/lib/api/daemon_client.py +203 -0
  22. mcli/lib/api/daemon_client_local.py +44 -0
  23. mcli/lib/api/daemon_decorator.py +217 -0
  24. mcli/lib/api/mcli_decorators.py +1032 -0
  25. mcli/lib/auth/auth.py +85 -0
  26. mcli/lib/auth/aws_manager.py +85 -0
  27. mcli/lib/auth/azure_manager.py +91 -0
  28. mcli/lib/auth/credential_manager.py +192 -0
  29. mcli/lib/auth/gcp_manager.py +93 -0
  30. mcli/lib/auth/key_manager.py +117 -0
  31. mcli/lib/auth/mcli_manager.py +93 -0
  32. mcli/lib/auth/token_manager.py +75 -0
  33. mcli/lib/auth/token_util.py +1011 -0
  34. mcli/lib/config/config.py +47 -0
  35. mcli/lib/discovery/__init__.py +1 -0
  36. mcli/lib/discovery/command_discovery.py +274 -0
  37. mcli/lib/erd/erd.py +1345 -0
  38. mcli/lib/erd/generate_graph.py +453 -0
  39. mcli/lib/files/files.py +76 -0
  40. mcli/lib/fs/fs.py +109 -0
  41. mcli/lib/lib.py +29 -0
  42. mcli/lib/logger/logger.py +611 -0
  43. mcli/lib/performance/optimizer.py +409 -0
  44. mcli/lib/performance/rust_bridge.py +502 -0
  45. mcli/lib/performance/uvloop_config.py +154 -0
  46. mcli/lib/pickles/pickles.py +50 -0
  47. mcli/lib/search/cached_vectorizer.py +479 -0
  48. mcli/lib/services/data_pipeline.py +460 -0
  49. mcli/lib/services/lsh_client.py +441 -0
  50. mcli/lib/services/redis_service.py +387 -0
  51. mcli/lib/shell/shell.py +137 -0
  52. mcli/lib/toml/toml.py +33 -0
  53. mcli/lib/ui/styling.py +47 -0
  54. mcli/lib/ui/visual_effects.py +634 -0
  55. mcli/lib/watcher/watcher.py +185 -0
  56. mcli/ml/api/app.py +215 -0
  57. mcli/ml/api/middleware.py +224 -0
  58. mcli/ml/api/routers/admin_router.py +12 -0
  59. mcli/ml/api/routers/auth_router.py +244 -0
  60. mcli/ml/api/routers/backtest_router.py +12 -0
  61. mcli/ml/api/routers/data_router.py +12 -0
  62. mcli/ml/api/routers/model_router.py +302 -0
  63. mcli/ml/api/routers/monitoring_router.py +12 -0
  64. mcli/ml/api/routers/portfolio_router.py +12 -0
  65. mcli/ml/api/routers/prediction_router.py +267 -0
  66. mcli/ml/api/routers/trade_router.py +12 -0
  67. mcli/ml/api/routers/websocket_router.py +76 -0
  68. mcli/ml/api/schemas.py +64 -0
  69. mcli/ml/auth/auth_manager.py +425 -0
  70. mcli/ml/auth/models.py +154 -0
  71. mcli/ml/auth/permissions.py +302 -0
  72. mcli/ml/backtesting/backtest_engine.py +502 -0
  73. mcli/ml/backtesting/performance_metrics.py +393 -0
  74. mcli/ml/cache.py +400 -0
  75. mcli/ml/cli/main.py +398 -0
  76. mcli/ml/config/settings.py +394 -0
  77. mcli/ml/configs/dvc_config.py +230 -0
  78. mcli/ml/configs/mlflow_config.py +131 -0
  79. mcli/ml/configs/mlops_manager.py +293 -0
  80. mcli/ml/dashboard/app.py +532 -0
  81. mcli/ml/dashboard/app_integrated.py +738 -0
  82. mcli/ml/dashboard/app_supabase.py +560 -0
  83. mcli/ml/dashboard/app_training.py +615 -0
  84. mcli/ml/dashboard/cli.py +51 -0
  85. mcli/ml/data_ingestion/api_connectors.py +501 -0
  86. mcli/ml/data_ingestion/data_pipeline.py +567 -0
  87. mcli/ml/data_ingestion/stream_processor.py +512 -0
  88. mcli/ml/database/migrations/env.py +94 -0
  89. mcli/ml/database/models.py +667 -0
  90. mcli/ml/database/session.py +200 -0
  91. mcli/ml/experimentation/ab_testing.py +845 -0
  92. mcli/ml/features/ensemble_features.py +607 -0
  93. mcli/ml/features/political_features.py +676 -0
  94. mcli/ml/features/recommendation_engine.py +809 -0
  95. mcli/ml/features/stock_features.py +573 -0
  96. mcli/ml/features/test_feature_engineering.py +346 -0
  97. mcli/ml/logging.py +85 -0
  98. mcli/ml/mlops/data_versioning.py +518 -0
  99. mcli/ml/mlops/experiment_tracker.py +377 -0
  100. mcli/ml/mlops/model_serving.py +481 -0
  101. mcli/ml/mlops/pipeline_orchestrator.py +614 -0
  102. mcli/ml/models/base_models.py +324 -0
  103. mcli/ml/models/ensemble_models.py +675 -0
  104. mcli/ml/models/recommendation_models.py +474 -0
  105. mcli/ml/models/test_models.py +487 -0
  106. mcli/ml/monitoring/drift_detection.py +676 -0
  107. mcli/ml/monitoring/metrics.py +45 -0
  108. mcli/ml/optimization/portfolio_optimizer.py +834 -0
  109. mcli/ml/preprocessing/data_cleaners.py +451 -0
  110. mcli/ml/preprocessing/feature_extractors.py +491 -0
  111. mcli/ml/preprocessing/ml_pipeline.py +382 -0
  112. mcli/ml/preprocessing/politician_trading_preprocessor.py +569 -0
  113. mcli/ml/preprocessing/test_preprocessing.py +294 -0
  114. mcli/ml/scripts/populate_sample_data.py +200 -0
  115. mcli/ml/tasks.py +400 -0
  116. mcli/ml/tests/test_integration.py +429 -0
  117. mcli/ml/tests/test_training_dashboard.py +387 -0
  118. mcli/public/oi/oi.py +15 -0
  119. mcli/public/public.py +4 -0
  120. mcli/self/self_cmd.py +1246 -0
  121. mcli/workflow/daemon/api_daemon.py +800 -0
  122. mcli/workflow/daemon/async_command_database.py +681 -0
  123. mcli/workflow/daemon/async_process_manager.py +591 -0
  124. mcli/workflow/daemon/client.py +530 -0
  125. mcli/workflow/daemon/commands.py +1196 -0
  126. mcli/workflow/daemon/daemon.py +905 -0
  127. mcli/workflow/daemon/daemon_api.py +59 -0
  128. mcli/workflow/daemon/enhanced_daemon.py +571 -0
  129. mcli/workflow/daemon/process_cli.py +244 -0
  130. mcli/workflow/daemon/process_manager.py +439 -0
  131. mcli/workflow/daemon/test_daemon.py +275 -0
  132. mcli/workflow/dashboard/dashboard_cmd.py +113 -0
  133. mcli/workflow/docker/docker.py +0 -0
  134. mcli/workflow/file/file.py +100 -0
  135. mcli/workflow/gcloud/config.toml +21 -0
  136. mcli/workflow/gcloud/gcloud.py +58 -0
  137. mcli/workflow/git_commit/ai_service.py +328 -0
  138. mcli/workflow/git_commit/commands.py +430 -0
  139. mcli/workflow/lsh_integration.py +355 -0
  140. mcli/workflow/model_service/client.py +594 -0
  141. mcli/workflow/model_service/download_and_run_efficient_models.py +288 -0
  142. mcli/workflow/model_service/lightweight_embedder.py +397 -0
  143. mcli/workflow/model_service/lightweight_model_server.py +714 -0
  144. mcli/workflow/model_service/lightweight_test.py +241 -0
  145. mcli/workflow/model_service/model_service.py +1955 -0
  146. mcli/workflow/model_service/ollama_efficient_runner.py +425 -0
  147. mcli/workflow/model_service/pdf_processor.py +386 -0
  148. mcli/workflow/model_service/test_efficient_runner.py +234 -0
  149. mcli/workflow/model_service/test_example.py +315 -0
  150. mcli/workflow/model_service/test_integration.py +131 -0
  151. mcli/workflow/model_service/test_new_features.py +149 -0
  152. mcli/workflow/openai/openai.py +99 -0
  153. mcli/workflow/politician_trading/commands.py +1790 -0
  154. mcli/workflow/politician_trading/config.py +134 -0
  155. mcli/workflow/politician_trading/connectivity.py +490 -0
  156. mcli/workflow/politician_trading/data_sources.py +395 -0
  157. mcli/workflow/politician_trading/database.py +410 -0
  158. mcli/workflow/politician_trading/demo.py +248 -0
  159. mcli/workflow/politician_trading/models.py +165 -0
  160. mcli/workflow/politician_trading/monitoring.py +413 -0
  161. mcli/workflow/politician_trading/scrapers.py +966 -0
  162. mcli/workflow/politician_trading/scrapers_california.py +412 -0
  163. mcli/workflow/politician_trading/scrapers_eu.py +377 -0
  164. mcli/workflow/politician_trading/scrapers_uk.py +350 -0
  165. mcli/workflow/politician_trading/scrapers_us_states.py +438 -0
  166. mcli/workflow/politician_trading/supabase_functions.py +354 -0
  167. mcli/workflow/politician_trading/workflow.py +852 -0
  168. mcli/workflow/registry/registry.py +180 -0
  169. mcli/workflow/repo/repo.py +223 -0
  170. mcli/workflow/scheduler/commands.py +493 -0
  171. mcli/workflow/scheduler/cron_parser.py +238 -0
  172. mcli/workflow/scheduler/job.py +182 -0
  173. mcli/workflow/scheduler/monitor.py +139 -0
  174. mcli/workflow/scheduler/persistence.py +324 -0
  175. mcli/workflow/scheduler/scheduler.py +679 -0
  176. mcli/workflow/sync/sync_cmd.py +437 -0
  177. mcli/workflow/sync/test_cmd.py +314 -0
  178. mcli/workflow/videos/videos.py +242 -0
  179. mcli/workflow/wakatime/wakatime.py +11 -0
  180. mcli/workflow/workflow.py +37 -0
  181. mcli_framework-7.0.0.dist-info/METADATA +479 -0
  182. mcli_framework-7.0.0.dist-info/RECORD +186 -0
  183. mcli_framework-7.0.0.dist-info/WHEEL +5 -0
  184. mcli_framework-7.0.0.dist-info/entry_points.txt +7 -0
  185. mcli_framework-7.0.0.dist-info/licenses/LICENSE +21 -0
  186. mcli_framework-7.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,288 @@
1
+ """
2
+ Completion helpers for MCLI that provide tab completion without loading heavy modules
3
+ """
4
+
5
+ from typing import List, Dict, Any
6
+ import click
7
+ from click.shell_completion import CompletionItem
8
+
9
+ # Static completion data for lazy-loaded commands
10
+ LAZY_COMMAND_COMPLETIONS = {
11
+ "workflow": {
12
+ "subcommands": [
13
+ "api-daemon",
14
+ "daemon",
15
+ "file",
16
+ "politician-trading",
17
+ "scheduler",
18
+ "sync",
19
+ "videos"
20
+ ],
21
+ "politician-trading": {
22
+ "subcommands": [
23
+ "connectivity",
24
+ "cron-job",
25
+ "data-sources",
26
+ "disclosures",
27
+ "health",
28
+ "jobs",
29
+ "monitor",
30
+ "politicians",
31
+ "run",
32
+ "schema",
33
+ "setup",
34
+ "stats",
35
+ "status",
36
+ "test-workflow",
37
+ "verify"
38
+ ],
39
+ "cron-job": {
40
+ "options": ["--create", "--test"]
41
+ },
42
+ "setup": {
43
+ "options": ["--create-tables", "--verify", "--generate-schema", "--output-dir"]
44
+ },
45
+ "run": {
46
+ "options": ["--full", "--us-only", "--eu-only"]
47
+ },
48
+ "connectivity": {
49
+ "options": ["--json", "--continuous", "--interval", "--duration"]
50
+ },
51
+ "health": {
52
+ "options": ["--json"]
53
+ },
54
+ "monitor": {
55
+ "options": ["--interval", "--count"]
56
+ },
57
+ "status": {
58
+ "options": ["--json"]
59
+ },
60
+ "stats": {
61
+ "options": ["--json"]
62
+ },
63
+ "test-workflow": {
64
+ "options": ["--verbose", "--validate-writes"]
65
+ },
66
+ "schema": {
67
+ "options": ["--show-location", "--generate", "--output-dir"]
68
+ },
69
+ "data-sources": {
70
+ "options": ["--json"]
71
+ },
72
+ "jobs": {
73
+ "options": ["--json", "--limit"]
74
+ },
75
+ "politicians": {
76
+ "options": ["--json", "--limit", "--role", "--party", "--state", "--search"]
77
+ },
78
+ "disclosures": {
79
+ "options": ["--json", "--limit", "--politician", "--asset", "--transaction-type", "--amount-min", "--amount-max", "--days", "--details"]
80
+ },
81
+ "verify": {
82
+ "options": ["--json"]
83
+ }
84
+ },
85
+ "scheduler": {
86
+ "subcommands": [
87
+ "add",
88
+ "cancel",
89
+ "list",
90
+ "monitor",
91
+ "remove",
92
+ "start",
93
+ "status",
94
+ "stop"
95
+ ]
96
+ },
97
+ "daemon": {
98
+ "subcommands": [
99
+ "start",
100
+ "stop",
101
+ "status",
102
+ "logs"
103
+ ]
104
+ },
105
+ "api-daemon": {
106
+ "subcommands": [
107
+ "start",
108
+ "stop",
109
+ "status",
110
+ "logs"
111
+ ]
112
+ },
113
+ "videos": {
114
+ "subcommands": [
115
+ "remove-overlay",
116
+ "extract-frames",
117
+ "create-video"
118
+ ]
119
+ },
120
+ "sync": {
121
+ "subcommands": [
122
+ "status",
123
+ "sync"
124
+ ]
125
+ },
126
+ "file": {
127
+ "subcommands": [
128
+ "search",
129
+ "organize"
130
+ ]
131
+ }
132
+ },
133
+ "chat": {
134
+ "options": ["--model", "--system", "--temperature", "--max-tokens", "--stream"]
135
+ },
136
+ "model": {
137
+ "subcommands": [
138
+ "download",
139
+ "list",
140
+ "remove",
141
+ "info"
142
+ ]
143
+ },
144
+ "cron-test": {
145
+ "options": ["--quick", "--cleanup", "--verbose"]
146
+ },
147
+ "visual": {
148
+ "subcommands": [
149
+ "demo",
150
+ "spinner-test"
151
+ ]
152
+ },
153
+ "redis": {
154
+ "subcommands": [
155
+ "start",
156
+ "stop",
157
+ "status",
158
+ "flush"
159
+ ]
160
+ },
161
+ "logs": {
162
+ "subcommands": [
163
+ "tail",
164
+ "view",
165
+ "clear"
166
+ ]
167
+ },
168
+ "completion": {
169
+ "subcommands": [
170
+ "bash",
171
+ "zsh",
172
+ "fish",
173
+ "install",
174
+ "status"
175
+ ],
176
+ "install": {
177
+ "options": ["--shell"]
178
+ }
179
+ }
180
+ }
181
+
182
+
183
+ def get_completion_items(cmd_path: List[str], incomplete: str = "") -> List[CompletionItem]:
184
+ """Get completion items for a given command path without loading modules"""
185
+ items = []
186
+
187
+ # Navigate to the completion data for this path
188
+ current_data = LAZY_COMMAND_COMPLETIONS
189
+
190
+ for part in cmd_path:
191
+ if part in current_data:
192
+ current_data = current_data[part]
193
+ else:
194
+ return items # No completion data available
195
+
196
+ # Add subcommands
197
+ if "subcommands" in current_data:
198
+ for subcommand in current_data["subcommands"]:
199
+ if subcommand.startswith(incomplete):
200
+ items.append(CompletionItem(subcommand))
201
+
202
+ # Add options
203
+ if "options" in current_data:
204
+ for option in current_data["options"]:
205
+ if option.startswith(incomplete):
206
+ items.append(CompletionItem(option))
207
+
208
+ return items
209
+
210
+
211
+ class CompletionAwareLazyGroup(click.Group):
212
+ """A Click group that provides completion without loading modules"""
213
+
214
+ def __init__(self, name, import_path, *args, **kwargs):
215
+ self.import_path = import_path
216
+ self._loaded_group = None
217
+ super().__init__(name, *args, **kwargs)
218
+
219
+ def _load_group(self):
220
+ """Load the actual group on first use."""
221
+ if self._loaded_group is None:
222
+ try:
223
+ import importlib
224
+ module_path, attr_name = self.import_path.rsplit(".", 1)
225
+ module = importlib.import_module(module_path)
226
+ self._loaded_group = getattr(module, attr_name)
227
+ except Exception as e:
228
+ # Return a dummy group that shows an error
229
+ def error_callback():
230
+ click.echo(f"Error: Command group {self.name} is not available")
231
+ self._loaded_group = click.Group(self.name, callback=error_callback)
232
+ return self._loaded_group
233
+
234
+ def invoke(self, ctx):
235
+ """Invoke the lazily loaded group."""
236
+ group = self._load_group()
237
+ return group.invoke(ctx)
238
+
239
+ def get_command(self, ctx, cmd_name):
240
+ """Get a command from the lazily loaded group."""
241
+ group = self._load_group()
242
+ return group.get_command(ctx, cmd_name)
243
+
244
+ def list_commands(self, ctx):
245
+ """List commands from completion data first, then load if needed."""
246
+ # Always try to get from static completion data first for workflow
247
+ if self.name == "workflow" and self.name in LAZY_COMMAND_COMPLETIONS:
248
+ data = LAZY_COMMAND_COMPLETIONS[self.name]
249
+ if "subcommands" in data:
250
+ return sorted(data["subcommands"])
251
+
252
+ # Try to get from static completion data for other commands
253
+ if self.name in LAZY_COMMAND_COMPLETIONS:
254
+ data = LAZY_COMMAND_COMPLETIONS[self.name]
255
+ if "subcommands" in data:
256
+ return sorted(data["subcommands"])
257
+
258
+ # Fallback to loading the actual group
259
+ group = self._load_group()
260
+ return group.list_commands(ctx)
261
+
262
+ def shell_complete(self, ctx, incomplete):
263
+ """Provide shell completion using static data when possible."""
264
+ # For workflow group, provide static subcommand completions
265
+ if self.name in LAZY_COMMAND_COMPLETIONS:
266
+ data = LAZY_COMMAND_COMPLETIONS[self.name]
267
+ if "subcommands" in data:
268
+ items = []
269
+ for subcommand in data["subcommands"]:
270
+ if subcommand.startswith(incomplete):
271
+ items.append(CompletionItem(subcommand))
272
+ return items
273
+
274
+ # Fallback to loading the actual group
275
+ group = self._load_group()
276
+ if hasattr(group, 'shell_complete'):
277
+ return group.shell_complete(ctx, incomplete)
278
+ return []
279
+
280
+ def get_params(self, ctx):
281
+ """Get parameters from the lazily loaded group."""
282
+ group = self._load_group()
283
+ return group.get_params(ctx)
284
+
285
+
286
+ def create_completion_aware_lazy_group(name: str, import_path: str, help_text: str = None) -> CompletionAwareLazyGroup:
287
+ """Create a completion-aware lazy group"""
288
+ return CompletionAwareLazyGroup(name, import_path, help=help_text)