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.
Files changed (480) hide show
  1. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/PKG-INFO +2 -2
  2. {terradev_cli-5.3.0/terradev_cli → terradev_cli-5.3.2}/README.md +1 -1
  3. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/pyproject.toml +1 -1
  4. {terradev_cli-5.3.0 → terradev_cli-5.3.2/terradev_cli}/README.md +1 -1
  5. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/__init__.py +1 -1
  6. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cli.py +4 -0
  7. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/auth.py +17 -5
  8. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/checkpoint_manager.py +1 -1
  9. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/dag_executor.py +0 -10
  10. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/data_governance.py +62 -31
  11. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/distributed_lock.py +27 -22
  12. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/event_system.py +45 -30
  13. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/gitops_manager.py +17 -1
  14. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/gpu_topology.py +4 -3
  15. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/inference_router.py +3 -0
  16. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/kv_cache_checkpoint_manager.py +38 -8
  17. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/oidc_provider.py +102 -38
  18. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/preflight_validator.py +1 -1
  19. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/price_intelligence.py +3 -0
  20. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/rate_limiter.py +40 -23
  21. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_router.py +4 -3
  22. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/session_manager.py +5 -1
  23. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/training_monitor.py +1 -1
  24. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/training_orchestrator.py +41 -26
  25. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/user_manager.py +2 -2
  26. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/mcp/server.py +73 -7
  27. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/agentic_serving.py +1 -1
  28. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/kubernetes_enhanced.py +12 -5
  29. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/ollama_service.py +16 -0
  30. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/sglang_service.py +7 -0
  31. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/vllm_service.py +8 -1
  32. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/base_provider.py +19 -2
  33. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/crusoe_provider.py +70 -15
  34. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/e2e_networks_provider.py +19 -9
  35. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/lambda_labs_provider.py +7 -1
  36. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/oracle_provider.py +7 -5
  37. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/yottalabs_provider.py +35 -17
  38. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/PKG-INFO +2 -2
  39. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.env.example +0 -0
  40. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/action.yml +0 -0
  41. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/ci.yml +0 -0
  42. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/release.yml +0 -0
  43. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/.github/workflows/static.yml +0 -0
  44. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/BNF_GRAMMAR.md +0 -0
  45. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/LIFECYCLES.md +0 -0
  46. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/architecture.md +0 -0
  47. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/overview.md +0 -0
  48. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/security.md +0 -0
  49. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Deployment Package/troubleshooting.md +0 -0
  50. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Dockerfile +0 -0
  51. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/Dockerfile.test +0 -0
  52. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/LICENSE +0 -0
  53. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/MANIFEST.in +0 -0
  54. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/agentic-template/helm/values-agentic.yaml +0 -0
  55. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/agentic-template/k8s/fleet-manifests.yaml +0 -0
  56. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/README.md +0 -0
  57. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/helm/values-glm5.yaml +0 -0
  58. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/hpa.yaml +0 -0
  59. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/model-cache-pvc.yaml +0 -0
  60. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/namespace.yaml +0 -0
  61. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/pdb.yaml +0 -0
  62. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/service.yaml +0 -0
  63. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/sglang-deployment.yaml +0 -0
  64. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/k8s/vllm-deployment.yaml +0 -0
  65. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/task.yaml +0 -0
  66. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/terraform/main.tf +0 -0
  67. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/terraform/outputs.tf +0 -0
  68. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/glm-5/terraform/variables.tf +0 -0
  69. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/README.md +0 -0
  70. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/helm/values-llmd.yaml +0 -0
  71. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/gateway.yaml +0 -0
  72. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/leaderworkerset.yaml +0 -0
  73. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/k8s/llminferenceservice.yaml +0 -0
  74. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/llmd-template/task.yaml +0 -0
  75. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/README.md +0 -0
  76. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/helm/values-moe.yaml +0 -0
  77. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/deployment.yaml +0 -0
  78. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/hpa.yaml +0 -0
  79. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/model-cache-pvc.yaml +0 -0
  80. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/namespace.yaml +0 -0
  81. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/pdb.yaml +0 -0
  82. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/k8s/service.yaml +0 -0
  83. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/task.yaml +0 -0
  84. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/terraform/main.tf +0 -0
  85. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/terraform/outputs.tf +0 -0
  86. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/moe-template/terraform/variables.tf +0 -0
  87. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/README.md +0 -0
  88. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/helm/values-rag.yaml +0 -0
  89. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/k8s/deployment.yaml +0 -0
  90. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/clusters/rag-template/terraform/main.tf +0 -0
  91. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/demo/RECORDING_GUIDE.md +0 -0
  92. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/demo/generate_gif.py +0 -0
  93. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/demo/terradev-demo.gif +0 -0
  94. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/ADVANCED_FINANCIAL_INNOVATIONS.md +0 -0
  95. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/API_DOCUMENTATION.md +0 -0
  96. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/BingSiteAuth.xml +0 -0
  97. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/FINOPS_ATTRIBUTION_SYSTEM.md +0 -0
  98. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/USER_GUIDE.md +0 -0
  99. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/VLLM_AUTO_OPTIMIZATION_GUIDE.md +0 -0
  100. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/VLLM_OPTIMIZATION_GUIDE.md +0 -0
  101. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/architecture.md +0 -0
  102. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/index.html +0 -0
  103. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/overview.md +0 -0
  104. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/robots.txt +0 -0
  105. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/sitemap.xml +0 -0
  106. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/docs/test_spot_provision.md +0 -0
  107. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/aws_ssm_starter.py +0 -0
  108. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/config.example.json +0 -0
  109. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/demo_k8s_config.yaml +0 -0
  110. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/direct_aws_starter.py +0 -0
  111. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/ec2_user_data_starter.py +0 -0
  112. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/example-pipeline.yaml +0 -0
  113. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/kubernetes_training_deployment.yaml +0 -0
  114. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/simple_ssm_starter.py +0 -0
  115. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/ssh_server_starter.py +0 -0
  116. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/examples/start_aws_servers.py +0 -0
  117. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/Chart.yaml +0 -0
  118. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/templates/_helpers.tpl +0 -0
  119. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/templates/deployment.yaml +0 -0
  120. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/helm/terradev/values.yaml +0 -0
  121. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/bucket-policy.json +0 -0
  122. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/grafana_training_dashboard.json +0 -0
  123. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/kubernetes/microservices.yaml +0 -0
  124. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/terraform/main.tf +0 -0
  125. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/infrastructure/terraform/parallelism.tf +0 -0
  126. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/cli-tool.tf +0 -0
  127. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/cloud-management-widgets.tf +0 -0
  128. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/cloud-provider-apis.py +0 -0
  129. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/critical-widgets.tf +0 -0
  130. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/devops-cicd-widgets.tf +0 -0
  131. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/devops-essential-tools.tf +0 -0
  132. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/docker-integration.tf +0 -0
  133. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/kubernetes-operator.tf +0 -0
  134. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/integrations/mlflow-integration.tf +0 -0
  135. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/README.md +0 -0
  136. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/dashboard.tf +0 -0
  137. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/monitors.tf +0 -0
  138. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/outputs.tf +0 -0
  139. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/provider.tf +0 -0
  140. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/variables.tf +0 -0
  141. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/datadog/versions.tf +0 -0
  142. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/modules/prometheus_training_config.yml +0 -0
  143. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/requirements.txt +0 -0
  144. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/Cargo.toml +0 -0
  145. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/INTEGRATION_GUIDE.md +0 -0
  146. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/PERFORMANCE_OPTIMIZATIONS.md +0 -0
  147. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/README.md +0 -0
  148. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/Cargo.toml +0 -0
  149. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/lib.rs +0 -0
  150. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/types.rs +0 -0
  151. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-artifact-verification/src/verifier.rs +0 -0
  152. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/Cargo.toml +0 -0
  153. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/encoding.rs +0 -0
  154. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/hmac.rs +0 -0
  155. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/lib.rs +0 -0
  156. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-authentication/src/types.rs +0 -0
  157. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/Cargo.toml +0 -0
  158. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/cache.rs +0 -0
  159. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/lib.rs +0 -0
  160. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cache-eviction/src/types.rs +0 -0
  161. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-command-executor/Cargo.toml +0 -0
  162. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-command-executor/src/lib.rs +0 -0
  163. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/Cargo.toml +0 -0
  164. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/lib.rs +0 -0
  165. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/types.rs +0 -0
  166. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-config-validator/src/validator.rs +0 -0
  167. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/Cargo.toml +0 -0
  168. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/lib.rs +0 -0
  169. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/pool.rs +0 -0
  170. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-connection-pool/src/types.rs +0 -0
  171. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/Cargo.toml +0 -0
  172. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/calculator.rs +0 -0
  173. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/lib.rs +0 -0
  174. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-calculator/src/types.rs +0 -0
  175. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-scaler/Cargo.toml +0 -0
  176. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-cost-scaler/src/lib.rs +0 -0
  177. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/Cargo.toml +0 -0
  178. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/lib.rs +0 -0
  179. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/types.rs +0 -0
  180. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-credential-vault/src/vault.rs +0 -0
  181. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-dag-executor/Cargo.toml +0 -0
  182. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-dag-executor/src/lib.rs +0 -0
  183. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/Cargo.toml +0 -0
  184. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/lib.rs +0 -0
  185. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/lock.rs +0 -0
  186. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-distributed-lock/src/types.rs +0 -0
  187. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/Cargo.toml +0 -0
  188. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/graph.rs +0 -0
  189. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/lib.rs +0 -0
  190. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-egress-optimizer/src/types.rs +0 -0
  191. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/Cargo.toml +0 -0
  192. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/bus.rs +0 -0
  193. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/lib.rs +0 -0
  194. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-event-bus/src/types.rs +0 -0
  195. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-governance/Cargo.toml +0 -0
  196. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-governance/src/lib.rs +0 -0
  197. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-discovery/Cargo.toml +0 -0
  198. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-discovery/src/lib.rs +0 -0
  199. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/Cargo.toml +0 -0
  200. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/lib.rs +0 -0
  201. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/topology.rs +0 -0
  202. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-gpu-topology/src/types.rs +0 -0
  203. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-helm-generator/Cargo.toml +0 -0
  204. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-helm-generator/src/lib.rs +0 -0
  205. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-codec/Cargo.toml +0 -0
  206. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-codec/src/lib.rs +0 -0
  207. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-optimizer/Cargo.toml +0 -0
  208. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-mcp-optimizer/src/lib.rs +0 -0
  209. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-price-intelligence/Cargo.toml +0 -0
  210. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-price-intelligence/src/lib.rs +0 -0
  211. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/Cargo.toml +0 -0
  212. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/lib.rs +0 -0
  213. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/manager.rs +0 -0
  214. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-quota-manager/src/types.rs +0 -0
  215. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/Cargo.toml +0 -0
  216. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/lib.rs +0 -0
  217. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/pool.rs +0 -0
  218. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-resource-pool/src/types.rs +0 -0
  219. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-result-compressor/Cargo.toml +0 -0
  220. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-result-compressor/src/lib.rs +0 -0
  221. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-semantic-router/Cargo.toml +0 -0
  222. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-semantic-router/src/lib.rs +0 -0
  223. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/Cargo.toml +0 -0
  224. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/lib.rs +0 -0
  225. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/snapshot.rs +0 -0
  226. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-snapshot-manager/src/types.rs +0 -0
  227. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/Cargo.toml +0 -0
  228. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/lib.rs +0 -0
  229. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/state.rs +0 -0
  230. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-state-machine/src/types.rs +0 -0
  231. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/Cargo.toml +0 -0
  232. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/lib.rs +0 -0
  233. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/pipeline.rs +0 -0
  234. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-telemetry/src/types.rs +0 -0
  235. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-tool-registry/Cargo.toml +0 -0
  236. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-tool-registry/src/lib.rs +0 -0
  237. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/Cargo.toml +0 -0
  238. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/estimator.rs +0 -0
  239. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/lib.rs +0 -0
  240. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-vram-estimator/src/types.rs +0 -0
  241. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-warm-pool/Cargo.toml +0 -0
  242. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/rust/terradev-warm-pool/src/lib.rs +0 -0
  243. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/scripts/action.py +0 -0
  244. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/scripts/gpu-check.sh +0 -0
  245. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/Lambda Cloud API spec 1.8.3.json +0 -0
  246. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/docker-compose.yml +0 -0
  247. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/nginx.conf +0 -0
  248. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup/setup.sh +0 -0
  249. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/setup.cfg +0 -0
  250. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/CHANGELOG.md +0 -0
  251. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/COMPLETE_COMMAND_REFERENCE.md +0 -0
  252. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/COMPLETE_INTEGRATION_GUIDE.md +0 -0
  253. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/IMPLEMENTATION_SUMMARY.md +0 -0
  254. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/MAKING_SPOT_WORK_FOR_STATEFUL_WORKLOADS.md +0 -0
  255. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/SGLANG_COMMAND_GUIDE.md +0 -0
  256. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/TERRADEV_STACK_CHART.md +0 -0
  257. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/__main__.py +0 -0
  258. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cli_hf_spaces.py +0 -0
  259. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cli_karpenter.py +0 -0
  260. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/__init__.py +0 -0
  261. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/agentic_provisioner.py +0 -0
  262. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/agentic_topology.py +0 -0
  263. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/async_config.py +0 -0
  264. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/auto_lineage.py +0 -0
  265. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cache_manager.py +0 -0
  266. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/command_executor.py +0 -0
  267. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/config.py +0 -0
  268. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/config_validator.py +0 -0
  269. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cost_scaler.py +0 -0
  270. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cost_tracker.py +0 -0
  271. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/credential_vault.py +0 -0
  272. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/cuda_graph_integrator.py +0 -0
  273. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/dataset_stager.py +0 -0
  274. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/deployment_router.py +0 -0
  275. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/drift_detector.py +0 -0
  276. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/egress_cost_monitor.py +0 -0
  277. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/egress_optimizer.py +0 -0
  278. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/evaluation_orchestrator.py +0 -0
  279. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/gpu_discovery.py +0 -0
  280. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/helm_generator.py +0 -0
  281. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/hf_cli_integration.py +0 -0
  282. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/hf_smart_templates.py +0 -0
  283. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/hf_spaces.py +0 -0
  284. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/inference_spot_manager.py +0 -0
  285. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/job_state_manager.py +0 -0
  286. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/kv_cache_checkpoint_tests.py +0 -0
  287. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/kv_sharing.py +0 -0
  288. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/manifest_cache.py +0 -0
  289. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/manifest_example.json +0 -0
  290. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/mig_manager.py +0 -0
  291. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/migration_orchestrator.py +0 -0
  292. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/mla_vram_estimator.py +0 -0
  293. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/mla_vram_tests.py +0 -0
  294. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/model_orchestrator.py +0 -0
  295. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/optimization_config.py +0 -0
  296. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/parallel_provisioner.py +0 -0
  297. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/pd_transport.py +0 -0
  298. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/pipeline_schema.py +0 -0
  299. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/price_discovery.py +0 -0
  300. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/public_ip_billing_tracker.py +0 -0
  301. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/quick_start.py +0 -0
  302. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/quota_manager.py +0 -0
  303. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/rust_telemetry.py +0 -0
  304. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/__init__.py +0 -0
  305. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/base_signal.py +0 -0
  306. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/complexity_signal.py +0 -0
  307. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/domain_signal.py +0 -0
  308. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/keyword_signal.py +0 -0
  309. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/language_signal.py +0 -0
  310. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/modality_signal.py +0 -0
  311. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/orchestrator.py +0 -0
  312. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/routing_policy.yaml +0 -0
  313. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/semantic_signals/safety_signal.py +0 -0
  314. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/ssh_key_manager.py +0 -0
  315. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/telemetry.py +0 -0
  316. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/terradev_engine.py +0 -0
  317. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/trace_viewer.py +0 -0
  318. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/warm_pool_manager.py +0 -0
  319. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/weight_streaming_benchmarks.py +0 -0
  320. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/core/weight_streaming_manager.py +0 -0
  321. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/cost_optimizer.py +0 -0
  322. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/credential_prompt.py +0 -0
  323. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/demo.py +0 -0
  324. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/entry_point.py +0 -0
  325. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/Terradev LOGO BLACK.png +0 -0
  326. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/Terradev LOGO WHITEW.png +0 -0
  327. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/__init__.py +0 -0
  328. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/databricks_integration.py +0 -0
  329. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/datadog_integration.py +0 -0
  330. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/helicone_integration.py +0 -0
  331. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/prometheus_integration.py +0 -0
  332. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/integrations/wandb_integration.py +0 -0
  333. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/k8s/terraform_wrapper.py +0 -0
  334. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-cost-optimized.yaml +0 -0
  335. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-infrastructure.yaml +0 -0
  336. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-models.yaml +0 -0
  337. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx-platform.yaml +0 -0
  338. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/kubernetes/inferx_setup.py +0 -0
  339. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/mcp/__init__.py +0 -0
  340. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/__init__.py +0 -0
  341. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/drift_retrain_service.py +0 -0
  342. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/dvc_service.py +0 -0
  343. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/guardrails_service.py +0 -0
  344. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/huggingface_service.py +0 -0
  345. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/kserve_service.py +0 -0
  346. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/kubernetes_service.py +0 -0
  347. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/langchain_service.py +0 -0
  348. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/langfuse_service.py +0 -0
  349. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/langgraph_service.py +0 -0
  350. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/lmcache_service.py +0 -0
  351. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/mlflow_service.py +0 -0
  352. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/model_router.py +0 -0
  353. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/phoenix_service.py +0 -0
  354. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/qdrant_service.py +0 -0
  355. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/ray_enhanced.py +0 -0
  356. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/ray_service.py +0 -0
  357. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/ml_services/wandb_enhanced.py +0 -0
  358. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/optimization/__init__.py +0 -0
  359. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/optimization/auto_optimizer.py +0 -0
  360. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/optimization/cuco_optimizer.py +0 -0
  361. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/LATITUDE_PROVIDER.md +0 -0
  362. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/__init__.py +0 -0
  363. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/alibaba_provider.py +0 -0
  364. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/aws_provider.py +0 -0
  365. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/azure_provider.py +0 -0
  366. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/baseten_provider.py +0 -0
  367. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/coreweave_provider.py +0 -0
  368. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/demo_mode.py +0 -0
  369. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/digitalocean_provider.py +0 -0
  370. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/fluidstack_provider.py +0 -0
  371. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/gcp_provider.py +0 -0
  372. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/hetzner_provider.py +0 -0
  373. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/huggingface_provider.py +0 -0
  374. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/hyperstack_provider.py +0 -0
  375. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/inferx_provider.py +0 -0
  376. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/latitude_provider.py +0 -0
  377. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/ovhcloud_provider.py +0 -0
  378. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/provider_factory.py +0 -0
  379. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/real_pricing.py +0 -0
  380. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/runpod_provider.py +0 -0
  381. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/siliconflow_provider.py +0 -0
  382. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/tensordock_provider.py +0 -0
  383. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/providers/vastai_provider.py +0 -0
  384. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/requirements.txt +0 -0
  385. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/requirements_minimal.txt +0 -0
  386. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/main.tf +0 -0
  387. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/__init__.py +0 -0
  388. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/bootstrap.sh +0 -0
  389. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/main.tf +0 -0
  390. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/outputs.tf +0 -0
  391. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/variables.tf +0 -0
  392. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-aws/versions.tf +0 -0
  393. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/bootstrap.sh +0 -0
  394. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/main.tf +0 -0
  395. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/outputs.tf +0 -0
  396. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/variables.tf +0 -0
  397. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/versions.tf +0 -0
  398. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/bootstrap.sh +0 -0
  399. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/main.tf +0 -0
  400. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/outputs.tf +0 -0
  401. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/variables.tf +0 -0
  402. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-lambda/versions.tf +0 -0
  403. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/bootstrap.sh +0 -0
  404. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/main.tf +0 -0
  405. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/outputs.tf +0 -0
  406. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/variables.tf +0 -0
  407. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/gpu-node-vastai/versions.tf +0 -0
  408. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/join-script.tpl +0 -0
  409. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/kubeconfig.tpl +0 -0
  410. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/main.tf +0 -0
  411. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/outputs.tf +0 -0
  412. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/variables.tf +0 -0
  413. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/k8s-control-plane/versions.tf +0 -0
  414. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/main.tf +0 -0
  415. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/outputs.tf +0 -0
  416. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/variables.tf +0 -0
  417. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/modules/networking/versions.tf +0 -0
  418. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/outputs.tf +0 -0
  419. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/price-optimizer/optimal-allocation.py +0 -0
  420. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/providers.tf +0 -0
  421. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/terraform/variables.tf +0 -0
  422. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/test_summary.py +0 -0
  423. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/utils/__init__.py +0 -0
  424. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli/utils/formatters.py +0 -0
  425. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/SOURCES.txt +0 -0
  426. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/dependency_links.txt +0 -0
  427. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/entry_points.txt +0 -0
  428. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/requires.txt +0 -0
  429. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terradev_cli.egg-info/top_level.txt +0 -0
  430. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform.tfvars.example +0 -0
  431. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/backend.tf +0 -0
  432. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/error_handling.py +0 -0
  433. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/parallel_provisioning.tf +0 -0
  434. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/storage_choice_matrix.py +0 -0
  435. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/test_error_handler.py +0 -0
  436. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_optimization/versions.tf +0 -0
  437. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/audit_demo/trail_3caed73ad5bf.json +0 -0
  438. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/audit_trail.py +0 -0
  439. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/audit_trails.json +0 -0
  440. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/decision_engine.py +0 -0
  441. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/decision_logs.json +0 -0
  442. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/operations.json +0 -0
  443. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/terraform_manager.py +0 -0
  444. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/terraform_plans.json +0 -0
  445. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/transparency_demo.py +0 -0
  446. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/terraform_transparency/transparency_report.json +0 -0
  447. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/CREDENTIAL_STRATEGY.md +0 -0
  448. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/INTEGRATION_STRATEGY.md +0 -0
  449. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/Makefile +0 -0
  450. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/ci_pipeline.py +0 -0
  451. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/conftest.py +0 -0
  452. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_battle.py +0 -0
  453. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_battle_fixed.py +0 -0
  454. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_cli_ux_final.py +0 -0
  455. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_final_integration.py +0 -0
  456. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_integrated_optimization.py +0 -0
  457. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_p10_production_failover.py +0 -0
  458. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_sso_phase1.py +0 -0
  459. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/root_tests/test_vllm_optimization.py +0 -0
  460. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/simple_test.py +0 -0
  461. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_ai_integrations.py +0 -0
  462. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_checkpoint_manager.py +0 -0
  463. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_cli_smoke.py +0 -0
  464. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_dag_executor.py +0 -0
  465. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_flashoptim.py +0 -0
  466. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_integration.py +0 -0
  467. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_job_state_manager.py +0 -0
  468. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_k8s_regression.py +0 -0
  469. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_latitude_provider.py +0 -0
  470. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_major_providers.py +0 -0
  471. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_mcp_handlers.py +0 -0
  472. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_new_providers.py +0 -0
  473. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_provider_conformance.py +0 -0
  474. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_providers.py +0 -0
  475. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_semantic_router.py +0 -0
  476. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_sglang_optimization.py +0 -0
  477. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_ssh_key_manager.py +0 -0
  478. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_training_monitor.py +0 -0
  479. {terradev_cli-5.3.0 → terradev_cli-5.3.2}/tests/test_training_orchestrator.py +0 -0
  480. {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.0
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.0
96
+ # Terradev CLI v5.3.2
97
97
 
98
98
  **An imperative command-line-interface for AI workload orchestration.**
99
99
 
@@ -1,4 +1,4 @@
1
- # Terradev CLI v5.3.0
1
+ # Terradev CLI v5.3.2
2
2
 
3
3
  **An imperative command-line-interface for AI workload orchestration.**
4
4
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "terradev-cli"
7
- version = "5.3.0"
7
+ version = "5.3.2"
8
8
  description = "An imperative command-line-interface for AI workload orchestration."
9
9
  readme = "README.md"
10
10
  license = {text = "Apache-2.0"}
@@ -1,4 +1,4 @@
1
- # Terradev CLI v5.3.0
1
+ # Terradev CLI v5.3.2
2
2
 
3
3
  **An imperative command-line-interface for AI workload orchestration.**
4
4
 
@@ -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.0.1"
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
- with open(auth_file_path, "w") as f:
120
- json.dump(data, f, indent=2)
121
-
122
- # Set secure permissions
123
- os.chmod(auth_file_path, 0o600)
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"\']+$', cmd):
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 typing import Dict, List, Any, Optional
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: List[DataMovementLog] = []
147
- self.opa_evaluations: List[OPAPolicyEvaluation] = []
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
- if self.logging_enabled:
743
- {
744
- "type": "consent_request",
745
- "timestamp": datetime.now(timezone.utc).isoformat(),
746
- "data": asdict(consent_request),
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
- if self.logging_enabled:
753
- {
754
- "type": "consent_response",
755
- "timestamp": datetime.now(timezone.utc).isoformat(),
756
- "data": asdict(consent_response),
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
- if self.logging_enabled:
763
- {
764
- "type": "opa_evaluation",
765
- "timestamp": datetime.now(timezone.utc).isoformat(),
766
- "data": asdict(evaluation),
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
- if self.logging_enabled:
773
- {
774
- "type": "data_movement",
775
- "timestamp": datetime.now(timezone.utc).isoformat(),
776
- "data": asdict(movement_log),
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
- if key in self._locks:
49
- holder, expiry = self._locks[key]
50
- if datetime.now() < expiry:
51
- return None
52
- lease_id = str(uuid.uuid4())
53
- self._locks[key] = (
54
- lease_id,
55
- datetime.now() + timedelta(seconds=ttl_seconds),
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
- if key in self._locks:
66
- stored_lease, _ = self._locks[key]
67
- if stored_lease == lease_id:
68
- del self._locks[key]
69
- return True
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
- if key in self._locks:
81
- stored_lease, _ = self._locks[key]
82
- if stored_lease == lease_id:
83
- self._locks[key] = (
84
- lease_id,
85
- datetime.now() + timedelta(seconds=ttl_seconds),
86
- )
87
- return True
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
- from typing import Dict, List, Any, Optional, Callable
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: List[Event] = []
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
- if event_type not in self.subscribers:
163
- self.subscribers[event_type] = []
164
- self.subscribers[event_type].append(callback)
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.event_history.append(event)
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
- if event.type in self.subscribers:
172
- for callback in self.subscribers[event.type]:
173
- try:
174
- callback(event)
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
- events = self.event_history
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
- self.triggers[trigger.id] = trigger
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
- for trigger in self.triggers.values():
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
- trigger.last_triggered = datetime.now()
260
- trigger.trigger_count += 1
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
- self.artifacts[artifact.id] = artifact
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
- if parent_id in self.artifacts and child_id in self.artifacts:
312
- self.artifacts[parent_id].child_ids.append(child_id)
313
- self.artifacts[child_id].parent_ids.append(parent_id)
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
- if artifact_id not in self.artifacts:
320
- return {}
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.promotions[promotion.id] = promotion
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
- promotions = list(self.promotions.values())
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
- "value": self.config.git_token or "",
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
- env["NCCL_TOPO_DUMP_FILE"] = tempfile.mktemp(
702
- prefix="nccl_topo_", suffix=".xml"
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",