terradev-cli 5.0.1__tar.gz → 5.0.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.0.1 → terradev_cli-5.0.2}/.github/workflows/ci.yml +16 -19
- terradev_cli-5.0.2/.github/workflows/release.yml +22 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/PKG-INFO +3 -3
- {terradev_cli-5.0.1/terradev_cli → terradev_cli-5.0.2}/README.md +2 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/pyproject.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/Cargo.toml +2 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-artifact-verification/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-artifact-verification/src/lib.rs +18 -5
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-artifact-verification/src/types.rs +4 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-artifact-verification/src/verifier.rs +14 -12
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-authentication/Cargo.toml +2 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-authentication/src/encoding.rs +5 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-authentication/src/hmac.rs +7 -9
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-authentication/src/lib.rs +6 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cache-eviction/Cargo.toml +2 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cache-eviction/src/cache.rs +9 -9
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cache-eviction/src/lib.rs +22 -16
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cache-eviction/src/types.rs +2 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-command-executor/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-command-executor/src/lib.rs +8 -6
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-config-validator/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-config-validator/src/lib.rs +6 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-config-validator/src/types.rs +12 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-config-validator/src/validator.rs +9 -8
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-connection-pool/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-connection-pool/src/lib.rs +8 -6
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-connection-pool/src/pool.rs +25 -18
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-connection-pool/src/types.rs +4 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cost-calculator/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cost-calculator/src/calculator.rs +23 -23
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cost-calculator/src/lib.rs +32 -13
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cost-calculator/src/types.rs +0 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cost-scaler/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-cost-scaler/src/lib.rs +119 -43
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-credential-vault/Cargo.toml +2 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-credential-vault/src/lib.rs +9 -6
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-credential-vault/src/vault.rs +8 -9
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-dag-executor/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-dag-executor/src/lib.rs +131 -95
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-distributed-lock/Cargo.toml +1 -1
- terradev_cli-5.0.2/rust/terradev-distributed-lock/src/lib.rs +124 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-distributed-lock/src/lock.rs +27 -20
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-distributed-lock/src/types.rs +4 -3
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-egress-optimizer/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-egress-optimizer/src/graph.rs +34 -30
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-egress-optimizer/src/lib.rs +16 -12
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-egress-optimizer/src/types.rs +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-event-bus/Cargo.toml +3 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-event-bus/src/bus.rs +20 -17
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-event-bus/src/lib.rs +32 -8
- terradev_cli-5.0.2/rust/terradev-event-bus/src/types.rs +37 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-governance/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-governance/src/lib.rs +48 -13
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-gpu-discovery/Cargo.toml +4 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-gpu-discovery/src/lib.rs +31 -6
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-gpu-topology/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-gpu-topology/src/lib.rs +21 -13
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-gpu-topology/src/topology.rs +15 -18
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-gpu-topology/src/types.rs +4 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-helm-generator/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-helm-generator/src/lib.rs +53 -34
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-mcp-codec/Cargo.toml +1 -1
- terradev_cli-5.0.2/rust/terradev-mcp-codec/src/lib.rs +202 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-mcp-optimizer/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-mcp-optimizer/src/lib.rs +43 -9
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-price-intelligence/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-price-intelligence/src/lib.rs +101 -38
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-quota-manager/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-quota-manager/src/lib.rs +21 -11
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-quota-manager/src/manager.rs +13 -13
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-quota-manager/src/types.rs +6 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-resource-pool/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-resource-pool/src/lib.rs +24 -15
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-resource-pool/src/pool.rs +25 -21
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-resource-pool/src/types.rs +7 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-result-compressor/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-result-compressor/src/lib.rs +16 -7
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-semantic-router/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-semantic-router/src/lib.rs +27 -14
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-snapshot-manager/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-snapshot-manager/src/lib.rs +23 -13
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-snapshot-manager/src/snapshot.rs +22 -21
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-snapshot-manager/src/types.rs +2 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-state-machine/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-state-machine/src/lib.rs +62 -26
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-state-machine/src/state.rs +112 -63
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-state-machine/src/types.rs +5 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-telemetry/Cargo.toml +2 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-telemetry/src/lib.rs +14 -8
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-telemetry/src/pipeline.rs +31 -15
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-tool-registry/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-tool-registry/src/lib.rs +31 -14
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-vram-estimator/Cargo.toml +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-vram-estimator/src/estimator.rs +16 -15
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-vram-estimator/src/lib.rs +7 -3
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-warm-pool/Cargo.toml +2 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-warm-pool/src/lib.rs +51 -32
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/cli.py +140 -195
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/helm_generator.py +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/quick_start.py +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/training_orchestrator.py +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/mcp/server.py +4 -2
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/kubernetes_enhanced.py +3 -21
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/kubernetes_service.py +13 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/ollama_service.py +22 -16
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/sglang_service.py +22 -11
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/vllm_service.py +25 -25
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terradev_cli/cli.py +7 -12
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli.egg-info/PKG-INFO +3 -3
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli.egg-info/SOURCES.txt +0 -4
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_vllm_features.py +2 -2
- terradev_cli-5.0.1/.github/workflows/release.yml +0 -50
- terradev_cli-5.0.1/rust/terradev-distributed-lock/src/lib.rs +0 -129
- terradev_cli-5.0.1/rust/terradev-event-bus/src/types.rs +0 -13
- terradev_cli-5.0.1/rust/terradev-mcp-codec/src/lib.rs +0 -123
- terradev_cli-5.0.1/terradev_cli/bandit-report.json +0 -388
- terradev_cli-5.0.1/terradev_cli/core/stripe_manager.py +0 -440
- terradev_cli-5.0.1/terradev_cli/core/tier_manager.py +0 -308
- terradev_cli-5.0.1/terradev_cli/safety-report.json +0 -18554
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/.ebextensions/python.config +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/.env.example +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/.github/workflows/action.yml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/.github/workflows/static.yml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/BNF_GRAMMAR.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/CUCO_INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/Dockerfile +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/LICENSE +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/MANIFEST.in +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/MCP_CI_SETUP.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/USER_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/activations/973dfe463ec85785f5f95af5ba3906eedb2d931c24e69824a89ea65dba4e813b.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/analysis/api-differences-comparison.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/analysis/cost-structure-differences.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/analysis/inference-arbitrage-pivot.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/apis/free-apis-latency-arbitrage.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/README.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/helm/values-glm5.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/k8s/hpa.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/k8s/namespace.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/k8s/pdb.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/k8s/service.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/k8s/sglang-deployment.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/k8s/vllm-deployment.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/task.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/terraform/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/terraform/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/glm-5/terraform/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/llmd-template/README.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/llmd-template/helm/values-llmd.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/llmd-template/k8s/gateway.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/llmd-template/k8s/leaderworkerset.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/llmd-template/k8s/llminferenceservice.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/llmd-template/task.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/README.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/helm/values-moe.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/k8s/hpa.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/k8s/pdb.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/k8s/service.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/task.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/terraform/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/terraform/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/moe-template/terraform/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/rag-template/README.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/rag-template/helm/values-rag.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/rag-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/clusters/rag-template/terraform/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/demo/RECORDING_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/demo/generate_gif.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/demo/terradev-demo.gif +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/ADVANCED_FINANCIAL_INNOVATIONS.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/API_DOCUMENTATION.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/BingSiteAuth.xml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/FINOPS_ATTRIBUTION_SYSTEM.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/MIGRATE_EVAL_IMPLEMENTATION.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/PHASE1_SSO_IMPLEMENTATION_SUMMARY.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/SGLANG_OPTIMIZATION_IMPLEMENTATION_COMPLETE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/USER_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/VLLM_AUTO_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/VLLM_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/VLLM_OPTIMIZATION_SUMMARY.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/architecture.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/index.html +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/robots.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/sitemap.xml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/docs/test_spot_provision.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/aws_ssm_starter.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/config.example.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/demo_k8s_config.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/direct_aws_starter.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/ec2_user_data_starter.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/example-pipeline.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/kubernetes_training_deployment.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/simple_ssm_starter.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/ssh_server_starter.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/examples/start_aws_servers.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/helm/terradev/Chart.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/helm/terradev/templates/_helpers.tpl +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/helm/terradev/templates/deployment.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/helm/terradev/values.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/infrastructure/bucket-policy.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/infrastructure/grafana_training_dashboard.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/infrastructure/kubernetes/microservices.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/infrastructure/terraform/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/infrastructure/terraform/parallelism.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/cli-tool.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/cloud-management-widgets.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/cloud-provider-apis.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/critical-widgets.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/devops-cicd-widgets.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/devops-essential-tools.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/docker-integration.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/kubernetes-operator.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/integrations/mlflow-integration.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/datadog/README.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/datadog/dashboard.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/datadog/monitors.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/datadog/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/datadog/provider.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/datadog/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/datadog/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/modules/prometheus_training_config.yml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/requirements.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/PERFORMANCE_OPTIMIZATIONS.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/README.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-authentication/src/types.rs +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-credential-vault/src/types.rs +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-telemetry/src/types.rs +1 -1
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-vram-estimator/src/types.rs +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/action.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/check_logs_fix.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/debug_comparison.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/debug_mla.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/debug_streaming.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/deployment/deploy_correct_pricing.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/deployment/deploy_enhanced_server.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/deployment/deploy_exact_servers.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/deployment/deploy_simple_enhanced.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/deployment/deploy_telemetry_aws.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/deployment/deploy_to_aws.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/figure_calculation_breakdown.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/fix_server_ports.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/gpu-check.sh +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/scripts/server_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/setup/Lambda Cloud API spec 1.8.3.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/setup/account-setup-guide.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/setup/docker-compose.yml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/setup/nginx.conf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/setup/render.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/setup/setup.sh +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/setup.cfg +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/CHANGELOG.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/COMPLETE_COMMAND_REFERENCE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/COMPLETE_INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/FULL_SOLUTION_STACK_MARCH_2025.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/IMPLEMENTATION_SUMMARY.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/MAKING_SPOT_WORK_FOR_STATEFUL_WORKLOADS.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2/terradev_cli}/README.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/SGLANG_COMMAND_GUIDE.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/TERRADEV_STACK_CHART.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/__main__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/cli_hf_spaces.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/cli_karpenter.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/async_config.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/auth.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/auto_lineage.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/cache_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/checkpoint_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/command_executor.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/config.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/config_validator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/cost_scaler.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/cost_tracker.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/credential_vault.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/cuda_graph_integrator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/dag_executor.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/data_governance.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/dataset_stager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/deployment_router.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/distributed_lock.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/drift_detector.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/egress_cost_monitor.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/egress_optimizer.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/evaluation_orchestrator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/event_system.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/gitops_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/gpu_discovery.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/gpu_topology.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/hf_cli_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/hf_smart_templates.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/hf_spaces.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/inference_router.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/inference_spot_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/job_state_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/kv_cache_checkpoint_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/kv_cache_checkpoint_tests.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/manifest_cache.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/manifest_example.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/mig_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/migration_orchestrator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/mla_vram_estimator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/mla_vram_tests.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/model_orchestrator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/oidc_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/optimization_config.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/parallel_provisioner.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/pipeline_schema.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/preflight_validator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/price_discovery.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/price_intelligence.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/public_ip_billing_tracker.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/quota_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/rate_limiter.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/rust_telemetry.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_router.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/base_signal.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/complexity_signal.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/domain_signal.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/keyword_signal.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/language_signal.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/modality_signal.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/orchestrator.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/routing_policy.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/semantic_signals/safety_signal.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/session_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/ssh_key_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/telemetry.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/terradev_engine.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/trace_viewer.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/training_monitor.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/user_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/warm_pool_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/weight_streaming_benchmarks.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/core/weight_streaming_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/cost_optimizer.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/credential_prompt.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/demo.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/entry_point.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/Terradev LOGO BLACK.png +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/Terradev LOGO WHITEW.png +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/databricks_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/datadog_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/helicone_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/prometheus_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/integrations/wandb_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/k8s/terraform_wrapper.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/kubernetes/inferx-cost-optimized.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/kubernetes/inferx-infrastructure.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/kubernetes/inferx-models.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/kubernetes/inferx-platform.yaml +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/kubernetes/inferx_setup.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/mcp/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/mcp/server.py.bak3 +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/agentic_serving.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/drift_retrain_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/dvc_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/guardrails_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/huggingface_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/kserve_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/langchain_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/langfuse_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/langgraph_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/lmcache_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/mlflow_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/model_router.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/phoenix_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/qdrant_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/ray_enhanced.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/ray_service.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/ml_services/wandb_enhanced.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/optimization/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/optimization/auto_optimizer.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/optimization/cuco_optimizer.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/LATITUDE_PROVIDER.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/alibaba_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/aws_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/azure_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/base_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/baseten_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/coreweave_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/crusoe_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/demo_mode.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/digitalocean_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/fluidstack_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/gcp_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/hetzner_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/huggingface_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/hyperstack_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/inferx_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/lambda_labs_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/latitude_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/oracle_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/ovhcloud_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/provider_factory.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/real_pricing.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/runpod_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/siliconflow_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/tensordock_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/providers/vastai_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/requirements.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/requirements_minimal.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terradev_cli/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terradev_cli/credential_prompt.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-aws/bootstrap.sh +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-aws/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-aws/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-aws/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-aws/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/bootstrap.sh +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-lambda/bootstrap.sh +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-lambda/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-lambda/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-lambda/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-lambda/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-vastai/bootstrap.sh +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-vastai/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-vastai/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-vastai/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/gpu-node-vastai/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/k8s-control-plane/join-script.tpl +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/k8s-control-plane/kubeconfig.tpl +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/k8s-control-plane/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/k8s-control-plane/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/k8s-control-plane/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/k8s-control-plane/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/networking/main.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/networking/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/networking/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/modules/networking/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/outputs.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/price-optimizer/optimal-allocation.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/providers.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/terraform/variables.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/test_summary.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/utils/__init__.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli/utils/formatters.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli.egg-info/dependency_links.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli.egg-info/entry_points.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli.egg-info/requires.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terradev_cli.egg-info/top_level.txt +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform.tfvars.example +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_optimization/backend.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_optimization/error_handling.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_optimization/parallel_provisioning.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_optimization/storage_choice_matrix.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_optimization/test_error_handler.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_optimization/versions.tf +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/audit_demo/trail_3caed73ad5bf.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/audit_trail.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/audit_trails.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/decision_engine.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/decision_logs.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/operations.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/terraform_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/terraform_plans.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/transparency_demo.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/terraform_transparency/transparency_report.json +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/INTEGRATION_STRATEGY.md +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/Makefile +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/ci_pipeline.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/conftest.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_cli_ux_battle.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_cli_ux_battle_fixed.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_cli_ux_final.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_final_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_integrated_optimization.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_p10_production_failover.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_sso_phase1.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/root_tests/test_vllm_optimization.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/simple_test.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_ai_integrations.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_checkpoint_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_cli_smoke.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_dag_executor.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_flashoptim.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_integration.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_job_state_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_k8s_regression.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_latitude_provider.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_major_providers.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_mcp_handlers.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_new_providers.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_provider_conformance.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_providers.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_semantic_router.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_sglang_optimization.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_ssh_key_manager.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_training_monitor.py +0 -0
- {terradev_cli-5.0.1 → terradev_cli-5.0.2}/tests/test_training_orchestrator.py +0 -0
|
@@ -41,33 +41,24 @@ jobs:
|
|
|
41
41
|
|
|
42
42
|
- name: Run cargo test
|
|
43
43
|
run: |
|
|
44
|
-
if [ -f "
|
|
45
|
-
cd
|
|
46
|
-
cargo test --verbose
|
|
47
|
-
elif [ -f "dxfeed-rust-api/Cargo.toml" ]; then
|
|
48
|
-
cd dxfeed-rust-api
|
|
49
|
-
cargo test --verbose
|
|
44
|
+
if [ -f "rust/Cargo.toml" ]; then
|
|
45
|
+
cd rust
|
|
46
|
+
cargo test --workspace --verbose
|
|
50
47
|
else
|
|
51
|
-
echo "No
|
|
48
|
+
echo "No rust/ workspace found, skipping Rust tests"
|
|
52
49
|
fi
|
|
53
50
|
|
|
54
51
|
- name: Run cargo clippy
|
|
55
52
|
run: |
|
|
56
|
-
if [ -f "
|
|
57
|
-
cd
|
|
58
|
-
cargo clippy -- -D warnings
|
|
59
|
-
elif [ -f "dxfeed-rust-api/Cargo.toml" ]; then
|
|
60
|
-
cd dxfeed-rust-api
|
|
61
|
-
cargo clippy -- -D warnings
|
|
53
|
+
if [ -f "rust/Cargo.toml" ]; then
|
|
54
|
+
cd rust
|
|
55
|
+
cargo clippy --workspace -- -D warnings
|
|
62
56
|
fi
|
|
63
57
|
|
|
64
58
|
- name: Run cargo fmt
|
|
65
59
|
run: |
|
|
66
|
-
if [ -f "
|
|
67
|
-
cd
|
|
68
|
-
cargo fmt --all -- --check
|
|
69
|
-
elif [ -f "dxfeed-rust-api/Cargo.toml" ]; then
|
|
70
|
-
cd dxfeed-rust-api
|
|
60
|
+
if [ -f "rust/Cargo.toml" ]; then
|
|
61
|
+
cd rust
|
|
71
62
|
cargo fmt --all -- --check
|
|
72
63
|
fi
|
|
73
64
|
|
|
@@ -157,10 +148,16 @@ jobs:
|
|
|
157
148
|
with:
|
|
158
149
|
python-version: '3.11'
|
|
159
150
|
|
|
151
|
+
- name: Install package for scan
|
|
152
|
+
run: pip install -e ".[dev]" 2>/dev/null || pip install -e .
|
|
153
|
+
|
|
160
154
|
- name: Install + scan
|
|
161
155
|
run: |
|
|
162
156
|
pip install bandit safety
|
|
163
|
-
|
|
157
|
+
# Scan the full package tree; -ll = medium+high only; fail on high severity
|
|
158
|
+
bandit -r terradev_cli/ -f json -o bandit-report.json -lll || true
|
|
159
|
+
# Print a summary to the job log for visibility
|
|
160
|
+
bandit -r terradev_cli/ -lll --exit-zero
|
|
164
161
|
safety check --json --output safety-report.json || true
|
|
165
162
|
|
|
166
163
|
- uses: actions/upload-artifact@v4
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: Release to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
releases: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
release:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout code
|
|
18
|
+
uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- name: Create GitHub Release
|
|
21
|
+
run: |
|
|
22
|
+
gh release create ${{ github.ref_name }} --generate-notes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: terradev-cli
|
|
3
|
-
Version: 5.0.
|
|
3
|
+
Version: 5.0.2
|
|
4
4
|
Summary: Open Source BYOAPI Multi-Cloud GPU Infrastructure Platform
|
|
5
5
|
Author-email: Terradev Team <team@terradev.com>
|
|
6
6
|
Maintainer-email: Terradev Team <team@terradev.com>
|
|
@@ -92,7 +92,7 @@ Requires-Dist: redis>=5.0.0; extra == "enterprise"
|
|
|
92
92
|
Requires-Dist: PyJWT>=2.8.0; extra == "enterprise"
|
|
93
93
|
Dynamic: license-file
|
|
94
94
|
|
|
95
|
-
# Terradev CLI v5.0.
|
|
95
|
+
# Terradev CLI v5.0.2
|
|
96
96
|
|
|
97
97
|
**Open Source BYOAPI Multi-Cloud GPU Infrastructure Platform**
|
|
98
98
|
|
|
@@ -130,7 +130,7 @@ terradev configure --provider gcp
|
|
|
130
130
|
- **Up to 90% cost savings** with automatic provider switching
|
|
131
131
|
- **<2 minute spot recovery** with KV cache checkpointing
|
|
132
132
|
- **3.6x faster cold starts** with weight streaming
|
|
133
|
-
- **57
|
|
133
|
+
- **57% cost savings** with MLA-aware VRAM estimation
|
|
134
134
|
|
|
135
135
|
## Complete Tutorial
|
|
136
136
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Terradev CLI v5.0.
|
|
1
|
+
# Terradev CLI v5.0.2
|
|
2
2
|
|
|
3
3
|
**Open Source BYOAPI Multi-Cloud GPU Infrastructure Platform**
|
|
4
4
|
|
|
@@ -36,7 +36,7 @@ terradev configure --provider gcp
|
|
|
36
36
|
- **Up to 90% cost savings** with automatic provider switching
|
|
37
37
|
- **<2 minute spot recovery** with KV cache checkpointing
|
|
38
38
|
- **3.6x faster cold starts** with weight streaming
|
|
39
|
-
- **57
|
|
39
|
+
- **57% cost savings** with MLA-aware VRAM estimation
|
|
40
40
|
|
|
41
41
|
## Complete Tutorial
|
|
42
42
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
[workspace]
|
|
2
|
+
resolver = "2"
|
|
2
3
|
members = [
|
|
3
4
|
"terradev-state-machine",
|
|
4
5
|
"terradev-resource-pool",
|
|
@@ -33,7 +34,7 @@ members = [
|
|
|
33
34
|
]
|
|
34
35
|
|
|
35
36
|
[workspace.dependencies]
|
|
36
|
-
pyo3 = { version = "0.20", features = ["
|
|
37
|
+
pyo3 = { version = "0.20", features = ["abi3-py38"] }
|
|
37
38
|
serde = { version = "1.0", features = ["derive"] }
|
|
38
39
|
serde_json = "1.0"
|
|
39
40
|
thiserror = "1.0"
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
#![allow(non_local_definitions)]
|
|
2
|
+
|
|
1
3
|
mod types;
|
|
2
4
|
mod verifier;
|
|
3
5
|
|
|
@@ -15,24 +17,35 @@ fn terradev_artifact_verification(_py: Python, m: &PyModule) -> PyResult<()> {
|
|
|
15
17
|
#[pyclass]
|
|
16
18
|
pub struct PyArtifactVerifier;
|
|
17
19
|
|
|
20
|
+
#[allow(non_local_definitions)]
|
|
18
21
|
#[pymethods]
|
|
19
22
|
impl PyArtifactVerifier {
|
|
20
23
|
#[new]
|
|
21
24
|
fn new() -> Self {
|
|
22
25
|
Self
|
|
23
26
|
}
|
|
24
|
-
|
|
27
|
+
|
|
25
28
|
fn compute_sha256(&self, data: Vec<u8>) -> String {
|
|
26
29
|
ArtifactVerifier::compute_sha256(&data)
|
|
27
30
|
}
|
|
28
|
-
|
|
29
|
-
fn verify_artifact(
|
|
31
|
+
|
|
32
|
+
fn verify_artifact(
|
|
33
|
+
&self,
|
|
34
|
+
data: Vec<u8>,
|
|
35
|
+
expected_checksum: String,
|
|
36
|
+
algorithm: String,
|
|
37
|
+
) -> PyResult<PyVerificationResult> {
|
|
30
38
|
ArtifactVerifier::verify_artifact(&data, &expected_checksum, &algorithm)
|
|
31
39
|
.map(|r| r.into())
|
|
32
40
|
.map_err(|e| PyErr::new::<pyo3::exceptions::PyValueError, _>(e.to_string()))
|
|
33
41
|
}
|
|
34
|
-
|
|
35
|
-
fn verify_file(
|
|
42
|
+
|
|
43
|
+
fn verify_file(
|
|
44
|
+
&self,
|
|
45
|
+
path: String,
|
|
46
|
+
expected_checksum: String,
|
|
47
|
+
algorithm: String,
|
|
48
|
+
) -> PyResult<PyVerificationResult> {
|
|
36
49
|
ArtifactVerifier::verify_file(&path, &expected_checksum, &algorithm)
|
|
37
50
|
.map(|r| r.into())
|
|
38
51
|
.map_err(|e| PyErr::new::<pyo3::exceptions::PyValueError, _>(e.to_string()))
|
|
@@ -5,14 +5,16 @@ use thiserror::Error;
|
|
|
5
5
|
pub enum VerificationError {
|
|
6
6
|
#[error("Hash mismatch: expected {expected}, got {actual}")]
|
|
7
7
|
HashMismatch { expected: String, actual: String },
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
#[allow(dead_code)]
|
|
9
10
|
#[error("Invalid signature")]
|
|
10
11
|
InvalidSignature,
|
|
11
|
-
|
|
12
|
+
|
|
12
13
|
#[error("Artifact not found: {0}")]
|
|
13
14
|
NotFound(String),
|
|
14
15
|
}
|
|
15
16
|
|
|
17
|
+
#[allow(dead_code)]
|
|
16
18
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
17
19
|
pub struct Artifact {
|
|
18
20
|
pub name: String,
|
{terradev_cli-5.0.1 → terradev_cli-5.0.2}/rust/terradev-artifact-verification/src/verifier.rs
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use crate::types::{
|
|
1
|
+
use crate::types::{VerificationError, VerificationResult};
|
|
2
2
|
use sha2::{Digest, Sha256};
|
|
3
3
|
use std::io::Read;
|
|
4
4
|
|
|
@@ -10,7 +10,7 @@ impl ArtifactVerifier {
|
|
|
10
10
|
hasher.update(data);
|
|
11
11
|
hex::encode(hasher.finalize())
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
pub fn verify_artifact(
|
|
15
15
|
data: &[u8],
|
|
16
16
|
expected_checksum: &str,
|
|
@@ -18,12 +18,14 @@ impl ArtifactVerifier {
|
|
|
18
18
|
) -> Result<VerificationResult, VerificationError> {
|
|
19
19
|
let computed = match algorithm {
|
|
20
20
|
"sha256" => Self::compute_sha256(data),
|
|
21
|
-
_ =>
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
_ => {
|
|
22
|
+
return Err(VerificationError::HashMismatch {
|
|
23
|
+
expected: expected_checksum.to_string(),
|
|
24
|
+
actual: "unsupported algorithm".to_string(),
|
|
25
|
+
})
|
|
26
|
+
}
|
|
25
27
|
};
|
|
26
|
-
|
|
28
|
+
|
|
27
29
|
if computed == expected_checksum {
|
|
28
30
|
Ok(VerificationResult {
|
|
29
31
|
is_valid: true,
|
|
@@ -40,19 +42,19 @@ impl ArtifactVerifier {
|
|
|
40
42
|
})
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
|
-
|
|
45
|
+
|
|
44
46
|
pub fn verify_file(
|
|
45
47
|
path: &str,
|
|
46
48
|
expected_checksum: &str,
|
|
47
49
|
algorithm: &str,
|
|
48
50
|
) -> Result<VerificationResult, VerificationError> {
|
|
49
|
-
let mut file =
|
|
50
|
-
.map_err(|_| VerificationError::NotFound(path.to_string()))?;
|
|
51
|
-
|
|
51
|
+
let mut file =
|
|
52
|
+
std::fs::File::open(path).map_err(|_| VerificationError::NotFound(path.to_string()))?;
|
|
53
|
+
|
|
52
54
|
let mut data = Vec::new();
|
|
53
55
|
file.read_to_end(&mut data)
|
|
54
56
|
.map_err(|_| VerificationError::NotFound(path.to_string()))?;
|
|
55
|
-
|
|
57
|
+
|
|
56
58
|
Self::verify_artifact(&data, expected_checksum, algorithm)
|
|
57
59
|
}
|
|
58
60
|
}
|
|
@@ -5,7 +5,7 @@ edition = "2021"
|
|
|
5
5
|
|
|
6
6
|
[lib]
|
|
7
7
|
name = "terradev_authentication"
|
|
8
|
-
crate-type = ["
|
|
8
|
+
crate-type = ["rlib"]
|
|
9
9
|
|
|
10
10
|
[dependencies]
|
|
11
11
|
pyo3 = { workspace = true }
|
|
@@ -16,3 +16,4 @@ hmac = "0.12"
|
|
|
16
16
|
sha1 = "0.10"
|
|
17
17
|
sha2 = "0.10"
|
|
18
18
|
percent-encoding = "2.3"
|
|
19
|
+
hex = "0.4"
|
|
@@ -8,7 +8,11 @@ pub fn encode_parameters(params: &[(String, String)]) -> String {
|
|
|
8
8
|
params
|
|
9
9
|
.iter()
|
|
10
10
|
.map(|(key, value)| {
|
|
11
|
-
format!(
|
|
11
|
+
format!(
|
|
12
|
+
"{}={}",
|
|
13
|
+
percent_encode_rfc3986(key),
|
|
14
|
+
percent_encode_rfc3986(value)
|
|
15
|
+
)
|
|
12
16
|
})
|
|
13
17
|
.collect::<Vec<_>>()
|
|
14
18
|
.join("&")
|
|
@@ -2,11 +2,9 @@ use crate::encoding::{encode_parameters, percent_encode_rfc3986};
|
|
|
2
2
|
use crate::types::{AlibabaCredentials, OVHCredentials, SignatureResult};
|
|
3
3
|
use hmac::{Hmac, Mac};
|
|
4
4
|
use sha1::Sha1;
|
|
5
|
-
use sha2::Sha256;
|
|
6
5
|
use std::time::{SystemTime, UNIX_EPOCH};
|
|
7
6
|
|
|
8
7
|
type HmacSha1 = Hmac<Sha1>;
|
|
9
|
-
type HmacSha256 = Hmac<Sha256>;
|
|
10
8
|
|
|
11
9
|
pub struct AlibabaSigner;
|
|
12
10
|
|
|
@@ -18,10 +16,10 @@ impl AlibabaSigner {
|
|
|
18
16
|
params: &[(String, String)],
|
|
19
17
|
) -> SignatureResult {
|
|
20
18
|
let timestamp = Self::get_timestamp();
|
|
21
|
-
|
|
19
|
+
|
|
22
20
|
// Build canonical query string
|
|
23
21
|
let canonical_query = encode_parameters(params);
|
|
24
|
-
|
|
22
|
+
|
|
25
23
|
// Build string to sign
|
|
26
24
|
let string_to_sign = format!(
|
|
27
25
|
"{}&{}&{}",
|
|
@@ -29,18 +27,18 @@ impl AlibabaSigner {
|
|
|
29
27
|
percent_encode_rfc3986(url),
|
|
30
28
|
percent_encode_rfc3986(&canonical_query)
|
|
31
29
|
);
|
|
32
|
-
|
|
30
|
+
|
|
33
31
|
// Create HMAC-SHA1 signature
|
|
34
32
|
let mut mac = HmacSha1::new_from_slice(credentials.access_key_secret.as_bytes()).unwrap();
|
|
35
33
|
mac.update(string_to_sign.as_bytes());
|
|
36
34
|
let signature = hex::encode(mac.finalize().into_bytes());
|
|
37
|
-
|
|
35
|
+
|
|
38
36
|
SignatureResult {
|
|
39
37
|
signature,
|
|
40
38
|
timestamp,
|
|
41
39
|
}
|
|
42
40
|
}
|
|
43
|
-
|
|
41
|
+
|
|
44
42
|
fn get_timestamp() -> String {
|
|
45
43
|
let now = SystemTime::now()
|
|
46
44
|
.duration_since(UNIX_EPOCH)
|
|
@@ -70,12 +68,12 @@ impl OVHSigner {
|
|
|
70
68
|
timestamp,
|
|
71
69
|
credentials.consumer_key
|
|
72
70
|
);
|
|
73
|
-
|
|
71
|
+
|
|
74
72
|
// Create SHA1 signature
|
|
75
73
|
let mut mac = HmacSha1::new_from_slice(credentials.application_secret.as_bytes()).unwrap();
|
|
76
74
|
mac.update(signature_string.as_bytes());
|
|
77
75
|
let signature = hex::encode(mac.finalize().into_bytes());
|
|
78
|
-
|
|
76
|
+
|
|
79
77
|
SignatureResult {
|
|
80
78
|
signature,
|
|
81
79
|
timestamp: timestamp.to_string(),
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
#![allow(non_local_definitions)]
|
|
2
|
+
|
|
1
3
|
mod encoding;
|
|
2
4
|
mod hmac;
|
|
3
5
|
mod types;
|
|
@@ -25,7 +27,7 @@ impl PyAlibabaSigner {
|
|
|
25
27
|
fn new() -> Self {
|
|
26
28
|
Self
|
|
27
29
|
}
|
|
28
|
-
|
|
30
|
+
|
|
29
31
|
fn sign_request(
|
|
30
32
|
&self,
|
|
31
33
|
credentials: PyAlibabaCredentials,
|
|
@@ -37,7 +39,7 @@ impl PyAlibabaSigner {
|
|
|
37
39
|
access_key_id: credentials.access_key_id,
|
|
38
40
|
access_key_secret: credentials.access_key_secret,
|
|
39
41
|
};
|
|
40
|
-
|
|
42
|
+
|
|
41
43
|
AlibabaSigner::sign_request(&creds, &http_method, &url, ¶ms).into()
|
|
42
44
|
}
|
|
43
45
|
}
|
|
@@ -51,7 +53,7 @@ impl PyOVHSigner {
|
|
|
51
53
|
fn new() -> Self {
|
|
52
54
|
Self
|
|
53
55
|
}
|
|
54
|
-
|
|
56
|
+
|
|
55
57
|
fn sign_request(
|
|
56
58
|
&self,
|
|
57
59
|
credentials: PyOvhCredentials,
|
|
@@ -65,7 +67,7 @@ impl PyOVHSigner {
|
|
|
65
67
|
application_secret: credentials.application_secret,
|
|
66
68
|
consumer_key: credentials.consumer_key,
|
|
67
69
|
};
|
|
68
|
-
|
|
70
|
+
|
|
69
71
|
OVHSigner::sign_request(&creds, &http_method, &url, &body, ×tamp).into()
|
|
70
72
|
}
|
|
71
73
|
}
|
|
@@ -5,7 +5,7 @@ edition = "2021"
|
|
|
5
5
|
|
|
6
6
|
[lib]
|
|
7
7
|
name = "terradev_cache_eviction"
|
|
8
|
-
crate-type = ["
|
|
8
|
+
crate-type = ["rlib"]
|
|
9
9
|
|
|
10
10
|
[dependencies]
|
|
11
11
|
pyo3 = { workspace = true }
|
|
@@ -14,3 +14,4 @@ serde_json = { workspace = true }
|
|
|
14
14
|
thiserror = { workspace = true }
|
|
15
15
|
moka = { workspace = true }
|
|
16
16
|
chrono = { workspace = true }
|
|
17
|
+
parking_lot = { workspace = true }
|
|
@@ -17,20 +17,20 @@ impl CacheEngine {
|
|
|
17
17
|
.max_capacity(max_capacity)
|
|
18
18
|
.time_to_live(Duration::from_secs(3600))
|
|
19
19
|
.build();
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
Self {
|
|
22
22
|
cache,
|
|
23
23
|
policy,
|
|
24
24
|
access_counts: Arc::new(RwLock::new(HashMap::new())),
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
pub fn put(&self, entry: CacheEntry) {
|
|
29
29
|
let key = entry.key.clone();
|
|
30
30
|
let entry_arc = Arc::new(entry);
|
|
31
31
|
self.cache.insert(key.clone(), entry_arc);
|
|
32
32
|
}
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
pub fn get(&self, key: &str) -> Option<Arc<CacheEntry>> {
|
|
35
35
|
if let Some(entry) = self.cache.get(key) {
|
|
36
36
|
let mut counts = self.access_counts.write();
|
|
@@ -40,32 +40,32 @@ impl CacheEngine {
|
|
|
40
40
|
None
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
pub fn remove(&self, key: &str) {
|
|
45
45
|
self.cache.invalidate(key);
|
|
46
46
|
let mut counts = self.access_counts.write();
|
|
47
47
|
counts.remove(key);
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
pub fn contains(&self, key: &str) -> bool {
|
|
51
51
|
self.cache.contains_key(key)
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
pub fn size(&self) -> u64 {
|
|
55
55
|
self.cache.entry_count()
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
pub fn clear(&self) {
|
|
59
59
|
self.cache.invalidate_all();
|
|
60
60
|
let mut counts = self.access_counts.write();
|
|
61
61
|
counts.clear();
|
|
62
62
|
}
|
|
63
|
-
|
|
63
|
+
|
|
64
64
|
pub fn access_count(&self, key: &str) -> u64 {
|
|
65
65
|
let counts = self.access_counts.read();
|
|
66
66
|
*counts.get(key).unwrap_or(&0)
|
|
67
67
|
}
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
pub fn policy(&self) -> &EvictionPolicy {
|
|
70
70
|
&self.policy
|
|
71
71
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
#![allow(non_local_definitions)]
|
|
2
|
+
|
|
1
3
|
mod cache;
|
|
2
4
|
mod types;
|
|
3
5
|
|
|
4
6
|
use cache::CacheEngine;
|
|
5
7
|
use pyo3::prelude::*;
|
|
6
|
-
use pyo3::types::PyDict;
|
|
7
8
|
use types::{CacheEntry, EvictionPolicy};
|
|
8
9
|
|
|
9
10
|
#[pymodule]
|
|
@@ -19,6 +20,7 @@ pub struct PyCacheEngine {
|
|
|
19
20
|
inner: CacheEngine,
|
|
20
21
|
}
|
|
21
22
|
|
|
23
|
+
#[allow(non_local_definitions)]
|
|
22
24
|
#[pymethods]
|
|
23
25
|
impl PyCacheEngine {
|
|
24
26
|
#[new]
|
|
@@ -27,11 +29,11 @@ impl PyCacheEngine {
|
|
|
27
29
|
inner: CacheEngine::new(max_capacity, policy.into()),
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
|
-
|
|
32
|
+
|
|
31
33
|
fn put(&self, entry: PyCacheEntry) {
|
|
32
34
|
self.inner.put(entry.into());
|
|
33
35
|
}
|
|
34
|
-
|
|
36
|
+
|
|
35
37
|
fn get(&self, key: String) -> Option<PyCacheEntry> {
|
|
36
38
|
self.inner.get(&key).map(|e| {
|
|
37
39
|
let entry = (*e).clone();
|
|
@@ -45,31 +47,31 @@ impl PyCacheEngine {
|
|
|
45
47
|
}
|
|
46
48
|
})
|
|
47
49
|
}
|
|
48
|
-
|
|
50
|
+
|
|
49
51
|
fn remove(&self, key: String) {
|
|
50
52
|
self.inner.remove(&key);
|
|
51
53
|
}
|
|
52
|
-
|
|
54
|
+
|
|
53
55
|
fn contains(&self, key: String) -> bool {
|
|
54
56
|
self.inner.contains(&key)
|
|
55
57
|
}
|
|
56
|
-
|
|
58
|
+
|
|
57
59
|
fn size(&self) -> u64 {
|
|
58
60
|
self.inner.size()
|
|
59
61
|
}
|
|
60
|
-
|
|
62
|
+
|
|
61
63
|
fn clear(&mut self) {
|
|
62
64
|
self.inner.clear();
|
|
63
65
|
}
|
|
64
|
-
|
|
66
|
+
|
|
65
67
|
fn access_count(&self, key: String) -> u64 {
|
|
66
68
|
self.inner.access_count(&key)
|
|
67
69
|
}
|
|
68
|
-
|
|
70
|
+
|
|
69
71
|
fn policy(&self) -> String {
|
|
70
72
|
match self.inner.policy() {
|
|
71
|
-
EvictionPolicy::
|
|
72
|
-
EvictionPolicy::
|
|
73
|
+
EvictionPolicy::Lru => "lru".to_string(),
|
|
74
|
+
EvictionPolicy::Arc => "arc".to_string(),
|
|
73
75
|
EvictionPolicy::TinyLFU => "tinylfu".to_string(),
|
|
74
76
|
}
|
|
75
77
|
}
|
|
@@ -98,8 +100,12 @@ impl From<PyCacheEntry> for CacheEntry {
|
|
|
98
100
|
key: p.key,
|
|
99
101
|
value: serde_json::from_str(&p.value).unwrap_or(serde_json::Value::Null),
|
|
100
102
|
size_bytes: p.size_bytes,
|
|
101
|
-
created_at: chrono::DateTime::parse_from_rfc3339(&p.created_at)
|
|
102
|
-
|
|
103
|
+
created_at: chrono::DateTime::parse_from_rfc3339(&p.created_at)
|
|
104
|
+
.unwrap()
|
|
105
|
+
.with_timezone(&chrono::Utc),
|
|
106
|
+
last_accessed: chrono::DateTime::parse_from_rfc3339(&p.last_accessed)
|
|
107
|
+
.unwrap()
|
|
108
|
+
.with_timezone(&chrono::Utc),
|
|
103
109
|
access_count: p.access_count,
|
|
104
110
|
}
|
|
105
111
|
}
|
|
@@ -114,10 +120,10 @@ pub struct PyEvictionPolicy {
|
|
|
114
120
|
impl From<PyEvictionPolicy> for EvictionPolicy {
|
|
115
121
|
fn from(p: PyEvictionPolicy) -> Self {
|
|
116
122
|
match p.policy_type.as_str() {
|
|
117
|
-
"lru" => EvictionPolicy::
|
|
118
|
-
"arc" => EvictionPolicy::
|
|
123
|
+
"lru" => EvictionPolicy::Lru,
|
|
124
|
+
"arc" => EvictionPolicy::Arc,
|
|
119
125
|
"tinylfu" => EvictionPolicy::TinyLFU,
|
|
120
|
-
_ => EvictionPolicy::
|
|
126
|
+
_ => EvictionPolicy::Lru,
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
#![allow(non_local_definitions)]
|
|
2
|
+
|
|
1
3
|
use pyo3::prelude::*;
|
|
2
4
|
use pyo3_asyncio::tokio::future_into_py;
|
|
3
5
|
use serde::{Deserialize, Serialize};
|
|
@@ -47,7 +49,7 @@ impl CommandExecutor {
|
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
match cmd.output() {
|
|
52
|
+
match cmd.output().await {
|
|
51
53
|
Ok(output) => {
|
|
52
54
|
let stdout = String::from_utf8_lossy(&output.stdout).to_string();
|
|
53
55
|
let stderr = String::from_utf8_lossy(&output.stderr).to_string();
|
|
@@ -68,6 +70,7 @@ impl CommandExecutor {
|
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
|
|
73
|
+
#[allow(clippy::type_complexity)]
|
|
71
74
|
pub async fn execute_parallel(
|
|
72
75
|
&self,
|
|
73
76
|
commands: Vec<(String, Vec<String>, Option<HashMap<String, String>>)>,
|
|
@@ -76,9 +79,7 @@ impl CommandExecutor {
|
|
|
76
79
|
.into_iter()
|
|
77
80
|
.map(|(program, args, env)| {
|
|
78
81
|
let executor = self.clone();
|
|
79
|
-
tokio::spawn(async move {
|
|
80
|
-
executor.execute_command(program, args, env).await
|
|
81
|
-
})
|
|
82
|
+
tokio::spawn(async move { executor.execute_command(program, args, env).await })
|
|
82
83
|
})
|
|
83
84
|
.collect::<Vec<_>>();
|
|
84
85
|
|
|
@@ -123,7 +124,7 @@ impl PyCommandExecutor {
|
|
|
123
124
|
env: Option<HashMap<String, String>>,
|
|
124
125
|
) -> PyResult<&'p PyAny> {
|
|
125
126
|
let executor = self.inner.clone();
|
|
126
|
-
future_into_py(py, async move {
|
|
127
|
+
future_into_py::<_, PyObject>(py, async move {
|
|
127
128
|
let result = executor.execute_command(program, args, env).await;
|
|
128
129
|
Python::with_gil(|py| {
|
|
129
130
|
let dict = pyo3::types::PyDict::new(py);
|
|
@@ -136,13 +137,14 @@ impl PyCommandExecutor {
|
|
|
136
137
|
})
|
|
137
138
|
}
|
|
138
139
|
|
|
140
|
+
#[allow(clippy::type_complexity)]
|
|
139
141
|
fn execute_parallel<'p>(
|
|
140
142
|
&self,
|
|
141
143
|
py: Python<'p>,
|
|
142
144
|
commands: Vec<(String, Vec<String>, Option<HashMap<String, String>>)>,
|
|
143
145
|
) -> PyResult<&'p PyAny> {
|
|
144
146
|
let executor = self.inner.clone();
|
|
145
|
-
future_into_py(py, async move {
|
|
147
|
+
future_into_py::<_, PyObject>(py, async move {
|
|
146
148
|
let results = executor.execute_parallel(commands).await;
|
|
147
149
|
Python::with_gil(|py| {
|
|
148
150
|
let list = pyo3::types::PyList::empty(py);
|