terradev-cli 5.3.0__tar.gz → 5.3.2__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.
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/PKG-INFO +2 -2
- {terradev_cli-5.3.0/terradev_cli → terradev_cli-5.3.2}/README.md +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/pyproject.toml +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2/terradev_cli}/README.md +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/__init__.py +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cli.py +4 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/auth.py +17 -5
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/checkpoint_manager.py +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/dag_executor.py +0 -10
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/data_governance.py +62 -31
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/distributed_lock.py +27 -22
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/event_system.py +45 -30
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/gitops_manager.py +17 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/gpu_topology.py +4 -3
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/inference_router.py +3 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/kv_cache_checkpoint_manager.py +38 -8
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/oidc_provider.py +102 -38
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/preflight_validator.py +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/price_intelligence.py +3 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/rate_limiter.py +40 -23
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_router.py +4 -3
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/session_manager.py +5 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/training_monitor.py +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/training_orchestrator.py +41 -26
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/user_manager.py +2 -2
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/mcp/server.py +73 -7
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/agentic_serving.py +1 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/kubernetes_enhanced.py +12 -5
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/ollama_service.py +16 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/sglang_service.py +7 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/vllm_service.py +8 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/base_provider.py +19 -2
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/crusoe_provider.py +70 -15
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/e2e_networks_provider.py +19 -9
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/lambda_labs_provider.py +7 -1
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/oracle_provider.py +7 -5
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/yottalabs_provider.py +35 -17
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/PKG-INFO +2 -2
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.env.example +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/action.yml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/ci.yml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/release.yml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/static.yml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/BNF_GRAMMAR.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/LIFECYCLES.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/architecture.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/overview.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/security.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/troubleshooting.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Dockerfile +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Dockerfile.test +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/LICENSE +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/MANIFEST.in +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/agentic-template/helm/values-agentic.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/agentic-template/k8s/fleet-manifests.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/README.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/helm/values-glm5.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/hpa.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/namespace.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/pdb.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/service.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/sglang-deployment.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/vllm-deployment.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/task.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/terraform/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/terraform/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/terraform/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/README.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/helm/values-llmd.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/gateway.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/leaderworkerset.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/llminferenceservice.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/task.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/README.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/helm/values-moe.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/hpa.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/pdb.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/service.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/task.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/terraform/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/terraform/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/terraform/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/README.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/helm/values-rag.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/terraform/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/demo/RECORDING_GUIDE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/demo/generate_gif.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/demo/terradev-demo.gif +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/ADVANCED_FINANCIAL_INNOVATIONS.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/API_DOCUMENTATION.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/BingSiteAuth.xml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/FINOPS_ATTRIBUTION_SYSTEM.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/USER_GUIDE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/VLLM_AUTO_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/VLLM_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/architecture.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/index.html +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/overview.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/robots.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/sitemap.xml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/test_spot_provision.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/aws_ssm_starter.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/config.example.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/demo_k8s_config.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/direct_aws_starter.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/ec2_user_data_starter.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/example-pipeline.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/kubernetes_training_deployment.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/simple_ssm_starter.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/ssh_server_starter.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/start_aws_servers.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/Chart.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/templates/_helpers.tpl +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/templates/deployment.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/values.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/bucket-policy.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/grafana_training_dashboard.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/kubernetes/microservices.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/terraform/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/terraform/parallelism.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/cli-tool.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/cloud-management-widgets.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/cloud-provider-apis.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/critical-widgets.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/devops-cicd-widgets.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/devops-essential-tools.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/docker-integration.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/kubernetes-operator.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/mlflow-integration.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/README.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/dashboard.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/monitors.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/provider.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/prometheus_training_config.yml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/requirements.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/PERFORMANCE_OPTIMIZATIONS.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/README.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/verifier.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/encoding.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/hmac.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/cache.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-command-executor/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-command-executor/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/validator.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/pool.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/calculator.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-scaler/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-scaler/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/vault.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-dag-executor/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-dag-executor/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/lock.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/graph.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/bus.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-governance/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-governance/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-discovery/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-discovery/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/topology.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-helm-generator/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-helm-generator/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-codec/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-codec/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-price-intelligence/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-price-intelligence/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/manager.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/pool.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-result-compressor/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-result-compressor/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-semantic-router/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-semantic-router/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/snapshot.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/state.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/pipeline.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-tool-registry/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-tool-registry/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/estimator.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/types.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-warm-pool/Cargo.toml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-warm-pool/src/lib.rs +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/scripts/action.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/scripts/gpu-check.sh +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/Lambda Cloud API spec 1.8.3.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/docker-compose.yml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/nginx.conf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/setup.sh +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup.cfg +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/CHANGELOG.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/COMPLETE_COMMAND_REFERENCE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/COMPLETE_INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/IMPLEMENTATION_SUMMARY.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/MAKING_SPOT_WORK_FOR_STATEFUL_WORKLOADS.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/SGLANG_COMMAND_GUIDE.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/TERRADEV_STACK_CHART.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/__main__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cli_hf_spaces.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cli_karpenter.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/agentic_provisioner.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/agentic_topology.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/async_config.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/auto_lineage.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cache_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/command_executor.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/config.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/config_validator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cost_scaler.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cost_tracker.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/credential_vault.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cuda_graph_integrator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/dataset_stager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/deployment_router.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/drift_detector.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/egress_cost_monitor.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/egress_optimizer.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/evaluation_orchestrator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/gpu_discovery.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/helm_generator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/hf_cli_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/hf_smart_templates.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/hf_spaces.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/inference_spot_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/job_state_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/kv_cache_checkpoint_tests.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/kv_sharing.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/manifest_cache.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/manifest_example.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/mig_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/migration_orchestrator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/mla_vram_estimator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/mla_vram_tests.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/model_orchestrator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/optimization_config.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/parallel_provisioner.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/pd_transport.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/pipeline_schema.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/price_discovery.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/public_ip_billing_tracker.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/quick_start.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/quota_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/rust_telemetry.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/base_signal.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/complexity_signal.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/domain_signal.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/keyword_signal.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/language_signal.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/modality_signal.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/orchestrator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/routing_policy.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/safety_signal.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/ssh_key_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/telemetry.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/terradev_engine.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/trace_viewer.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/warm_pool_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/weight_streaming_benchmarks.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/weight_streaming_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cost_optimizer.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/credential_prompt.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/demo.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/entry_point.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/Terradev LOGO BLACK.png +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/Terradev LOGO WHITEW.png +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/databricks_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/datadog_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/helicone_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/prometheus_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/wandb_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/k8s/terraform_wrapper.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-cost-optimized.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-infrastructure.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-models.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-platform.yaml +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx_setup.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/mcp/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/drift_retrain_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/dvc_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/guardrails_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/huggingface_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/kserve_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/kubernetes_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/langchain_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/langfuse_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/langgraph_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/lmcache_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/mlflow_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/model_router.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/phoenix_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/qdrant_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/ray_enhanced.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/ray_service.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/wandb_enhanced.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/optimization/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/optimization/auto_optimizer.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/optimization/cuco_optimizer.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/LATITUDE_PROVIDER.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/alibaba_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/aws_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/azure_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/baseten_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/coreweave_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/demo_mode.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/digitalocean_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/fluidstack_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/gcp_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/hetzner_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/huggingface_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/hyperstack_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/inferx_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/latitude_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/ovhcloud_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/provider_factory.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/real_pricing.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/runpod_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/siliconflow_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/tensordock_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/vastai_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/requirements.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/requirements_minimal.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/bootstrap.sh +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/bootstrap.sh +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/bootstrap.sh +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/bootstrap.sh +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/join-script.tpl +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/kubeconfig.tpl +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/main.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/outputs.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/price-optimizer/optimal-allocation.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/providers.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/variables.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/test_summary.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/utils/__init__.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/utils/formatters.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/SOURCES.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/dependency_links.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/entry_points.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/requires.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/top_level.txt +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform.tfvars.example +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/backend.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/error_handling.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/parallel_provisioning.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/storage_choice_matrix.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/test_error_handler.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/versions.tf +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/audit_demo/trail_3caed73ad5bf.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/audit_trail.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/audit_trails.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/decision_engine.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/decision_logs.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/operations.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/terraform_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/terraform_plans.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/transparency_demo.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/transparency_report.json +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/CREDENTIAL_STRATEGY.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/INTEGRATION_STRATEGY.md +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/Makefile +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/ci_pipeline.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/conftest.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_battle.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_battle_fixed.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_final.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_final_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_integrated_optimization.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_p10_production_failover.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_sso_phase1.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_vllm_optimization.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/simple_test.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_ai_integrations.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_checkpoint_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_cli_smoke.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_dag_executor.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_flashoptim.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_integration.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_job_state_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_k8s_regression.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_latitude_provider.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_major_providers.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_mcp_handlers.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_new_providers.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_provider_conformance.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_providers.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_semantic_router.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_sglang_optimization.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_ssh_key_manager.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_training_monitor.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_training_orchestrator.py +0 -0
- {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_vllm_features.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: terradev-cli
|
|
3
|
-
Version: 5.3.
|
|
3
|
+
Version: 5.3.2
|
|
4
4
|
Summary: An imperative command-line-interface for AI workload orchestration.
|
|
5
5
|
Author-email: Terradev Team <team@terradev.com>
|
|
6
6
|
Maintainer-email: Terradev Team <team@terradev.com>
|
|
@@ -93,7 +93,7 @@ Requires-Dist: redis>=5.0.0; extra == "enterprise"
|
|
|
93
93
|
Requires-Dist: PyJWT>=2.8.0; extra == "enterprise"
|
|
94
94
|
Dynamic: license-file
|
|
95
95
|
|
|
96
|
-
# Terradev CLI v5.3.
|
|
96
|
+
# Terradev CLI v5.3.2
|
|
97
97
|
|
|
98
98
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
99
99
|
|
|
@@ -3,6 +3,6 @@ Terradev CLI - Cross-Cloud Compute Optimization Platform
|
|
|
3
3
|
Parallel provisioning and orchestration for optimized compute costs
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
__version__ = "5.
|
|
6
|
+
__version__ = "5.3.2"
|
|
7
7
|
__author__ = "Terradev Team"
|
|
8
8
|
__description__ = "Open Source BYOAPI Multi-Cloud GPU Infrastructure Platform"
|
|
@@ -14533,6 +14533,10 @@ def agent_teardown(fleet_id, yes):
|
|
|
14533
14533
|
click.echo(_json.dumps(result, indent=2))
|
|
14534
14534
|
|
|
14535
14535
|
|
|
14536
|
+
# Register agent command group (defined above)
|
|
14537
|
+
cli.add_command(agent)
|
|
14538
|
+
|
|
14539
|
+
|
|
14536
14540
|
if __name__ == "__main__":
|
|
14537
14541
|
cli()
|
|
14538
14542
|
|
|
@@ -6,6 +6,7 @@ Handles secure credential storage and management
|
|
|
6
6
|
|
|
7
7
|
import json
|
|
8
8
|
import os
|
|
9
|
+
import tempfile
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
from typing import Dict, Optional
|
|
11
12
|
from cryptography.fernet import Fernet
|
|
@@ -116,11 +117,22 @@ class AuthManager:
|
|
|
116
117
|
"version": "2.0",
|
|
117
118
|
}
|
|
118
119
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
120
|
+
# Atomic write: write to a temp file in the same directory, then
|
|
121
|
+
# rename into place. On POSIX, os.replace() is atomic, so a crash
|
|
122
|
+
# mid-write cannot corrupt the existing credentials file.
|
|
123
|
+
dir_path = auth_file_path.parent
|
|
124
|
+
fd, tmp_path = tempfile.mkstemp(dir=dir_path, prefix=".auth_tmp_")
|
|
125
|
+
try:
|
|
126
|
+
with os.fdopen(fd, "w") as f:
|
|
127
|
+
json.dump(data, f, indent=2)
|
|
128
|
+
os.chmod(tmp_path, 0o600)
|
|
129
|
+
os.replace(tmp_path, auth_file_path)
|
|
130
|
+
except Exception:
|
|
131
|
+
try:
|
|
132
|
+
os.unlink(tmp_path)
|
|
133
|
+
except OSError:
|
|
134
|
+
pass
|
|
135
|
+
raise
|
|
124
136
|
|
|
125
137
|
def set_credentials(
|
|
126
138
|
self, provider: str, api_key: str, secret_key: Optional[str] = None
|
|
@@ -221,7 +221,7 @@ def _run_on(
|
|
|
221
221
|
import re
|
|
222
222
|
|
|
223
223
|
# Allow alphanumeric, spaces, and basic shell-safe characters
|
|
224
|
-
if not re.match(r'^[a-zA-Z0-9_\-./:=@, \n\t
|
|
224
|
+
if not re.match(r'^[a-zA-Z0-9_\-./:=@, \n\t|>&]+$', cmd):
|
|
225
225
|
return -1, "", "Unsafe command characters detected"
|
|
226
226
|
|
|
227
227
|
if host and host not in ("localhost", "127.0.0.1"):
|
|
@@ -197,9 +197,6 @@ class DAGExecutor:
|
|
|
197
197
|
def dfs(name: str, path: List[str]):
|
|
198
198
|
color[name] = GRAY
|
|
199
199
|
path.append(name)
|
|
200
|
-
for dep_name, dep_node in self._nodes.items():
|
|
201
|
-
# Check reverse: who depends on `name`
|
|
202
|
-
pass
|
|
203
200
|
# Check forward: what does `name` depend on
|
|
204
201
|
for dep in self._nodes[name].dependencies:
|
|
205
202
|
if color[dep] == GRAY:
|
|
@@ -327,7 +324,6 @@ class DAGExecutor:
|
|
|
327
324
|
|
|
328
325
|
for node_name in wave.nodes:
|
|
329
326
|
node = self._nodes[node_name]
|
|
330
|
-
node.status = "running"
|
|
331
327
|
|
|
332
328
|
# Build dependency context for this node
|
|
333
329
|
dep_ctx = {dep: context.get(dep) for dep in node.dependencies}
|
|
@@ -340,20 +336,14 @@ class DAGExecutor:
|
|
|
340
336
|
# Collect wave results
|
|
341
337
|
for future in as_completed(futures):
|
|
342
338
|
node_name = futures[future]
|
|
343
|
-
node = self._nodes[node_name]
|
|
344
339
|
|
|
345
340
|
try:
|
|
346
341
|
output, latency = future.result()
|
|
347
|
-
node.output = output
|
|
348
|
-
node.latency_ms = latency
|
|
349
|
-
node.status = "done"
|
|
350
342
|
context[node_name] = output
|
|
351
343
|
result.outputs[node_name] = output
|
|
352
344
|
result.node_latencies[node_name] = latency
|
|
353
345
|
result.node_statuses[node_name] = "done"
|
|
354
346
|
except Exception as e:
|
|
355
|
-
node.status = "failed"
|
|
356
|
-
node.error = str(e)
|
|
357
347
|
result.errors[node_name] = str(e)
|
|
358
348
|
result.node_statuses[node_name] = "failed"
|
|
359
349
|
logger.error(
|
|
@@ -4,9 +4,17 @@ Terradev Data Governance Module
|
|
|
4
4
|
Handles explicit consent, comprehensive logging, and OPA policy enforcement for data movement
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
import json
|
|
7
8
|
import logging
|
|
8
9
|
from datetime import datetime, timezone, timedelta
|
|
9
|
-
from
|
|
10
|
+
from collections import deque
|
|
11
|
+
from typing import Deque, Dict, List, Any, Optional
|
|
12
|
+
|
|
13
|
+
_MAX_MOVEMENT_LOGS = 10_000
|
|
14
|
+
_MAX_OPA_EVALUATIONS = 10_000
|
|
15
|
+
_MAX_CONSENT_REQUESTS = 5_000
|
|
16
|
+
_AUDIT_MAX_BYTES = 50 * 1024 * 1024 # 50 MB before rotation
|
|
17
|
+
_AUDIT_BACKUP_COUNT = 5
|
|
10
18
|
from dataclasses import dataclass, asdict
|
|
11
19
|
from enum import Enum
|
|
12
20
|
import hashlib
|
|
@@ -143,8 +151,8 @@ class DataGovernanceManager:
|
|
|
143
151
|
self.auth = auth
|
|
144
152
|
self.consent_requests: Dict[str, ConsentRequest] = {}
|
|
145
153
|
self.consent_responses: Dict[str, ConsentResponse] = {}
|
|
146
|
-
self.movement_logs:
|
|
147
|
-
self.opa_evaluations:
|
|
154
|
+
self.movement_logs: Deque[DataMovementLog] = deque(maxlen=_MAX_MOVEMENT_LOGS)
|
|
155
|
+
self.opa_evaluations: Deque[OPAPolicyEvaluation] = deque(maxlen=_MAX_OPA_EVALUATIONS)
|
|
148
156
|
|
|
149
157
|
# Governance settings
|
|
150
158
|
self.consent_required = True
|
|
@@ -156,6 +164,8 @@ class DataGovernanceManager:
|
|
|
156
164
|
self._log_dir = Path.home() / ".terradev" / "governance"
|
|
157
165
|
self._log_dir.mkdir(parents=True, exist_ok=True)
|
|
158
166
|
self._audit_file = self._log_dir / "audit_log.jsonl"
|
|
167
|
+
self._audit_max_bytes = _AUDIT_MAX_BYTES
|
|
168
|
+
self._audit_backup_count = _AUDIT_BACKUP_COUNT
|
|
159
169
|
|
|
160
170
|
# Initialize OPA policies
|
|
161
171
|
self._initialize_opa_policies()
|
|
@@ -269,6 +279,10 @@ class DataGovernanceManager:
|
|
|
269
279
|
},
|
|
270
280
|
)
|
|
271
281
|
|
|
282
|
+
# H-C: Evict oldest consent requests when cap is reached
|
|
283
|
+
if len(self.consent_requests) >= _MAX_CONSENT_REQUESTS:
|
|
284
|
+
oldest_key = next(iter(self.consent_requests))
|
|
285
|
+
del self.consent_requests[oldest_key]
|
|
272
286
|
self.consent_requests[request_id] = consent_request
|
|
273
287
|
|
|
274
288
|
# Log consent request
|
|
@@ -737,45 +751,62 @@ class DataGovernanceManager:
|
|
|
737
751
|
f"Consent notification sent to user {consent_request.user_id} for request {consent_request.request_id}"
|
|
738
752
|
)
|
|
739
753
|
|
|
754
|
+
def _write_audit_entry(self, entry: Dict[str, Any]) -> None:
|
|
755
|
+
"""Write a single JSONL audit entry with log rotation."""
|
|
756
|
+
if not self.logging_enabled:
|
|
757
|
+
return
|
|
758
|
+
try:
|
|
759
|
+
if (
|
|
760
|
+
self._audit_file.exists()
|
|
761
|
+
and self._audit_file.stat().st_size >= self._audit_max_bytes
|
|
762
|
+
):
|
|
763
|
+
# Rotate: shift backup files down, rename current → .1
|
|
764
|
+
for i in range(self._audit_backup_count - 1, 0, -1):
|
|
765
|
+
src = self._audit_file.with_suffix(f".jsonl.{i}")
|
|
766
|
+
dst = self._audit_file.with_suffix(f".jsonl.{i + 1}")
|
|
767
|
+
if src.exists():
|
|
768
|
+
src.rename(dst)
|
|
769
|
+
self._audit_file.rename(self._audit_file.with_suffix(".jsonl.1"))
|
|
770
|
+
with open(self._audit_file, "a") as af:
|
|
771
|
+
af.write(json.dumps(entry, default=str) + "\n")
|
|
772
|
+
except Exception as exc:
|
|
773
|
+
logger.warning(f"Audit log write failed: {exc}")
|
|
774
|
+
|
|
740
775
|
async def _log_consent_request(self, consent_request: ConsentRequest):
|
|
741
776
|
"""Log consent request"""
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
logger.info(f"Consent request logged: {consent_request.request_id}")
|
|
777
|
+
self._write_audit_entry({
|
|
778
|
+
"type": "consent_request",
|
|
779
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
780
|
+
"data": asdict(consent_request),
|
|
781
|
+
})
|
|
782
|
+
logger.info(f"Consent request logged: {consent_request.request_id}")
|
|
749
783
|
|
|
750
784
|
async def _log_consent_response(self, consent_response: ConsentResponse):
|
|
751
785
|
"""Log consent response"""
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
logger.info(f"Consent response logged: {consent_response.request_id}")
|
|
786
|
+
self._write_audit_entry({
|
|
787
|
+
"type": "consent_response",
|
|
788
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
789
|
+
"data": asdict(consent_response),
|
|
790
|
+
})
|
|
791
|
+
logger.info(f"Consent response logged: {consent_response.request_id}")
|
|
759
792
|
|
|
760
793
|
async def _log_opa_evaluation(self, evaluation: OPAPolicyEvaluation):
|
|
761
794
|
"""Log OPA policy evaluation"""
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
logger.info(f"OPA evaluation logged: {evaluation.policy_id}")
|
|
795
|
+
self._write_audit_entry({
|
|
796
|
+
"type": "opa_evaluation",
|
|
797
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
798
|
+
"data": asdict(evaluation),
|
|
799
|
+
})
|
|
800
|
+
logger.info(f"OPA evaluation logged: {evaluation.policy_id}")
|
|
769
801
|
|
|
770
802
|
async def _log_data_movement(self, movement_log: DataMovementLog):
|
|
771
803
|
"""Log data movement"""
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
logger.info(f"Data movement logged: {movement_log.movement_id}")
|
|
804
|
+
self._write_audit_entry({
|
|
805
|
+
"type": "data_movement",
|
|
806
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
807
|
+
"data": asdict(movement_log),
|
|
808
|
+
})
|
|
809
|
+
logger.info(f"Data movement logged: {movement_log.movement_id}")
|
|
779
810
|
|
|
780
811
|
async def _evaluate_single_policy(
|
|
781
812
|
self, policy_config: Dict[str, Any], input_data: Dict[str, Any]
|
|
@@ -10,6 +10,7 @@ Rust implementation provides:
|
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
import logging
|
|
13
|
+
import threading
|
|
13
14
|
import uuid
|
|
14
15
|
from datetime import datetime, timedelta
|
|
15
16
|
from typing import Dict, Optional, Tuple
|
|
@@ -35,6 +36,7 @@ class DistributedLockManager:
|
|
|
35
36
|
self._rust_lock = PyDistributedLock()
|
|
36
37
|
else:
|
|
37
38
|
self._locks: Dict[str, Tuple[str, datetime]] = {}
|
|
39
|
+
self._lock = threading.Lock()
|
|
38
40
|
|
|
39
41
|
async def acquire(
|
|
40
42
|
self, key: str, holder: str, ttl_seconds: int = 3600
|
|
@@ -45,15 +47,16 @@ class DistributedLockManager:
|
|
|
45
47
|
return grant.lease_id
|
|
46
48
|
else:
|
|
47
49
|
# Python fallback with in-memory dict
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
with self._lock:
|
|
51
|
+
if key in self._locks:
|
|
52
|
+
_stored_lease, expiry = self._locks[key]
|
|
53
|
+
if datetime.now() < expiry:
|
|
54
|
+
return None
|
|
55
|
+
lease_id = str(uuid.uuid4())
|
|
56
|
+
self._locks[key] = (
|
|
57
|
+
lease_id,
|
|
58
|
+
datetime.now() + timedelta(seconds=ttl_seconds),
|
|
59
|
+
)
|
|
57
60
|
return lease_id
|
|
58
61
|
|
|
59
62
|
async def release(self, key: str, holder: str, lease_id: str) -> bool:
|
|
@@ -62,11 +65,12 @@ class DistributedLockManager:
|
|
|
62
65
|
return await self._rust_lock.release(key, holder, lease_id)
|
|
63
66
|
else:
|
|
64
67
|
# Python fallback
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
with self._lock:
|
|
69
|
+
if key in self._locks:
|
|
70
|
+
stored_lease, _ = self._locks[key]
|
|
71
|
+
if stored_lease == lease_id:
|
|
72
|
+
del self._locks[key]
|
|
73
|
+
return True
|
|
70
74
|
return False
|
|
71
75
|
|
|
72
76
|
async def renew(
|
|
@@ -77,12 +81,13 @@ class DistributedLockManager:
|
|
|
77
81
|
return await self._rust_lock.renew(key, holder, lease_id, ttl_seconds)
|
|
78
82
|
else:
|
|
79
83
|
# Python fallback
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
with self._lock:
|
|
85
|
+
if key in self._locks:
|
|
86
|
+
stored_lease, _ = self._locks[key]
|
|
87
|
+
if stored_lease == lease_id:
|
|
88
|
+
self._locks[key] = (
|
|
89
|
+
lease_id,
|
|
90
|
+
datetime.now() + timedelta(seconds=ttl_seconds),
|
|
91
|
+
)
|
|
92
|
+
return True
|
|
88
93
|
return False
|
|
@@ -4,13 +4,17 @@ Terradev Event System - Triggers, Environment Promotion, and Artifact Lineage
|
|
|
4
4
|
Production-grade automation infrastructure for ML workflows
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
import threading
|
|
8
|
+
from collections import deque
|
|
9
|
+
from typing import Dict, Deque, List, Any, Optional, Callable
|
|
8
10
|
from dataclasses import dataclass, field
|
|
9
11
|
from enum import Enum
|
|
10
12
|
import uuid
|
|
11
13
|
from datetime import datetime
|
|
12
14
|
import logging
|
|
13
15
|
|
|
16
|
+
_EVENT_HISTORY_MAX = 1000 # Maximum events retained in memory
|
|
17
|
+
|
|
14
18
|
# Rust event bus integration
|
|
15
19
|
try:
|
|
16
20
|
from terradev_event_bus import PyEventBus, PyEvent
|
|
@@ -153,27 +157,29 @@ class EventBus:
|
|
|
153
157
|
"""Event bus for publishing and subscribing to events"""
|
|
154
158
|
|
|
155
159
|
def __init__(self):
|
|
160
|
+
self._lock = threading.Lock()
|
|
156
161
|
self.subscribers: Dict[EventType, List[Callable]] = {}
|
|
157
|
-
self.event_history:
|
|
162
|
+
self.event_history: Deque[Event] = deque(maxlen=_EVENT_HISTORY_MAX)
|
|
158
163
|
self.logger = logging.getLogger(__name__)
|
|
159
164
|
|
|
160
165
|
def subscribe(self, event_type: EventType, callback: Callable[[Event], None]):
|
|
161
166
|
"""Subscribe to event type"""
|
|
162
|
-
|
|
163
|
-
self.subscribers
|
|
164
|
-
|
|
167
|
+
with self._lock:
|
|
168
|
+
if event_type not in self.subscribers:
|
|
169
|
+
self.subscribers[event_type] = []
|
|
170
|
+
self.subscribers[event_type].append(callback)
|
|
165
171
|
|
|
166
172
|
def publish(self, event: Event):
|
|
167
173
|
"""Publish event to all subscribers"""
|
|
168
|
-
self.
|
|
174
|
+
with self._lock:
|
|
175
|
+
self.event_history.append(event) # deque auto-evicts oldest when full
|
|
176
|
+
callbacks = list(self.subscribers.get(event.type, []))
|
|
169
177
|
self.logger.info(f"Published event: {event.type.value} from {event.source}")
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
except Exception as e:
|
|
176
|
-
self.logger.error(f"Error in event callback: {e}")
|
|
178
|
+
for callback in callbacks:
|
|
179
|
+
try:
|
|
180
|
+
callback(event)
|
|
181
|
+
except Exception as e:
|
|
182
|
+
self.logger.error(f"Error in event callback: {e}")
|
|
177
183
|
|
|
178
184
|
def get_events(
|
|
179
185
|
self,
|
|
@@ -182,7 +188,8 @@ class EventBus:
|
|
|
182
188
|
limit: int = 100,
|
|
183
189
|
) -> List[Event]:
|
|
184
190
|
"""Get events with optional filtering"""
|
|
185
|
-
|
|
191
|
+
with self._lock:
|
|
192
|
+
events: List[Event] = list(self.event_history)
|
|
186
193
|
|
|
187
194
|
if event_type:
|
|
188
195
|
events = [e for e in events if e.type == event_type]
|
|
@@ -199,6 +206,7 @@ class TriggerManager:
|
|
|
199
206
|
def __init__(self, event_bus: EventBus):
|
|
200
207
|
self.event_bus = event_bus
|
|
201
208
|
self.triggers: Dict[str, Trigger] = {}
|
|
209
|
+
self._lock = threading.Lock()
|
|
202
210
|
self.logger = logging.getLogger(__name__)
|
|
203
211
|
|
|
204
212
|
# Subscribe to all event types
|
|
@@ -212,15 +220,16 @@ class TriggerManager:
|
|
|
212
220
|
trigger = Trigger(
|
|
213
221
|
name=name, type=trigger_type, target_pipeline=target_pipeline, **kwargs
|
|
214
222
|
)
|
|
215
|
-
|
|
216
|
-
|
|
223
|
+
with self._lock:
|
|
224
|
+
self.triggers[trigger.id] = trigger
|
|
217
225
|
self.logger.info(f"Created trigger: {name} ({trigger_type.value})")
|
|
218
|
-
|
|
219
226
|
return trigger
|
|
220
227
|
|
|
221
228
|
def _handle_event(self, event: Event):
|
|
222
229
|
"""Handle incoming events and check triggers"""
|
|
223
|
-
|
|
230
|
+
with self._lock:
|
|
231
|
+
triggers = list(self.triggers.values())
|
|
232
|
+
for trigger in triggers:
|
|
224
233
|
if not trigger.enabled:
|
|
225
234
|
continue
|
|
226
235
|
|
|
@@ -256,8 +265,9 @@ class TriggerManager:
|
|
|
256
265
|
|
|
257
266
|
def _execute_trigger(self, trigger: Trigger, event: Event):
|
|
258
267
|
"""Execute trigger (launch pipeline)"""
|
|
259
|
-
|
|
260
|
-
|
|
268
|
+
with self._lock:
|
|
269
|
+
trigger.last_triggered = datetime.now()
|
|
270
|
+
trigger.trigger_count += 1
|
|
261
271
|
|
|
262
272
|
self.logger.info(f"Trigger '{trigger.name}' fired by event {event.type.value}")
|
|
263
273
|
|
|
@@ -284,6 +294,7 @@ class LineageService:
|
|
|
284
294
|
|
|
285
295
|
def __init__(self):
|
|
286
296
|
self.artifacts: Dict[str, Artifact] = {}
|
|
297
|
+
self._lock = threading.Lock()
|
|
287
298
|
self.logger = logging.getLogger(__name__)
|
|
288
299
|
|
|
289
300
|
def register_artifact(
|
|
@@ -298,26 +309,27 @@ class LineageService:
|
|
|
298
309
|
artifact = Artifact(
|
|
299
310
|
type=artifact_type, name=name, uri=uri, environment=environment, **kwargs
|
|
300
311
|
)
|
|
301
|
-
|
|
302
|
-
|
|
312
|
+
with self._lock:
|
|
313
|
+
self.artifacts[artifact.id] = artifact
|
|
303
314
|
self.logger.info(
|
|
304
315
|
f"Registered artifact: {artifact_type.value} {name} in {environment.value}"
|
|
305
316
|
)
|
|
306
|
-
|
|
307
317
|
return artifact
|
|
308
318
|
|
|
309
319
|
def add_relationship(self, parent_id: str, child_id: str):
|
|
310
320
|
"""Add parent-child relationship between artifacts"""
|
|
311
|
-
|
|
312
|
-
self.artifacts
|
|
313
|
-
|
|
321
|
+
with self._lock:
|
|
322
|
+
if parent_id in self.artifacts and child_id in self.artifacts:
|
|
323
|
+
self.artifacts[parent_id].child_ids.append(child_id)
|
|
324
|
+
self.artifacts[child_id].parent_ids.append(parent_id)
|
|
314
325
|
|
|
315
326
|
def get_lineage(
|
|
316
327
|
self, artifact_id: str, direction: str = "both"
|
|
317
328
|
) -> Dict[str, List[Artifact]]:
|
|
318
329
|
"""Get lineage graph for artifact"""
|
|
319
|
-
|
|
320
|
-
|
|
330
|
+
with self._lock:
|
|
331
|
+
if artifact_id not in self.artifacts:
|
|
332
|
+
return {}
|
|
321
333
|
|
|
322
334
|
result = {"parents": [], "children": []}
|
|
323
335
|
|
|
@@ -378,6 +390,7 @@ class EnvironmentManager:
|
|
|
378
390
|
self.lineage_service = lineage_service
|
|
379
391
|
self.event_bus = event_bus
|
|
380
392
|
self.promotions: Dict[str, Promotion] = {}
|
|
393
|
+
self._lock = threading.Lock()
|
|
381
394
|
self.logger = logging.getLogger(__name__)
|
|
382
395
|
|
|
383
396
|
def request_promotion(
|
|
@@ -395,7 +408,8 @@ class EnvironmentManager:
|
|
|
395
408
|
requested_by=requested_by,
|
|
396
409
|
)
|
|
397
410
|
|
|
398
|
-
self.
|
|
411
|
+
with self._lock:
|
|
412
|
+
self.promotions[promotion.id] = promotion
|
|
399
413
|
self.logger.info(
|
|
400
414
|
f"Promotion requested: {from_env.value} -> {to_env.value} for artifact {artifact_id}"
|
|
401
415
|
)
|
|
@@ -464,7 +478,8 @@ class EnvironmentManager:
|
|
|
464
478
|
self, artifact_id: Optional[str] = None
|
|
465
479
|
) -> List[Promotion]:
|
|
466
480
|
"""Get promotion history"""
|
|
467
|
-
|
|
481
|
+
with self._lock:
|
|
482
|
+
promotions = list(self.promotions.values())
|
|
468
483
|
|
|
469
484
|
if artifact_id:
|
|
470
485
|
promotions = [p for p in promotions if p.artifact_id == artifact_id]
|
|
@@ -12,6 +12,7 @@ Implements GitOps patterns for Kubernetes infrastructure management:
|
|
|
12
12
|
Based on production lessons: "GitOps isn't optional, it's survival"
|
|
13
13
|
"""
|
|
14
14
|
|
|
15
|
+
import re
|
|
15
16
|
import yaml
|
|
16
17
|
import subprocess
|
|
17
18
|
import logging
|
|
@@ -20,6 +21,8 @@ from typing import Dict, List, Optional, Any
|
|
|
20
21
|
from dataclasses import dataclass, field
|
|
21
22
|
from enum import Enum
|
|
22
23
|
|
|
24
|
+
_SAFE_REPO_NAME_RE = re.compile(r'^[a-zA-Z0-9_\-\.]{1,128}$')
|
|
25
|
+
|
|
23
26
|
logger = logging.getLogger(__name__)
|
|
24
27
|
|
|
25
28
|
|
|
@@ -80,6 +83,14 @@ class GitOpsManager:
|
|
|
80
83
|
def __init__(self, config: GitOpsConfig):
|
|
81
84
|
self.config = config
|
|
82
85
|
self.repo_structure = GitRepoStructure()
|
|
86
|
+
# H-B: Sanitize repository name — reject anything that could escape the
|
|
87
|
+
# ~/.terradev/gitops/ directory via path traversal (e.g. "../../.ssh").
|
|
88
|
+
if not _SAFE_REPO_NAME_RE.match(config.repository):
|
|
89
|
+
raise ValueError(
|
|
90
|
+
f"GitOps repository name {config.repository!r} is invalid. "
|
|
91
|
+
"Only alphanumerics, hyphens, underscores, and dots are allowed "
|
|
92
|
+
"(max 128 chars)."
|
|
93
|
+
)
|
|
83
94
|
self.work_dir = Path.home() / ".terradev" / "gitops" / config.repository
|
|
84
95
|
|
|
85
96
|
async def init_repository(self) -> bool:
|
|
@@ -222,7 +233,12 @@ class GitOpsManager:
|
|
|
222
233
|
},
|
|
223
234
|
{
|
|
224
235
|
"name": "configs.credentialTemplates.git-creds.password",
|
|
225
|
-
|
|
236
|
+
# H-A: Do NOT embed the literal token in the YAML — it would
|
|
237
|
+
# be committed to git. Reference a Kubernetes Secret instead;
|
|
238
|
+
# the caller must create the secret out-of-band:
|
|
239
|
+
# kubectl create secret generic argocd-git-creds \
|
|
240
|
+
# --from-literal=password=<TOKEN> -n <namespace>
|
|
241
|
+
"value": "<from-secret:argocd-git-creds:password>",
|
|
226
242
|
},
|
|
227
243
|
]
|
|
228
244
|
},
|
|
@@ -696,11 +696,12 @@ class RDMAConfigurator:
|
|
|
696
696
|
"NCCL_NET_GDR_READ": "1",
|
|
697
697
|
}
|
|
698
698
|
if pair.locality == PCIeLocality.PIX:
|
|
699
|
+
import os
|
|
699
700
|
import tempfile
|
|
700
701
|
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
702
|
+
_nccl_fd, _nccl_path = tempfile.mkstemp(prefix="nccl_topo_", suffix=".xml")
|
|
703
|
+
os.close(_nccl_fd)
|
|
704
|
+
env["NCCL_TOPO_DUMP_FILE"] = _nccl_path
|
|
704
705
|
|
|
705
706
|
# XCD-aware env vars for intra-GPU NUMA
|
|
706
707
|
if gpu:
|
|
@@ -813,6 +813,9 @@ class InferenceRouter:
|
|
|
813
813
|
) -> Optional[float]:
|
|
814
814
|
"""Measure latency to a target via async ping (ms)"""
|
|
815
815
|
try:
|
|
816
|
+
# R3-B: Defense-in-depth — refuse targets that look like flags.
|
|
817
|
+
if not target or target.startswith("-"):
|
|
818
|
+
return None
|
|
816
819
|
proc = await asyncio.create_subprocess_exec(
|
|
817
820
|
"ping",
|
|
818
821
|
"-c",
|