mcli-framework 8.0.67__tar.gz → 8.0.69__tar.gz

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 (239) hide show
  1. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/MANIFEST.in +1 -1
  2. {mcli_framework-8.0.67/src/mcli_framework.egg-info → mcli_framework-8.0.69}/PKG-INFO +1 -1
  3. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/mcli_rust/Cargo.toml +1 -1
  4. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/pyproject.toml +1 -1
  5. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/import_cmd.py +14 -14
  6. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/model/model.py +21 -21
  7. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/sync_cmd.py +3 -3
  8. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/video/video.py +21 -21
  9. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/config.toml +1 -1
  10. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/api/api.py +16 -15
  11. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/api/daemon_client.py +17 -17
  12. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/api/daemon_client_local.py +3 -3
  13. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/api/daemon_decorator.py +2 -2
  14. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/credential_manager.py +3 -3
  15. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/mcli_manager.py +1 -1
  16. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/config/settings.py +1 -1
  17. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/commands.py +3 -3
  18. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/defaults.py +17 -2
  19. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/env.py +2 -0
  20. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/scripts.py +8 -8
  21. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/discovery/command_discovery.py +5 -5
  22. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/erd/erd.py +31 -31
  23. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/erd/generate_graph.py +1 -1
  24. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/errors.py +3 -3
  25. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/feature_detection.py +1 -1
  26. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/files/files.py +1 -1
  27. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/folder_workflows.py +6 -6
  28. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/fs/fs.py +1 -1
  29. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/ipfs_sync.py +41 -43
  30. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/ipfs_utils.py +3 -3
  31. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/logger/correlation.py +2 -1
  32. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/logger/logger.py +54 -8
  33. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/logger/structured.py +6 -5
  34. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/optional_deps.py +3 -3
  35. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/performance/optimizer.py +9 -9
  36. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/performance/rust_bridge.py +15 -15
  37. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/pickles/pickles.py +4 -4
  38. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/deps.py +5 -5
  39. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/data_pipeline.py +20 -20
  40. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/lsh_client.py +26 -26
  41. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/manager.py +4 -4
  42. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/registry.py +3 -3
  43. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/state.py +1 -1
  44. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/supervisor.py +3 -3
  45. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/shell/exceptions.py +9 -9
  46. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/sync_key_store.py +1 -1
  47. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/types.py +8 -8
  48. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/workspace_registry.py +6 -6
  49. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/base.py +7 -7
  50. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/ci/act_runner.py +48 -30
  51. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/ci/ci.py +18 -3
  52. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/async_command_database.py +15 -15
  53. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/async_process_manager.py +12 -12
  54. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/client.py +8 -8
  55. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/daemon.py +23 -23
  56. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/daemon_api.py +3 -3
  57. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/enhanced_daemon.py +6 -6
  58. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/process_manager.py +15 -15
  59. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/test_daemon.py +0 -0
  60. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/doc_convert.py +3 -3
  61. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/gcloud/config.toml +1 -1
  62. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/git_commit/ai_service.py +8 -8
  63. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/client.py +9 -9
  64. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +1 -1
  65. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/lightweight_embedder.py +8 -8
  66. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/lightweight_model_server.py +7 -7
  67. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
  68. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/ollama_efficient_runner.py +10 -10
  69. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/openai_adapter.py +10 -9
  70. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/pdf_processor.py +5 -5
  71. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
  72. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_example.py +0 -0
  73. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_integration.py +0 -0
  74. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/test_new_features.py +0 -0
  75. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/command_loader.py +2 -1
  76. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/converter.py +9 -9
  77. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/validator.py +6 -6
  78. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/registry/registry.py +5 -5
  79. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/repo/repo.py +1 -1
  80. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/cron_parser.py +3 -3
  81. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/job.py +4 -4
  82. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/monitor.py +3 -3
  83. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/scheduler.py +16 -16
  84. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/sync/test_cmd.py +4 -4
  85. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/wakatime/__init__.py +12 -15
  86. {mcli_framework-8.0.67 → mcli_framework-8.0.69/src/mcli_framework.egg-info}/PKG-INFO +1 -1
  87. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/LICENSE +0 -0
  88. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/README.md +0 -0
  89. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/llms-full.txt +0 -0
  90. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/llms.txt +0 -0
  91. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/mcli_rust/src/command_parser.rs +0 -0
  92. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/mcli_rust/src/file_watcher.rs +0 -0
  93. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/mcli_rust/src/lib.rs +0 -0
  94. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/mcli_rust/src/process_manager.rs +0 -0
  95. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/mcli_rust/src/tfidf.rs +0 -0
  96. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/setup.cfg +0 -0
  97. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/__init__.py +0 -0
  98. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/__main__.py +0 -0
  99. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/__init__.py +0 -0
  100. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/completion_helpers.py +0 -0
  101. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/context_cmd.py +0 -0
  102. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/delete_cmd.py +0 -0
  103. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/edit_cmd.py +0 -0
  104. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/init_cmd.py +0 -0
  105. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/list_cmd.py +0 -0
  106. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/main.py +0 -0
  107. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/model/__init__.py +0 -0
  108. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/model_cmd.py +0 -0
  109. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/mv_cmd.py +0 -0
  110. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/new_cmd.py +0 -0
  111. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/search_cmd.py +0 -0
  112. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/services_cmd.py +0 -0
  113. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/setup_cmd.py +0 -0
  114. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/source_sync_cmd.py +0 -0
  115. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/app/video/__init__.py +0 -0
  116. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/__init__.py +0 -0
  117. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/api/__init__.py +0 -0
  118. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/api/mcli_decorators.py +0 -0
  119. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/__init__.py +0 -0
  120. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/auth.py +0 -0
  121. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/aws_manager.py +0 -0
  122. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/azure_manager.py +0 -0
  123. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/gcp_manager.py +0 -0
  124. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/key_manager.py +0 -0
  125. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/token_manager.py +0 -0
  126. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/auth/token_util.py +0 -0
  127. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/config/__init__.py +0 -0
  128. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/config/config.py +0 -0
  129. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/__init__.py +0 -0
  130. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/messages.py +0 -0
  131. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/paths.py +0 -0
  132. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/constants/storage.py +0 -0
  133. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/custom_commands.py +0 -0
  134. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/discovery/__init__.py +0 -0
  135. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/erd/__init__.py +0 -0
  136. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/files/__init__.py +0 -0
  137. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/fs/__init__.py +0 -0
  138. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/ipns_manager.py +0 -0
  139. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/lib.py +0 -0
  140. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/logger/__init__.py +0 -0
  141. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/paths.py +0 -0
  142. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/performance/__init__.py +0 -0
  143. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/performance/uvloop_config.py +0 -0
  144. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/pickles/__init__.py +0 -0
  145. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/__init__.py +0 -0
  146. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/manager.py +0 -0
  147. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/pyenv/venv.py +0 -0
  148. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/script_loader.py +0 -0
  149. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/script_sync.py +0 -0
  150. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/script_watcher.py +0 -0
  151. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/search/cached_vectorizer.py +0 -0
  152. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/secrets/__init__.py +0 -0
  153. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/secrets/commands.py +0 -0
  154. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/secrets/manager.py +0 -0
  155. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/secrets/repl.py +0 -0
  156. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/secrets/store.py +0 -0
  157. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/__init__.py +0 -0
  158. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/config.py +0 -0
  159. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/health.py +0 -0
  160. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/services/redis_service.py +0 -0
  161. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/shell/__init__.py +0 -0
  162. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/shell/shell.py +0 -0
  163. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/templates/__init__.py +0 -0
  164. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/templates/command_templates.py +0 -0
  165. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/toml/__init__.py +0 -0
  166. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/toml/toml.py +0 -0
  167. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/ui/styling.py +0 -0
  168. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/ui/visual_effects.py +0 -0
  169. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/watcher/__init__.py +0 -0
  170. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/watcher/watcher.py +0 -0
  171. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/workflow_models.py +0 -0
  172. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/lib/workflow_runtime.py +0 -0
  173. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/mygroup/__init__.py +0 -0
  174. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/mygroup/test_cmd.py +0 -0
  175. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/public/__init__.py +0 -0
  176. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/public/commands/__init__.py +0 -0
  177. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/public/oi/oi.py +0 -0
  178. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/public/public.py +0 -0
  179. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/__init__.py +0 -0
  180. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/completion_cmd.py +0 -0
  181. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/env_cmd.py +0 -0
  182. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/health_cmd.py +0 -0
  183. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/ipfs_cmd.py +0 -0
  184. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/logs_cmd.py +0 -0
  185. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/migrate_cmd.py +0 -0
  186. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/release_notes_cmd.py +0 -0
  187. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/self_cmd.py +0 -0
  188. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/store_cmd.py +0 -0
  189. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/test_cmd.py +0 -0
  190. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/self/workflows_cmd.py +0 -0
  191. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/__init__.py +0 -0
  192. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/backends/__init__.py +0 -0
  193. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/backends/ipfs_backend.py +0 -0
  194. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/cache.py +0 -0
  195. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/encryption.py +0 -0
  196. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/factory.py +0 -0
  197. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/registry.py +0 -0
  198. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/storage/storacha_cli.py +0 -0
  199. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/__init__.py +0 -0
  200. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/ci/__init__.py +0 -0
  201. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/ci/act_lock.py +0 -0
  202. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/ci/runner_status.py +0 -0
  203. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/ci/workflow_transform.py +0 -0
  204. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/__init__.py +0 -0
  205. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/daemon/process_cli.py +0 -0
  206. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/docker/__init__.py +0 -0
  207. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/docker/docker.py +0 -0
  208. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/file/__init__.py +0 -0
  209. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/gcloud/__init__.py +0 -0
  210. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/gcloud/gcloud.py +0 -0
  211. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/git_commit/__init__.py +0 -0
  212. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/interview/__init__.py +0 -0
  213. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/lsh_integration.py +0 -0
  214. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/model_service/model_service.py +0 -0
  215. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/__init__.py +0 -0
  216. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/executor.py +0 -0
  217. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
  218. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/notebook/schema.py +0 -0
  219. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/openai/openai.py +0 -0
  220. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/registry/__init__.py +0 -0
  221. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/repo/__init__.py +0 -0
  222. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/__init__.py +0 -0
  223. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/models.py +0 -0
  224. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/persistence.py +0 -0
  225. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/scheduler/validation.py +0 -0
  226. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/search/__init__.py +0 -0
  227. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/secrets/__init__.py +0 -0
  228. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
  229. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/storage/__init__.py +0 -0
  230. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/storage/storage_cmd.py +0 -0
  231. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/sync/__init__.py +0 -0
  232. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/videos/__init__.py +0 -0
  233. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/wakatime/wakatime.py +0 -0
  234. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli/workflow/workflow.py +0 -0
  235. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
  236. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
  237. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/entry_points.txt +0 -0
  238. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/requires.txt +0 -0
  239. {mcli_framework-8.0.67 → mcli_framework-8.0.69}/src/mcli_framework.egg-info/top_level.txt +0 -0
@@ -38,4 +38,4 @@ global-exclude *.log
38
38
  # Include package data
39
39
  recursive-include src/mcli/lib *.py
40
40
  recursive-include src/mcli/workflow *.py
41
- recursive-include src/mcli/app *.py
41
+ recursive-include src/mcli/app *.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcli-framework
3
- Version: 8.0.67
3
+ Version: 8.0.69
4
4
  Summary: Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job.
5
5
  Author-email: Luis Fernandez de la Vara <luis@lefv.io>
6
6
  Maintainer-email: Luis Fernandez de la Vara <luis@lefv.io>
@@ -24,4 +24,4 @@ uuid = { version = "1.0", features = ["v4"] }
24
24
  chrono = { version = "0.4", features = ["serde"] }
25
25
 
26
26
  [build-dependencies]
27
- pyo3-build-config = "0.22"
27
+ pyo3-build-config = "0.22"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcli-framework"
3
- version = "8.0.67"
3
+ version = "8.0.69"
4
4
  description = "Portable workflow framework - transform any script into a versioned, schedulable command. Store in ~/.mcli/workflows/, version with lockfile, run as daemon or cron job."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -78,7 +78,7 @@ def _is_binary(file_path: Path) -> bool:
78
78
 
79
79
  def _is_importable(
80
80
  file_path: Path,
81
- ) -> Tuple[bool, Optional[str], Optional[bool], Optional[str]]:
81
+ ) -> tuple[bool, Optional[str], Optional[bool], Optional[str]]:
82
82
  """Classify a file as importable, wrappable, or rejected.
83
83
 
84
84
  Returns:
@@ -124,7 +124,7 @@ def _is_importable(
124
124
 
125
125
  # Check for shebang
126
126
  try:
127
- with open(file_path, "r", encoding="utf-8", errors="ignore") as fh:
127
+ with open(file_path, encoding="utf-8", errors="ignore") as fh:
128
128
  first_line = fh.readline(256)
129
129
  if first_line.startswith("#!"):
130
130
  return (True, None, True, None)
@@ -157,7 +157,7 @@ def _detect_wrapper_interpreter(file_path: Path) -> str:
157
157
 
158
158
  # Try shebang
159
159
  try:
160
- with open(file_path, "r", encoding="utf-8", errors="ignore") as fh:
160
+ with open(file_path, encoding="utf-8", errors="ignore") as fh:
161
161
  first_line = fh.readline(256).strip()
162
162
  if first_line.startswith("#!"):
163
163
  # e.g. #!/usr/bin/env ruby -> ruby
@@ -209,8 +209,8 @@ def _derive_command_name(file_path: Path) -> str:
209
209
 
210
210
 
211
211
  def _resolve_name_conflicts(
212
- files: List[Tuple[Path, str, bool]],
213
- ) -> List[Tuple[Path, str, bool, str]]:
212
+ files: list[tuple[Path, str, bool]],
213
+ ) -> list[tuple[Path, str, bool, str]]:
214
214
  """Resolve duplicate command names for directory imports.
215
215
 
216
216
  For conflicts, prefix with parent directory name:
@@ -219,17 +219,17 @@ def _resolve_name_conflicts(
219
219
  Returns list of ``(path, language_or_None, needs_wrapper, command_name)``.
220
220
  """
221
221
  # First pass: derive names
222
- entries: List[Tuple[Path, str, bool, str]] = []
222
+ entries: list[tuple[Path, str, bool, str]] = []
223
223
  for fpath, lang, wrap in files:
224
224
  entries.append((fpath, lang, wrap, _derive_command_name(fpath)))
225
225
 
226
226
  # Find duplicates
227
- name_counts: Dict[str, int] = {}
227
+ name_counts: dict[str, int] = {}
228
228
  for _, _, _, cname in entries:
229
229
  name_counts[cname] = name_counts.get(cname, 0) + 1
230
230
 
231
231
  # Resolve duplicates
232
- resolved: List[Tuple[Path, str, bool, str]] = []
232
+ resolved: list[tuple[Path, str, bool, str]] = []
233
233
  for fpath, lang, wrap, cname in entries:
234
234
  if name_counts[cname] > 1:
235
235
  parent = fpath.parent.name.lower().replace("-", "_")
@@ -256,13 +256,13 @@ def _resolve_name_conflicts(
256
256
  def _scan_source(
257
257
  source: Path,
258
258
  recursive: bool,
259
- ) -> List[Tuple[Path, Optional[str], bool]]:
259
+ ) -> list[tuple[Path, Optional[str], bool]]:
260
260
  """Scan *source* and return importable files.
261
261
 
262
262
  Returns list of ``(path, language_or_None, needs_wrapper)``.
263
263
  Skipped files are logged but not returned.
264
264
  """
265
- candidates: List[Tuple[Path, Optional[str], bool]] = []
265
+ candidates: list[tuple[Path, Optional[str], bool]] = []
266
266
 
267
267
  if source.is_file():
268
268
  ok, lang, wrap, reason = _is_importable(source)
@@ -327,7 +327,7 @@ def _import_single_file(
327
327
  force: bool = False,
328
328
  wrap: bool = True,
329
329
  dry_run: bool = False,
330
- ) -> Tuple[str, str, str]:
330
+ ) -> tuple[str, str, str]:
331
331
  """Import a single file into the workflows directory.
332
332
 
333
333
  Returns ``(command_name, action_label, status)``.
@@ -382,7 +382,7 @@ def _import_single_file(
382
382
  version=version,
383
383
  language=language,
384
384
  )
385
- saved = save_script(workflows_dir, command_name, code, language)
385
+ save_script(workflows_dir, command_name, code, language)
386
386
  # Remove original after successful save
387
387
  file_path.unlink()
388
388
  return (command_name, "move", STATUS_MOVED)
@@ -405,7 +405,7 @@ def _import_single_file(
405
405
  # =============================================================================
406
406
 
407
407
 
408
- def _display_summary(results: List[Tuple[str, str, str]], verbose: bool) -> None:
408
+ def _display_summary(results: list[tuple[str, str, str]], verbose: bool) -> None:
409
409
  """Show a Rich table summarising the import results."""
410
410
  if not results:
411
411
  return
@@ -566,7 +566,7 @@ def import_cmd(
566
566
  named = _resolve_name_conflicts(candidates)
567
567
 
568
568
  # Import each file
569
- results: List[Tuple[str, str, str]] = []
569
+ results: list[tuple[str, str, str]] = []
570
570
  for fpath, lang, needs_wrapper, cmd_name in named:
571
571
  if verbose and not dry_run:
572
572
  console.print(ImportMessages.IMPORTING_FILE.format(path=fpath))
@@ -35,7 +35,7 @@ class VideoProcessor:
35
35
  os.makedirs(temp_dir, exist_ok=True)
36
36
  os.makedirs(CONFIG["output_dir"], exist_ok=True)
37
37
 
38
- def extract_frames(self, video_path: str, fps: int = 8) -> List[str]:
38
+ def extract_frames(self, video_path: str, fps: int = 8) -> list[str]:
39
39
  """
40
40
  Extract frames from video at specified FPS.
41
41
 
@@ -92,7 +92,7 @@ class VideoProcessor:
92
92
 
93
93
  return frame_paths
94
94
 
95
- def extract_motion_vectors(self, video_path: str) -> Dict[str, Any]:
95
+ def extract_motion_vectors(self, video_path: str) -> dict[str, Any]:
96
96
  """
97
97
  Extract motion vectors from video for temporal consistency.
98
98
  This is a simplified placeholder for actual motion vector extraction.
@@ -155,7 +155,7 @@ class VideoProcessor:
155
155
  return motion_data
156
156
 
157
157
  def frames_to_video(
158
- self, frame_paths: List[str], output_path: str, fps: Optional[float] = None
158
+ self, frame_paths: list[str], output_path: str, fps: Optional[float] = None
159
159
  ) -> str:
160
160
  """
161
161
  Convert frames back to video.
@@ -203,8 +203,8 @@ class VideoProcessor:
203
203
  return output_path
204
204
 
205
205
  def apply_temporal_consistency(
206
- self, processed_frames: List[str], motion_data: Dict[str, Any]
207
- ) -> List[str]:
206
+ self, processed_frames: list[str], motion_data: dict[str, Any]
207
+ ) -> list[str]:
208
208
  """
209
209
  Apply temporal consistency to processed frames using motion data.
210
210
  This is a simplified implementation.
@@ -272,7 +272,7 @@ class ComfyUIClient:
272
272
  self.client_id = str(uuid.uuid4())
273
273
  self.session = requests.Session()
274
274
 
275
- def queue_prompt(self, prompt: Dict[str, Any]) -> str:
275
+ def queue_prompt(self, prompt: dict[str, Any]) -> str:
276
276
  """
277
277
  Queue a prompt in ComfyUI.
278
278
 
@@ -302,7 +302,7 @@ class ComfyUIClient:
302
302
  response = self.session.get(f"{self.api_url}/view", params=data)
303
303
  return Image.open(response.raw)
304
304
 
305
- def upload_image(self, image_path: str) -> Tuple[str, str]:
305
+ def upload_image(self, image_path: str) -> tuple[str, str]:
306
306
  """
307
307
  Upload an image to ComfyUI.
308
308
 
@@ -327,7 +327,7 @@ class ComfyUIClient:
327
327
  self.session.post(f"{self.api_url}/upload/image", json=data)
328
328
  return filename, "v2v_input"
329
329
 
330
- def wait_for_prompt(self, prompt_id: str) -> Dict[str, Any]:
330
+ def wait_for_prompt(self, prompt_id: str) -> dict[str, Any]:
331
331
  """
332
332
  Wait for prompt to complete.
333
333
 
@@ -350,7 +350,7 @@ class ComfyUIClient:
350
350
  if "outputs" in data[prompt_id]:
351
351
  # Complete
352
352
  bar.update(100 - progress)
353
- return cast(Dict[str, Any], data[prompt_id])
353
+ return cast(dict[str, Any], data[prompt_id])
354
354
  # Update progress based on execution state
355
355
  if "executed" in data[prompt_id]:
356
356
  executed_nodes = len(data[prompt_id]["executed"])
@@ -367,7 +367,7 @@ class ComfyUIClient:
367
367
  if response.status_code == 200:
368
368
  data = response.json()
369
369
  if prompt_id in data:
370
- return cast(Dict[str, Any], data[prompt_id])
370
+ return cast(dict[str, Any], data[prompt_id])
371
371
 
372
372
  raise ValueError(f"Processing failed for prompt {prompt_id}")
373
373
 
@@ -449,7 +449,7 @@ class ComfyUIClient:
449
449
  guidance_scale: float,
450
450
  use_controlnet: bool,
451
451
  use_lora: bool,
452
- ) -> Dict[str, Any]:
452
+ ) -> dict[str, Any]:
453
453
  """
454
454
  Build a ComfyUI workflow for frame processing.
455
455
 
@@ -524,9 +524,9 @@ class ComfyUIClient:
524
524
  "class_type": "LoraLoader",
525
525
  }
526
526
  # Update model and clip reference
527
- workflow_4 = cast(Dict[str, Any], workflow["4"])
528
- workflow_2 = cast(Dict[str, Any], workflow["2"])
529
- workflow_3 = cast(Dict[str, Any], workflow["3"])
527
+ workflow_4 = cast(dict[str, Any], workflow["4"])
528
+ workflow_2 = cast(dict[str, Any], workflow["2"])
529
+ workflow_3 = cast(dict[str, Any], workflow["3"])
530
530
  workflow_4["inputs"]["model"] = ["11", 0]
531
531
  workflow_2["inputs"]["clip"] = ["11", 1]
532
532
  workflow_3["inputs"]["clip"] = ["11", 1]
@@ -542,8 +542,8 @@ class ComfyUIClient:
542
542
  "class_type": "ControlNetApply",
543
543
  }
544
544
  # Update model with ControlNet
545
- workflow_13 = cast(Dict[str, Any], workflow["13"])
546
- workflow_4 = cast(Dict[str, Any], workflow["4"])
545
+ workflow_13 = cast(dict[str, Any], workflow["13"])
546
+ workflow_4 = cast(dict[str, Any], workflow["4"])
547
547
  if use_lora:
548
548
  workflow_13["inputs"]["model"] = ["11", 0]
549
549
  workflow_4["inputs"]["model"] = ["13", 0]
@@ -651,7 +651,7 @@ class VideoToVideoGenerator:
651
651
 
652
652
  def process_frames(
653
653
  self,
654
- frame_paths: List[str],
654
+ frame_paths: list[str],
655
655
  prompt: str,
656
656
  negative_prompt: str = "",
657
657
  strength: float = 0.75,
@@ -659,7 +659,7 @@ class VideoToVideoGenerator:
659
659
  use_controlnet: bool = True,
660
660
  use_lora: bool = True,
661
661
  batch_size: int = 1,
662
- ) -> List[str]:
662
+ ) -> list[str]:
663
663
  """
664
664
  Process frames using ComfyUI.
665
665
 
@@ -704,7 +704,7 @@ class VideoToVideoGenerator:
704
704
  )
705
705
 
706
706
  # Use threading to process batch in parallel
707
- threads: List[threading.Thread] = []
707
+ threads: list[threading.Thread] = []
708
708
  results_queue: "queue.Queue[Tuple[int, str]]" = queue.Queue()
709
709
 
710
710
  for j, frame_path in enumerate(batch):
@@ -883,7 +883,7 @@ def config(config_file, output):
883
883
  if os.path.exists(config_file):
884
884
  # Load and modify existing config
885
885
  click.echo(f"Loading existing config from {config_file}...")
886
- with open(config_file, "r") as f:
886
+ with open(config_file) as f:
887
887
  existing_config = json.load(f)
888
888
 
889
889
  # Update the existing config with current CONFIG values
@@ -922,7 +922,7 @@ def config(config_file, output):
922
922
  @click.option("--path", "-p", default="./models", help="Path to search for models")
923
923
  def list_models(path):
924
924
  """List available models that can be used with the workflow."""
925
- models: Dict[str, List[str]] = {
925
+ models: dict[str, list[str]] = {
926
926
  "Video Models": [],
927
927
  "VAE Models": [],
928
928
  "LoRA Models": [],
@@ -102,14 +102,14 @@ def sync_init(install: bool, foreground: bool):
102
102
  # Step 2: Initialize IPFS
103
103
  if not _ipfs_initialized():
104
104
  info("Initializing IPFS...")
105
- result = subprocess.run(
105
+ init_result = subprocess.run(
106
106
  ["ipfs", "init"],
107
107
  capture_output=True,
108
108
  text=True,
109
109
  )
110
- if result.returncode != 0:
110
+ if init_result.returncode != 0:
111
111
  error("Failed to initialize IPFS.")
112
- console.print(f"[dim]{result.stderr}[/dim]")
112
+ console.print(f"[dim]{init_result.stderr}[/dim]")
113
113
  return 1
114
114
  success("IPFS initialized!")
115
115
  else:
@@ -19,7 +19,7 @@ class VideoProcessor:
19
19
  os.makedirs(temp_dir, exist_ok=True)
20
20
  os.makedirs(CONFIG["output_dir"], exist_ok=True)
21
21
 
22
- def extract_frames(self, video_path: str, fps: int = 8) -> List[str]:
22
+ def extract_frames(self, video_path: str, fps: int = 8) -> list[str]:
23
23
  """
24
24
  Extract frames from video at specified FPS.
25
25
 
@@ -76,7 +76,7 @@ class VideoProcessor:
76
76
 
77
77
  return frame_paths
78
78
 
79
- def extract_motion_vectors(self, video_path: str) -> Dict[str, Any]:
79
+ def extract_motion_vectors(self, video_path: str) -> dict[str, Any]:
80
80
  """
81
81
  Extract motion vectors from video for temporal consistency.
82
82
  This is a simplified placeholder for actual motion vector extraction.
@@ -139,7 +139,7 @@ class VideoProcessor:
139
139
  return motion_data
140
140
 
141
141
  def frames_to_video(
142
- self, frame_paths: List[str], output_path: str, fps: Optional[float] = None
142
+ self, frame_paths: list[str], output_path: str, fps: Optional[float] = None
143
143
  ) -> str:
144
144
  """
145
145
  Convert frames back to video.
@@ -187,8 +187,8 @@ class VideoProcessor:
187
187
  return output_path
188
188
 
189
189
  def apply_temporal_consistency(
190
- self, processed_frames: List[str], motion_data: Dict[str, Any]
191
- ) -> List[str]:
190
+ self, processed_frames: list[str], motion_data: dict[str, Any]
191
+ ) -> list[str]:
192
192
  """
193
193
  Apply temporal consistency to processed frames using motion data.
194
194
  This is a simplified implementation.
@@ -337,7 +337,7 @@ class OverlayRemover:
337
337
 
338
338
  def remove_overlay_from_frame(
339
339
  self, frame: np.ndarray, debug: bool = False
340
- ) -> Tuple[np.ndarray, np.ndarray]:
340
+ ) -> tuple[np.ndarray, np.ndarray]:
341
341
  """
342
342
  Complete overlay removal pipeline for a single frame.
343
343
 
@@ -381,8 +381,8 @@ class EnhancedVideoProcessor(VideoProcessor):
381
381
  os.makedirs(self.cleaned_dir, exist_ok=True)
382
382
 
383
383
  def process_frames_remove_overlay(
384
- self, frame_paths: List[str], save_debug: bool = False
385
- ) -> List[str]:
384
+ self, frame_paths: list[str], save_debug: bool = False
385
+ ) -> list[str]:
386
386
  """
387
387
  Process all frames to remove green overlays.
388
388
 
@@ -420,7 +420,7 @@ class EnhancedVideoProcessor(VideoProcessor):
420
420
  click.echo(f"Processed {len(cleaned_frame_paths)} frames.")
421
421
  return cleaned_frame_paths
422
422
 
423
- def analyze_overlay_consistency(self, frame_paths: List[str]) -> Dict[str, Any]:
423
+ def analyze_overlay_consistency(self, frame_paths: list[str]) -> dict[str, Any]:
424
424
  """
425
425
  Analyze overlay patterns across frames for better temporal consistency.
426
426
 
@@ -448,7 +448,7 @@ class EnhancedVideoProcessor(VideoProcessor):
448
448
 
449
449
  return overlay_stats
450
450
 
451
- def _calculate_centroid(self, mask: np.ndarray) -> Tuple[float, float]:
451
+ def _calculate_centroid(self, mask: np.ndarray) -> tuple[float, float]:
452
452
  """Calculate centroid of overlay mask."""
453
453
  if np.sum(mask) == 0:
454
454
  return (0.0, 0.0)
@@ -602,8 +602,8 @@ class AdvancedOverlayRemover:
602
602
  self,
603
603
  frame: "np.ndarray[Any, Any]",
604
604
  mask: "np.ndarray[Any, Any]",
605
- target_point: Tuple[int, int],
606
- ) -> List[Any]:
605
+ target_point: tuple[int, int],
606
+ ) -> list[Any]:
607
607
  """Find similar patches in the frame for exemplar-based inpainting."""
608
608
  y, x = target_point
609
609
  h, w = frame.shape[:2]
@@ -616,8 +616,8 @@ class AdvancedOverlayRemover:
616
616
  target_patch = frame[y_start:y_end, x_start:x_end]
617
617
  target_mask = mask[y_start:y_end, x_start:x_end]
618
618
 
619
- best_patches: List[Any] = []
620
- best_scores: List[float] = []
619
+ best_patches: list[Any] = []
620
+ best_scores: list[float] = []
621
621
 
622
622
  # Search for similar patches in valid areas
623
623
  search_y_start = max(0, y - self.search_radius)
@@ -704,9 +704,9 @@ class AdvancedOverlayRemover:
704
704
  def temporal_reference_inpainting(
705
705
  self,
706
706
  current_frame: np.ndarray,
707
- reference_frames: List[np.ndarray],
707
+ reference_frames: list[np.ndarray],
708
708
  mask: np.ndarray,
709
- motion_vectors: Optional[Dict] = None,
709
+ motion_vectors: Optional[dict] = None,
710
710
  ) -> np.ndarray:
711
711
  """Use multiple reference frames for better content reconstruction."""
712
712
  if not reference_frames:
@@ -791,8 +791,8 @@ class AdvancedOverlayRemover:
791
791
  def remove_overlay_with_context(
792
792
  self,
793
793
  frame: "np.ndarray[Any, Any]",
794
- reference_frames: Optional[List["np.ndarray[Any, Any]"]] = None,
795
- ) -> Tuple["np.ndarray[Any, Any]", "np.ndarray[Any, Any]"]:
794
+ reference_frames: Optional[list["np.ndarray[Any, Any]"]] = None,
795
+ ) -> tuple["np.ndarray[Any, Any]", "np.ndarray[Any, Any]"]:
796
796
  """
797
797
  Remove overlay with intelligent content reconstruction using context.
798
798
 
@@ -838,7 +838,7 @@ class IntelligentVideoProcessor(VideoProcessor):
838
838
 
839
839
  def extract_motion_vectors_highspeed(
840
840
  self, video_path: str, sample_rate: int = 10
841
- ) -> Dict[str, Any]:
841
+ ) -> dict[str, Any]:
842
842
  """
843
843
  Optimized motion vector extraction for high-speed videos.
844
844
  Sample every Nth frame to reduce computation while maintaining accuracy.
@@ -905,8 +905,8 @@ class IntelligentVideoProcessor(VideoProcessor):
905
905
  return motion_data
906
906
 
907
907
  def process_with_temporal_context(
908
- self, frame_paths: List[str], context_window: int = 3
909
- ) -> List[str]:
908
+ self, frame_paths: list[str], context_window: int = 3
909
+ ) -> list[str]:
910
910
  """
911
911
  Process frames with temporal context for better reconstruction.
912
912
 
@@ -9,7 +9,7 @@ temperature = 0.7
9
9
  system_prompt = "You are the MCLI Chat Assistant, an expert AI assistant for the MCLI command line tool.\n\nCRITICAL RULES:\n- NEVER suggest commands that don't exist\n- ONLY reference commands from the provided available commands list\n- If functionality doesn't exist, clearly state it needs to be created\n- ALWAYS be accurate about what commands are available\n\nYou can:\n1. **Create new commands**: Generate Python code using Click framework when functionality is missing\n2. **Execute existing commands**: Help users run commands that actually exist\n3. **Explain functionality**: Provide accurate explanations based on real commands\n4. **Integrate external code**: Help create new commands from GitHub repositories\n5. **File operations**: Generate new commands for missing functionality\n\nWhen creating commands:\n- Use Click framework (@click.command() decorator)\n- Include proper help text and argument descriptions\n- Add error handling and validation\n- Follow Python best practices\n- Provide specific file paths and testing instructions\n\nBe accurate, helpful, and never hallucinate non-existent commands."
10
10
  # Default to lightweight model server (offline mode)
11
11
  ollama_base_url = "http://localhost:8080"
12
- # Set to true to use lightweight models by default (can override with --remote flag)
12
+ # Set to true to use lightweight models by default (can override with --remote flag)
13
13
  use_lightweight_models = true
14
14
 
15
15
  # Alternative providers (uncomment to use)
@@ -5,9 +5,10 @@ import random
5
5
  import socket
6
6
  import threading
7
7
  import time
8
+ from collections.abc import Sequence
8
9
  from enum import Enum
9
10
  from pathlib import Path
10
- from typing import Any, Callable, Dict, List, Optional, Sequence, Type, Union, cast
11
+ from typing import Any, Callable, Dict, List, Optional, Type, Union, cast
11
12
 
12
13
  import uvicorn
13
14
  from fastapi import FastAPI
@@ -50,7 +51,7 @@ def find_free_port(start_port: int = 8000, max_attempts: int = 100) -> int:
50
51
  return random.randint(49152, 65535)
51
52
 
52
53
 
53
- def get_api_config() -> Dict[str, Any]:
54
+ def get_api_config() -> dict[str, Any]:
54
55
  """
55
56
  Get API configuration from MCLI config files.
56
57
 
@@ -113,7 +114,7 @@ class ClickToAPIDecorator:
113
114
  self,
114
115
  endpoint_path: Optional[str] = None,
115
116
  http_method: str = "POST",
116
- response_model: Optional[Type[BaseModel]] = None,
117
+ response_model: Optional[type[BaseModel]] = None,
117
118
  description: Optional[str] = None,
118
119
  tags: Optional[Sequence[Union[str, Enum]]] = None,
119
120
  ):
@@ -223,9 +224,9 @@ class ClickToAPIDecorator:
223
224
 
224
225
  def _create_request_model(
225
226
  self, func: Callable[..., Any], sig: inspect.Signature
226
- ) -> Type[BaseModel]:
227
+ ) -> type[BaseModel]:
227
228
  """Create a Pydantic model from function signature."""
228
- fields: Dict[str, Any] = {}
229
+ fields: dict[str, Any] = {}
229
230
 
230
231
  for param_name, param in sig.parameters.items():
231
232
  if param_name in ["sel", "ctx"]:
@@ -255,9 +256,9 @@ class ClickToAPIDecorator:
255
256
 
256
257
  # Create dynamic model
257
258
  model_name = f"{func.__name__}Request"
258
- return cast(Type[BaseModel], type(model_name, (BaseModel,), fields))
259
+ return cast(type[BaseModel], type(model_name, (BaseModel,), fields))
259
260
 
260
- def _create_response_model(self) -> Type[BaseModel]:
261
+ def _create_response_model(self) -> type[BaseModel]:
261
262
  """Create a default response model."""
262
263
 
263
264
  class DefaultResponse(BaseModel):
@@ -274,8 +275,8 @@ class ClickToAPIDecorator:
274
275
  path: str,
275
276
  method: str,
276
277
  func: Callable[..., Any],
277
- request_model: Type[BaseModel],
278
- response_model: Type[BaseModel],
278
+ request_model: type[BaseModel],
279
+ response_model: type[BaseModel],
279
280
  description: str,
280
281
  tags: Sequence[Union[str, Enum]],
281
282
  ) -> None:
@@ -300,7 +301,7 @@ class ClickToAPIDecorator:
300
301
  return response_model(success=False, error=str(e), message="Operation failed")
301
302
 
302
303
  # Convert tags to list for FastAPI
303
- tags_list: List[Union[str, Enum]] = list(tags)
304
+ tags_list: list[Union[str, Enum]] = list(tags)
304
305
 
305
306
  # Register with FastAPI
306
307
  if method == "GET":
@@ -320,7 +321,7 @@ class ClickToAPIDecorator:
320
321
  path, response_model=response_model, description=description, tags=tags_list
321
322
  )(api_endpoint)
322
323
 
323
- def _get_registered_endpoints(self, app: FastAPI) -> List[Dict[str, str]]:
324
+ def _get_registered_endpoints(self, app: FastAPI) -> list[dict[str, str]]:
324
325
  """Get list of registered endpoints."""
325
326
  endpoints = []
326
327
  for route in app.routes:
@@ -339,7 +340,7 @@ class ClickToAPIDecorator:
339
340
  def api_endpoint(
340
341
  endpoint_path: Optional[str] = None,
341
342
  http_method: str = "POST",
342
- response_model: Optional[Type[BaseModel]] = None,
343
+ response_model: Optional[type[BaseModel]] = None,
343
344
  description: Optional[str] = None,
344
345
  tags: Optional[Sequence[Union[str, Enum]]] = None,
345
346
  ) -> ClickToAPIDecorator:
@@ -528,7 +529,7 @@ def register_command_as_api(
528
529
  command_func: Callable[..., Any],
529
530
  endpoint_path: Optional[str] = None,
530
531
  http_method: str = "POST",
531
- response_model: Optional[Type[BaseModel]] = None,
532
+ response_model: Optional[type[BaseModel]] = None,
532
533
  description: Optional[str] = None,
533
534
  tags: Optional[Sequence[Union[str, Enum]]] = None,
534
535
  ) -> None:
@@ -573,7 +574,7 @@ def register_command_as_api(
573
574
 
574
575
 
575
576
  # Convenience function for common response models
576
- def create_success_response_model(result_type: type = str) -> Type[BaseModel]:
577
+ def create_success_response_model(result_type: type = str) -> type[BaseModel]:
577
578
  """Create a success response model."""
578
579
 
579
580
  class SuccessResponse(BaseModel):
@@ -586,7 +587,7 @@ def create_success_response_model(result_type: type = str) -> Type[BaseModel]:
586
587
  return SuccessResponse
587
588
 
588
589
 
589
- def create_error_response_model() -> Type[BaseModel]:
590
+ def create_error_response_model() -> type[BaseModel]:
590
591
  """Create an error response model."""
591
592
 
592
593
  class ErrorResponse(BaseModel):