PraisonAI 3.0.0__py3-none-any.whl
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.
- praisonai/__init__.py +54 -0
- praisonai/__main__.py +15 -0
- praisonai/acp/__init__.py +54 -0
- praisonai/acp/config.py +159 -0
- praisonai/acp/server.py +587 -0
- praisonai/acp/session.py +219 -0
- praisonai/adapters/__init__.py +50 -0
- praisonai/adapters/readers.py +395 -0
- praisonai/adapters/rerankers.py +315 -0
- praisonai/adapters/retrievers.py +394 -0
- praisonai/adapters/vector_stores.py +409 -0
- praisonai/agent_scheduler.py +337 -0
- praisonai/agents_generator.py +903 -0
- praisonai/api/call.py +292 -0
- praisonai/auto.py +1197 -0
- praisonai/capabilities/__init__.py +275 -0
- praisonai/capabilities/a2a.py +140 -0
- praisonai/capabilities/assistants.py +283 -0
- praisonai/capabilities/audio.py +320 -0
- praisonai/capabilities/batches.py +469 -0
- praisonai/capabilities/completions.py +336 -0
- praisonai/capabilities/container_files.py +155 -0
- praisonai/capabilities/containers.py +93 -0
- praisonai/capabilities/embeddings.py +158 -0
- praisonai/capabilities/files.py +467 -0
- praisonai/capabilities/fine_tuning.py +293 -0
- praisonai/capabilities/guardrails.py +182 -0
- praisonai/capabilities/images.py +330 -0
- praisonai/capabilities/mcp.py +190 -0
- praisonai/capabilities/messages.py +270 -0
- praisonai/capabilities/moderations.py +154 -0
- praisonai/capabilities/ocr.py +217 -0
- praisonai/capabilities/passthrough.py +204 -0
- praisonai/capabilities/rag.py +207 -0
- praisonai/capabilities/realtime.py +160 -0
- praisonai/capabilities/rerank.py +165 -0
- praisonai/capabilities/responses.py +266 -0
- praisonai/capabilities/search.py +109 -0
- praisonai/capabilities/skills.py +133 -0
- praisonai/capabilities/vector_store_files.py +334 -0
- praisonai/capabilities/vector_stores.py +304 -0
- praisonai/capabilities/videos.py +141 -0
- praisonai/chainlit_ui.py +304 -0
- praisonai/chat/__init__.py +106 -0
- praisonai/chat/app.py +125 -0
- praisonai/cli/__init__.py +26 -0
- praisonai/cli/app.py +213 -0
- praisonai/cli/commands/__init__.py +75 -0
- praisonai/cli/commands/acp.py +70 -0
- praisonai/cli/commands/completion.py +333 -0
- praisonai/cli/commands/config.py +166 -0
- praisonai/cli/commands/debug.py +142 -0
- praisonai/cli/commands/diag.py +55 -0
- praisonai/cli/commands/doctor.py +166 -0
- praisonai/cli/commands/environment.py +179 -0
- praisonai/cli/commands/lsp.py +112 -0
- praisonai/cli/commands/mcp.py +210 -0
- praisonai/cli/commands/profile.py +457 -0
- praisonai/cli/commands/run.py +228 -0
- praisonai/cli/commands/schedule.py +150 -0
- praisonai/cli/commands/serve.py +97 -0
- praisonai/cli/commands/session.py +212 -0
- praisonai/cli/commands/traces.py +145 -0
- praisonai/cli/commands/version.py +101 -0
- praisonai/cli/configuration/__init__.py +18 -0
- praisonai/cli/configuration/loader.py +353 -0
- praisonai/cli/configuration/paths.py +114 -0
- praisonai/cli/configuration/schema.py +164 -0
- praisonai/cli/features/__init__.py +268 -0
- praisonai/cli/features/acp.py +236 -0
- praisonai/cli/features/action_orchestrator.py +546 -0
- praisonai/cli/features/agent_scheduler.py +773 -0
- praisonai/cli/features/agent_tools.py +474 -0
- praisonai/cli/features/agents.py +375 -0
- praisonai/cli/features/at_mentions.py +471 -0
- praisonai/cli/features/auto_memory.py +182 -0
- praisonai/cli/features/autonomy_mode.py +490 -0
- praisonai/cli/features/background.py +356 -0
- praisonai/cli/features/base.py +168 -0
- praisonai/cli/features/capabilities.py +1326 -0
- praisonai/cli/features/checkpoints.py +338 -0
- praisonai/cli/features/code_intelligence.py +652 -0
- praisonai/cli/features/compaction.py +294 -0
- praisonai/cli/features/compare.py +534 -0
- praisonai/cli/features/cost_tracker.py +514 -0
- praisonai/cli/features/debug.py +810 -0
- praisonai/cli/features/deploy.py +517 -0
- praisonai/cli/features/diag.py +289 -0
- praisonai/cli/features/doctor/__init__.py +63 -0
- praisonai/cli/features/doctor/checks/__init__.py +24 -0
- praisonai/cli/features/doctor/checks/acp_checks.py +240 -0
- praisonai/cli/features/doctor/checks/config_checks.py +366 -0
- praisonai/cli/features/doctor/checks/db_checks.py +366 -0
- praisonai/cli/features/doctor/checks/env_checks.py +543 -0
- praisonai/cli/features/doctor/checks/lsp_checks.py +199 -0
- praisonai/cli/features/doctor/checks/mcp_checks.py +349 -0
- praisonai/cli/features/doctor/checks/memory_checks.py +268 -0
- praisonai/cli/features/doctor/checks/network_checks.py +251 -0
- praisonai/cli/features/doctor/checks/obs_checks.py +328 -0
- praisonai/cli/features/doctor/checks/performance_checks.py +235 -0
- praisonai/cli/features/doctor/checks/permissions_checks.py +259 -0
- praisonai/cli/features/doctor/checks/selftest_checks.py +322 -0
- praisonai/cli/features/doctor/checks/serve_checks.py +426 -0
- praisonai/cli/features/doctor/checks/skills_checks.py +231 -0
- praisonai/cli/features/doctor/checks/tools_checks.py +371 -0
- praisonai/cli/features/doctor/engine.py +266 -0
- praisonai/cli/features/doctor/formatters.py +310 -0
- praisonai/cli/features/doctor/handler.py +397 -0
- praisonai/cli/features/doctor/models.py +264 -0
- praisonai/cli/features/doctor/registry.py +239 -0
- praisonai/cli/features/endpoints.py +1019 -0
- praisonai/cli/features/eval.py +560 -0
- praisonai/cli/features/external_agents.py +231 -0
- praisonai/cli/features/fast_context.py +410 -0
- praisonai/cli/features/flow_display.py +566 -0
- praisonai/cli/features/git_integration.py +651 -0
- praisonai/cli/features/guardrail.py +171 -0
- praisonai/cli/features/handoff.py +185 -0
- praisonai/cli/features/hooks.py +583 -0
- praisonai/cli/features/image.py +384 -0
- praisonai/cli/features/interactive_runtime.py +585 -0
- praisonai/cli/features/interactive_tools.py +380 -0
- praisonai/cli/features/interactive_tui.py +603 -0
- praisonai/cli/features/jobs.py +632 -0
- praisonai/cli/features/knowledge.py +531 -0
- praisonai/cli/features/lite.py +244 -0
- praisonai/cli/features/lsp_cli.py +225 -0
- praisonai/cli/features/mcp.py +169 -0
- praisonai/cli/features/message_queue.py +587 -0
- praisonai/cli/features/metrics.py +211 -0
- praisonai/cli/features/n8n.py +673 -0
- praisonai/cli/features/observability.py +293 -0
- praisonai/cli/features/ollama.py +361 -0
- praisonai/cli/features/output_style.py +273 -0
- praisonai/cli/features/package.py +631 -0
- praisonai/cli/features/performance.py +308 -0
- praisonai/cli/features/persistence.py +636 -0
- praisonai/cli/features/profile.py +226 -0
- praisonai/cli/features/profiler/__init__.py +81 -0
- praisonai/cli/features/profiler/core.py +558 -0
- praisonai/cli/features/profiler/optimizations.py +652 -0
- praisonai/cli/features/profiler/suite.py +386 -0
- praisonai/cli/features/profiling.py +350 -0
- praisonai/cli/features/queue/__init__.py +73 -0
- praisonai/cli/features/queue/manager.py +395 -0
- praisonai/cli/features/queue/models.py +286 -0
- praisonai/cli/features/queue/persistence.py +564 -0
- praisonai/cli/features/queue/scheduler.py +484 -0
- praisonai/cli/features/queue/worker.py +372 -0
- praisonai/cli/features/recipe.py +1723 -0
- praisonai/cli/features/recipes.py +449 -0
- praisonai/cli/features/registry.py +229 -0
- praisonai/cli/features/repo_map.py +860 -0
- praisonai/cli/features/router.py +466 -0
- praisonai/cli/features/sandbox_executor.py +515 -0
- praisonai/cli/features/serve.py +829 -0
- praisonai/cli/features/session.py +222 -0
- praisonai/cli/features/skills.py +856 -0
- praisonai/cli/features/slash_commands.py +650 -0
- praisonai/cli/features/telemetry.py +179 -0
- praisonai/cli/features/templates.py +1384 -0
- praisonai/cli/features/thinking.py +305 -0
- praisonai/cli/features/todo.py +334 -0
- praisonai/cli/features/tools.py +680 -0
- praisonai/cli/features/tui/__init__.py +83 -0
- praisonai/cli/features/tui/app.py +580 -0
- praisonai/cli/features/tui/cli.py +566 -0
- praisonai/cli/features/tui/debug.py +511 -0
- praisonai/cli/features/tui/events.py +99 -0
- praisonai/cli/features/tui/mock_provider.py +328 -0
- praisonai/cli/features/tui/orchestrator.py +652 -0
- praisonai/cli/features/tui/screens/__init__.py +50 -0
- praisonai/cli/features/tui/screens/main.py +245 -0
- praisonai/cli/features/tui/screens/queue.py +174 -0
- praisonai/cli/features/tui/screens/session.py +124 -0
- praisonai/cli/features/tui/screens/settings.py +148 -0
- praisonai/cli/features/tui/widgets/__init__.py +56 -0
- praisonai/cli/features/tui/widgets/chat.py +261 -0
- praisonai/cli/features/tui/widgets/composer.py +224 -0
- praisonai/cli/features/tui/widgets/queue_panel.py +200 -0
- praisonai/cli/features/tui/widgets/status.py +167 -0
- praisonai/cli/features/tui/widgets/tool_panel.py +248 -0
- praisonai/cli/features/workflow.py +720 -0
- praisonai/cli/legacy.py +236 -0
- praisonai/cli/main.py +5559 -0
- praisonai/cli/schedule_cli.py +54 -0
- praisonai/cli/state/__init__.py +31 -0
- praisonai/cli/state/identifiers.py +161 -0
- praisonai/cli/state/sessions.py +313 -0
- praisonai/code/__init__.py +93 -0
- praisonai/code/agent_tools.py +344 -0
- praisonai/code/diff/__init__.py +21 -0
- praisonai/code/diff/diff_strategy.py +432 -0
- praisonai/code/tools/__init__.py +27 -0
- praisonai/code/tools/apply_diff.py +221 -0
- praisonai/code/tools/execute_command.py +275 -0
- praisonai/code/tools/list_files.py +274 -0
- praisonai/code/tools/read_file.py +206 -0
- praisonai/code/tools/search_replace.py +248 -0
- praisonai/code/tools/write_file.py +217 -0
- praisonai/code/utils/__init__.py +46 -0
- praisonai/code/utils/file_utils.py +307 -0
- praisonai/code/utils/ignore_utils.py +308 -0
- praisonai/code/utils/text_utils.py +276 -0
- praisonai/db/__init__.py +64 -0
- praisonai/db/adapter.py +531 -0
- praisonai/deploy/__init__.py +62 -0
- praisonai/deploy/api.py +231 -0
- praisonai/deploy/docker.py +454 -0
- praisonai/deploy/doctor.py +367 -0
- praisonai/deploy/main.py +327 -0
- praisonai/deploy/models.py +179 -0
- praisonai/deploy/providers/__init__.py +33 -0
- praisonai/deploy/providers/aws.py +331 -0
- praisonai/deploy/providers/azure.py +358 -0
- praisonai/deploy/providers/base.py +101 -0
- praisonai/deploy/providers/gcp.py +314 -0
- praisonai/deploy/schema.py +208 -0
- praisonai/deploy.py +185 -0
- praisonai/endpoints/__init__.py +53 -0
- praisonai/endpoints/a2u_server.py +410 -0
- praisonai/endpoints/discovery.py +165 -0
- praisonai/endpoints/providers/__init__.py +28 -0
- praisonai/endpoints/providers/a2a.py +253 -0
- praisonai/endpoints/providers/a2u.py +208 -0
- praisonai/endpoints/providers/agents_api.py +171 -0
- praisonai/endpoints/providers/base.py +231 -0
- praisonai/endpoints/providers/mcp.py +263 -0
- praisonai/endpoints/providers/recipe.py +206 -0
- praisonai/endpoints/providers/tools_mcp.py +150 -0
- praisonai/endpoints/registry.py +131 -0
- praisonai/endpoints/server.py +161 -0
- praisonai/inbuilt_tools/__init__.py +24 -0
- praisonai/inbuilt_tools/autogen_tools.py +117 -0
- praisonai/inc/__init__.py +2 -0
- praisonai/inc/config.py +96 -0
- praisonai/inc/models.py +155 -0
- praisonai/integrations/__init__.py +56 -0
- praisonai/integrations/base.py +303 -0
- praisonai/integrations/claude_code.py +270 -0
- praisonai/integrations/codex_cli.py +255 -0
- praisonai/integrations/cursor_cli.py +195 -0
- praisonai/integrations/gemini_cli.py +222 -0
- praisonai/jobs/__init__.py +67 -0
- praisonai/jobs/executor.py +425 -0
- praisonai/jobs/models.py +230 -0
- praisonai/jobs/router.py +314 -0
- praisonai/jobs/server.py +186 -0
- praisonai/jobs/store.py +203 -0
- praisonai/llm/__init__.py +66 -0
- praisonai/llm/registry.py +382 -0
- praisonai/mcp_server/__init__.py +152 -0
- praisonai/mcp_server/adapters/__init__.py +74 -0
- praisonai/mcp_server/adapters/agents.py +128 -0
- praisonai/mcp_server/adapters/capabilities.py +168 -0
- praisonai/mcp_server/adapters/cli_tools.py +568 -0
- praisonai/mcp_server/adapters/extended_capabilities.py +462 -0
- praisonai/mcp_server/adapters/knowledge.py +93 -0
- praisonai/mcp_server/adapters/memory.py +104 -0
- praisonai/mcp_server/adapters/prompts.py +306 -0
- praisonai/mcp_server/adapters/resources.py +124 -0
- praisonai/mcp_server/adapters/tools_bridge.py +280 -0
- praisonai/mcp_server/auth/__init__.py +48 -0
- praisonai/mcp_server/auth/api_key.py +291 -0
- praisonai/mcp_server/auth/oauth.py +460 -0
- praisonai/mcp_server/auth/oidc.py +289 -0
- praisonai/mcp_server/auth/scopes.py +260 -0
- praisonai/mcp_server/cli.py +852 -0
- praisonai/mcp_server/elicitation.py +445 -0
- praisonai/mcp_server/icons.py +302 -0
- praisonai/mcp_server/recipe_adapter.py +573 -0
- praisonai/mcp_server/recipe_cli.py +824 -0
- praisonai/mcp_server/registry.py +703 -0
- praisonai/mcp_server/sampling.py +422 -0
- praisonai/mcp_server/server.py +490 -0
- praisonai/mcp_server/tasks.py +443 -0
- praisonai/mcp_server/transports/__init__.py +18 -0
- praisonai/mcp_server/transports/http_stream.py +376 -0
- praisonai/mcp_server/transports/stdio.py +132 -0
- praisonai/persistence/__init__.py +84 -0
- praisonai/persistence/config.py +238 -0
- praisonai/persistence/conversation/__init__.py +25 -0
- praisonai/persistence/conversation/async_mysql.py +427 -0
- praisonai/persistence/conversation/async_postgres.py +410 -0
- praisonai/persistence/conversation/async_sqlite.py +371 -0
- praisonai/persistence/conversation/base.py +151 -0
- praisonai/persistence/conversation/json_store.py +250 -0
- praisonai/persistence/conversation/mysql.py +387 -0
- praisonai/persistence/conversation/postgres.py +401 -0
- praisonai/persistence/conversation/singlestore.py +240 -0
- praisonai/persistence/conversation/sqlite.py +341 -0
- praisonai/persistence/conversation/supabase.py +203 -0
- praisonai/persistence/conversation/surrealdb.py +287 -0
- praisonai/persistence/factory.py +301 -0
- praisonai/persistence/hooks/__init__.py +18 -0
- praisonai/persistence/hooks/agent_hooks.py +297 -0
- praisonai/persistence/knowledge/__init__.py +26 -0
- praisonai/persistence/knowledge/base.py +144 -0
- praisonai/persistence/knowledge/cassandra.py +232 -0
- praisonai/persistence/knowledge/chroma.py +295 -0
- praisonai/persistence/knowledge/clickhouse.py +242 -0
- praisonai/persistence/knowledge/cosmosdb_vector.py +438 -0
- praisonai/persistence/knowledge/couchbase.py +286 -0
- praisonai/persistence/knowledge/lancedb.py +216 -0
- praisonai/persistence/knowledge/langchain_adapter.py +291 -0
- praisonai/persistence/knowledge/lightrag_adapter.py +212 -0
- praisonai/persistence/knowledge/llamaindex_adapter.py +256 -0
- praisonai/persistence/knowledge/milvus.py +277 -0
- praisonai/persistence/knowledge/mongodb_vector.py +306 -0
- praisonai/persistence/knowledge/pgvector.py +335 -0
- praisonai/persistence/knowledge/pinecone.py +253 -0
- praisonai/persistence/knowledge/qdrant.py +301 -0
- praisonai/persistence/knowledge/redis_vector.py +291 -0
- praisonai/persistence/knowledge/singlestore_vector.py +299 -0
- praisonai/persistence/knowledge/surrealdb_vector.py +309 -0
- praisonai/persistence/knowledge/upstash_vector.py +266 -0
- praisonai/persistence/knowledge/weaviate.py +223 -0
- praisonai/persistence/migrations/__init__.py +10 -0
- praisonai/persistence/migrations/manager.py +251 -0
- praisonai/persistence/orchestrator.py +406 -0
- praisonai/persistence/state/__init__.py +21 -0
- praisonai/persistence/state/async_mongodb.py +200 -0
- praisonai/persistence/state/base.py +107 -0
- praisonai/persistence/state/dynamodb.py +226 -0
- praisonai/persistence/state/firestore.py +175 -0
- praisonai/persistence/state/gcs.py +155 -0
- praisonai/persistence/state/memory.py +245 -0
- praisonai/persistence/state/mongodb.py +158 -0
- praisonai/persistence/state/redis.py +190 -0
- praisonai/persistence/state/upstash.py +144 -0
- praisonai/persistence/tests/__init__.py +3 -0
- praisonai/persistence/tests/test_all_backends.py +633 -0
- praisonai/profiler.py +1214 -0
- praisonai/recipe/__init__.py +134 -0
- praisonai/recipe/bridge.py +278 -0
- praisonai/recipe/core.py +893 -0
- praisonai/recipe/exceptions.py +54 -0
- praisonai/recipe/history.py +402 -0
- praisonai/recipe/models.py +266 -0
- praisonai/recipe/operations.py +440 -0
- praisonai/recipe/policy.py +422 -0
- praisonai/recipe/registry.py +849 -0
- praisonai/recipe/runtime.py +214 -0
- praisonai/recipe/security.py +711 -0
- praisonai/recipe/serve.py +859 -0
- praisonai/recipe/server.py +613 -0
- praisonai/scheduler/__init__.py +45 -0
- praisonai/scheduler/agent_scheduler.py +552 -0
- praisonai/scheduler/base.py +124 -0
- praisonai/scheduler/daemon_manager.py +225 -0
- praisonai/scheduler/state_manager.py +155 -0
- praisonai/scheduler/yaml_loader.py +193 -0
- praisonai/scheduler.py +194 -0
- praisonai/setup/__init__.py +1 -0
- praisonai/setup/build.py +21 -0
- praisonai/setup/post_install.py +23 -0
- praisonai/setup/setup_conda_env.py +25 -0
- praisonai/setup.py +16 -0
- praisonai/templates/__init__.py +116 -0
- praisonai/templates/cache.py +364 -0
- praisonai/templates/dependency_checker.py +358 -0
- praisonai/templates/discovery.py +391 -0
- praisonai/templates/loader.py +564 -0
- praisonai/templates/registry.py +511 -0
- praisonai/templates/resolver.py +206 -0
- praisonai/templates/security.py +327 -0
- praisonai/templates/tool_override.py +498 -0
- praisonai/templates/tools_doctor.py +256 -0
- praisonai/test.py +105 -0
- praisonai/train.py +562 -0
- praisonai/train_vision.py +306 -0
- praisonai/ui/agents.py +824 -0
- praisonai/ui/callbacks.py +57 -0
- praisonai/ui/chainlit_compat.py +246 -0
- praisonai/ui/chat.py +532 -0
- praisonai/ui/code.py +717 -0
- praisonai/ui/colab.py +474 -0
- praisonai/ui/colab_chainlit.py +81 -0
- praisonai/ui/components/aicoder.py +284 -0
- praisonai/ui/context.py +283 -0
- praisonai/ui/database_config.py +56 -0
- praisonai/ui/db.py +294 -0
- praisonai/ui/realtime.py +488 -0
- praisonai/ui/realtimeclient/__init__.py +756 -0
- praisonai/ui/realtimeclient/tools.py +242 -0
- praisonai/ui/sql_alchemy.py +710 -0
- praisonai/upload_vision.py +140 -0
- praisonai/version.py +1 -0
- praisonai-3.0.0.dist-info/METADATA +3493 -0
- praisonai-3.0.0.dist-info/RECORD +393 -0
- praisonai-3.0.0.dist-info/WHEEL +5 -0
- praisonai-3.0.0.dist-info/entry_points.txt +4 -0
- praisonai-3.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI handler for deploy commands.
|
|
3
|
+
"""
|
|
4
|
+
import json
|
|
5
|
+
import sys
|
|
6
|
+
from rich.console import Console
|
|
7
|
+
from rich.table import Table
|
|
8
|
+
from rich.panel import Panel
|
|
9
|
+
from rich import print as rprint
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
console = Console()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class DeployHandler:
|
|
16
|
+
"""Handler for deploy CLI commands."""
|
|
17
|
+
|
|
18
|
+
def handle_deploy(self, args):
|
|
19
|
+
"""
|
|
20
|
+
Handle deploy command.
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
args: Parsed command-line arguments
|
|
24
|
+
"""
|
|
25
|
+
try:
|
|
26
|
+
from praisonai.deploy import Deploy, DeployConfig, DeployType, CloudProvider
|
|
27
|
+
from praisonai.deploy.models import APIConfig, DockerConfig, CloudConfig
|
|
28
|
+
|
|
29
|
+
# Determine if loading from YAML or using explicit flags
|
|
30
|
+
if args.type:
|
|
31
|
+
# Explicit type specified via CLI flags
|
|
32
|
+
deploy_type = DeployType(args.type)
|
|
33
|
+
|
|
34
|
+
if deploy_type == DeployType.API:
|
|
35
|
+
config = DeployConfig(
|
|
36
|
+
type=deploy_type,
|
|
37
|
+
api=APIConfig(
|
|
38
|
+
host=getattr(args, 'host', '127.0.0.1'),
|
|
39
|
+
port=getattr(args, 'port', 8005),
|
|
40
|
+
workers=getattr(args, 'workers', 1)
|
|
41
|
+
)
|
|
42
|
+
)
|
|
43
|
+
elif deploy_type == DeployType.DOCKER:
|
|
44
|
+
config = DeployConfig(
|
|
45
|
+
type=deploy_type,
|
|
46
|
+
docker=DockerConfig(
|
|
47
|
+
image_name=getattr(args, 'image_name', 'praisonai-app'),
|
|
48
|
+
tag=getattr(args, 'tag', 'latest'),
|
|
49
|
+
push=getattr(args, 'push', False),
|
|
50
|
+
registry=getattr(args, 'registry', None)
|
|
51
|
+
)
|
|
52
|
+
)
|
|
53
|
+
elif deploy_type == DeployType.CLOUD:
|
|
54
|
+
provider = CloudProvider(args.provider)
|
|
55
|
+
config = DeployConfig(
|
|
56
|
+
type=deploy_type,
|
|
57
|
+
cloud=CloudConfig(
|
|
58
|
+
provider=provider,
|
|
59
|
+
region=getattr(args, 'region', 'us-east-1'),
|
|
60
|
+
service_name=getattr(args, 'service_name', 'praisonai-service'),
|
|
61
|
+
project_id=getattr(args, 'project_id', None),
|
|
62
|
+
resource_group=getattr(args, 'resource_group', None),
|
|
63
|
+
subscription_id=getattr(args, 'subscription_id', None)
|
|
64
|
+
)
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
deploy = Deploy(config, args.file)
|
|
68
|
+
else:
|
|
69
|
+
# Load from YAML
|
|
70
|
+
deploy = Deploy.from_yaml(args.file)
|
|
71
|
+
|
|
72
|
+
# Execute deployment
|
|
73
|
+
console.print(f"\n[bold blue]🚀 Starting deployment...[/bold blue]\n")
|
|
74
|
+
|
|
75
|
+
background = getattr(args, 'background', False)
|
|
76
|
+
result = deploy.deploy(background=background)
|
|
77
|
+
|
|
78
|
+
if args.json:
|
|
79
|
+
self._print_json({
|
|
80
|
+
"success": result.success,
|
|
81
|
+
"message": result.message,
|
|
82
|
+
"url": result.url,
|
|
83
|
+
"error": result.error,
|
|
84
|
+
"metadata": result.metadata
|
|
85
|
+
})
|
|
86
|
+
else:
|
|
87
|
+
if result.success:
|
|
88
|
+
console.print(f"\n[bold green]✅ {result.message}[/bold green]")
|
|
89
|
+
if result.url:
|
|
90
|
+
console.print(f"[bold cyan]🔗 URL:[/bold cyan] {result.url}")
|
|
91
|
+
if result.metadata:
|
|
92
|
+
console.print(f"\n[bold]Metadata:[/bold]")
|
|
93
|
+
for key, value in result.metadata.items():
|
|
94
|
+
console.print(f" • {key}: {value}")
|
|
95
|
+
else:
|
|
96
|
+
console.print(f"\n[bold red]❌ {result.message}[/bold red]")
|
|
97
|
+
if result.error:
|
|
98
|
+
console.print(f"[red]Error: {result.error}[/red]")
|
|
99
|
+
sys.exit(1)
|
|
100
|
+
|
|
101
|
+
except Exception as e:
|
|
102
|
+
if getattr(args, 'json', False):
|
|
103
|
+
self._print_json({"success": False, "error": str(e)})
|
|
104
|
+
else:
|
|
105
|
+
console.print(f"[bold red]❌ Deployment failed: {e}[/bold red]")
|
|
106
|
+
sys.exit(1)
|
|
107
|
+
|
|
108
|
+
def handle_doctor(self, args):
|
|
109
|
+
"""
|
|
110
|
+
Handle deploy doctor command.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
args: Parsed command-line arguments
|
|
114
|
+
"""
|
|
115
|
+
try:
|
|
116
|
+
from praisonai.deploy.doctor import (
|
|
117
|
+
run_all_checks, run_local_checks,
|
|
118
|
+
run_aws_checks, run_azure_checks, run_gcp_checks
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
console.print("\n[bold blue]🏥 Running deployment health checks...[/bold blue]\n")
|
|
122
|
+
|
|
123
|
+
# Determine which checks to run
|
|
124
|
+
if args.all:
|
|
125
|
+
report = run_all_checks(args.file)
|
|
126
|
+
elif args.provider:
|
|
127
|
+
if args.provider == 'aws':
|
|
128
|
+
report = run_aws_checks()
|
|
129
|
+
elif args.provider == 'azure':
|
|
130
|
+
report = run_azure_checks()
|
|
131
|
+
elif args.provider == 'gcp':
|
|
132
|
+
report = run_gcp_checks()
|
|
133
|
+
else:
|
|
134
|
+
console.print(f"[red]Unknown provider: {args.provider}[/red]")
|
|
135
|
+
sys.exit(1)
|
|
136
|
+
else:
|
|
137
|
+
report = run_local_checks(agents_file=args.file)
|
|
138
|
+
|
|
139
|
+
if args.json:
|
|
140
|
+
self._print_json({
|
|
141
|
+
"total_checks": report.total_checks,
|
|
142
|
+
"passed": report.passed_checks,
|
|
143
|
+
"failed": report.failed_checks,
|
|
144
|
+
"all_passed": report.all_passed,
|
|
145
|
+
"checks": [
|
|
146
|
+
{
|
|
147
|
+
"name": c.name,
|
|
148
|
+
"passed": c.passed,
|
|
149
|
+
"message": c.message,
|
|
150
|
+
"fix_suggestion": c.fix_suggestion
|
|
151
|
+
}
|
|
152
|
+
for c in report.checks
|
|
153
|
+
]
|
|
154
|
+
})
|
|
155
|
+
else:
|
|
156
|
+
# Create results table
|
|
157
|
+
table = Table(title="Health Check Results")
|
|
158
|
+
table.add_column("Check", style="cyan")
|
|
159
|
+
table.add_column("Status", style="bold")
|
|
160
|
+
table.add_column("Message")
|
|
161
|
+
|
|
162
|
+
for check in report.checks:
|
|
163
|
+
status = "[green]✅ PASS[/green]" if check.passed else "[red]❌ FAIL[/red]"
|
|
164
|
+
table.add_row(check.name, status, check.message)
|
|
165
|
+
|
|
166
|
+
console.print(table)
|
|
167
|
+
|
|
168
|
+
# Summary
|
|
169
|
+
console.print(f"\n[bold]Summary:[/bold]")
|
|
170
|
+
console.print(f" Total checks: {report.total_checks}")
|
|
171
|
+
console.print(f" Passed: [green]{report.passed_checks}[/green]")
|
|
172
|
+
console.print(f" Failed: [red]{report.failed_checks}[/red]")
|
|
173
|
+
|
|
174
|
+
# Show fix suggestions for failed checks
|
|
175
|
+
failed_checks = [c for c in report.checks if not c.passed and c.fix_suggestion]
|
|
176
|
+
if failed_checks:
|
|
177
|
+
console.print(f"\n[bold yellow]💡 Fix Suggestions:[/bold yellow]")
|
|
178
|
+
for check in failed_checks:
|
|
179
|
+
console.print(f"\n[bold]{check.name}:[/bold]")
|
|
180
|
+
console.print(f" {check.fix_suggestion}")
|
|
181
|
+
|
|
182
|
+
if not report.all_passed:
|
|
183
|
+
sys.exit(1)
|
|
184
|
+
|
|
185
|
+
except Exception as e:
|
|
186
|
+
if getattr(args, 'json', False):
|
|
187
|
+
self._print_json({"error": str(e)})
|
|
188
|
+
else:
|
|
189
|
+
console.print(f"[bold red]❌ Doctor check failed: {e}[/bold red]")
|
|
190
|
+
sys.exit(1)
|
|
191
|
+
|
|
192
|
+
def handle_init(self, args):
|
|
193
|
+
"""
|
|
194
|
+
Handle deploy init command - generate sample agents.yaml.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
args: Parsed command-line arguments
|
|
198
|
+
"""
|
|
199
|
+
try:
|
|
200
|
+
from praisonai.deploy.schema import save_sample_yaml
|
|
201
|
+
from praisonai.deploy.models import DeployType, CloudProvider
|
|
202
|
+
|
|
203
|
+
deploy_type = DeployType(args.type) if args.type else DeployType.API
|
|
204
|
+
provider = CloudProvider(args.provider) if hasattr(args, 'provider') and args.provider else None
|
|
205
|
+
|
|
206
|
+
console.print(f"\n[bold blue]📝 Generating sample agents.yaml...[/bold blue]\n")
|
|
207
|
+
|
|
208
|
+
save_sample_yaml(args.file, deploy_type, provider)
|
|
209
|
+
|
|
210
|
+
console.print(f"[bold green]✅ Created {args.file}[/bold green]")
|
|
211
|
+
console.print(f"\n[bold]Next steps:[/bold]")
|
|
212
|
+
console.print(f" 1. Edit {args.file} to configure your agents")
|
|
213
|
+
console.print(f" 2. Run: praisonai deploy validate --file {args.file}")
|
|
214
|
+
console.print(f" 3. Run: praisonai deploy --file {args.file}")
|
|
215
|
+
|
|
216
|
+
except Exception as e:
|
|
217
|
+
console.print(f"[bold red]❌ Failed to create sample YAML: {e}[/bold red]")
|
|
218
|
+
sys.exit(1)
|
|
219
|
+
|
|
220
|
+
def handle_validate(self, args):
|
|
221
|
+
"""
|
|
222
|
+
Handle deploy validate command.
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
args: Parsed command-line arguments
|
|
226
|
+
"""
|
|
227
|
+
try:
|
|
228
|
+
from praisonai.deploy.schema import validate_agents_yaml
|
|
229
|
+
|
|
230
|
+
console.print(f"\n[bold blue]🔍 Validating {args.file}...[/bold blue]\n")
|
|
231
|
+
|
|
232
|
+
config = validate_agents_yaml(args.file)
|
|
233
|
+
|
|
234
|
+
if config is None:
|
|
235
|
+
if args.json:
|
|
236
|
+
self._print_json({"valid": False, "error": "No deploy section found"})
|
|
237
|
+
else:
|
|
238
|
+
console.print("[yellow]⚠️ No deploy configuration found in agents.yaml[/yellow]")
|
|
239
|
+
console.print("\nRun: praisonai deploy init --file agents.yaml")
|
|
240
|
+
sys.exit(1)
|
|
241
|
+
|
|
242
|
+
if args.json:
|
|
243
|
+
self._print_json({
|
|
244
|
+
"valid": True,
|
|
245
|
+
"type": config.type.value,
|
|
246
|
+
"config": config.model_dump()
|
|
247
|
+
})
|
|
248
|
+
else:
|
|
249
|
+
console.print("[bold green]✅ Configuration is valid![/bold green]")
|
|
250
|
+
console.print(f"\n[bold]Deploy Type:[/bold] {config.type.value}")
|
|
251
|
+
|
|
252
|
+
if config.type.value == "api":
|
|
253
|
+
console.print(f" Host: {config.api.host}")
|
|
254
|
+
console.print(f" Port: {config.api.port}")
|
|
255
|
+
console.print(f" Workers: {config.api.workers}")
|
|
256
|
+
elif config.type.value == "docker":
|
|
257
|
+
console.print(f" Image: {config.docker.image_name}:{config.docker.tag}")
|
|
258
|
+
console.print(f" Ports: {config.docker.expose}")
|
|
259
|
+
elif config.type.value == "cloud":
|
|
260
|
+
console.print(f" Provider: {config.cloud.provider.value}")
|
|
261
|
+
console.print(f" Region: {config.cloud.region}")
|
|
262
|
+
console.print(f" Service: {config.cloud.service_name}")
|
|
263
|
+
|
|
264
|
+
except ValueError as e:
|
|
265
|
+
if args.json:
|
|
266
|
+
self._print_json({"valid": False, "error": str(e)})
|
|
267
|
+
else:
|
|
268
|
+
console.print(f"[bold red]❌ Validation failed: {e}[/bold red]")
|
|
269
|
+
sys.exit(1)
|
|
270
|
+
except Exception as e:
|
|
271
|
+
if args.json:
|
|
272
|
+
self._print_json({"valid": False, "error": str(e)})
|
|
273
|
+
else:
|
|
274
|
+
console.print(f"[bold red]❌ Error: {e}[/bold red]")
|
|
275
|
+
sys.exit(1)
|
|
276
|
+
|
|
277
|
+
def handle_plan(self, args):
|
|
278
|
+
"""
|
|
279
|
+
Handle deploy plan command - show deployment plan without executing.
|
|
280
|
+
|
|
281
|
+
Args:
|
|
282
|
+
args: Parsed command-line arguments
|
|
283
|
+
"""
|
|
284
|
+
try:
|
|
285
|
+
from praisonai.deploy import Deploy
|
|
286
|
+
|
|
287
|
+
console.print(f"\n[bold blue]📋 Generating deployment plan...[/bold blue]\n")
|
|
288
|
+
|
|
289
|
+
deploy = Deploy.from_yaml(args.file)
|
|
290
|
+
plan = deploy.plan()
|
|
291
|
+
|
|
292
|
+
if args.json:
|
|
293
|
+
self._print_json(plan)
|
|
294
|
+
else:
|
|
295
|
+
console.print(Panel.fit(
|
|
296
|
+
self._format_plan(plan),
|
|
297
|
+
title="[bold]Deployment Plan[/bold]",
|
|
298
|
+
border_style="blue"
|
|
299
|
+
))
|
|
300
|
+
|
|
301
|
+
console.print("\n[bold]To execute this plan, run:[/bold]")
|
|
302
|
+
console.print(f" praisonai deploy --file {args.file}")
|
|
303
|
+
|
|
304
|
+
except Exception as e:
|
|
305
|
+
if args.json:
|
|
306
|
+
self._print_json({"error": str(e)})
|
|
307
|
+
else:
|
|
308
|
+
console.print(f"[bold red]❌ Failed to generate plan: {e}[/bold red]")
|
|
309
|
+
sys.exit(1)
|
|
310
|
+
|
|
311
|
+
def _format_plan(self, plan: dict) -> str:
|
|
312
|
+
"""Format plan dictionary as readable text."""
|
|
313
|
+
lines = []
|
|
314
|
+
for key, value in plan.items():
|
|
315
|
+
if key == "steps" and isinstance(value, list):
|
|
316
|
+
lines.append(f"\n[bold]Steps:[/bold]")
|
|
317
|
+
for step in value:
|
|
318
|
+
lines.append(f" {step}")
|
|
319
|
+
elif isinstance(value, dict):
|
|
320
|
+
lines.append(f"\n[bold]{key}:[/bold]")
|
|
321
|
+
for k, v in value.items():
|
|
322
|
+
lines.append(f" {k}: {v}")
|
|
323
|
+
else:
|
|
324
|
+
lines.append(f"[bold]{key}:[/bold] {value}")
|
|
325
|
+
return "\n".join(lines)
|
|
326
|
+
|
|
327
|
+
def handle_status(self, args):
|
|
328
|
+
"""
|
|
329
|
+
Handle deploy status command - show current deployment status.
|
|
330
|
+
|
|
331
|
+
Args:
|
|
332
|
+
args: Parsed command-line arguments
|
|
333
|
+
"""
|
|
334
|
+
try:
|
|
335
|
+
from praisonai.deploy import Deploy
|
|
336
|
+
|
|
337
|
+
console.print(f"\n[bold blue]📊 Checking deployment status...[/bold blue]\n")
|
|
338
|
+
|
|
339
|
+
deploy = Deploy.from_yaml(args.file)
|
|
340
|
+
status = deploy.status()
|
|
341
|
+
|
|
342
|
+
if args.json:
|
|
343
|
+
self._print_json(status.to_dict())
|
|
344
|
+
else:
|
|
345
|
+
# Create status table
|
|
346
|
+
table = Table(title="Deployment Status")
|
|
347
|
+
table.add_column("Property", style="cyan")
|
|
348
|
+
table.add_column("Value", style="bold")
|
|
349
|
+
|
|
350
|
+
# State with color
|
|
351
|
+
state_color = {
|
|
352
|
+
"running": "green",
|
|
353
|
+
"stopped": "yellow",
|
|
354
|
+
"pending": "blue",
|
|
355
|
+
"failed": "red",
|
|
356
|
+
"not_found": "dim",
|
|
357
|
+
"unknown": "dim"
|
|
358
|
+
}.get(status.state.value, "white")
|
|
359
|
+
|
|
360
|
+
table.add_row("State", f"[{state_color}]{status.state.value.upper()}[/{state_color}]")
|
|
361
|
+
table.add_row("Service Name", status.service_name or "N/A")
|
|
362
|
+
table.add_row("Provider", status.provider or "N/A")
|
|
363
|
+
table.add_row("Region", status.region or "N/A")
|
|
364
|
+
|
|
365
|
+
if status.url:
|
|
366
|
+
table.add_row("URL", f"[cyan]{status.url}[/cyan]")
|
|
367
|
+
|
|
368
|
+
table.add_row("Healthy", "✅ Yes" if status.healthy else "❌ No")
|
|
369
|
+
table.add_row("Instances", f"{status.instances_running}/{status.instances_desired}")
|
|
370
|
+
|
|
371
|
+
if status.created_at:
|
|
372
|
+
table.add_row("Created", status.created_at)
|
|
373
|
+
if status.updated_at:
|
|
374
|
+
table.add_row("Updated", status.updated_at)
|
|
375
|
+
|
|
376
|
+
console.print(table)
|
|
377
|
+
|
|
378
|
+
if status.message:
|
|
379
|
+
console.print(f"\n[bold]Message:[/bold] {status.message}")
|
|
380
|
+
|
|
381
|
+
# Show metadata if verbose
|
|
382
|
+
if getattr(args, 'verbose', False) and status.metadata:
|
|
383
|
+
console.print(f"\n[bold]Metadata:[/bold]")
|
|
384
|
+
for key, value in status.metadata.items():
|
|
385
|
+
console.print(f" • {key}: {value}")
|
|
386
|
+
|
|
387
|
+
except Exception as e:
|
|
388
|
+
if getattr(args, 'json', False):
|
|
389
|
+
self._print_json({"error": str(e)})
|
|
390
|
+
else:
|
|
391
|
+
console.print(f"[bold red]❌ Failed to get status: {e}[/bold red]")
|
|
392
|
+
sys.exit(1)
|
|
393
|
+
|
|
394
|
+
def handle_destroy(self, args):
|
|
395
|
+
"""
|
|
396
|
+
Handle deploy destroy command - destroy/delete deployment.
|
|
397
|
+
|
|
398
|
+
Args:
|
|
399
|
+
args: Parsed command-line arguments
|
|
400
|
+
"""
|
|
401
|
+
try:
|
|
402
|
+
from praisonai.deploy import Deploy
|
|
403
|
+
|
|
404
|
+
deploy = Deploy.from_yaml(args.file)
|
|
405
|
+
|
|
406
|
+
# Confirmation check unless --yes is provided
|
|
407
|
+
if not args.yes:
|
|
408
|
+
console.print(f"\n[bold yellow]⚠️ Warning: This will destroy the deployment![/bold yellow]")
|
|
409
|
+
console.print(f"[bold]File:[/bold] {args.file}")
|
|
410
|
+
|
|
411
|
+
# Show what will be destroyed
|
|
412
|
+
status = deploy.status()
|
|
413
|
+
if status.service_name:
|
|
414
|
+
console.print(f"[bold]Service:[/bold] {status.service_name}")
|
|
415
|
+
if status.provider:
|
|
416
|
+
console.print(f"[bold]Provider:[/bold] {status.provider}")
|
|
417
|
+
|
|
418
|
+
confirm = input("\nType 'yes' to confirm destruction: ")
|
|
419
|
+
if confirm.lower() != 'yes':
|
|
420
|
+
console.print("[yellow]Destruction cancelled.[/yellow]")
|
|
421
|
+
return
|
|
422
|
+
|
|
423
|
+
console.print(f"\n[bold red]🗑️ Destroying deployment...[/bold red]\n")
|
|
424
|
+
|
|
425
|
+
force = getattr(args, 'force', False)
|
|
426
|
+
result = deploy.destroy(force=force)
|
|
427
|
+
|
|
428
|
+
if args.json:
|
|
429
|
+
self._print_json({
|
|
430
|
+
"success": result.success,
|
|
431
|
+
"message": result.message,
|
|
432
|
+
"resources_deleted": result.resources_deleted,
|
|
433
|
+
"error": result.error,
|
|
434
|
+
"metadata": result.metadata
|
|
435
|
+
})
|
|
436
|
+
else:
|
|
437
|
+
if result.success:
|
|
438
|
+
console.print(f"[bold green]✅ {result.message}[/bold green]")
|
|
439
|
+
if result.resources_deleted:
|
|
440
|
+
console.print(f"\n[bold]Deleted resources:[/bold]")
|
|
441
|
+
for resource in result.resources_deleted:
|
|
442
|
+
console.print(f" • {resource}")
|
|
443
|
+
else:
|
|
444
|
+
console.print(f"[bold red]❌ {result.message}[/bold red]")
|
|
445
|
+
if result.error:
|
|
446
|
+
console.print(f"[red]Error: {result.error}[/red]")
|
|
447
|
+
sys.exit(1)
|
|
448
|
+
|
|
449
|
+
except Exception as e:
|
|
450
|
+
if getattr(args, 'json', False):
|
|
451
|
+
self._print_json({"success": False, "error": str(e)})
|
|
452
|
+
else:
|
|
453
|
+
console.print(f"[bold red]❌ Destruction failed: {e}[/bold red]")
|
|
454
|
+
sys.exit(1)
|
|
455
|
+
|
|
456
|
+
def _print_json(self, data: dict):
|
|
457
|
+
"""Print data as JSON."""
|
|
458
|
+
print(json.dumps(data, indent=2))
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
def add_deploy_subcommands(subparsers):
|
|
462
|
+
"""
|
|
463
|
+
Add deploy subcommands to CLI parser.
|
|
464
|
+
|
|
465
|
+
Args:
|
|
466
|
+
subparsers: Subparsers from argparse
|
|
467
|
+
"""
|
|
468
|
+
# Main deploy command
|
|
469
|
+
deploy_parser = subparsers.add_parser('deploy', help='Deploy agents')
|
|
470
|
+
deploy_subparsers = deploy_parser.add_subparsers(dest='deploy_command')
|
|
471
|
+
|
|
472
|
+
# deploy (main deployment)
|
|
473
|
+
deploy_main = deploy_subparsers.add_parser('run', help='Deploy agents')
|
|
474
|
+
deploy_main.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
|
|
475
|
+
deploy_main.add_argument('--type', choices=['api', 'docker', 'cloud'], help='Deployment type')
|
|
476
|
+
deploy_main.add_argument('--provider', choices=['aws', 'azure', 'gcp'], help='Cloud provider (for cloud type)')
|
|
477
|
+
deploy_main.add_argument('--background', action='store_true', help='Run in background (API only)')
|
|
478
|
+
deploy_main.add_argument('--json', action='store_true', help='Output as JSON')
|
|
479
|
+
|
|
480
|
+
# deploy doctor
|
|
481
|
+
doctor_parser = deploy_subparsers.add_parser('doctor', help='Check deployment readiness')
|
|
482
|
+
doctor_parser.add_argument('--file', '-f', help='Path to agents.yaml')
|
|
483
|
+
doctor_parser.add_argument('--provider', choices=['aws', 'azure', 'gcp'], help='Check specific provider')
|
|
484
|
+
doctor_parser.add_argument('--all', action='store_true', help='Run all checks')
|
|
485
|
+
doctor_parser.add_argument('--verbose', action='store_true', help='Verbose output')
|
|
486
|
+
doctor_parser.add_argument('--json', action='store_true', help='Output as JSON')
|
|
487
|
+
|
|
488
|
+
# deploy init
|
|
489
|
+
init_parser = deploy_subparsers.add_parser('init', help='Generate sample agents.yaml')
|
|
490
|
+
init_parser.add_argument('--file', '-f', default='agents.yaml', help='Output file path')
|
|
491
|
+
init_parser.add_argument('--type', choices=['api', 'docker', 'cloud'], default='api', help='Deployment type')
|
|
492
|
+
init_parser.add_argument('--provider', choices=['aws', 'azure', 'gcp'], help='Cloud provider (for cloud type)')
|
|
493
|
+
|
|
494
|
+
# deploy validate
|
|
495
|
+
validate_parser = deploy_subparsers.add_parser('validate', help='Validate agents.yaml deploy config')
|
|
496
|
+
validate_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
|
|
497
|
+
validate_parser.add_argument('--json', action='store_true', help='Output as JSON')
|
|
498
|
+
|
|
499
|
+
# deploy plan
|
|
500
|
+
plan_parser = deploy_subparsers.add_parser('plan', help='Show deployment plan')
|
|
501
|
+
plan_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
|
|
502
|
+
plan_parser.add_argument('--json', action='store_true', help='Output as JSON')
|
|
503
|
+
|
|
504
|
+
# deploy status
|
|
505
|
+
status_parser = deploy_subparsers.add_parser('status', help='Show deployment status')
|
|
506
|
+
status_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
|
|
507
|
+
status_parser.add_argument('--json', action='store_true', help='Output as JSON')
|
|
508
|
+
status_parser.add_argument('--verbose', '-v', action='store_true', help='Show detailed metadata')
|
|
509
|
+
|
|
510
|
+
# deploy destroy
|
|
511
|
+
destroy_parser = deploy_subparsers.add_parser('destroy', help='Destroy/delete deployment')
|
|
512
|
+
destroy_parser.add_argument('--file', '-f', default='agents.yaml', help='Path to agents.yaml')
|
|
513
|
+
destroy_parser.add_argument('--yes', '-y', action='store_true', help='Skip confirmation prompt')
|
|
514
|
+
destroy_parser.add_argument('--force', action='store_true', help='Force deletion and remove all related resources')
|
|
515
|
+
destroy_parser.add_argument('--json', action='store_true', help='Output as JSON')
|
|
516
|
+
|
|
517
|
+
return deploy_parser
|