mcli-framework 8.0.46__tar.gz → 8.0.48__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.46/src/mcli_framework.egg-info → mcli_framework-8.0.48}/PKG-INFO +1 -1
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/pyproject.toml +1 -1
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/sync_cmd.py +119 -9
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ipfs_sync.py +23 -17
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ipns_manager.py +17 -2
- mcli_framework-8.0.48/src/mcli/lib/sync_key_store.py +69 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48/src/mcli_framework.egg-info}/PKG-INFO +1 -1
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/SOURCES.txt +1 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/LICENSE +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/MANIFEST.in +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/README.md +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/llms-full.txt +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/llms.txt +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/Cargo.toml +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/command_parser.rs +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/file_watcher.rs +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/lib.rs +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/process_manager.rs +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/mcli_rust/src/tfidf.rs +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/setup.cfg +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/commands_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/completion_helpers.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/context_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/create_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/delete_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/edit_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/import_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/init_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/list_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/main.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/migrate_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/model/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/model/model.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/model_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/mv_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/new_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/remove_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/rm_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/search_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/services_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/setup_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/source_sync_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/video/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/app/video/video.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/config.toml +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/api.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/daemon_client.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/daemon_client_local.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/daemon_decorator.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/api/mcli_decorators.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/auth.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/aws_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/azure_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/credential_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/gcp_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/key_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/mcli_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/token_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/auth/token_util.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/config/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/config/config.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/config/settings.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/commands.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/defaults.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/env.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/messages.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/paths.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/scripts.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/constants/storage.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/custom_commands.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/discovery/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/discovery/command_discovery.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/erd/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/erd/erd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/erd/generate_graph.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/errors.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/feature_detection.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/files/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/files/files.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/folder_workflows.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/fs/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/fs/fs.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ipfs_utils.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/lib.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/correlation.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/logger.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/logger/structured.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/optional_deps.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/paths.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/optimizer.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/rust_bridge.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/performance/uvloop_config.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pickles/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pickles/pickles.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/deps.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/pyenv/venv.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/script_loader.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/script_sync.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/script_watcher.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/search/cached_vectorizer.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/commands.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/repl.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/secrets/store.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/config.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/data_pipeline.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/health.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/lsh_client.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/redis_service.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/registry.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/state.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/services/supervisor.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/shell/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/shell/exceptions.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/shell/shell.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/templates/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/templates/command_templates.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/toml/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/toml/toml.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/types.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ui/styling.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/ui/visual_effects.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/watcher/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/watcher/watcher.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/workflow_models.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/lib/workspace_registry.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/mygroup/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/mygroup/test_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/commands/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/oi/oi.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/public/public.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/completion_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/env_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/health_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/ipfs_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/logs_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/migrate_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/release_notes_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/self_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/store_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/test_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/self/workflows_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/backends/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/backends/ipfs_backend.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/base.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/cache.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/encryption.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/factory.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/registry.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/storage/storacha_cli.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/async_command_database.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/async_process_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/client.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/daemon.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/daemon_api.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/enhanced_daemon.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/process_cli.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/process_manager.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/daemon/test_daemon.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/doc_convert.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/docker/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/docker/docker.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/file/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/gcloud/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/gcloud/config.toml +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/gcloud/gcloud.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/git_commit/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/git_commit/ai_service.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/interview/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/lsh_integration.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/client.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/download_and_run_efficient_models.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/lightweight_embedder.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/lightweight_model_server.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/lightweight_test.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/model_service.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/ollama_efficient_runner.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/openai_adapter.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/pdf_processor.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_efficient_runner.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_example.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_integration.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/model_service/test_new_features.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/command_loader.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/converter.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/executor.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/notebook_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/schema.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/notebook/validator.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/openai/openai.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/registry/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/registry/registry.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/repo/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/repo/repo.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/cron_parser.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/job.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/models.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/monitor.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/persistence.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/scheduler.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/scheduler/validation.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/search/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/secrets/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/secrets/secrets_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/storage/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/storage/storage_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/sync/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/sync/test_cmd.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/videos/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/wakatime/__init__.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/wakatime/wakatime.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli/workflow/workflow.py +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/dependency_links.txt +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/entry_points.txt +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/src/mcli_framework.egg-info/requires.txt +0 -0
- {mcli_framework-8.0.46 → mcli_framework-8.0.48}/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.48
|
|
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.48"
|
|
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"
|
|
@@ -7,6 +7,7 @@ Provides:
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
|
+
import os
|
|
10
11
|
import shutil
|
|
11
12
|
import subprocess
|
|
12
13
|
import sys
|
|
@@ -494,20 +495,17 @@ def sync_pull_command(
|
|
|
494
495
|
|
|
495
496
|
ipfs = IPFSSync()
|
|
496
497
|
|
|
497
|
-
if cid:
|
|
498
|
-
#
|
|
499
|
-
|
|
500
|
-
data = ipfs.pull(cid, verify=not no_verify)
|
|
501
|
-
else:
|
|
502
|
-
# No CID — resolve via IPNS
|
|
498
|
+
if not cid:
|
|
499
|
+
# No CID — resolve via IPNS, then fall through to the explicit-CID flow
|
|
500
|
+
# so that --workflows-dir extraction also works for IPNS-resolved pulls.
|
|
503
501
|
if not ensure_daemon_running():
|
|
504
502
|
error(SyncMessages.DAEMON_START_FAILED)
|
|
505
503
|
return
|
|
506
504
|
|
|
507
505
|
info(SyncMessages.IPNS_RESOLVING)
|
|
508
|
-
|
|
506
|
+
cid = ipfs.resolve_latest_cid(scope="global", repo_name=repo)
|
|
509
507
|
|
|
510
|
-
if
|
|
508
|
+
if not cid:
|
|
511
509
|
from mcli.lib.ipns_manager import get_sync_key
|
|
512
510
|
|
|
513
511
|
if not get_sync_key():
|
|
@@ -519,6 +517,10 @@ def sync_pull_command(
|
|
|
519
517
|
console.print(SyncMessages.IPNS_PULL_HINT)
|
|
520
518
|
return
|
|
521
519
|
|
|
520
|
+
# Explicit or just-resolved CID — retrieve it
|
|
521
|
+
info(SyncMessages.RETRIEVING_FROM_IPFS.format(cid=cid))
|
|
522
|
+
data = ipfs.pull(cid, verify=not no_verify)
|
|
523
|
+
|
|
522
524
|
if data:
|
|
523
525
|
success(SyncMessages.RETRIEVED_FROM_IPFS)
|
|
524
526
|
|
|
@@ -542,7 +544,7 @@ def sync_pull_command(
|
|
|
542
544
|
console.print(SyncMessages.VERSION_LABEL.format(version=data["version"]))
|
|
543
545
|
|
|
544
546
|
# Optional: reconstruct script files from per-script CIDs
|
|
545
|
-
if workflows_dir
|
|
547
|
+
if workflows_dir:
|
|
546
548
|
try:
|
|
547
549
|
written = ipfs.pull_workflows(cid, workflows_dir, verify=not no_verify)
|
|
548
550
|
except ValueError as exc:
|
|
@@ -832,3 +834,111 @@ def sync_info(is_global: bool):
|
|
|
832
834
|
else:
|
|
833
835
|
console.print(" Installed: No")
|
|
834
836
|
console.print(" [dim]Install with: brew install ipfs[/dim]")
|
|
837
|
+
|
|
838
|
+
|
|
839
|
+
@sync_group.group(name="key")
|
|
840
|
+
def sync_key_group():
|
|
841
|
+
"""🔑 Manage the persistent IPNS sync key.
|
|
842
|
+
|
|
843
|
+
Generates / shows / sets / clears the shared secret used to derive
|
|
844
|
+
a deterministic IPNS name for cross-host workflow sync. The
|
|
845
|
+
``MCLI_SYNC_KEY`` environment variable, if set, always wins over
|
|
846
|
+
the on-disk value.
|
|
847
|
+
"""
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
def _mask_key(key: str) -> str:
|
|
851
|
+
if len(key) <= 12:
|
|
852
|
+
return "*" * len(key)
|
|
853
|
+
return f"{key[:4]}...{key[-4:]}"
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
@sync_key_group.command(name="gen")
|
|
857
|
+
@click.option("--force", "-f", is_flag=True, help="Overwrite an existing key")
|
|
858
|
+
@click.option("--show", is_flag=True, help="Print the full key (default masks it)")
|
|
859
|
+
def sync_key_gen(force: bool, show: bool):
|
|
860
|
+
"""Generate and persist a new 64-char hex sync key.
|
|
861
|
+
|
|
862
|
+
Examples:
|
|
863
|
+
mcli sync key gen
|
|
864
|
+
mcli sync key gen --show
|
|
865
|
+
mcli sync key gen --force --show
|
|
866
|
+
"""
|
|
867
|
+
from mcli.lib.sync_key_store import SyncKeyStore
|
|
868
|
+
|
|
869
|
+
store = SyncKeyStore()
|
|
870
|
+
try:
|
|
871
|
+
key = store.generate(force=force)
|
|
872
|
+
except FileExistsError:
|
|
873
|
+
error("A sync key is already configured.")
|
|
874
|
+
info("Use --force to overwrite, or 'mcli sync key show' to view it.")
|
|
875
|
+
return 1
|
|
876
|
+
|
|
877
|
+
success(f"Generated sync key at {store.path}")
|
|
878
|
+
if show:
|
|
879
|
+
console.print(f"[bold cyan]{key}[/bold cyan]")
|
|
880
|
+
else:
|
|
881
|
+
console.print(f"[dim]Key: {_mask_key(key)} (use --show to print full)[/dim]")
|
|
882
|
+
console.print(
|
|
883
|
+
"[dim]Share this key with teammates / your other hosts. "
|
|
884
|
+
"Then run `mcli sync key set <key>` on each peer.[/dim]"
|
|
885
|
+
)
|
|
886
|
+
return 0
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
@sync_key_group.command(name="set")
|
|
890
|
+
@click.argument("key")
|
|
891
|
+
def sync_key_set(key: str):
|
|
892
|
+
"""Persist an existing 64-char hex sync key.
|
|
893
|
+
|
|
894
|
+
Use this on a second host after copying the key generated on the
|
|
895
|
+
first.
|
|
896
|
+
"""
|
|
897
|
+
from mcli.lib.sync_key_store import SyncKeyStore
|
|
898
|
+
|
|
899
|
+
try:
|
|
900
|
+
SyncKeyStore().set(key.strip())
|
|
901
|
+
except ValueError as exc:
|
|
902
|
+
error(str(exc))
|
|
903
|
+
return 1
|
|
904
|
+
success("Sync key stored.")
|
|
905
|
+
return 0
|
|
906
|
+
|
|
907
|
+
|
|
908
|
+
@sync_key_group.command(name="show")
|
|
909
|
+
@click.option("--reveal", is_flag=True, help="Print the full key (default masks it)")
|
|
910
|
+
def sync_key_show(reveal: bool):
|
|
911
|
+
"""Show the currently configured sync key (masked unless --reveal)."""
|
|
912
|
+
from mcli.lib.sync_key_store import SyncKeyStore
|
|
913
|
+
|
|
914
|
+
env_value = os.environ.get("MCLI_SYNC_KEY")
|
|
915
|
+
stored = SyncKeyStore().get()
|
|
916
|
+
|
|
917
|
+
if not env_value and not stored:
|
|
918
|
+
info("No sync key configured.")
|
|
919
|
+
console.print("[dim]Generate one with: mcli sync key gen[/dim]")
|
|
920
|
+
return 1
|
|
921
|
+
|
|
922
|
+
if env_value:
|
|
923
|
+
label = "MCLI_SYNC_KEY env var (overrides on-disk value)"
|
|
924
|
+
value = env_value
|
|
925
|
+
else:
|
|
926
|
+
label = "stored at " + str(SyncKeyStore().path)
|
|
927
|
+
value = stored
|
|
928
|
+
|
|
929
|
+
console.print(f"[bold]Source:[/bold] {label}")
|
|
930
|
+
console.print(f"[bold]Key:[/bold] [cyan]{value if reveal else _mask_key(value)}[/cyan]")
|
|
931
|
+
if not reveal:
|
|
932
|
+
console.print("[dim]Use --reveal to print the full key.[/dim]")
|
|
933
|
+
return 0
|
|
934
|
+
|
|
935
|
+
|
|
936
|
+
@sync_key_group.command(name="clear")
|
|
937
|
+
@click.confirmation_option(prompt="Remove the stored sync key?")
|
|
938
|
+
def sync_key_clear():
|
|
939
|
+
"""Delete the persisted sync key (env var, if set, is untouched)."""
|
|
940
|
+
from mcli.lib.sync_key_store import SyncKeyStore
|
|
941
|
+
|
|
942
|
+
SyncKeyStore().clear()
|
|
943
|
+
success("Stored sync key removed.")
|
|
944
|
+
return 0
|
|
@@ -541,45 +541,51 @@ class IPFSSync:
|
|
|
541
541
|
|
|
542
542
|
return written
|
|
543
543
|
|
|
544
|
-
def
|
|
544
|
+
def resolve_latest_cid(
|
|
545
545
|
self,
|
|
546
546
|
scope: str = "global",
|
|
547
547
|
repo_name: Optional[str] = None,
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
"""Pull the latest workflow state by resolving via IPNS.
|
|
551
|
-
|
|
552
|
-
Requires MCLI_SYNC_KEY to be set. Uses deterministic IPNS key
|
|
553
|
-
derivation to find the latest CID without explicit CID sharing.
|
|
548
|
+
) -> Optional[str]:
|
|
549
|
+
"""Resolve the deterministic IPNS name to a current CID.
|
|
554
550
|
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
Returns:
|
|
561
|
-
Command data if successful, None otherwise
|
|
551
|
+
Returns the CID string on success, ``None`` if the sync key is
|
|
552
|
+
unset, the key cannot be imported into Kubo, or IPNS resolution
|
|
553
|
+
fails. Surfaces the CID so CLI callers can hand it to
|
|
554
|
+
``pull_workflows`` for script extraction.
|
|
562
555
|
"""
|
|
563
556
|
sync_key = get_sync_key()
|
|
564
557
|
if not sync_key:
|
|
565
|
-
logger.warning("
|
|
558
|
+
logger.warning("Sync key not configured — cannot resolve via IPNS")
|
|
566
559
|
return None
|
|
567
560
|
|
|
568
561
|
repo = repo_name or get_repo_name()
|
|
569
562
|
key_info = derive_key_info(sync_key, repo, scope)
|
|
570
563
|
|
|
571
|
-
# Ensure key is in Kubo so we can resolve
|
|
572
564
|
ipns_name = ensure_key_imported(key_info)
|
|
573
565
|
if not ipns_name:
|
|
574
566
|
logger.error("Failed to import IPNS key into Kubo")
|
|
575
567
|
return None
|
|
576
568
|
|
|
577
|
-
# Resolve IPNS to CID
|
|
578
569
|
cid = resolve_ipns(ipns_name)
|
|
579
570
|
if not cid:
|
|
580
571
|
logger.error("IPNS resolution failed — no workflows published yet?")
|
|
581
572
|
return None
|
|
573
|
+
return cid
|
|
574
|
+
|
|
575
|
+
def pull_latest(
|
|
576
|
+
self,
|
|
577
|
+
scope: str = "global",
|
|
578
|
+
repo_name: Optional[str] = None,
|
|
579
|
+
verify: bool = True,
|
|
580
|
+
) -> Optional[dict]:
|
|
581
|
+
"""Pull the latest workflow state by resolving via IPNS.
|
|
582
582
|
|
|
583
|
+
Requires the sync key to be configured (env var or store).
|
|
584
|
+
Returns the command data dict on success, ``None`` otherwise.
|
|
585
|
+
"""
|
|
586
|
+
cid = self.resolve_latest_cid(scope=scope, repo_name=repo_name)
|
|
587
|
+
if not cid:
|
|
588
|
+
return None
|
|
583
589
|
return self.pull(cid, verify=verify)
|
|
584
590
|
|
|
585
591
|
def get_history(self, limit: int = 10) -> list[dict]:
|
|
@@ -174,8 +174,23 @@ def resolve_ipns(ipns_name: str) -> Optional[str]:
|
|
|
174
174
|
|
|
175
175
|
|
|
176
176
|
def get_sync_key() -> Optional[str]:
|
|
177
|
-
"""Return the
|
|
178
|
-
|
|
177
|
+
"""Return the active sync key.
|
|
178
|
+
|
|
179
|
+
Resolution order:
|
|
180
|
+
1. ``MCLI_SYNC_KEY`` environment variable (lets users override per-shell).
|
|
181
|
+
2. The persistent on-disk store at ``$MCLI_HOME/sync_key.json``.
|
|
182
|
+
|
|
183
|
+
Returns ``None`` when neither source has a value.
|
|
184
|
+
"""
|
|
185
|
+
env_key = os.environ.get(EnvVars.MCLI_SYNC_KEY)
|
|
186
|
+
if env_key:
|
|
187
|
+
return env_key
|
|
188
|
+
|
|
189
|
+
# Lazy import to avoid a hard dependency cycle if the store module is
|
|
190
|
+
# ever extended to read IPNS state.
|
|
191
|
+
from mcli.lib.sync_key_store import SyncKeyStore
|
|
192
|
+
|
|
193
|
+
return SyncKeyStore().get()
|
|
179
194
|
|
|
180
195
|
|
|
181
196
|
def get_repo_name() -> str:
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""Persistent storage for the shared workflow sync key.
|
|
2
|
+
|
|
3
|
+
The store keeps a 64-character hex secret on disk so users do not have
|
|
4
|
+
to ``export MCLI_SYNC_KEY=...`` in every shell. The env var still wins
|
|
5
|
+
when set — see :func:`mcli.lib.ipns_manager.get_sync_key`.
|
|
6
|
+
|
|
7
|
+
File: ``$MCLI_HOME/sync_key.json`` (default ``~/.mcli/sync_key.json``)
|
|
8
|
+
mode 0600. JSON shape: ``{"key": "<64 hex chars>"}``.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
import re
|
|
16
|
+
import secrets
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Optional
|
|
19
|
+
|
|
20
|
+
from mcli.lib.paths import get_mcli_home
|
|
21
|
+
|
|
22
|
+
_FILENAME = "sync_key.json"
|
|
23
|
+
_HEX64 = re.compile(r"^[0-9a-fA-F]{64}$")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class SyncKeyStore:
|
|
27
|
+
"""Read/write the persistent sync key on disk."""
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def path(self) -> Path:
|
|
31
|
+
return get_mcli_home() / _FILENAME
|
|
32
|
+
|
|
33
|
+
def get(self) -> Optional[str]:
|
|
34
|
+
path = self.path
|
|
35
|
+
if not path.is_file():
|
|
36
|
+
return None
|
|
37
|
+
try:
|
|
38
|
+
data = json.loads(path.read_text())
|
|
39
|
+
except (json.JSONDecodeError, OSError):
|
|
40
|
+
return None
|
|
41
|
+
key = data.get("key")
|
|
42
|
+
return key if isinstance(key, str) and _HEX64.match(key) else None
|
|
43
|
+
|
|
44
|
+
def set(self, key: str) -> None:
|
|
45
|
+
if not isinstance(key, str) or not _HEX64.match(key):
|
|
46
|
+
raise ValueError("sync key must be a 64-char hex string")
|
|
47
|
+
self._write(key)
|
|
48
|
+
|
|
49
|
+
def generate(self, force: bool = False) -> str:
|
|
50
|
+
if self.path.exists() and not force:
|
|
51
|
+
raise FileExistsError(
|
|
52
|
+
f"sync key already exists at {self.path}; use force=True to overwrite"
|
|
53
|
+
)
|
|
54
|
+
key = secrets.token_hex(32)
|
|
55
|
+
self._write(key)
|
|
56
|
+
return key
|
|
57
|
+
|
|
58
|
+
def clear(self) -> None:
|
|
59
|
+
try:
|
|
60
|
+
self.path.unlink()
|
|
61
|
+
except FileNotFoundError:
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
def _write(self, key: str) -> None:
|
|
65
|
+
path = self.path
|
|
66
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
67
|
+
# Write then chmod so the secret is never world-readable.
|
|
68
|
+
path.write_text(json.dumps({"key": key}))
|
|
69
|
+
os.chmod(path, 0o600)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcli-framework
|
|
3
|
-
Version: 8.0.
|
|
3
|
+
Version: 8.0.48
|
|
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>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|