mcli-framework 8.0.67__tar.gz → 8.0.68__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.
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/MANIFEST.in +1 -1
- {mcli_framework-8.0.67/src/mcli_framework.egg-info → mcli_framework-8.0.68}/PKG-INFO +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/mcli_rust/Cargo.toml +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/pyproject.toml +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/import_cmd.py +14 -14
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/model/model.py +21 -21
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/sync_cmd.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/video/video.py +21 -21
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/config.toml +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/api/api.py +16 -15
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/api/daemon_client.py +17 -17
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/api/daemon_client_local.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/api/daemon_decorator.py +2 -2
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/credential_manager.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/mcli_manager.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/config/settings.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/commands.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/defaults.py +17 -2
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/env.py +2 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/scripts.py +8 -8
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/discovery/command_discovery.py +5 -5
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/erd/erd.py +31 -31
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/erd/generate_graph.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/errors.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/feature_detection.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/files/files.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/folder_workflows.py +6 -6
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/fs/fs.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/ipfs_sync.py +41 -43
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/ipfs_utils.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/logger/correlation.py +2 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/logger/logger.py +54 -8
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/logger/structured.py +6 -5
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/optional_deps.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/performance/optimizer.py +9 -9
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/performance/rust_bridge.py +15 -15
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/pickles/pickles.py +4 -4
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/pyenv/deps.py +5 -5
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/data_pipeline.py +20 -20
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/lsh_client.py +26 -26
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/manager.py +4 -4
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/registry.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/state.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/supervisor.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/shell/exceptions.py +9 -9
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/sync_key_store.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/types.py +8 -8
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/workspace_registry.py +6 -6
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/base.py +7 -7
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/async_command_database.py +15 -15
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/async_process_manager.py +12 -12
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/client.py +8 -8
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/daemon.py +23 -23
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/daemon_api.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/enhanced_daemon.py +6 -6
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/process_manager.py +15 -15
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/doc_convert.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/gcloud/config.toml +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/git_commit/ai_service.py +8 -8
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/client.py +9 -9
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/lightweight_embedder.py +8 -8
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/lightweight_model_server.py +7 -7
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/ollama_efficient_runner.py +10 -10
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/openai_adapter.py +10 -9
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/pdf_processor.py +5 -5
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/notebook/command_loader.py +2 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/notebook/converter.py +9 -9
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/notebook/validator.py +6 -6
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/registry/registry.py +5 -5
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/repo/repo.py +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/cron_parser.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/job.py +4 -4
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/monitor.py +3 -3
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/scheduler.py +16 -16
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/sync/test_cmd.py +4 -4
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/wakatime/__init__.py +12 -15
- {mcli_framework-8.0.67 → mcli_framework-8.0.68/src/mcli_framework.egg-info}/PKG-INFO +1 -1
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/LICENSE +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/README.md +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/llms-full.txt +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/llms.txt +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/setup.cfg +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/__main__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/init_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/mv_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/new_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/services_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/setup_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/source_sync_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/messages.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/paths.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/ipns_manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/pyenv/manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/script_loader.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/config.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/health.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/workflow_models.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/lib/workflow_runtime.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/env_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/health_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/ipfs_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/release_notes_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/self_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/store_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/ci/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/ci/act_lock.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/ci/act_runner.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/ci/ci.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/ci/runner_status.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/ci/workflow_transform.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/models.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/scheduler/validation.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli_framework.egg-info/SOURCES.txt +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-8.0.67 → mcli_framework-8.0.68}/src/mcli_framework.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.68
|
|
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>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mcli-framework"
|
|
3
|
-
version = "8.0.
|
|
3
|
+
version = "8.0.68"
|
|
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
|
-
) ->
|
|
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,
|
|
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,
|
|
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:
|
|
213
|
-
) ->
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
) ->
|
|
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:
|
|
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
|
-
) ->
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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) ->
|
|
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) ->
|
|
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:
|
|
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:
|
|
207
|
-
) ->
|
|
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:
|
|
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) ->
|
|
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) ->
|
|
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(
|
|
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(
|
|
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
|
-
) ->
|
|
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(
|
|
528
|
-
workflow_2 = cast(
|
|
529
|
-
workflow_3 = cast(
|
|
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(
|
|
546
|
-
workflow_4 = cast(
|
|
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:
|
|
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
|
-
) ->
|
|
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:
|
|
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
|
|
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:
|
|
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
|
-
|
|
105
|
+
init_result = subprocess.run(
|
|
106
106
|
["ipfs", "init"],
|
|
107
107
|
capture_output=True,
|
|
108
108
|
text=True,
|
|
109
109
|
)
|
|
110
|
-
if
|
|
110
|
+
if init_result.returncode != 0:
|
|
111
111
|
error("Failed to initialize IPFS.")
|
|
112
|
-
console.print(f"[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) ->
|
|
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) ->
|
|
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:
|
|
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:
|
|
191
|
-
) ->
|
|
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
|
-
) ->
|
|
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:
|
|
385
|
-
) ->
|
|
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:
|
|
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) ->
|
|
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:
|
|
606
|
-
) ->
|
|
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:
|
|
620
|
-
best_scores:
|
|
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:
|
|
707
|
+
reference_frames: list[np.ndarray],
|
|
708
708
|
mask: np.ndarray,
|
|
709
|
-
motion_vectors: Optional[
|
|
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[
|
|
795
|
-
) ->
|
|
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
|
-
) ->
|
|
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:
|
|
909
|
-
) ->
|
|
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,
|
|
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() ->
|
|
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[
|
|
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
|
-
) ->
|
|
227
|
+
) -> type[BaseModel]:
|
|
227
228
|
"""Create a Pydantic model from function signature."""
|
|
228
|
-
fields:
|
|
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(
|
|
259
|
+
return cast(type[BaseModel], type(model_name, (BaseModel,), fields))
|
|
259
260
|
|
|
260
|
-
def _create_response_model(self) ->
|
|
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:
|
|
278
|
-
response_model:
|
|
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:
|
|
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) ->
|
|
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[
|
|
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[
|
|
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) ->
|
|
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() ->
|
|
590
|
+
def create_error_response_model() -> type[BaseModel]:
|
|
590
591
|
"""Create an error response model."""
|
|
591
592
|
|
|
592
593
|
class ErrorResponse(BaseModel):
|