kubiya-control-plane-api 0.9.15__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.
- control_plane_api/LICENSE +676 -0
- control_plane_api/README.md +350 -0
- control_plane_api/__init__.py +4 -0
- control_plane_api/__version__.py +8 -0
- control_plane_api/alembic/README +1 -0
- control_plane_api/alembic/env.py +121 -0
- control_plane_api/alembic/script.py.mako +28 -0
- control_plane_api/alembic/versions/2613c65c3dbe_initial_database_setup.py +32 -0
- control_plane_api/alembic/versions/2df520d4927d_merge_heads.py +28 -0
- control_plane_api/alembic/versions/43abf98d6a01_add_paused_status_to_executions.py +73 -0
- control_plane_api/alembic/versions/6289854264cb_merge_multiple_heads.py +28 -0
- control_plane_api/alembic/versions/6a4d4dc3d8dc_generate_execution_transitions.py +50 -0
- control_plane_api/alembic/versions/87d11cf0a783_add_disconnected_status_to_worker_.py +44 -0
- control_plane_api/alembic/versions/add_ephemeral_queue_support.py +85 -0
- control_plane_api/alembic/versions/add_model_type_to_llm_models.py +31 -0
- control_plane_api/alembic/versions/add_plan_executions_table.py +114 -0
- control_plane_api/alembic/versions/add_trace_span_tables.py +154 -0
- control_plane_api/alembic/versions/add_user_info_to_traces.py +36 -0
- control_plane_api/alembic/versions/adjusting_foreign_keys.py +32 -0
- control_plane_api/alembic/versions/b4983d976db2_initial_tables.py +1128 -0
- control_plane_api/alembic/versions/d181a3b40e71_rename_custom_metadata_to_metadata_in_.py +50 -0
- control_plane_api/alembic/versions/df9117888e82_add_missing_columns.py +82 -0
- control_plane_api/alembic/versions/f25de6ad895a_missing_migrations.py +34 -0
- control_plane_api/alembic/versions/f71305fb69b9_fix_ephemeral_queue_deletion_foreign_key.py +54 -0
- control_plane_api/alembic/versions/mark_local_exec_queues_as_ephemeral.py +68 -0
- control_plane_api/alembic.ini +148 -0
- control_plane_api/api/index.py +12 -0
- control_plane_api/app/__init__.py +11 -0
- control_plane_api/app/activities/__init__.py +20 -0
- control_plane_api/app/activities/agent_activities.py +384 -0
- control_plane_api/app/activities/plan_generation_activities.py +499 -0
- control_plane_api/app/activities/team_activities.py +424 -0
- control_plane_api/app/activities/temporal_cloud_activities.py +588 -0
- control_plane_api/app/config/__init__.py +35 -0
- control_plane_api/app/config/api_config.py +469 -0
- control_plane_api/app/config/config_loader.py +224 -0
- control_plane_api/app/config/model_pricing.py +323 -0
- control_plane_api/app/config/storage_config.py +159 -0
- control_plane_api/app/config.py +115 -0
- control_plane_api/app/controllers/__init__.py +0 -0
- control_plane_api/app/controllers/execution_environment_controller.py +1315 -0
- control_plane_api/app/database.py +135 -0
- control_plane_api/app/exceptions.py +408 -0
- control_plane_api/app/lib/__init__.py +11 -0
- control_plane_api/app/lib/environment.py +65 -0
- control_plane_api/app/lib/event_bus/__init__.py +17 -0
- control_plane_api/app/lib/event_bus/base.py +136 -0
- control_plane_api/app/lib/event_bus/manager.py +335 -0
- control_plane_api/app/lib/event_bus/providers/__init__.py +6 -0
- control_plane_api/app/lib/event_bus/providers/http_provider.py +166 -0
- control_plane_api/app/lib/event_bus/providers/nats_provider.py +324 -0
- control_plane_api/app/lib/event_bus/providers/redis_provider.py +233 -0
- control_plane_api/app/lib/event_bus/providers/websocket_provider.py +497 -0
- control_plane_api/app/lib/job_executor.py +330 -0
- control_plane_api/app/lib/kubiya_client.py +293 -0
- control_plane_api/app/lib/litellm_pricing.py +166 -0
- control_plane_api/app/lib/mcp_validation.py +163 -0
- control_plane_api/app/lib/nats/__init__.py +13 -0
- control_plane_api/app/lib/nats/credentials_manager.py +288 -0
- control_plane_api/app/lib/nats/listener.py +374 -0
- control_plane_api/app/lib/planning_prompt_builder.py +153 -0
- control_plane_api/app/lib/planning_tools/__init__.py +41 -0
- control_plane_api/app/lib/planning_tools/agents.py +409 -0
- control_plane_api/app/lib/planning_tools/agno_toolkit.py +836 -0
- control_plane_api/app/lib/planning_tools/base.py +119 -0
- control_plane_api/app/lib/planning_tools/cognitive_memory_tools.py +403 -0
- control_plane_api/app/lib/planning_tools/context_graph_tools.py +545 -0
- control_plane_api/app/lib/planning_tools/environments.py +218 -0
- control_plane_api/app/lib/planning_tools/knowledge.py +204 -0
- control_plane_api/app/lib/planning_tools/models.py +93 -0
- control_plane_api/app/lib/planning_tools/planning_service.py +646 -0
- control_plane_api/app/lib/planning_tools/resources.py +242 -0
- control_plane_api/app/lib/planning_tools/teams.py +334 -0
- control_plane_api/app/lib/policy_enforcer_client.py +1016 -0
- control_plane_api/app/lib/redis_client.py +803 -0
- control_plane_api/app/lib/sqlalchemy_utils.py +486 -0
- control_plane_api/app/lib/state_transition_tools/__init__.py +7 -0
- control_plane_api/app/lib/state_transition_tools/execution_context.py +388 -0
- control_plane_api/app/lib/storage/__init__.py +20 -0
- control_plane_api/app/lib/storage/base_provider.py +274 -0
- control_plane_api/app/lib/storage/provider_factory.py +157 -0
- control_plane_api/app/lib/storage/vercel_blob_provider.py +468 -0
- control_plane_api/app/lib/supabase.py +71 -0
- control_plane_api/app/lib/supabase_utils.py +138 -0
- control_plane_api/app/lib/task_planning/__init__.py +138 -0
- control_plane_api/app/lib/task_planning/agent_factory.py +308 -0
- control_plane_api/app/lib/task_planning/agents.py +389 -0
- control_plane_api/app/lib/task_planning/cache.py +218 -0
- control_plane_api/app/lib/task_planning/entity_resolver.py +273 -0
- control_plane_api/app/lib/task_planning/helpers.py +293 -0
- control_plane_api/app/lib/task_planning/hooks.py +474 -0
- control_plane_api/app/lib/task_planning/models.py +503 -0
- control_plane_api/app/lib/task_planning/plan_validator.py +166 -0
- control_plane_api/app/lib/task_planning/planning_workflow.py +2911 -0
- control_plane_api/app/lib/task_planning/runner.py +656 -0
- control_plane_api/app/lib/task_planning/streaming_hook.py +213 -0
- control_plane_api/app/lib/task_planning/workflow.py +424 -0
- control_plane_api/app/lib/templating/__init__.py +88 -0
- control_plane_api/app/lib/templating/compiler.py +278 -0
- control_plane_api/app/lib/templating/engine.py +178 -0
- control_plane_api/app/lib/templating/parsers/__init__.py +29 -0
- control_plane_api/app/lib/templating/parsers/base.py +96 -0
- control_plane_api/app/lib/templating/parsers/env.py +85 -0
- control_plane_api/app/lib/templating/parsers/graph.py +112 -0
- control_plane_api/app/lib/templating/parsers/secret.py +87 -0
- control_plane_api/app/lib/templating/parsers/simple.py +81 -0
- control_plane_api/app/lib/templating/resolver.py +366 -0
- control_plane_api/app/lib/templating/types.py +214 -0
- control_plane_api/app/lib/templating/validator.py +201 -0
- control_plane_api/app/lib/temporal_client.py +232 -0
- control_plane_api/app/lib/temporal_credentials_cache.py +178 -0
- control_plane_api/app/lib/temporal_credentials_service.py +203 -0
- control_plane_api/app/lib/validation/__init__.py +24 -0
- control_plane_api/app/lib/validation/runtime_validation.py +388 -0
- control_plane_api/app/main.py +531 -0
- control_plane_api/app/middleware/__init__.py +10 -0
- control_plane_api/app/middleware/auth.py +645 -0
- control_plane_api/app/middleware/exception_handler.py +267 -0
- control_plane_api/app/middleware/prometheus_middleware.py +173 -0
- control_plane_api/app/middleware/rate_limiting.py +384 -0
- control_plane_api/app/middleware/request_id.py +202 -0
- control_plane_api/app/models/__init__.py +40 -0
- control_plane_api/app/models/agent.py +90 -0
- control_plane_api/app/models/analytics.py +206 -0
- control_plane_api/app/models/associations.py +107 -0
- control_plane_api/app/models/auth_user.py +73 -0
- control_plane_api/app/models/context.py +161 -0
- control_plane_api/app/models/custom_integration.py +99 -0
- control_plane_api/app/models/environment.py +64 -0
- control_plane_api/app/models/execution.py +125 -0
- control_plane_api/app/models/execution_transition.py +50 -0
- control_plane_api/app/models/job.py +159 -0
- control_plane_api/app/models/llm_model.py +78 -0
- control_plane_api/app/models/orchestration.py +66 -0
- control_plane_api/app/models/plan_execution.py +102 -0
- control_plane_api/app/models/presence.py +49 -0
- control_plane_api/app/models/project.py +61 -0
- control_plane_api/app/models/project_management.py +85 -0
- control_plane_api/app/models/session.py +29 -0
- control_plane_api/app/models/skill.py +155 -0
- control_plane_api/app/models/system_tables.py +43 -0
- control_plane_api/app/models/task_planning.py +372 -0
- control_plane_api/app/models/team.py +86 -0
- control_plane_api/app/models/trace.py +257 -0
- control_plane_api/app/models/user_profile.py +54 -0
- control_plane_api/app/models/worker.py +221 -0
- control_plane_api/app/models/workflow.py +161 -0
- control_plane_api/app/models/workspace.py +50 -0
- control_plane_api/app/observability/__init__.py +177 -0
- control_plane_api/app/observability/context_logging.py +475 -0
- control_plane_api/app/observability/decorators.py +337 -0
- control_plane_api/app/observability/local_span_processor.py +702 -0
- control_plane_api/app/observability/metrics.py +303 -0
- control_plane_api/app/observability/middleware.py +246 -0
- control_plane_api/app/observability/optional.py +115 -0
- control_plane_api/app/observability/tracing.py +382 -0
- control_plane_api/app/policies/README.md +149 -0
- control_plane_api/app/policies/approved_users.rego +62 -0
- control_plane_api/app/policies/business_hours.rego +51 -0
- control_plane_api/app/policies/rate_limiting.rego +100 -0
- control_plane_api/app/policies/tool_enforcement/README.md +336 -0
- control_plane_api/app/policies/tool_enforcement/bash_command_validation.rego +71 -0
- control_plane_api/app/policies/tool_enforcement/business_hours_enforcement.rego +82 -0
- control_plane_api/app/policies/tool_enforcement/mcp_tool_allowlist.rego +58 -0
- control_plane_api/app/policies/tool_enforcement/production_safeguards.rego +80 -0
- control_plane_api/app/policies/tool_enforcement/role_based_tool_access.rego +44 -0
- control_plane_api/app/policies/tool_restrictions.rego +86 -0
- control_plane_api/app/routers/__init__.py +4 -0
- control_plane_api/app/routers/agents.py +382 -0
- control_plane_api/app/routers/agents_v2.py +1598 -0
- control_plane_api/app/routers/analytics.py +1310 -0
- control_plane_api/app/routers/auth.py +59 -0
- control_plane_api/app/routers/client_config.py +57 -0
- control_plane_api/app/routers/context_graph.py +561 -0
- control_plane_api/app/routers/context_manager.py +577 -0
- control_plane_api/app/routers/custom_integrations.py +490 -0
- control_plane_api/app/routers/enforcer.py +132 -0
- control_plane_api/app/routers/environment_context.py +252 -0
- control_plane_api/app/routers/environments.py +761 -0
- control_plane_api/app/routers/execution_environment.py +847 -0
- control_plane_api/app/routers/executions/__init__.py +28 -0
- control_plane_api/app/routers/executions/router.py +286 -0
- control_plane_api/app/routers/executions/services/__init__.py +22 -0
- control_plane_api/app/routers/executions/services/demo_worker_health.py +156 -0
- control_plane_api/app/routers/executions/services/status_service.py +420 -0
- control_plane_api/app/routers/executions/services/test_worker_health.py +480 -0
- control_plane_api/app/routers/executions/services/worker_health.py +514 -0
- control_plane_api/app/routers/executions/streaming/__init__.py +22 -0
- control_plane_api/app/routers/executions/streaming/deduplication.py +352 -0
- control_plane_api/app/routers/executions/streaming/event_buffer.py +353 -0
- control_plane_api/app/routers/executions/streaming/event_formatter.py +964 -0
- control_plane_api/app/routers/executions/streaming/history_loader.py +588 -0
- control_plane_api/app/routers/executions/streaming/live_source.py +693 -0
- control_plane_api/app/routers/executions/streaming/streamer.py +849 -0
- control_plane_api/app/routers/executions.py +4888 -0
- control_plane_api/app/routers/health.py +165 -0
- control_plane_api/app/routers/health_v2.py +394 -0
- control_plane_api/app/routers/integration_templates.py +496 -0
- control_plane_api/app/routers/integrations.py +287 -0
- control_plane_api/app/routers/jobs.py +1809 -0
- control_plane_api/app/routers/metrics.py +517 -0
- control_plane_api/app/routers/models.py +82 -0
- control_plane_api/app/routers/models_v2.py +628 -0
- control_plane_api/app/routers/plan_executions.py +1481 -0
- control_plane_api/app/routers/plan_generation_async.py +304 -0
- control_plane_api/app/routers/policies.py +669 -0
- control_plane_api/app/routers/presence.py +234 -0
- control_plane_api/app/routers/projects.py +987 -0
- control_plane_api/app/routers/runners.py +379 -0
- control_plane_api/app/routers/runtimes.py +172 -0
- control_plane_api/app/routers/secrets.py +171 -0
- control_plane_api/app/routers/skills.py +1010 -0
- control_plane_api/app/routers/skills_definitions.py +140 -0
- control_plane_api/app/routers/storage.py +456 -0
- control_plane_api/app/routers/task_planning.py +611 -0
- control_plane_api/app/routers/task_queues.py +650 -0
- control_plane_api/app/routers/team_context.py +274 -0
- control_plane_api/app/routers/teams.py +1747 -0
- control_plane_api/app/routers/templates.py +248 -0
- control_plane_api/app/routers/traces.py +571 -0
- control_plane_api/app/routers/websocket_client.py +479 -0
- control_plane_api/app/routers/websocket_executions_status.py +437 -0
- control_plane_api/app/routers/websocket_gateway.py +323 -0
- control_plane_api/app/routers/websocket_traces.py +576 -0
- control_plane_api/app/routers/worker_queues.py +2555 -0
- control_plane_api/app/routers/worker_websocket.py +419 -0
- control_plane_api/app/routers/workers.py +1004 -0
- control_plane_api/app/routers/workflows.py +204 -0
- control_plane_api/app/runtimes/__init__.py +6 -0
- control_plane_api/app/runtimes/validation.py +344 -0
- control_plane_api/app/schemas/__init__.py +1 -0
- control_plane_api/app/schemas/job_schemas.py +302 -0
- control_plane_api/app/schemas/mcp_schemas.py +311 -0
- control_plane_api/app/schemas/template_schemas.py +133 -0
- control_plane_api/app/schemas/trace_schemas.py +168 -0
- control_plane_api/app/schemas/worker_queue_observability_schemas.py +165 -0
- control_plane_api/app/services/__init__.py +1 -0
- control_plane_api/app/services/agno_planning_strategy.py +233 -0
- control_plane_api/app/services/agno_service.py +838 -0
- control_plane_api/app/services/claude_code_planning_service.py +203 -0
- control_plane_api/app/services/context_graph_client.py +224 -0
- control_plane_api/app/services/custom_integration_service.py +415 -0
- control_plane_api/app/services/integration_resolution_service.py +345 -0
- control_plane_api/app/services/litellm_service.py +394 -0
- control_plane_api/app/services/plan_generator.py +79 -0
- control_plane_api/app/services/planning_strategy.py +66 -0
- control_plane_api/app/services/planning_strategy_factory.py +118 -0
- control_plane_api/app/services/policy_service.py +615 -0
- control_plane_api/app/services/state_transition_service.py +755 -0
- control_plane_api/app/services/storage_service.py +593 -0
- control_plane_api/app/services/temporal_cloud_provisioning.py +150 -0
- control_plane_api/app/services/toolsets/context_graph_skill.py +432 -0
- control_plane_api/app/services/trace_retention.py +354 -0
- control_plane_api/app/services/worker_queue_metrics_service.py +190 -0
- control_plane_api/app/services/workflow_cancellation_manager.py +135 -0
- control_plane_api/app/services/workflow_operations_service.py +611 -0
- control_plane_api/app/skills/__init__.py +100 -0
- control_plane_api/app/skills/base.py +239 -0
- control_plane_api/app/skills/builtin/__init__.py +37 -0
- control_plane_api/app/skills/builtin/agent_communication/__init__.py +8 -0
- control_plane_api/app/skills/builtin/agent_communication/skill.py +246 -0
- control_plane_api/app/skills/builtin/code_ingestion/__init__.py +4 -0
- control_plane_api/app/skills/builtin/code_ingestion/skill.py +267 -0
- control_plane_api/app/skills/builtin/cognitive_memory/__init__.py +4 -0
- control_plane_api/app/skills/builtin/cognitive_memory/skill.py +174 -0
- control_plane_api/app/skills/builtin/contextual_awareness/__init__.py +4 -0
- control_plane_api/app/skills/builtin/contextual_awareness/skill.py +387 -0
- control_plane_api/app/skills/builtin/data_visualization/__init__.py +4 -0
- control_plane_api/app/skills/builtin/data_visualization/skill.py +154 -0
- control_plane_api/app/skills/builtin/docker/__init__.py +4 -0
- control_plane_api/app/skills/builtin/docker/skill.py +104 -0
- control_plane_api/app/skills/builtin/file_generation/__init__.py +4 -0
- control_plane_api/app/skills/builtin/file_generation/skill.py +94 -0
- control_plane_api/app/skills/builtin/file_system/__init__.py +4 -0
- control_plane_api/app/skills/builtin/file_system/skill.py +110 -0
- control_plane_api/app/skills/builtin/knowledge_api/__init__.py +5 -0
- control_plane_api/app/skills/builtin/knowledge_api/skill.py +124 -0
- control_plane_api/app/skills/builtin/python/__init__.py +4 -0
- control_plane_api/app/skills/builtin/python/skill.py +92 -0
- control_plane_api/app/skills/builtin/remote_filesystem/__init__.py +5 -0
- control_plane_api/app/skills/builtin/remote_filesystem/skill.py +170 -0
- control_plane_api/app/skills/builtin/shell/__init__.py +4 -0
- control_plane_api/app/skills/builtin/shell/skill.py +161 -0
- control_plane_api/app/skills/builtin/slack/__init__.py +3 -0
- control_plane_api/app/skills/builtin/slack/skill.py +302 -0
- control_plane_api/app/skills/builtin/workflow_executor/__init__.py +4 -0
- control_plane_api/app/skills/builtin/workflow_executor/skill.py +469 -0
- control_plane_api/app/skills/business_intelligence.py +189 -0
- control_plane_api/app/skills/config.py +63 -0
- control_plane_api/app/skills/loaders/__init__.py +14 -0
- control_plane_api/app/skills/loaders/base.py +73 -0
- control_plane_api/app/skills/loaders/filesystem_loader.py +199 -0
- control_plane_api/app/skills/registry.py +125 -0
- control_plane_api/app/utils/helpers.py +12 -0
- control_plane_api/app/utils/workflow_executor.py +354 -0
- control_plane_api/app/workflows/__init__.py +11 -0
- control_plane_api/app/workflows/agent_execution.py +520 -0
- control_plane_api/app/workflows/agent_execution_with_skills.py +223 -0
- control_plane_api/app/workflows/namespace_provisioning.py +326 -0
- control_plane_api/app/workflows/plan_generation.py +254 -0
- control_plane_api/app/workflows/team_execution.py +442 -0
- control_plane_api/scripts/seed_models.py +240 -0
- control_plane_api/scripts/validate_existing_tool_names.py +492 -0
- control_plane_api/shared/__init__.py +8 -0
- control_plane_api/shared/version.py +17 -0
- control_plane_api/test_deduplication.py +274 -0
- control_plane_api/test_executor_deduplication_e2e.py +309 -0
- control_plane_api/test_job_execution_e2e.py +283 -0
- control_plane_api/test_real_integration.py +193 -0
- control_plane_api/version.py +38 -0
- control_plane_api/worker/__init__.py +0 -0
- control_plane_api/worker/activities/__init__.py +0 -0
- control_plane_api/worker/activities/agent_activities.py +1585 -0
- control_plane_api/worker/activities/approval_activities.py +234 -0
- control_plane_api/worker/activities/job_activities.py +199 -0
- control_plane_api/worker/activities/runtime_activities.py +1167 -0
- control_plane_api/worker/activities/skill_activities.py +282 -0
- control_plane_api/worker/activities/team_activities.py +479 -0
- control_plane_api/worker/agent_runtime_server.py +370 -0
- control_plane_api/worker/binary_manager.py +333 -0
- control_plane_api/worker/config/__init__.py +31 -0
- control_plane_api/worker/config/worker_config.py +273 -0
- control_plane_api/worker/control_plane_client.py +1491 -0
- control_plane_api/worker/examples/analytics_integration_example.py +362 -0
- control_plane_api/worker/health_monitor.py +159 -0
- control_plane_api/worker/metrics.py +237 -0
- control_plane_api/worker/models/__init__.py +1 -0
- control_plane_api/worker/models/error_events.py +105 -0
- control_plane_api/worker/models/inputs.py +89 -0
- control_plane_api/worker/runtimes/__init__.py +35 -0
- control_plane_api/worker/runtimes/agent_runtime/runtime.py +485 -0
- control_plane_api/worker/runtimes/agno/__init__.py +34 -0
- control_plane_api/worker/runtimes/agno/config.py +248 -0
- control_plane_api/worker/runtimes/agno/hooks.py +385 -0
- control_plane_api/worker/runtimes/agno/mcp_builder.py +195 -0
- control_plane_api/worker/runtimes/agno/runtime.py +1063 -0
- control_plane_api/worker/runtimes/agno/utils.py +163 -0
- control_plane_api/worker/runtimes/base.py +979 -0
- control_plane_api/worker/runtimes/claude_code/__init__.py +38 -0
- control_plane_api/worker/runtimes/claude_code/cleanup.py +184 -0
- control_plane_api/worker/runtimes/claude_code/client_pool.py +529 -0
- control_plane_api/worker/runtimes/claude_code/config.py +829 -0
- control_plane_api/worker/runtimes/claude_code/hooks.py +482 -0
- control_plane_api/worker/runtimes/claude_code/litellm_proxy.py +1702 -0
- control_plane_api/worker/runtimes/claude_code/mcp_builder.py +467 -0
- control_plane_api/worker/runtimes/claude_code/mcp_discovery.py +558 -0
- control_plane_api/worker/runtimes/claude_code/runtime.py +1546 -0
- control_plane_api/worker/runtimes/claude_code/tool_mapper.py +403 -0
- control_plane_api/worker/runtimes/claude_code/utils.py +149 -0
- control_plane_api/worker/runtimes/factory.py +173 -0
- control_plane_api/worker/runtimes/model_utils.py +107 -0
- control_plane_api/worker/runtimes/validation.py +93 -0
- control_plane_api/worker/services/__init__.py +1 -0
- control_plane_api/worker/services/agent_communication_tools.py +908 -0
- control_plane_api/worker/services/agent_executor.py +485 -0
- control_plane_api/worker/services/agent_executor_v2.py +793 -0
- control_plane_api/worker/services/analytics_collector.py +457 -0
- control_plane_api/worker/services/analytics_service.py +464 -0
- control_plane_api/worker/services/approval_tools.py +310 -0
- control_plane_api/worker/services/approval_tools_agno.py +207 -0
- control_plane_api/worker/services/cancellation_manager.py +177 -0
- control_plane_api/worker/services/code_ingestion_tools.py +465 -0
- control_plane_api/worker/services/contextual_awareness_tools.py +405 -0
- control_plane_api/worker/services/data_visualization.py +834 -0
- control_plane_api/worker/services/event_publisher.py +531 -0
- control_plane_api/worker/services/jira_tools.py +257 -0
- control_plane_api/worker/services/remote_filesystem_tools.py +498 -0
- control_plane_api/worker/services/runtime_analytics.py +328 -0
- control_plane_api/worker/services/session_service.py +365 -0
- control_plane_api/worker/services/skill_context_enhancement.py +181 -0
- control_plane_api/worker/services/skill_factory.py +471 -0
- control_plane_api/worker/services/system_prompt_enhancement.py +410 -0
- control_plane_api/worker/services/team_executor.py +715 -0
- control_plane_api/worker/services/team_executor_v2.py +1866 -0
- control_plane_api/worker/services/tool_enforcement.py +254 -0
- control_plane_api/worker/services/workflow_executor/__init__.py +52 -0
- control_plane_api/worker/services/workflow_executor/event_processor.py +287 -0
- control_plane_api/worker/services/workflow_executor/event_publisher.py +210 -0
- control_plane_api/worker/services/workflow_executor/executors/__init__.py +15 -0
- control_plane_api/worker/services/workflow_executor/executors/base.py +270 -0
- control_plane_api/worker/services/workflow_executor/executors/json_executor.py +50 -0
- control_plane_api/worker/services/workflow_executor/executors/python_executor.py +50 -0
- control_plane_api/worker/services/workflow_executor/models.py +142 -0
- control_plane_api/worker/services/workflow_executor_tools.py +1748 -0
- control_plane_api/worker/skills/__init__.py +12 -0
- control_plane_api/worker/skills/builtin/context_graph_search/README.md +213 -0
- control_plane_api/worker/skills/builtin/context_graph_search/__init__.py +5 -0
- control_plane_api/worker/skills/builtin/context_graph_search/agno_impl.py +808 -0
- control_plane_api/worker/skills/builtin/context_graph_search/skill.yaml +67 -0
- control_plane_api/worker/skills/builtin/contextual_awareness/__init__.py +4 -0
- control_plane_api/worker/skills/builtin/contextual_awareness/agno_impl.py +62 -0
- control_plane_api/worker/skills/builtin/data_visualization/agno_impl.py +18 -0
- control_plane_api/worker/skills/builtin/data_visualization/skill.yaml +84 -0
- control_plane_api/worker/skills/builtin/docker/agno_impl.py +65 -0
- control_plane_api/worker/skills/builtin/docker/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/file_generation/agno_impl.py +47 -0
- control_plane_api/worker/skills/builtin/file_generation/skill.yaml +64 -0
- control_plane_api/worker/skills/builtin/file_system/agno_impl.py +32 -0
- control_plane_api/worker/skills/builtin/file_system/skill.yaml +54 -0
- control_plane_api/worker/skills/builtin/knowledge_api/__init__.py +4 -0
- control_plane_api/worker/skills/builtin/knowledge_api/agno_impl.py +50 -0
- control_plane_api/worker/skills/builtin/knowledge_api/skill.yaml +66 -0
- control_plane_api/worker/skills/builtin/python/agno_impl.py +25 -0
- control_plane_api/worker/skills/builtin/python/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/schema_fix_mixin.py +260 -0
- control_plane_api/worker/skills/builtin/shell/agno_impl.py +31 -0
- control_plane_api/worker/skills/builtin/shell/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/slack/__init__.py +3 -0
- control_plane_api/worker/skills/builtin/slack/agno_impl.py +1282 -0
- control_plane_api/worker/skills/builtin/slack/skill.yaml +276 -0
- control_plane_api/worker/skills/builtin/workflow_executor/agno_impl.py +62 -0
- control_plane_api/worker/skills/builtin/workflow_executor/skill.yaml +79 -0
- control_plane_api/worker/skills/loaders/__init__.py +5 -0
- control_plane_api/worker/skills/loaders/base.py +23 -0
- control_plane_api/worker/skills/loaders/filesystem_loader.py +357 -0
- control_plane_api/worker/skills/registry.py +208 -0
- control_plane_api/worker/tests/__init__.py +1 -0
- control_plane_api/worker/tests/conftest.py +12 -0
- control_plane_api/worker/tests/e2e/__init__.py +0 -0
- control_plane_api/worker/tests/e2e/test_context_graph_real_api.py +338 -0
- control_plane_api/worker/tests/e2e/test_context_graph_templates_e2e.py +523 -0
- control_plane_api/worker/tests/e2e/test_enforcement_e2e.py +344 -0
- control_plane_api/worker/tests/e2e/test_execution_flow.py +571 -0
- control_plane_api/worker/tests/e2e/test_single_execution_mode.py +656 -0
- control_plane_api/worker/tests/integration/__init__.py +0 -0
- control_plane_api/worker/tests/integration/test_builtin_skills_fixes.py +245 -0
- control_plane_api/worker/tests/integration/test_context_graph_search_integration.py +365 -0
- control_plane_api/worker/tests/integration/test_control_plane_integration.py +308 -0
- control_plane_api/worker/tests/integration/test_hook_enforcement_integration.py +579 -0
- control_plane_api/worker/tests/integration/test_scheduled_job_workflow.py +237 -0
- control_plane_api/worker/tests/integration/test_system_prompt_enhancement_integration.py +343 -0
- control_plane_api/worker/tests/unit/__init__.py +0 -0
- control_plane_api/worker/tests/unit/test_builtin_skill_autoload.py +396 -0
- control_plane_api/worker/tests/unit/test_context_graph_search.py +450 -0
- control_plane_api/worker/tests/unit/test_context_graph_templates.py +403 -0
- control_plane_api/worker/tests/unit/test_control_plane_client.py +401 -0
- control_plane_api/worker/tests/unit/test_control_plane_client_jobs.py +345 -0
- control_plane_api/worker/tests/unit/test_job_activities.py +353 -0
- control_plane_api/worker/tests/unit/test_skill_context_enhancement.py +321 -0
- control_plane_api/worker/tests/unit/test_system_prompt_enhancement.py +415 -0
- control_plane_api/worker/tests/unit/test_tool_enforcement.py +324 -0
- control_plane_api/worker/utils/__init__.py +1 -0
- control_plane_api/worker/utils/chunk_batcher.py +330 -0
- control_plane_api/worker/utils/environment.py +65 -0
- control_plane_api/worker/utils/error_publisher.py +260 -0
- control_plane_api/worker/utils/event_batcher.py +256 -0
- control_plane_api/worker/utils/logging_config.py +335 -0
- control_plane_api/worker/utils/logging_helper.py +326 -0
- control_plane_api/worker/utils/parameter_validator.py +120 -0
- control_plane_api/worker/utils/retry_utils.py +60 -0
- control_plane_api/worker/utils/streaming_utils.py +665 -0
- control_plane_api/worker/utils/tool_validation.py +332 -0
- control_plane_api/worker/utils/workspace_manager.py +163 -0
- control_plane_api/worker/websocket_client.py +393 -0
- control_plane_api/worker/worker.py +1297 -0
- control_plane_api/worker/workflows/__init__.py +0 -0
- control_plane_api/worker/workflows/agent_execution.py +909 -0
- control_plane_api/worker/workflows/scheduled_job_wrapper.py +332 -0
- control_plane_api/worker/workflows/team_execution.py +611 -0
- kubiya_control_plane_api-0.9.15.dist-info/METADATA +354 -0
- kubiya_control_plane_api-0.9.15.dist-info/RECORD +479 -0
- kubiya_control_plane_api-0.9.15.dist-info/WHEEL +5 -0
- kubiya_control_plane_api-0.9.15.dist-info/entry_points.txt +5 -0
- kubiya_control_plane_api-0.9.15.dist-info/licenses/LICENSE +676 -0
- kubiya_control_plane_api-0.9.15.dist-info/top_level.txt +3 -0
- scripts/__init__.py +1 -0
- scripts/migrations.py +39 -0
- scripts/seed_worker_queues.py +128 -0
- scripts/setup_agent_runtime.py +142 -0
- worker_internal/__init__.py +1 -0
- worker_internal/planner/__init__.py +1 -0
- worker_internal/planner/activities.py +1499 -0
- worker_internal/planner/agent_tools.py +197 -0
- worker_internal/planner/event_models.py +148 -0
- worker_internal/planner/event_publisher.py +67 -0
- worker_internal/planner/models.py +199 -0
- worker_internal/planner/retry_logic.py +134 -0
- worker_internal/planner/worker.py +300 -0
- worker_internal/planner/workflows.py +970 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
"""Team-related Temporal activities"""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import httpx
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
from typing import Optional, List, Any, Dict
|
|
7
|
+
from datetime import datetime, timezone
|
|
8
|
+
from temporalio import activity
|
|
9
|
+
import structlog
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from types import GeneratorType
|
|
12
|
+
|
|
13
|
+
from agno.agent import Agent
|
|
14
|
+
from agno.team import Team
|
|
15
|
+
from agno.models.litellm import LiteLLM
|
|
16
|
+
from agno.tools.shell import ShellTools
|
|
17
|
+
from agno.tools.python import PythonTools
|
|
18
|
+
from agno.tools.file import FileTools
|
|
19
|
+
|
|
20
|
+
from control_plane_api.worker.activities.agent_activities import update_execution_status, ActivityUpdateExecutionInput
|
|
21
|
+
from control_plane_api.worker.control_plane_client import get_control_plane_client
|
|
22
|
+
from control_plane_api.worker.services.skill_factory import SkillFactory
|
|
23
|
+
from control_plane_api.worker.services.team_executor_v2 import TeamExecutorServiceV2
|
|
24
|
+
from control_plane_api.worker.services.session_service import SessionService
|
|
25
|
+
from control_plane_api.worker.services.cancellation_manager import CancellationManager
|
|
26
|
+
|
|
27
|
+
logger = structlog.get_logger()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def serialize_tool_output(output: Any, max_length: int = 10000) -> Optional[str]:
|
|
31
|
+
"""
|
|
32
|
+
Safely serialize tool output for JSON encoding.
|
|
33
|
+
|
|
34
|
+
Handles:
|
|
35
|
+
- Generator objects (consumes and converts to string)
|
|
36
|
+
- Large strings (truncates with indication)
|
|
37
|
+
- None values
|
|
38
|
+
- Other types (converts to string)
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
output: Tool output to serialize
|
|
42
|
+
max_length: Maximum length for output string (default 10000)
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Serialized string or None
|
|
46
|
+
"""
|
|
47
|
+
if output is None:
|
|
48
|
+
return None
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
# Check if it's a generator - consume it first
|
|
52
|
+
if isinstance(output, GeneratorType):
|
|
53
|
+
# Consume generator and join results
|
|
54
|
+
output = ''.join(str(item) for item in output)
|
|
55
|
+
|
|
56
|
+
# Convert to string
|
|
57
|
+
output_str = str(output)
|
|
58
|
+
|
|
59
|
+
# Truncate if too long
|
|
60
|
+
if len(output_str) > max_length:
|
|
61
|
+
return output_str[:max_length] + f"\n... (truncated, {len(output_str) - max_length} chars omitted)"
|
|
62
|
+
|
|
63
|
+
return output_str
|
|
64
|
+
|
|
65
|
+
except Exception as e:
|
|
66
|
+
logger.warning("failed_to_serialize_tool_output", error=str(e))
|
|
67
|
+
return f"<Failed to serialize output: {str(e)}>"
|
|
68
|
+
|
|
69
|
+
# Global registry for active Team instances to support cancellation
|
|
70
|
+
# Key: execution_id, Value: {team: Team, run_id: str}
|
|
71
|
+
_active_teams: Dict[str, Dict[str, Any]] = {}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def instantiate_skill(skill_data: dict) -> Optional[Any]:
|
|
75
|
+
"""
|
|
76
|
+
Instantiate an Agno toolkit based on skill configuration from Control Plane.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
skill_data: Skill data from Control Plane API containing:
|
|
80
|
+
- type: Skill type (file_system, shell, python, docker, etc.)
|
|
81
|
+
- name: Skill name
|
|
82
|
+
- configuration: Dict with skill-specific config
|
|
83
|
+
- enabled: Whether skill is enabled
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
Instantiated Agno toolkit or None if type not supported/enabled
|
|
87
|
+
"""
|
|
88
|
+
if not skill_data.get("enabled", True):
|
|
89
|
+
print(f" ⊗ Skipping disabled skill: {skill_data.get('name')}")
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
skill_type = skill_data.get("type", "").lower()
|
|
93
|
+
config = skill_data.get("configuration", {})
|
|
94
|
+
name = skill_data.get("name", "Unknown")
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
# Map Control Plane skill types to Agno toolkit classes
|
|
98
|
+
if skill_type in ["file_system", "file", "file_generation"]:
|
|
99
|
+
# FileTools: file operations (read, write, list, search)
|
|
100
|
+
# Note: file_generation is mapped to FileTools (save_file functionality)
|
|
101
|
+
base_dir = config.get("base_dir")
|
|
102
|
+
toolkit = FileTools(
|
|
103
|
+
base_dir=Path(base_dir) if base_dir else None,
|
|
104
|
+
enable_save_file=config.get("enable_save_file", True),
|
|
105
|
+
enable_read_file=config.get("enable_read_file", True),
|
|
106
|
+
enable_list_files=config.get("enable_list_files", True),
|
|
107
|
+
enable_search_files=config.get("enable_search_files", True),
|
|
108
|
+
)
|
|
109
|
+
print(f" ✓ Instantiated FileTools: {name}")
|
|
110
|
+
if skill_type == "file_generation":
|
|
111
|
+
print(f" - Type: File Generation (using FileTools.save_file)")
|
|
112
|
+
print(f" - Base Dir: {base_dir or 'Current directory'}")
|
|
113
|
+
print(f" - Read: {config.get('enable_read_file', True)}, Write: {config.get('enable_save_file', True)}")
|
|
114
|
+
return toolkit
|
|
115
|
+
|
|
116
|
+
elif skill_type in ["shell", "bash"]:
|
|
117
|
+
# ShellTools: shell command execution
|
|
118
|
+
base_dir = config.get("base_dir")
|
|
119
|
+
toolkit = ShellTools(
|
|
120
|
+
base_dir=Path(base_dir) if base_dir else None,
|
|
121
|
+
enable_run_shell_command=config.get("enable_run_shell_command", True),
|
|
122
|
+
)
|
|
123
|
+
print(f" ✓ Instantiated ShellTools: {name}")
|
|
124
|
+
print(f" - Base Dir: {base_dir or 'Current directory'}")
|
|
125
|
+
print(f" - Run Commands: {config.get('enable_run_shell_command', True)}")
|
|
126
|
+
return toolkit
|
|
127
|
+
|
|
128
|
+
elif skill_type == "python":
|
|
129
|
+
# PythonTools: Python code execution
|
|
130
|
+
base_dir = config.get("base_dir")
|
|
131
|
+
toolkit = PythonTools(
|
|
132
|
+
base_dir=Path(base_dir) if base_dir else None,
|
|
133
|
+
safe_globals=config.get("safe_globals"),
|
|
134
|
+
safe_locals=config.get("safe_locals"),
|
|
135
|
+
)
|
|
136
|
+
print(f" ✓ Instantiated PythonTools: {name}")
|
|
137
|
+
print(f" - Base Dir: {base_dir or 'Current directory'}")
|
|
138
|
+
return toolkit
|
|
139
|
+
|
|
140
|
+
elif skill_type == "docker":
|
|
141
|
+
# DockerTools requires docker package and running Docker daemon
|
|
142
|
+
try:
|
|
143
|
+
from agno.tools.docker import DockerTools
|
|
144
|
+
import docker
|
|
145
|
+
|
|
146
|
+
# Check if Docker daemon is accessible
|
|
147
|
+
try:
|
|
148
|
+
docker_client = docker.from_env()
|
|
149
|
+
docker_client.ping()
|
|
150
|
+
|
|
151
|
+
# Docker is available, instantiate toolkit
|
|
152
|
+
toolkit = DockerTools()
|
|
153
|
+
print(f" ✓ Instantiated DockerTools: {name}")
|
|
154
|
+
print(f" - Docker daemon: Connected")
|
|
155
|
+
docker_client.close()
|
|
156
|
+
return toolkit
|
|
157
|
+
|
|
158
|
+
except Exception as docker_error:
|
|
159
|
+
print(f" ⚠ Docker daemon not available - skipping: {name}")
|
|
160
|
+
print(f" Error: {str(docker_error)}")
|
|
161
|
+
return None
|
|
162
|
+
|
|
163
|
+
except ImportError:
|
|
164
|
+
print(f" ⚠ Docker skill requires 'docker' package - skipping: {name}")
|
|
165
|
+
print(f" Install with: pip install docker")
|
|
166
|
+
return None
|
|
167
|
+
|
|
168
|
+
else:
|
|
169
|
+
print(f" ⚠ Unsupported skill type '{skill_type}': {name}")
|
|
170
|
+
return None
|
|
171
|
+
|
|
172
|
+
except Exception as e:
|
|
173
|
+
print(f" ❌ Error instantiating skill '{name}' (type: {skill_type}): {str(e)}")
|
|
174
|
+
logger.error(
|
|
175
|
+
f"Error instantiating skill",
|
|
176
|
+
extra={
|
|
177
|
+
"skill_name": name,
|
|
178
|
+
"skill_type": skill_type,
|
|
179
|
+
"error": str(e)
|
|
180
|
+
}
|
|
181
|
+
)
|
|
182
|
+
return None
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
@dataclass
|
|
186
|
+
class ActivityGetTeamAgentsInput:
|
|
187
|
+
"""Input for get_team_agents activity"""
|
|
188
|
+
team_id: str
|
|
189
|
+
organization_id: str
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
@dataclass
|
|
193
|
+
class ActivityExecuteTeamInput:
|
|
194
|
+
"""Input for execute_team_coordination activity"""
|
|
195
|
+
execution_id: str
|
|
196
|
+
team_id: str
|
|
197
|
+
organization_id: str
|
|
198
|
+
prompt: str
|
|
199
|
+
system_prompt: Optional[str] = None
|
|
200
|
+
agents: List[dict] = None
|
|
201
|
+
team_config: dict = None
|
|
202
|
+
mcp_servers: dict = None # MCP servers configuration
|
|
203
|
+
session_id: Optional[str] = None # Session ID for session management
|
|
204
|
+
user_id: Optional[str] = None # User ID for multi-user support
|
|
205
|
+
model_id: Optional[str] = None # Model ID for the team coordinator
|
|
206
|
+
model_config: Optional[dict] = None # Model configuration
|
|
207
|
+
# Note: control_plane_url and api_key are read from worker environment variables (CONTROL_PLANE_URL, KUBIYA_API_KEY)
|
|
208
|
+
|
|
209
|
+
def __post_init__(self):
|
|
210
|
+
if self.agents is None:
|
|
211
|
+
self.agents = []
|
|
212
|
+
if self.team_config is None:
|
|
213
|
+
self.team_config = {}
|
|
214
|
+
if self.mcp_servers is None:
|
|
215
|
+
self.mcp_servers = {}
|
|
216
|
+
if self.model_config is None:
|
|
217
|
+
self.model_config = {}
|
|
218
|
+
# Default model_id if not provided
|
|
219
|
+
if self.model_id is None:
|
|
220
|
+
self.model_id = self.team_config.get("llm", {}).get("model", "kubiya/claude-sonnet-4")
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
@activity.defn
|
|
224
|
+
async def get_team_agents(input: ActivityGetTeamAgentsInput) -> dict:
|
|
225
|
+
"""
|
|
226
|
+
Get all agents in a team via Control Plane API.
|
|
227
|
+
|
|
228
|
+
This activity fetches team details including member agents from the Control Plane.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
input: Activity input with team details
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
Dict with agents list
|
|
235
|
+
"""
|
|
236
|
+
print(f"\n\n=== GET_TEAM_AGENTS START ===")
|
|
237
|
+
print(f"team_id: {input.team_id} (type: {type(input.team_id).__name__})")
|
|
238
|
+
print(f"organization_id: {input.organization_id} (type: {type(input.organization_id).__name__})")
|
|
239
|
+
print(f"================================\n")
|
|
240
|
+
|
|
241
|
+
activity.logger.info(
|
|
242
|
+
f"[DEBUG] Getting team agents START",
|
|
243
|
+
extra={
|
|
244
|
+
"team_id": input.team_id,
|
|
245
|
+
"team_id_type": type(input.team_id).__name__,
|
|
246
|
+
"organization_id": input.organization_id,
|
|
247
|
+
"organization_id_type": type(input.organization_id).__name__,
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
try:
|
|
252
|
+
# Get Control Plane URL and Kubiya API key from environment
|
|
253
|
+
control_plane_url = os.getenv("CONTROL_PLANE_URL")
|
|
254
|
+
kubiya_api_key = os.getenv("KUBIYA_API_KEY")
|
|
255
|
+
|
|
256
|
+
if not control_plane_url:
|
|
257
|
+
raise ValueError("CONTROL_PLANE_URL environment variable not set")
|
|
258
|
+
if not kubiya_api_key:
|
|
259
|
+
raise ValueError("KUBIYA_API_KEY environment variable not set")
|
|
260
|
+
|
|
261
|
+
print(f"Fetching team from Control Plane API: {control_plane_url}")
|
|
262
|
+
|
|
263
|
+
# Call Control Plane API to get team with agents
|
|
264
|
+
async with httpx.AsyncClient(timeout=30.0) as client:
|
|
265
|
+
response = await client.get(
|
|
266
|
+
f"{control_plane_url}/api/v1/teams/{input.team_id}",
|
|
267
|
+
headers={
|
|
268
|
+
"Authorization": f"Bearer {kubiya_api_key}",
|
|
269
|
+
"Content-Type": "application/json",
|
|
270
|
+
}
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
if response.status_code == 404:
|
|
274
|
+
print(f"Team not found!")
|
|
275
|
+
activity.logger.error(
|
|
276
|
+
f"[DEBUG] Team not found",
|
|
277
|
+
extra={
|
|
278
|
+
"team_id": input.team_id,
|
|
279
|
+
"organization_id": input.organization_id,
|
|
280
|
+
}
|
|
281
|
+
)
|
|
282
|
+
return {"agents": [], "count": 0}
|
|
283
|
+
elif response.status_code != 200:
|
|
284
|
+
raise Exception(f"Failed to get team: {response.status_code} - {response.text}")
|
|
285
|
+
|
|
286
|
+
team_data = response.json()
|
|
287
|
+
|
|
288
|
+
# Extract agents from the API response
|
|
289
|
+
# The API returns a TeamWithAgentsResponse which includes the agents array
|
|
290
|
+
agents = team_data.get("agents", [])
|
|
291
|
+
|
|
292
|
+
print(f"Query executed. Agents found: {len(agents)}")
|
|
293
|
+
|
|
294
|
+
activity.logger.info(
|
|
295
|
+
f"[DEBUG] Query executed, processing results",
|
|
296
|
+
extra={
|
|
297
|
+
"agents_found": len(agents),
|
|
298
|
+
"agent_ids": [a.get("id") for a in agents],
|
|
299
|
+
}
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
print(f"Agents found: {len(agents)}")
|
|
303
|
+
if agents:
|
|
304
|
+
for agent in agents:
|
|
305
|
+
print(f" - {agent.get('name')} (ID: {agent.get('id')})")
|
|
306
|
+
|
|
307
|
+
activity.logger.info(
|
|
308
|
+
f"[DEBUG] Retrieved team agents via API",
|
|
309
|
+
extra={
|
|
310
|
+
"team_id": input.team_id,
|
|
311
|
+
"agent_count": len(agents),
|
|
312
|
+
"agent_names": [a.get("name") for a in agents],
|
|
313
|
+
"agent_ids": [a.get("id") for a in agents],
|
|
314
|
+
}
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
if not agents:
|
|
318
|
+
print(f"\n!!! NO AGENTS FOUND - Team may have no members !!!")
|
|
319
|
+
activity.logger.warning(
|
|
320
|
+
f"[DEBUG] WARNING: No agents found for team",
|
|
321
|
+
extra={
|
|
322
|
+
"team_id": input.team_id,
|
|
323
|
+
"organization_id": input.organization_id,
|
|
324
|
+
}
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
print(f"\n=== GET_TEAM_AGENTS END: Returning {len(agents)} agents ===\n\n")
|
|
328
|
+
return {
|
|
329
|
+
"agents": agents,
|
|
330
|
+
"count": len(agents),
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
except Exception as e:
|
|
334
|
+
print(f"\n!!! EXCEPTION in get_team_agents: {type(e).__name__}: {str(e)} !!!\n")
|
|
335
|
+
activity.logger.error(
|
|
336
|
+
f"[DEBUG] EXCEPTION in get_team_agents",
|
|
337
|
+
extra={
|
|
338
|
+
"team_id": input.team_id,
|
|
339
|
+
"organization_id": input.organization_id,
|
|
340
|
+
"error": str(e),
|
|
341
|
+
"error_type": type(e).__name__,
|
|
342
|
+
}
|
|
343
|
+
)
|
|
344
|
+
raise
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
@activity.defn
|
|
348
|
+
async def execute_team_coordination(input: ActivityExecuteTeamInput) -> dict:
|
|
349
|
+
"""
|
|
350
|
+
Execute team coordination using runtime-abstracted execution (V2).
|
|
351
|
+
|
|
352
|
+
This activity uses TeamExecutorServiceV2 which:
|
|
353
|
+
- Detects the team's runtime configuration (claude_code or agno)
|
|
354
|
+
- Routes to appropriate executor
|
|
355
|
+
- Handles session management
|
|
356
|
+
- Provides streaming support
|
|
357
|
+
|
|
358
|
+
Args:
|
|
359
|
+
input: Activity input with team execution details
|
|
360
|
+
|
|
361
|
+
Returns:
|
|
362
|
+
Dict with aggregated response, usage, success flag
|
|
363
|
+
"""
|
|
364
|
+
print("\n" + "="*80)
|
|
365
|
+
print("🚀 TEAM EXECUTION START (V2)")
|
|
366
|
+
print("="*80)
|
|
367
|
+
print(f"Execution ID: {input.execution_id}")
|
|
368
|
+
print(f"Team ID: {input.team_id}")
|
|
369
|
+
print(f"Organization: {input.organization_id}")
|
|
370
|
+
print(f"Agent Count: {len(input.agents)}")
|
|
371
|
+
print(f"MCP Servers: {len(input.mcp_servers)} configured" if input.mcp_servers else "MCP Servers: None")
|
|
372
|
+
print(f"Session ID: {input.session_id}")
|
|
373
|
+
print(f"Prompt: {input.prompt[:100]}..." if len(input.prompt) > 100 else f"Prompt: {input.prompt}")
|
|
374
|
+
print("="*80 + "\n")
|
|
375
|
+
|
|
376
|
+
activity.logger.info(
|
|
377
|
+
f"Executing team coordination with V2 (runtime-abstracted)",
|
|
378
|
+
extra={
|
|
379
|
+
"execution_id": input.execution_id,
|
|
380
|
+
"team_id": input.team_id,
|
|
381
|
+
"organization_id": input.organization_id,
|
|
382
|
+
"agent_count": len(input.agents),
|
|
383
|
+
"has_mcp_servers": bool(input.mcp_servers),
|
|
384
|
+
"mcp_server_count": len(input.mcp_servers) if input.mcp_servers else 0,
|
|
385
|
+
"mcp_server_ids": list(input.mcp_servers.keys()) if input.mcp_servers else [],
|
|
386
|
+
"session_id": input.session_id,
|
|
387
|
+
"team_config_runtime": input.team_config.get("runtime", "default") if input.team_config else "default",
|
|
388
|
+
}
|
|
389
|
+
)
|
|
390
|
+
|
|
391
|
+
try:
|
|
392
|
+
# Initialize services
|
|
393
|
+
control_plane = get_control_plane_client()
|
|
394
|
+
session_service = SessionService(control_plane)
|
|
395
|
+
cancellation_manager = CancellationManager()
|
|
396
|
+
|
|
397
|
+
# Create V2 executor
|
|
398
|
+
executor = TeamExecutorServiceV2(
|
|
399
|
+
control_plane=control_plane,
|
|
400
|
+
session_service=session_service,
|
|
401
|
+
cancellation_manager=cancellation_manager,
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
# Execute using V2 - it will handle runtime detection and routing
|
|
405
|
+
result = await executor.execute(input)
|
|
406
|
+
|
|
407
|
+
print("\n" + "="*80)
|
|
408
|
+
print("🏁 TEAM EXECUTION END (V2)")
|
|
409
|
+
print("="*80 + "\n")
|
|
410
|
+
|
|
411
|
+
return result
|
|
412
|
+
|
|
413
|
+
except Exception as e:
|
|
414
|
+
print("\n" + "="*80)
|
|
415
|
+
print("❌ TEAM EXECUTION FAILED (V2)")
|
|
416
|
+
print("="*80)
|
|
417
|
+
print(f"Error: {str(e)}")
|
|
418
|
+
print("="*80 + "\n")
|
|
419
|
+
|
|
420
|
+
activity.logger.error(
|
|
421
|
+
f"Team coordination failed (V2)",
|
|
422
|
+
extra={
|
|
423
|
+
"execution_id": input.execution_id,
|
|
424
|
+
"error": str(e),
|
|
425
|
+
}
|
|
426
|
+
)
|
|
427
|
+
return {
|
|
428
|
+
"success": False,
|
|
429
|
+
"error": str(e),
|
|
430
|
+
"coordination_type": "unknown",
|
|
431
|
+
"usage": {},
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
@dataclass
|
|
439
|
+
class ActivityCancelTeamInput:
|
|
440
|
+
execution_id: str
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@activity.defn(name="cancel_team_run")
|
|
444
|
+
async def cancel_team_run(input: ActivityCancelTeamInput) -> dict:
|
|
445
|
+
"""Cancel an active team run using Agno's cancel_run API."""
|
|
446
|
+
print("\n" + "="*80)
|
|
447
|
+
print("🛑 CANCEL TEAM RUN")
|
|
448
|
+
print("="*80)
|
|
449
|
+
print(f"Execution ID: {input.execution_id}\n")
|
|
450
|
+
|
|
451
|
+
try:
|
|
452
|
+
if input.execution_id not in _active_teams:
|
|
453
|
+
print(f"⚠️ Team not found in registry - may have already completed")
|
|
454
|
+
return {"success": False, "error": "Team not found or already completed", "execution_id": input.execution_id}
|
|
455
|
+
|
|
456
|
+
team_info = _active_teams[input.execution_id]
|
|
457
|
+
team = team_info["team"]
|
|
458
|
+
run_id = team_info.get("run_id")
|
|
459
|
+
|
|
460
|
+
if not run_id:
|
|
461
|
+
print(f"⚠️ No run_id found - execution may not have started yet")
|
|
462
|
+
return {"success": False, "error": "Execution not started yet", "execution_id": input.execution_id}
|
|
463
|
+
|
|
464
|
+
print(f"🆔 Found run_id: {run_id}")
|
|
465
|
+
print(f"🛑 Calling team.cancel_run()...")
|
|
466
|
+
|
|
467
|
+
success = team.cancel_run(run_id)
|
|
468
|
+
|
|
469
|
+
if success:
|
|
470
|
+
print(f"✅ Team run cancelled successfully!\n")
|
|
471
|
+
del _active_teams[input.execution_id]
|
|
472
|
+
return {"success": True, "execution_id": input.execution_id, "run_id": run_id, "cancelled_at": datetime.now(timezone.utc).isoformat()}
|
|
473
|
+
else:
|
|
474
|
+
print(f"⚠️ Cancel failed - run may have already completed\n")
|
|
475
|
+
return {"success": False, "error": "Cancel failed - run may be completed", "execution_id": input.execution_id, "run_id": run_id}
|
|
476
|
+
|
|
477
|
+
except Exception as e:
|
|
478
|
+
print(f"❌ Error cancelling run: {str(e)}\n")
|
|
479
|
+
return {"success": False, "error": str(e), "execution_id": input.execution_id}
|