terradev-cli 5.6.0__tar.gz → 5.6.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.6.0 → terradev_cli-5.6.2}/PKG-INFO +14 -2
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/README.md +13 -1
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/pyproject.toml +1 -1
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/cli.py +216 -24
- terradev_cli-5.6.2/terradev_cli/core/database_connection.py +440 -0
- terradev_cli-5.6.2/terradev_cli/core/observe.py +321 -0
- terradev_cli-5.6.2/terradev_cli/core/schedule.py +414 -0
- terradev_cli-5.6.2/terradev_cli/mcp/new_feature_tools.py +291 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/mcp/server.py +31 -16
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli.egg-info/PKG-INFO +14 -2
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli.egg-info/SOURCES.txt +4 -0
- terradev_cli-5.6.2/test_database_connection.py +171 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_cli_smoke.py +23 -18
- terradev_cli-5.6.0/terradev_cli/mcp/new_feature_tools.py +0 -15
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/.env.example +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/.github/workflows/action.yml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/.github/workflows/ci-improved.yml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/.github/workflows/ci.yml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/.github/workflows/release.yml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/.github/workflows/static.yml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/.terradev/custom_providers.example.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Deployment Package/BNF_GRAMMAR.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Deployment Package/LIFECYCLES.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Deployment Package/architecture.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Deployment Package/overview.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Deployment Package/security.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Deployment Package/troubleshooting.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Dockerfile +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/Dockerfile.test +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/LICENSE +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/MANIFEST.in +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/RELEASE_CHECKLIST.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/agentic-template/helm/values-agentic.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/agentic-template/k8s/fleet-manifests.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/README.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/helm/values-glm5.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/k8s/hpa.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/k8s/namespace.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/k8s/pdb.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/k8s/service.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/k8s/sglang-deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/k8s/vllm-deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/task.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/terraform/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/terraform/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/glm-5/terraform/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/llmd-template/README.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/llmd-template/helm/values-llmd.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/llmd-template/k8s/gateway.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/llmd-template/k8s/leaderworkerset.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/llmd-template/k8s/llminferenceservice.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/llmd-template/task.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/Chart.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/templates/_helpers.tpl +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/templates/deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/templates/pvc-adapter.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/templates/pvc-registry.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/templates/service.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/templates/serviceaccount.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/helm/values-lora.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/k8s/adapter-pvc.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/k8s/registry-pvc.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/k8s/service.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lora-template/k8s/serviceaccount.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lorax-template/helm/Chart.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lorax-template/helm/templates/_helpers.tpl +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lorax-template/helm/templates/deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lorax-template/helm/templates/pvc.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lorax-template/helm/templates/service.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lorax-template/helm/templates/serviceaccount.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/lorax-template/helm/values-lorax.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/README.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/helm/values-moe.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/k8s/hpa.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/k8s/model-cache-pvc.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/k8s/namespace.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/k8s/pdb.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/k8s/service.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/task.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/terraform/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/terraform/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/moe-template/terraform/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/rag-template/README.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/rag-template/helm/values-rag.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/rag-template/k8s/deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/clusters/rag-template/terraform/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/demo/RECORDING_GUIDE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/demo/generate_gif.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/demo/terradev-demo.gif +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/ADVANCED_FINANCIAL_INNOVATIONS.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/API_DOCUMENTATION.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/BingSiteAuth.xml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/FINOPS_ATTRIBUTION_SYSTEM.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/LORA_COMMAND_LIFECYCLE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/USER_GUIDE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/VLLM_AUTO_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/VLLM_OPTIMIZATION_GUIDE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/architecture.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/index.html +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/overview.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/robots.txt +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/sitemap.xml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/docs/test_spot_provision.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/aws_ssm_starter.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/config.example.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/demo_k8s_config.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/direct_aws_starter.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/ec2_user_data_starter.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/example-pipeline.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/kubernetes_training_deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/simple_ssm_starter.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/ssh_server_starter.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/examples/start_aws_servers.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/helm/terradev/Chart.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/helm/terradev/templates/_helpers.tpl +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/helm/terradev/templates/deployment.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/helm/terradev/values.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/infrastructure/bucket-policy.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/infrastructure/grafana_training_dashboard.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/infrastructure/kubernetes/microservices.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/infrastructure/terraform/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/infrastructure/terraform/parallelism.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/cli-tool.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/cloud-management-widgets.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/cloud-provider-apis.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/critical-widgets.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/devops-cicd-widgets.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/devops-essential-tools.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/docker-integration.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/kubernetes-operator.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/integrations/mlflow-integration.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/marketing/bare-metal-latitude-post.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/datadog/README.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/datadog/dashboard.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/datadog/monitors.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/datadog/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/datadog/provider.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/datadog/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/datadog/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/modules/prometheus_training_config.yml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/PERFORMANCE_OPTIMIZATIONS.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/README.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-artifact-verification/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-artifact-verification/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-artifact-verification/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-artifact-verification/src/verifier.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-authentication/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-authentication/src/encoding.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-authentication/src/hmac.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-authentication/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-authentication/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cache-eviction/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cache-eviction/src/cache.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cache-eviction/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cache-eviction/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-command-executor/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-command-executor/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-config-validator/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-config-validator/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-config-validator/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-config-validator/src/validator.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-connection-pool/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-connection-pool/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-connection-pool/src/pool.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-connection-pool/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cost-calculator/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cost-calculator/src/calculator.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cost-calculator/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cost-calculator/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cost-scaler/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-cost-scaler/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-credential-vault/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-credential-vault/pyproject.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-credential-vault/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-credential-vault/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-credential-vault/src/vault.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-dag-executor/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-dag-executor/pyproject.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-dag-executor/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-distributed-lock/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-distributed-lock/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-distributed-lock/src/lock.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-distributed-lock/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-egress-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-egress-optimizer/src/graph.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-egress-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-egress-optimizer/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-event-bus/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-event-bus/src/bus.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-event-bus/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-event-bus/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-governance/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-governance/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-gpu-discovery/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-gpu-discovery/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-gpu-topology/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-gpu-topology/pyproject.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-gpu-topology/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-gpu-topology/src/topology.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-gpu-topology/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-helm-generator/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-helm-generator/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-mcp-codec/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-mcp-codec/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-mcp-optimizer/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-mcp-optimizer/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-price-intelligence/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-price-intelligence/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-quota-manager/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-quota-manager/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-quota-manager/src/manager.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-quota-manager/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-resource-pool/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-resource-pool/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-resource-pool/src/pool.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-resource-pool/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-result-compressor/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-result-compressor/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-semantic-router/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-semantic-router/pyproject.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-semantic-router/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-snapshot-manager/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-snapshot-manager/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-snapshot-manager/src/snapshot.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-snapshot-manager/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-state-machine/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-state-machine/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-state-machine/src/state.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-state-machine/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-telemetry/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-telemetry/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-telemetry/src/pipeline.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-telemetry/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-tool-registry/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-tool-registry/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-vram-estimator/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-vram-estimator/src/estimator.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-vram-estimator/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-vram-estimator/src/types.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-warm-pool/Cargo.toml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/rust/terradev-warm-pool/src/lib.rs +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/scripts/action.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/scripts/build_rust.sh +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/scripts/gpu-check.sh +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/setup/Lambda Cloud API spec 1.8.3.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/setup/docker-compose.yml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/setup/nginx.conf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/setup/setup.sh +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/setup.cfg +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/CHANGELOG.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/COMPLETE_COMMAND_REFERENCE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/COMPLETE_INTEGRATION_GUIDE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/IMPLEMENTATION_SUMMARY.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/MAKING_SPOT_WORK_FOR_STATEFUL_WORKLOADS.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/README.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/SGLANG_COMMAND_GUIDE.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/TERRADEV_STACK_CHART.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/__main__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/cli_hf_spaces.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/cli_karpenter.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/agentic_provisioner.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/agentic_topology.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/async_config.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/auth.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/auto_lineage.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/cache_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/checkpoint_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/command_executor.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/config.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/config_validator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/cost_scaler.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/cost_tracker.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/credential_vault.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/cuda_graph_integrator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/dag_executor.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/data_governance.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/dataset_stager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/deployment_router.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/distributed_lock.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/drift_detector.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/egress_cost_monitor.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/egress_optimizer.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/evaluation_orchestrator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/event_system.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/gateway_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/gitops_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/gpu_discovery.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/gpu_topology.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/helm_generator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/hf_cli_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/hf_smart_templates.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/hf_spaces.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/inference_router.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/inference_spot_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/job_state_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/kv_cache_checkpoint_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/kv_cache_checkpoint_tests.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/kv_sharing.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/lora_consistency.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/lora_cost_attribution.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/lora_versioning.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/manifest_cache.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/manifest_example.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/mig_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/migration_orchestrator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/mla_vram_estimator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/mla_vram_tests.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/model_orchestrator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/monitoring.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/oidc_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/optimization_config.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/parallel_provisioner.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/pd_transport.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/pipeline_schema.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/preflight_validator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/price_discovery.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/price_intelligence.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/public_ip_billing_tracker.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/quick_start.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/quota_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/rate_limiter.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/rust_telemetry.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_router.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/base_signal.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/complexity_signal.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/domain_signal.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/keyword_signal.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/language_signal.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/modality_signal.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/orchestrator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/routing_policy.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/semantic_signals/safety_signal.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/session_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/ssh_key_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/telemetry.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/terradev_engine.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/trace_viewer.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/training_monitor.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/training_orchestrator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/user_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/warm_pool_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/weight_streaming_benchmarks.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/core/weight_streaming_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/cost_optimizer.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/credential_prompt.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/demo.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/entry_point.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/Terradev LOGO BLACK.png +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/Terradev LOGO WHITEW.png +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/databricks_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/datadog_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/helicone_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/prometheus_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/integrations/wandb_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/k8s/terraform_wrapper.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/kubernetes/inferx-cost-optimized.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/kubernetes/inferx-infrastructure.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/kubernetes/inferx-models.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/kubernetes/inferx-platform.yaml +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/kubernetes/inferx_setup.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/mcp/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/agentic_serving.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/drift_retrain_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/dvc_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/guardrails_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/huggingface_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/kserve_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/kubernetes_enhanced.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/kubernetes_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/langchain_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/langfuse_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/langgraph_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/lmcache_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/lora_registry.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/lorax_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/mlflow_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/model_router.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/ollama_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/peft_import_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/phoenix_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/qdrant_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/ray_enhanced.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/ray_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/sglang_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/vllm_service.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/ml_services/wandb_enhanced.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/optimization/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/optimization/auto_optimizer.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/optimization/cuco_optimizer.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/LATITUDE_PROVIDER.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/alibaba_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/aws_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/azure_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/base_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/baseten_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/coreweave_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/crusoe_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/demo_mode.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/digitalocean_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/e2e_networks_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/fluidstack_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/gcp_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/gpu_catalog.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/hetzner_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/huggingface_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/hyperstack_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/inferx_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/lambda_labs_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/latitude_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/oracle_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/ovhcloud_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/provider_factory.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/provider_profiles.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/real_pricing.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/registry.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/runpod_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/siliconflow_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/tensordock_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/types.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/vastai_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/providers/yottalabs_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/requirements.txt +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/requirements_minimal.txt +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-aws/bootstrap.sh +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-aws/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-aws/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-aws/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-aws/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/bootstrap.sh +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-hyperstack/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-lambda/bootstrap.sh +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-lambda/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-lambda/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-lambda/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-lambda/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-vastai/bootstrap.sh +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-vastai/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-vastai/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-vastai/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/gpu-node-vastai/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/k8s-control-plane/join-script.tpl +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/k8s-control-plane/kubeconfig.tpl +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/k8s-control-plane/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/k8s-control-plane/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/k8s-control-plane/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/k8s-control-plane/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/networking/main.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/networking/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/networking/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/modules/networking/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/outputs.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/price-optimizer/optimal-allocation.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/providers.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/terraform/variables.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/test_summary.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/utils/__init__.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli/utils/formatters.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli.egg-info/dependency_links.txt +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli.egg-info/entry_points.txt +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli.egg-info/requires.txt +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terradev_cli.egg-info/top_level.txt +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform.tfvars.example +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_optimization/backend.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_optimization/error_handling.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_optimization/parallel_provisioning.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_optimization/storage_choice_matrix.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_optimization/test_error_handler.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_optimization/versions.tf +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/audit_demo/trail_3caed73ad5bf.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/audit_trail.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/audit_trails.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/decision_engine.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/decision_logs.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/operations.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/terraform_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/terraform_plans.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/transparency_demo.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/terraform_transparency/transparency_report.json +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/CREDENTIAL_STRATEGY.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/INTEGRATION_STRATEGY.md +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/Makefile +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/ci_pipeline.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/conftest.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_cli_ux_battle.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_cli_ux_battle_fixed.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_cli_ux_final.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_final_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_integrated_optimization.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_p10_production_failover.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_sso_phase1.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/root_tests/test_vllm_optimization.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/simple_test.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_ai_integrations.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_base_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_checkpoint_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_cli_commands.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_cli_utils.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_core_components.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_dag_executor.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_demo_mode.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_flashoptim.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_formatters.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_gpu_catalog.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_integration.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_job_state_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_k8s_regression.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_latitude_provider.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_major_providers.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_mcp_handlers.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_ml_integrations.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_new_providers.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_provider_conformance.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_provider_factory.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_provider_profiles.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_providers.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_real_pricing.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_semantic_router.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_session_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_sglang_optimization.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_ssh_key_manager.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_terradev_engine.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_trace_viewer.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_training_monitor.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.2}/tests/test_training_orchestrator.py +0 -0
- {terradev_cli-5.6.0 → terradev_cli-5.6.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.6.
|
|
3
|
+
Version: 5.6.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>
|
|
@@ -100,7 +100,7 @@ Requires-Dist: redis>=5.0.0; extra == "enterprise"
|
|
|
100
100
|
Requires-Dist: PyJWT>=2.8.0; extra == "enterprise"
|
|
101
101
|
Dynamic: license-file
|
|
102
102
|
|
|
103
|
-
# Terradev CLI v5.6.
|
|
103
|
+
# Terradev CLI v5.6.2
|
|
104
104
|
|
|
105
105
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
106
106
|
|
|
@@ -118,6 +118,18 @@ Continued focus on lower cost, faster provisioning, and topology-aware execution
|
|
|
118
118
|
|
|
119
119
|
Model agnostic. Dataset agnostic. GPU agnostic. Provider agnostic. The only thing Terradev is not agnostic about is correctness: it enforces topology, idempotency, and sequencing.
|
|
120
120
|
|
|
121
|
+
**NOTES ON 5.6.1**
|
|
122
|
+
|
|
123
|
+
Added **Database Connection System** and **Unified Observability & Scheduling** commands:
|
|
124
|
+
|
|
125
|
+
- **Database Connection System** (`core/database_connection.py`): SQLite and PostgreSQL support with in-memory connection storage, connection ID system, auto-table creation for 4 standard metadata tables (dataset_versions, workflow_runs, idempotency_keys, node_executions), and database operations (query, upsert, get connection).
|
|
126
|
+
|
|
127
|
+
- **Observe Command** (`terradev observe`): Unified monitoring pipeline that wires API Gateway traffic into W&B, Phoenix, and Cost Analytics with a shared trace ID across all three destinations. Commands: `terradev observe gateway`, `terradev observe status`.
|
|
128
|
+
|
|
129
|
+
- **Schedule Command** (`terradev schedule`): Spot-aware scheduling for cost-optimized job execution with pricing window awareness (not just generic cron). Commands: `terradev schedule job`, `terradev schedule list`, `terradev schedule windows`.
|
|
130
|
+
|
|
131
|
+
- **MCP Tools**: 5 new database tools for connection management and queries (create_sqlite_connection, create_postgresql_connection, query_database, upsert_database, get_database_connection).
|
|
132
|
+
|
|
121
133
|
**NOTES ON 5.6.0**
|
|
122
134
|
|
|
123
135
|
Added **API Gateway for inference serving** with OpenAI/Anthropic/custom API entry and exit points:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Terradev CLI v5.6.
|
|
1
|
+
# Terradev CLI v5.6.2
|
|
2
2
|
|
|
3
3
|
**An imperative command-line-interface for AI workload orchestration.**
|
|
4
4
|
|
|
@@ -16,6 +16,18 @@ Continued focus on lower cost, faster provisioning, and topology-aware execution
|
|
|
16
16
|
|
|
17
17
|
Model agnostic. Dataset agnostic. GPU agnostic. Provider agnostic. The only thing Terradev is not agnostic about is correctness: it enforces topology, idempotency, and sequencing.
|
|
18
18
|
|
|
19
|
+
**NOTES ON 5.6.1**
|
|
20
|
+
|
|
21
|
+
Added **Database Connection System** and **Unified Observability & Scheduling** commands:
|
|
22
|
+
|
|
23
|
+
- **Database Connection System** (`core/database_connection.py`): SQLite and PostgreSQL support with in-memory connection storage, connection ID system, auto-table creation for 4 standard metadata tables (dataset_versions, workflow_runs, idempotency_keys, node_executions), and database operations (query, upsert, get connection).
|
|
24
|
+
|
|
25
|
+
- **Observe Command** (`terradev observe`): Unified monitoring pipeline that wires API Gateway traffic into W&B, Phoenix, and Cost Analytics with a shared trace ID across all three destinations. Commands: `terradev observe gateway`, `terradev observe status`.
|
|
26
|
+
|
|
27
|
+
- **Schedule Command** (`terradev schedule`): Spot-aware scheduling for cost-optimized job execution with pricing window awareness (not just generic cron). Commands: `terradev schedule job`, `terradev schedule list`, `terradev schedule windows`.
|
|
28
|
+
|
|
29
|
+
- **MCP Tools**: 5 new database tools for connection management and queries (create_sqlite_connection, create_postgresql_connection, query_database, upsert_database, get_database_connection).
|
|
30
|
+
|
|
19
31
|
**NOTES ON 5.6.0**
|
|
20
32
|
|
|
21
33
|
Added **API Gateway for inference serving** with OpenAI/Anthropic/custom API entry and exit points:
|
|
@@ -4519,7 +4519,13 @@ def job(job_file, optimize):
|
|
|
4519
4519
|
print(f"ERROR: Error loading job file: {e}")
|
|
4520
4520
|
|
|
4521
4521
|
|
|
4522
|
-
@cli.
|
|
4522
|
+
@cli.group()
|
|
4523
|
+
def infer():
|
|
4524
|
+
"""Deploy and manage inference endpoints"""
|
|
4525
|
+
pass
|
|
4526
|
+
|
|
4527
|
+
|
|
4528
|
+
@infer.command("deploy")
|
|
4523
4529
|
@click.option("--model", "-m", required=True, help="Model name or path")
|
|
4524
4530
|
@click.option(
|
|
4525
4531
|
"--type", "-t", type=click.Choice(["llm", "embedding", "vision"]), help="Model type"
|
|
@@ -4534,7 +4540,7 @@ def job(job_file, optimize):
|
|
|
4534
4540
|
@click.option("--region", "-r", help="Region preference")
|
|
4535
4541
|
@click.option("--max-latency", type=float, help="Max latency in ms")
|
|
4536
4542
|
@click.option("--max-cost", type=float, help="Max cost per request")
|
|
4537
|
-
def
|
|
4543
|
+
def infer_deploy_main(model, type, provider, gpu_type, region, max_latency, max_cost):
|
|
4538
4544
|
"""Deploy and manage inference endpoints"""
|
|
4539
4545
|
print(f"Deploying inference for model: {model}")
|
|
4540
4546
|
|
|
@@ -4688,7 +4694,7 @@ def infer(model, type, provider, gpu_type, region, max_latency, max_cost):
|
|
|
4688
4694
|
pass
|
|
4689
4695
|
|
|
4690
4696
|
|
|
4691
|
-
@
|
|
4697
|
+
@infer.command("endpoint")
|
|
4692
4698
|
@click.argument("model_path")
|
|
4693
4699
|
@click.option("--name", "-n", required=True, help="Endpoint name (required)")
|
|
4694
4700
|
@click.option(
|
|
@@ -4703,7 +4709,7 @@ def infer(model, type, provider, gpu_type, region, max_latency, max_cost):
|
|
|
4703
4709
|
@click.option("--idle-timeout", type=int, default=300, help="Idle timeout in seconds")
|
|
4704
4710
|
@click.option("--cost-optimize", is_flag=True, help="Enable cost optimization")
|
|
4705
4711
|
@click.option("--dry-run", is_flag=True, help="Show deployment plan without deploying")
|
|
4706
|
-
def
|
|
4712
|
+
def infer_endpoint(
|
|
4707
4713
|
model_path,
|
|
4708
4714
|
name,
|
|
4709
4715
|
provider,
|
|
@@ -5217,7 +5223,7 @@ def run(gpu, image, cmd, mount, port, env, max_price, providers, keep_alive, dry
|
|
|
5217
5223
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
5218
5224
|
|
|
5219
5225
|
|
|
5220
|
-
@
|
|
5226
|
+
@infer.command("status")
|
|
5221
5227
|
@click.option(
|
|
5222
5228
|
"--check", is_flag=True, help="Run live health probes before showing status"
|
|
5223
5229
|
)
|
|
@@ -5288,7 +5294,7 @@ def infer_status(check):
|
|
|
5288
5294
|
pass
|
|
5289
5295
|
|
|
5290
5296
|
|
|
5291
|
-
@
|
|
5297
|
+
@infer.command("failover")
|
|
5292
5298
|
@click.option(
|
|
5293
5299
|
"--dry-run", is_flag=True, help="Show what would happen without executing failover"
|
|
5294
5300
|
)
|
|
@@ -5363,7 +5369,7 @@ def infer_failover(dry_run):
|
|
|
5363
5369
|
print(" OK: All primary endpoints healthy no failover needed.")
|
|
5364
5370
|
|
|
5365
5371
|
|
|
5366
|
-
@
|
|
5372
|
+
@infer.command("route")
|
|
5367
5373
|
@click.option("--model", "-m", help="Filter by model name")
|
|
5368
5374
|
@click.option(
|
|
5369
5375
|
"--strategy",
|
|
@@ -8276,7 +8282,13 @@ def hf_space(space_name, model_id, hardware, sdk, private, template, env, secret
|
|
|
8276
8282
|
|
|
8277
8283
|
|
|
8278
8284
|
# Model Orchestrator Commands
|
|
8279
|
-
@cli.
|
|
8285
|
+
@cli.group()
|
|
8286
|
+
def orchestrator():
|
|
8287
|
+
"""Model orchestrator for multi-model inference"""
|
|
8288
|
+
pass
|
|
8289
|
+
|
|
8290
|
+
|
|
8291
|
+
@orchestrator.command("start")
|
|
8280
8292
|
@click.option("--gpu-id", default=0, help="GPU ID to use for orchestration")
|
|
8281
8293
|
@click.option("--memory-gb", default=80.0, help="Total GPU memory in GB")
|
|
8282
8294
|
@click.option(
|
|
@@ -8324,7 +8336,7 @@ def orchestrator_start(gpu_id, memory_gb, policy):
|
|
|
8324
8336
|
asyncio.run(run_orchestrator())
|
|
8325
8337
|
|
|
8326
8338
|
|
|
8327
|
-
@
|
|
8339
|
+
@orchestrator.command("register")
|
|
8328
8340
|
@click.argument("model-id")
|
|
8329
8341
|
@click.argument("model-path")
|
|
8330
8342
|
@click.option(
|
|
@@ -8361,7 +8373,7 @@ def orchestrator_register(model_id, model_path, framework, priority, tags):
|
|
|
8361
8373
|
print(f" Tags: {', '.join(tag_set) if tag_set else 'None'}")
|
|
8362
8374
|
|
|
8363
8375
|
|
|
8364
|
-
@
|
|
8376
|
+
@orchestrator.command("load")
|
|
8365
8377
|
@click.argument("model-id")
|
|
8366
8378
|
@click.option("--force", is_flag=True, help="Force loading even if memory is full")
|
|
8367
8379
|
def orchestrator_load(model_id, force):
|
|
@@ -8385,7 +8397,7 @@ def orchestrator_load(model_id, force):
|
|
|
8385
8397
|
asyncio.run(load_model())
|
|
8386
8398
|
|
|
8387
8399
|
|
|
8388
|
-
@
|
|
8400
|
+
@orchestrator.command("evict")
|
|
8389
8401
|
@click.argument("model-id")
|
|
8390
8402
|
def orchestrator_evict(model_id):
|
|
8391
8403
|
"""Evict a model from GPU memory"""
|
|
@@ -8403,7 +8415,7 @@ def orchestrator_evict(model_id):
|
|
|
8403
8415
|
asyncio.run(evict_model())
|
|
8404
8416
|
|
|
8405
8417
|
|
|
8406
|
-
@
|
|
8418
|
+
@orchestrator.command("status")
|
|
8407
8419
|
@click.option("--model-id", help="Get details for specific model")
|
|
8408
8420
|
def orchestrator_status(model_id):
|
|
8409
8421
|
"""Get orchestrator and model status"""
|
|
@@ -8447,7 +8459,7 @@ def orchestrator_status(model_id):
|
|
|
8447
8459
|
print(f" {state}: {', '.join(model_ids)}")
|
|
8448
8460
|
|
|
8449
8461
|
|
|
8450
|
-
@
|
|
8462
|
+
@orchestrator.command("infer")
|
|
8451
8463
|
@click.argument("model-id")
|
|
8452
8464
|
def orchestrator_infer(model_id):
|
|
8453
8465
|
"""Test inference with a model"""
|
|
@@ -8466,7 +8478,13 @@ def orchestrator_infer(model_id):
|
|
|
8466
8478
|
asyncio.run(test_inference())
|
|
8467
8479
|
|
|
8468
8480
|
|
|
8469
|
-
@cli.
|
|
8481
|
+
@cli.group(name="warm-pool")
|
|
8482
|
+
def warm_pool():
|
|
8483
|
+
"""Warm pool manager for intelligent pre-warming"""
|
|
8484
|
+
pass
|
|
8485
|
+
|
|
8486
|
+
|
|
8487
|
+
@warm_pool.command("start")
|
|
8470
8488
|
@click.option(
|
|
8471
8489
|
"--strategy",
|
|
8472
8490
|
type=click.Choice(
|
|
@@ -8527,7 +8545,7 @@ def warm_pool_start(strategy, max_warm, min_warm):
|
|
|
8527
8545
|
asyncio.run(run_warm_pool())
|
|
8528
8546
|
|
|
8529
8547
|
|
|
8530
|
-
@
|
|
8548
|
+
@warm_pool.command("register")
|
|
8531
8549
|
@click.argument("model-id")
|
|
8532
8550
|
@click.option("--priority", default=0, help="Model priority for warming")
|
|
8533
8551
|
def warm_pool_register(model_id, priority):
|
|
@@ -8541,7 +8559,7 @@ def warm_pool_register(model_id, priority):
|
|
|
8541
8559
|
print(f" Priority: {priority}")
|
|
8542
8560
|
|
|
8543
8561
|
|
|
8544
|
-
@
|
|
8562
|
+
@warm_pool.command("status")
|
|
8545
8563
|
def warm_pool_status():
|
|
8546
8564
|
"""Get warm pool manager status"""
|
|
8547
8565
|
from terradev_cli.core.warm_pool_manager import WarmPoolManager, WarmPoolConfig
|
|
@@ -8563,7 +8581,13 @@ def warm_pool_status():
|
|
|
8563
8581
|
print(f" Cost saved: ${status['cost_saved_usd']:.2f}")
|
|
8564
8582
|
|
|
8565
8583
|
|
|
8566
|
-
@cli.
|
|
8584
|
+
@cli.group()
|
|
8585
|
+
def cost_scaler():
|
|
8586
|
+
"""Cost-aware scaling manager for inference optimization"""
|
|
8587
|
+
pass
|
|
8588
|
+
|
|
8589
|
+
|
|
8590
|
+
@cost_scaler.command("start")
|
|
8567
8591
|
@click.option(
|
|
8568
8592
|
"--strategy",
|
|
8569
8593
|
type=click.Choice(
|
|
@@ -8623,7 +8647,7 @@ def cost_scaler_start(strategy, budget, cost_per_gb):
|
|
|
8623
8647
|
asyncio.run(run_cost_scaler())
|
|
8624
8648
|
|
|
8625
8649
|
|
|
8626
|
-
@
|
|
8650
|
+
@cost_scaler.command("status")
|
|
8627
8651
|
def cost_scaler_status():
|
|
8628
8652
|
"""Get cost scaler status and recommendations"""
|
|
8629
8653
|
from terradev_cli.core.cost_scaler import CostScaler, CostConfig
|
|
@@ -8655,7 +8679,7 @@ def cost_scaler_status():
|
|
|
8655
8679
|
print(f" Potential savings: {rec['potential_savings']}")
|
|
8656
8680
|
|
|
8657
8681
|
|
|
8658
|
-
@
|
|
8682
|
+
@cost_scaler.command("model-details")
|
|
8659
8683
|
@click.argument("model-id")
|
|
8660
8684
|
def cost_scaler_model_details(model_id):
|
|
8661
8685
|
"""Get cost details for a specific model"""
|
|
@@ -9499,7 +9523,13 @@ def preflight(nodes, ssh_user, ssh_key, provision_group, quick, fmt):
|
|
|
9499
9523
|
print()
|
|
9500
9524
|
|
|
9501
9525
|
|
|
9502
|
-
@cli.
|
|
9526
|
+
@cli.group()
|
|
9527
|
+
def train():
|
|
9528
|
+
"""Launch distributed training jobs across provisioned GPU nodes"""
|
|
9529
|
+
pass
|
|
9530
|
+
|
|
9531
|
+
|
|
9532
|
+
@train.command("start")
|
|
9503
9533
|
@click.option(
|
|
9504
9534
|
"--config",
|
|
9505
9535
|
"-c",
|
|
@@ -9557,7 +9587,7 @@ def preflight(nodes, ssh_user, ssh_key, provision_group, quick, fmt):
|
|
|
9557
9587
|
help="Output format: text (default) or json",
|
|
9558
9588
|
)
|
|
9559
9589
|
@click.argument("script_args", nargs=-1, type=click.UNPROCESSED)
|
|
9560
|
-
def
|
|
9590
|
+
def train_start(
|
|
9561
9591
|
config_path,
|
|
9562
9592
|
script,
|
|
9563
9593
|
framework,
|
|
@@ -9880,7 +9910,7 @@ def checkpoint(action, job_id, step, checkpoint_id, dest, fmt):
|
|
|
9880
9910
|
print(f"Deleted: {checkpoint_id}")
|
|
9881
9911
|
|
|
9882
9912
|
|
|
9883
|
-
@
|
|
9913
|
+
@train.command("status")
|
|
9884
9914
|
@click.option("--job-id", "-j", default="", help="Job ID (empty = all running)")
|
|
9885
9915
|
@click.option(
|
|
9886
9916
|
"--format", "-f", "fmt", type=click.Choice(["json", "text"]), default="text"
|
|
@@ -9954,7 +9984,7 @@ def train_status(job_id, fmt):
|
|
|
9954
9984
|
print(f"\nTotal cost across all jobs: ${total:.2f}\n")
|
|
9955
9985
|
|
|
9956
9986
|
|
|
9957
|
-
@
|
|
9987
|
+
@train.command("stop")
|
|
9958
9988
|
@click.option("--job-id", "-j", required=True, help="Job ID to stop")
|
|
9959
9989
|
@click.option(
|
|
9960
9990
|
"--format", "-f", "fmt", type=click.Choice(["json", "text"]), default="text"
|
|
@@ -9978,7 +10008,7 @@ def train_stop(job_id, fmt):
|
|
|
9978
10008
|
print(f"Job {job_id}: {result.get('status', 'unknown')}")
|
|
9979
10009
|
|
|
9980
10010
|
|
|
9981
|
-
@
|
|
10011
|
+
@train.command("resume")
|
|
9982
10012
|
@click.option("--job-id", "-j", required=True, help="Job ID to resume")
|
|
9983
10013
|
@click.option(
|
|
9984
10014
|
"--checkpoint-id", default="", help="Checkpoint to resume from (default: latest)"
|
|
@@ -16017,6 +16047,168 @@ def gateway(host, port, openai, no_openai, anthropic, no_anthropic, custom, no_c
|
|
|
16017
16047
|
sys.exit(1)
|
|
16018
16048
|
|
|
16019
16049
|
|
|
16050
|
+
# Observe Command - Unified Monitoring Pipeline
|
|
16051
|
+
@cli.group()
|
|
16052
|
+
def observe():
|
|
16053
|
+
"""Unified observability pipeline - W&B, Phoenix, Cost Analytics with shared trace ID"""
|
|
16054
|
+
pass
|
|
16055
|
+
|
|
16056
|
+
|
|
16057
|
+
@observe.command("gateway")
|
|
16058
|
+
@click.argument("gateway_endpoint")
|
|
16059
|
+
@click.option("--wandb-project", help="W&B project name")
|
|
16060
|
+
@click.option("--wandb-entity", help="W&B entity/team")
|
|
16061
|
+
@click.option("--phoenix-endpoint", help="Phoenix endpoint URL")
|
|
16062
|
+
@click.option("--enable-cost-analytics/--disable-cost-analytics", default=True, help="Enable cost analytics tracking")
|
|
16063
|
+
@click.option("--duration", default=3600, help="Observation duration in seconds")
|
|
16064
|
+
@click.option("--sample-rate", default=1.0, help="Sampling rate (0.0-1.0)")
|
|
16065
|
+
def observe_gateway(
|
|
16066
|
+
gateway_endpoint,
|
|
16067
|
+
wandb_project,
|
|
16068
|
+
wandb_entity,
|
|
16069
|
+
phoenix_endpoint,
|
|
16070
|
+
enable_cost_analytics,
|
|
16071
|
+
duration,
|
|
16072
|
+
sample_rate
|
|
16073
|
+
):
|
|
16074
|
+
"""Observe API Gateway traffic across W&B, Phoenix, and Cost Analytics"""
|
|
16075
|
+
import asyncio
|
|
16076
|
+
|
|
16077
|
+
async def run_observe():
|
|
16078
|
+
from terradev_cli.core.observe import observe_gateway_traffic
|
|
16079
|
+
|
|
16080
|
+
result = await observe_gateway_traffic(
|
|
16081
|
+
gateway_endpoint=gateway_endpoint,
|
|
16082
|
+
wandb_project=wandb_project,
|
|
16083
|
+
wandb_entity=wandb_entity,
|
|
16084
|
+
phoenix_endpoint=phoenix_endpoint,
|
|
16085
|
+
enable_cost_analytics=enable_cost_analytics,
|
|
16086
|
+
duration_seconds=duration,
|
|
16087
|
+
sample_rate=sample_rate
|
|
16088
|
+
)
|
|
16089
|
+
|
|
16090
|
+
print(f"\n📊 Observability Summary:")
|
|
16091
|
+
print(f" Trace ID: {result['trace_id']}")
|
|
16092
|
+
print(f" Active Destinations: {', '.join(result['active_destinations'])}")
|
|
16093
|
+
print(f" Start Time: {result['start_time']}")
|
|
16094
|
+
|
|
16095
|
+
return result
|
|
16096
|
+
|
|
16097
|
+
try:
|
|
16098
|
+
result = asyncio.run(run_observe())
|
|
16099
|
+
return 0 if result else 1
|
|
16100
|
+
except Exception as e: # noqa: BLE001
|
|
16101
|
+
print(f"ERROR: Observability pipeline failed: {e}")
|
|
16102
|
+
return 1
|
|
16103
|
+
|
|
16104
|
+
|
|
16105
|
+
@observe.command("status")
|
|
16106
|
+
@click.argument("trace_id")
|
|
16107
|
+
def observe_status(trace_id):
|
|
16108
|
+
"""Get status of an observability trace"""
|
|
16109
|
+
import asyncio
|
|
16110
|
+
|
|
16111
|
+
async def run_status():
|
|
16112
|
+
from terradev_cli.core.observe import observe_status
|
|
16113
|
+
|
|
16114
|
+
result = await observe_status(trace_id)
|
|
16115
|
+
|
|
16116
|
+
print(f"\n📊 Trace Status: {trace_id}")
|
|
16117
|
+
print(f" Overall Status: {result['status']}")
|
|
16118
|
+
|
|
16119
|
+
for dest, info in result.items():
|
|
16120
|
+
if dest != "trace_id" and dest != "status":
|
|
16121
|
+
print(f" {dest.upper()}: {info}")
|
|
16122
|
+
|
|
16123
|
+
return result
|
|
16124
|
+
|
|
16125
|
+
try:
|
|
16126
|
+
result = asyncio.run(run_status())
|
|
16127
|
+
return 0 if result else 1
|
|
16128
|
+
except Exception as e: # noqa: BLE001
|
|
16129
|
+
print(f"ERROR: Failed to get trace status: {e}")
|
|
16130
|
+
return 1
|
|
16131
|
+
|
|
16132
|
+
|
|
16133
|
+
# Schedule Command - Spot-Aware Scheduling
|
|
16134
|
+
@cli.group()
|
|
16135
|
+
def schedule():
|
|
16136
|
+
"""Spot-aware scheduling for cost-optimized job execution"""
|
|
16137
|
+
pass
|
|
16138
|
+
|
|
16139
|
+
|
|
16140
|
+
@schedule.command("job")
|
|
16141
|
+
@click.argument("command")
|
|
16142
|
+
@click.argument("gpu_type")
|
|
16143
|
+
@click.option("--cron", help="Cron expression for recurring jobs")
|
|
16144
|
+
@click.option("--max-wait-hours", default=24, help="Maximum hours to wait for optimal pricing")
|
|
16145
|
+
@click.option("--job-name", help="Custom job name")
|
|
16146
|
+
@click.option("--prefer-current/--no-prefer-current", default=True, help="Prefer currently active pricing window")
|
|
16147
|
+
def schedule_job(command, gpu_type, cron, max_wait_hours, job_name, prefer_current):
|
|
16148
|
+
"""Schedule a job with spot pricing awareness"""
|
|
16149
|
+
import asyncio
|
|
16150
|
+
|
|
16151
|
+
async def run_schedule():
|
|
16152
|
+
from terradev_cli.core.schedule import schedule_spot_job
|
|
16153
|
+
|
|
16154
|
+
result = await schedule_spot_job(
|
|
16155
|
+
command=command,
|
|
16156
|
+
gpu_type=gpu_type,
|
|
16157
|
+
cron_expression=cron,
|
|
16158
|
+
max_wait_hours=max_wait_hours,
|
|
16159
|
+
job_name=job_name,
|
|
16160
|
+
prefer_current_window=prefer_current
|
|
16161
|
+
)
|
|
16162
|
+
|
|
16163
|
+
return result
|
|
16164
|
+
|
|
16165
|
+
try:
|
|
16166
|
+
result = asyncio.run(run_schedule())
|
|
16167
|
+
return 0 if result.get("status") == "success" else 1
|
|
16168
|
+
except Exception as e: # noqa: BLE001
|
|
16169
|
+
print(f"ERROR: Failed to schedule job: {e}")
|
|
16170
|
+
return 1
|
|
16171
|
+
|
|
16172
|
+
|
|
16173
|
+
@schedule.command("list")
|
|
16174
|
+
def schedule_list_cmd():
|
|
16175
|
+
"""List all scheduled jobs"""
|
|
16176
|
+
import asyncio
|
|
16177
|
+
|
|
16178
|
+
async def run_list():
|
|
16179
|
+
from terradev_cli.core.schedule import schedule_list
|
|
16180
|
+
|
|
16181
|
+
result = await schedule_list()
|
|
16182
|
+
return result
|
|
16183
|
+
|
|
16184
|
+
try:
|
|
16185
|
+
result = asyncio.run(run_list())
|
|
16186
|
+
return 0
|
|
16187
|
+
except Exception as e: # noqa: BLE001
|
|
16188
|
+
print(f"ERROR: Failed to list jobs: {e}")
|
|
16189
|
+
return 1
|
|
16190
|
+
|
|
16191
|
+
|
|
16192
|
+
@schedule.command("windows")
|
|
16193
|
+
@click.option("--gpu-type", help="Filter by GPU type")
|
|
16194
|
+
def schedule_windows(gpu_type):
|
|
16195
|
+
"""Show available spot pricing windows"""
|
|
16196
|
+
import asyncio
|
|
16197
|
+
|
|
16198
|
+
async def run_windows():
|
|
16199
|
+
from terradev_cli.core.schedule import schedule_pricing_windows
|
|
16200
|
+
|
|
16201
|
+
result = await schedule_pricing_windows(gpu_type)
|
|
16202
|
+
return result
|
|
16203
|
+
|
|
16204
|
+
try:
|
|
16205
|
+
result = asyncio.run(run_windows())
|
|
16206
|
+
return 0
|
|
16207
|
+
except Exception as e: # noqa: BLE001
|
|
16208
|
+
print(f"ERROR: Failed to get pricing windows: {e}")
|
|
16209
|
+
return 1
|
|
16210
|
+
|
|
16211
|
+
|
|
16020
16212
|
if __name__ == "__main__":
|
|
16021
16213
|
cli()
|
|
16022
16214
|
|