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,100 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Skills Module
|
|
3
|
+
|
|
4
|
+
This module manages all available skills (OS-level capabilities) that can be
|
|
5
|
+
assigned to agents and teams. Each skill corresponds to a capability that agents
|
|
6
|
+
can use during execution (file system, shell, Docker, Python, etc.).
|
|
7
|
+
|
|
8
|
+
Skills are defined as Python classes that provide:
|
|
9
|
+
- Metadata (name, description, icon)
|
|
10
|
+
- Default configuration
|
|
11
|
+
- Validation logic
|
|
12
|
+
- Instantiation logic for the underlying framework
|
|
13
|
+
|
|
14
|
+
Skills can be:
|
|
15
|
+
1. Built-in (imported below)
|
|
16
|
+
2. Dynamic (loaded from .kubiya/skills/ via loaders)
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from .base import SkillDefinition, SkillType, SkillCategory, SkillRequirements, SkillVariant
|
|
20
|
+
from .registry import skill_registry, get_skill, get_all_skills, register_skill
|
|
21
|
+
from .config import get_skill_template_paths, is_dynamic_skills_enabled
|
|
22
|
+
from .loaders import FilesystemSkillTemplateLoader
|
|
23
|
+
import logging
|
|
24
|
+
|
|
25
|
+
# Import all built-in skill definitions to auto-register them
|
|
26
|
+
from .builtin import (
|
|
27
|
+
FileSystemSkill,
|
|
28
|
+
ShellSkill,
|
|
29
|
+
DockerSkill,
|
|
30
|
+
PythonSkill,
|
|
31
|
+
FileGenerationSkill,
|
|
32
|
+
DataVisualizationSkill,
|
|
33
|
+
WorkflowExecutorSkill,
|
|
34
|
+
KnowledgeAPISkill,
|
|
35
|
+
AgentCommunicationSkill,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
__all__ = [
|
|
41
|
+
"SkillDefinition",
|
|
42
|
+
"SkillType",
|
|
43
|
+
"SkillCategory",
|
|
44
|
+
"SkillRequirements",
|
|
45
|
+
"SkillVariant",
|
|
46
|
+
"skill_registry",
|
|
47
|
+
"get_skill",
|
|
48
|
+
"get_all_skills",
|
|
49
|
+
"register_skill",
|
|
50
|
+
"FileSystemSkill",
|
|
51
|
+
"ShellSkill",
|
|
52
|
+
"DockerSkill",
|
|
53
|
+
"PythonSkill",
|
|
54
|
+
"FileGenerationSkill",
|
|
55
|
+
"DataVisualizationSkill",
|
|
56
|
+
"WorkflowExecutorSkill",
|
|
57
|
+
"KnowledgeAPISkill",
|
|
58
|
+
"AgentCommunicationSkill",
|
|
59
|
+
"initialize_dynamic_skills",
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def initialize_dynamic_skills() -> int:
|
|
64
|
+
"""
|
|
65
|
+
Initialize and load dynamic skills from configured sources.
|
|
66
|
+
|
|
67
|
+
This should be called during Control Plane startup, after built-in
|
|
68
|
+
skills have been registered.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
Number of dynamic skills loaded
|
|
72
|
+
|
|
73
|
+
Environment Variables:
|
|
74
|
+
KUBIYA_ENABLE_DYNAMIC_SKILLS: Enable/disable dynamic loading (default: true)
|
|
75
|
+
KUBIYA_SKILLS_TEMPLATES_PATH: Primary skills directory
|
|
76
|
+
KUBIYA_SKILLS_EXTRA_PATHS: Additional paths (colon-separated)
|
|
77
|
+
"""
|
|
78
|
+
if not is_dynamic_skills_enabled():
|
|
79
|
+
logger.info("Dynamic skills loading is disabled")
|
|
80
|
+
return 0
|
|
81
|
+
|
|
82
|
+
logger.info("Initializing dynamic skills...")
|
|
83
|
+
|
|
84
|
+
# Get configured paths
|
|
85
|
+
paths = get_skill_template_paths()
|
|
86
|
+
|
|
87
|
+
if not paths:
|
|
88
|
+
logger.info("No skill template paths configured, skipping dynamic loading")
|
|
89
|
+
return 0
|
|
90
|
+
|
|
91
|
+
# Create filesystem loader
|
|
92
|
+
loaders = [
|
|
93
|
+
FilesystemSkillTemplateLoader(base_paths=paths, enabled=True)
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
# Load from all loaders
|
|
97
|
+
loaded_count = skill_registry.load_from_loaders(loaders)
|
|
98
|
+
|
|
99
|
+
logger.info(f"Dynamic skills initialization complete: {loaded_count} skills loaded")
|
|
100
|
+
return loaded_count
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base classes for skill definitions
|
|
3
|
+
"""
|
|
4
|
+
from typing import Dict, Any, List, Optional, Set
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
import platform
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SkillType(str, Enum):
|
|
12
|
+
"""Supported skill types"""
|
|
13
|
+
FILE_SYSTEM = "file_system"
|
|
14
|
+
SHELL = "shell"
|
|
15
|
+
DOCKER = "docker"
|
|
16
|
+
PYTHON = "python"
|
|
17
|
+
FILE_GENERATION = "file_generation"
|
|
18
|
+
DATA_VISUALIZATION = "data_visualization"
|
|
19
|
+
SLEEP = "sleep"
|
|
20
|
+
WORKFLOW_EXECUTOR = "workflow_executor"
|
|
21
|
+
CONTEXTUAL_AWARENESS = "contextual_awareness"
|
|
22
|
+
KNOWLEDGE_API = "knowledge_api"
|
|
23
|
+
COGNITIVE_MEMORY = "cognitive_memory" # Context graph + semantic memory operations
|
|
24
|
+
CODE_INGESTION = "code_ingestion" # Code repository ingestion and analysis
|
|
25
|
+
AGENT_COMMUNICATION = "agent_communication"
|
|
26
|
+
REMOTE_FILESYSTEM = "remote_filesystem"
|
|
27
|
+
SLACK = "slack"
|
|
28
|
+
CUSTOM = "custom"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class SkillCategory(str, Enum):
|
|
32
|
+
"""Skill categories for organization"""
|
|
33
|
+
COMMON = "common" # Frequently used, safe defaults
|
|
34
|
+
ADVANCED = "advanced" # Advanced features, require more privileges
|
|
35
|
+
SECURITY = "security" # Security-focused, restricted access
|
|
36
|
+
CUSTOM = "custom" # User-defined custom skills
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class SkillRequirements(BaseModel):
|
|
40
|
+
"""Runtime requirements for a skill"""
|
|
41
|
+
# Python packages required (will be checked/installed by worker)
|
|
42
|
+
python_packages: List[str] = Field(default_factory=list)
|
|
43
|
+
|
|
44
|
+
# System packages required (informational, worker should validate)
|
|
45
|
+
system_packages: List[str] = Field(default_factory=list)
|
|
46
|
+
|
|
47
|
+
# Supported operating systems (e.g., ["linux", "darwin", "windows"])
|
|
48
|
+
supported_os: Optional[List[str]] = None
|
|
49
|
+
|
|
50
|
+
# Minimum Python version (e.g., "3.10")
|
|
51
|
+
min_python_version: Optional[str] = None
|
|
52
|
+
|
|
53
|
+
# Environment variables required
|
|
54
|
+
required_env_vars: List[str] = Field(default_factory=list)
|
|
55
|
+
|
|
56
|
+
# External services/APIs required (informational)
|
|
57
|
+
external_dependencies: List[str] = Field(default_factory=list)
|
|
58
|
+
|
|
59
|
+
# Additional notes about requirements
|
|
60
|
+
notes: Optional[str] = None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class SkillVariant(BaseModel):
|
|
64
|
+
"""A specific variant/preset of a skill"""
|
|
65
|
+
id: str
|
|
66
|
+
name: str
|
|
67
|
+
description: str
|
|
68
|
+
category: SkillCategory
|
|
69
|
+
configuration: Dict[str, Any]
|
|
70
|
+
badge: Optional[str] = None # e.g., "Safe", "Recommended", "Advanced"
|
|
71
|
+
icon: Optional[str] = None
|
|
72
|
+
is_default: bool = False
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class SkillDefinition(ABC):
|
|
76
|
+
"""
|
|
77
|
+
Base class for all skill definitions.
|
|
78
|
+
|
|
79
|
+
Each skill type should subclass this and implement the required methods.
|
|
80
|
+
This provides a clean interface for defining new skills.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
@abstractmethod
|
|
85
|
+
def type(self) -> SkillType:
|
|
86
|
+
"""The type identifier for this skill"""
|
|
87
|
+
pass
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
@abstractmethod
|
|
91
|
+
def name(self) -> str:
|
|
92
|
+
"""Human-readable name"""
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
@abstractmethod
|
|
97
|
+
def description(self) -> str:
|
|
98
|
+
"""Description of what this skill does"""
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
@abstractmethod
|
|
103
|
+
def icon(self) -> str:
|
|
104
|
+
"""Icon name (Lucide or React Icons)"""
|
|
105
|
+
pass
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def icon_type(self) -> str:
|
|
109
|
+
"""Icon type: 'lucide' or 'react-icon'"""
|
|
110
|
+
return "lucide"
|
|
111
|
+
|
|
112
|
+
@abstractmethod
|
|
113
|
+
def get_variants(self) -> List[SkillVariant]:
|
|
114
|
+
"""
|
|
115
|
+
Get all predefined variants/presets for this skill.
|
|
116
|
+
|
|
117
|
+
Returns a list of variants with different configurations
|
|
118
|
+
(e.g., "Read Only", "Full Access", "Sandboxed")
|
|
119
|
+
"""
|
|
120
|
+
pass
|
|
121
|
+
|
|
122
|
+
@abstractmethod
|
|
123
|
+
def validate_configuration(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
124
|
+
"""
|
|
125
|
+
Validate and normalize configuration.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
config: Raw configuration dict
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
Validated and normalized configuration
|
|
132
|
+
|
|
133
|
+
Raises:
|
|
134
|
+
ValueError: If configuration is invalid
|
|
135
|
+
"""
|
|
136
|
+
pass
|
|
137
|
+
|
|
138
|
+
@abstractmethod
|
|
139
|
+
def get_default_configuration(self) -> Dict[str, Any]:
|
|
140
|
+
"""Get the default configuration for this skill"""
|
|
141
|
+
pass
|
|
142
|
+
|
|
143
|
+
def get_framework_class_name(self) -> str:
|
|
144
|
+
"""
|
|
145
|
+
Get the underlying framework tool class name.
|
|
146
|
+
This is used for instantiation during agent execution.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Class name (e.g., "FileTools", "ShellTools")
|
|
150
|
+
"""
|
|
151
|
+
# Default mapping based on type
|
|
152
|
+
mapping = {
|
|
153
|
+
SkillType.FILE_SYSTEM: "FileTools",
|
|
154
|
+
SkillType.SHELL: "ShellTools",
|
|
155
|
+
SkillType.DOCKER: "DockerTools",
|
|
156
|
+
SkillType.PYTHON: "PythonTools",
|
|
157
|
+
SkillType.FILE_GENERATION: "FileGenerationTools",
|
|
158
|
+
SkillType.DATA_VISUALIZATION: "DataVisualizationTools",
|
|
159
|
+
SkillType.SLEEP: "SleepTools",
|
|
160
|
+
SkillType.CONTEXTUAL_AWARENESS: "ContextualAwarenessTools",
|
|
161
|
+
SkillType.AGENT_COMMUNICATION: "AgentCommunicationTools",
|
|
162
|
+
SkillType.REMOTE_FILESYSTEM: "RemoteFilesystemTools",
|
|
163
|
+
}
|
|
164
|
+
return mapping.get(self.type, "BaseTool")
|
|
165
|
+
|
|
166
|
+
def get_requirements(self) -> SkillRequirements:
|
|
167
|
+
"""
|
|
168
|
+
Get runtime requirements for this skill.
|
|
169
|
+
|
|
170
|
+
Override this method to specify requirements like:
|
|
171
|
+
- Python packages
|
|
172
|
+
- System packages
|
|
173
|
+
- OS requirements
|
|
174
|
+
- Environment variables
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
SkillRequirements instance
|
|
178
|
+
"""
|
|
179
|
+
# Default: no special requirements
|
|
180
|
+
return SkillRequirements()
|
|
181
|
+
|
|
182
|
+
def check_requirements(self) -> tuple[bool, List[str]]:
|
|
183
|
+
"""
|
|
184
|
+
Check if requirements are met in current environment.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Tuple of (is_satisfied, missing_requirements)
|
|
188
|
+
"""
|
|
189
|
+
requirements = self.get_requirements()
|
|
190
|
+
missing = []
|
|
191
|
+
|
|
192
|
+
# Check OS
|
|
193
|
+
if requirements.supported_os:
|
|
194
|
+
current_os = platform.system().lower()
|
|
195
|
+
if current_os not in requirements.supported_os:
|
|
196
|
+
missing.append(f"OS '{current_os}' not supported (requires: {', '.join(requirements.supported_os)})")
|
|
197
|
+
|
|
198
|
+
# Check Python version
|
|
199
|
+
if requirements.min_python_version:
|
|
200
|
+
import sys
|
|
201
|
+
from packaging import version
|
|
202
|
+
current_version = f"{sys.version_info.major}.{sys.version_info.minor}"
|
|
203
|
+
if version.parse(current_version) < version.parse(requirements.min_python_version):
|
|
204
|
+
missing.append(f"Python {requirements.min_python_version}+ required (current: {current_version})")
|
|
205
|
+
|
|
206
|
+
# Check environment variables
|
|
207
|
+
import os
|
|
208
|
+
for env_var in requirements.required_env_vars:
|
|
209
|
+
if not os.getenv(env_var):
|
|
210
|
+
missing.append(f"Environment variable '{env_var}' not set")
|
|
211
|
+
|
|
212
|
+
# Check Python packages (basic import check)
|
|
213
|
+
for package in requirements.python_packages:
|
|
214
|
+
package_name = package.split('[')[0].split('>=')[0].split('==')[0].strip()
|
|
215
|
+
try:
|
|
216
|
+
__import__(package_name)
|
|
217
|
+
except ImportError:
|
|
218
|
+
missing.append(f"Python package '{package}' not installed")
|
|
219
|
+
|
|
220
|
+
return len(missing) == 0, missing
|
|
221
|
+
|
|
222
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
223
|
+
"""Convert to dictionary representation"""
|
|
224
|
+
requirements = self.get_requirements()
|
|
225
|
+
is_satisfied, missing = self.check_requirements()
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
"type": self.type.value,
|
|
229
|
+
"name": self.name,
|
|
230
|
+
"description": self.description,
|
|
231
|
+
"icon": self.icon,
|
|
232
|
+
"icon_type": self.icon_type,
|
|
233
|
+
"default_configuration": self.get_default_configuration(),
|
|
234
|
+
"variants": [v.model_dump() for v in self.get_variants()],
|
|
235
|
+
"framework_class": self.get_framework_class_name(),
|
|
236
|
+
"requirements": requirements.model_dump(),
|
|
237
|
+
"requirements_satisfied": is_satisfied,
|
|
238
|
+
"missing_requirements": missing,
|
|
239
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Built-in Skills Module
|
|
3
|
+
|
|
4
|
+
Contains all built-in skill definitions that are part of the Control Plane.
|
|
5
|
+
Each skill is in its own dedicated folder with proper structure.
|
|
6
|
+
"""
|
|
7
|
+
from .file_system import FileSystemSkill
|
|
8
|
+
from .shell import ShellSkill
|
|
9
|
+
from .python import PythonSkill
|
|
10
|
+
from .docker import DockerSkill
|
|
11
|
+
from .workflow_executor import WorkflowExecutorSkill
|
|
12
|
+
from .file_generation import FileGenerationSkill
|
|
13
|
+
from .data_visualization import DataVisualizationSkill
|
|
14
|
+
from .contextual_awareness import ContextualAwarenessSkill
|
|
15
|
+
from .knowledge_api import KnowledgeAPISkill
|
|
16
|
+
from .cognitive_memory import CognitiveMemorySkill
|
|
17
|
+
from .code_ingestion import CodeIngestionSkill
|
|
18
|
+
from .agent_communication import AgentCommunicationSkill
|
|
19
|
+
from .remote_filesystem import RemoteFilesystemSkill
|
|
20
|
+
from .slack import SlackSkill
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"FileSystemSkill",
|
|
24
|
+
"ShellSkill",
|
|
25
|
+
"PythonSkill",
|
|
26
|
+
"DockerSkill",
|
|
27
|
+
"WorkflowExecutorSkill",
|
|
28
|
+
"FileGenerationSkill",
|
|
29
|
+
"DataVisualizationSkill",
|
|
30
|
+
"ContextualAwarenessSkill",
|
|
31
|
+
"KnowledgeAPISkill",
|
|
32
|
+
"CognitiveMemorySkill",
|
|
33
|
+
"CodeIngestionSkill",
|
|
34
|
+
"AgentCommunicationSkill",
|
|
35
|
+
"RemoteFilesystemSkill",
|
|
36
|
+
"SlackSkill",
|
|
37
|
+
]
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent Communication Skill
|
|
3
|
+
|
|
4
|
+
Provides agent-to-agent and agent-to-team communication capabilities.
|
|
5
|
+
"""
|
|
6
|
+
from typing import Dict, Any, List, Union, Literal, Optional
|
|
7
|
+
from pydantic import BaseModel, Field, validator
|
|
8
|
+
from control_plane_api.app.skills.base import SkillDefinition, SkillType, SkillCategory, SkillVariant
|
|
9
|
+
from control_plane_api.app.skills.registry import register_skill
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AgentCommunicationConfiguration(BaseModel):
|
|
13
|
+
"""Configuration for Agent Communication Skill"""
|
|
14
|
+
|
|
15
|
+
allowed_operations: List[Literal[
|
|
16
|
+
"execute_agent",
|
|
17
|
+
"execute_team",
|
|
18
|
+
"followup_execution",
|
|
19
|
+
"get_execution_status"
|
|
20
|
+
]] = Field(
|
|
21
|
+
default=["get_execution_status"],
|
|
22
|
+
description="List of allowed tool operations"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
allowed_agents: Union[List[str], Literal["*"]] = Field(
|
|
26
|
+
default=[],
|
|
27
|
+
description="List of agent IDs that can be called, or '*' for all"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
allowed_teams: Union[List[str], Literal["*"]] = Field(
|
|
31
|
+
default=[],
|
|
32
|
+
description="List of team IDs that can be called, or '*' for all"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
max_execution_depth: int = Field(
|
|
36
|
+
default=2,
|
|
37
|
+
ge=0,
|
|
38
|
+
le=10,
|
|
39
|
+
description="Maximum nesting depth for child executions (0 = monitoring only)"
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
timeout: int = Field(
|
|
43
|
+
default=300,
|
|
44
|
+
ge=30,
|
|
45
|
+
le=3600,
|
|
46
|
+
description="Maximum wait time for child execution in seconds"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
wait_for_completion: bool = Field(
|
|
50
|
+
default=True,
|
|
51
|
+
description="Whether to wait for child execution to complete (sync vs async)"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
inherit_context: bool = Field(
|
|
55
|
+
default=True,
|
|
56
|
+
description="Whether to pass parent execution context to child"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
max_concurrent_calls: int = Field(
|
|
60
|
+
default=3,
|
|
61
|
+
ge=1,
|
|
62
|
+
le=20,
|
|
63
|
+
description="Maximum number of concurrent child executions"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
allow_session_continuation: bool = Field(
|
|
67
|
+
default=True,
|
|
68
|
+
description="Allow following up on existing sessions"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
streaming_enabled: bool = Field(
|
|
72
|
+
default=True,
|
|
73
|
+
description="Stream child execution events to parent"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@validator('allowed_agents', 'allowed_teams')
|
|
77
|
+
def validate_allowed_entities(cls, v):
|
|
78
|
+
"""Validate allowed entities format"""
|
|
79
|
+
if v == "*":
|
|
80
|
+
return v
|
|
81
|
+
if not isinstance(v, list):
|
|
82
|
+
raise ValueError("Must be a list of IDs or '*'")
|
|
83
|
+
return v
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class AgentCommunicationSkill(SkillDefinition):
|
|
87
|
+
"""Agent communication skill - orchestrate hierarchical agent execution"""
|
|
88
|
+
|
|
89
|
+
@property
|
|
90
|
+
def type(self) -> SkillType:
|
|
91
|
+
return SkillType.AGENT_COMMUNICATION
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def name(self) -> str:
|
|
95
|
+
return "Agent Communication"
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def description(self) -> str:
|
|
99
|
+
return "Enable agents to call other agents or teams, creating hierarchical execution workflows"
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def icon(self) -> str:
|
|
103
|
+
return "Network"
|
|
104
|
+
|
|
105
|
+
def get_variants(self) -> List[SkillVariant]:
|
|
106
|
+
return [
|
|
107
|
+
SkillVariant(
|
|
108
|
+
id="agent_communication_read_only",
|
|
109
|
+
name="Agent Communication - Read Only",
|
|
110
|
+
description="Monitor execution status only. Cannot initiate agent calls. Safe for observability.",
|
|
111
|
+
category=SkillCategory.COMMON,
|
|
112
|
+
badge="Safe",
|
|
113
|
+
icon="Eye",
|
|
114
|
+
configuration={
|
|
115
|
+
"allowed_operations": ["get_execution_status"],
|
|
116
|
+
"allowed_agents": [],
|
|
117
|
+
"allowed_teams": [],
|
|
118
|
+
"max_execution_depth": 0,
|
|
119
|
+
"timeout": 30,
|
|
120
|
+
"wait_for_completion": False,
|
|
121
|
+
"inherit_context": True,
|
|
122
|
+
"max_concurrent_calls": 1,
|
|
123
|
+
"allow_session_continuation": False,
|
|
124
|
+
"streaming_enabled": True,
|
|
125
|
+
},
|
|
126
|
+
is_default=False,
|
|
127
|
+
),
|
|
128
|
+
SkillVariant(
|
|
129
|
+
id="agent_communication_limited",
|
|
130
|
+
name="Agent Communication - Limited",
|
|
131
|
+
description="Call specific approved agents and teams with safeguards. Recommended for most use cases.",
|
|
132
|
+
category=SkillCategory.COMMON,
|
|
133
|
+
badge="Recommended",
|
|
134
|
+
icon="Network",
|
|
135
|
+
configuration={
|
|
136
|
+
"allowed_operations": ["execute_agent", "execute_team", "followup_execution", "get_execution_status"],
|
|
137
|
+
"allowed_agents": [], # Must be explicitly configured
|
|
138
|
+
"allowed_teams": [], # Must be explicitly configured
|
|
139
|
+
"max_execution_depth": 2,
|
|
140
|
+
"timeout": 300,
|
|
141
|
+
"wait_for_completion": True,
|
|
142
|
+
"inherit_context": True,
|
|
143
|
+
"max_concurrent_calls": 3,
|
|
144
|
+
"allow_session_continuation": True,
|
|
145
|
+
"streaming_enabled": True,
|
|
146
|
+
},
|
|
147
|
+
is_default=True,
|
|
148
|
+
),
|
|
149
|
+
SkillVariant(
|
|
150
|
+
id="agent_communication_full",
|
|
151
|
+
name="Agent Communication - Full Orchestration",
|
|
152
|
+
description="Unrestricted agent orchestration for complex workflows. Advanced use cases only.",
|
|
153
|
+
category=SkillCategory.ADVANCED,
|
|
154
|
+
badge="Advanced",
|
|
155
|
+
icon="Workflow",
|
|
156
|
+
configuration={
|
|
157
|
+
"allowed_operations": ["execute_agent", "execute_team", "followup_execution", "get_execution_status"],
|
|
158
|
+
"allowed_agents": "*",
|
|
159
|
+
"allowed_teams": "*",
|
|
160
|
+
"max_execution_depth": 5,
|
|
161
|
+
"timeout": 600,
|
|
162
|
+
"wait_for_completion": True,
|
|
163
|
+
"inherit_context": True,
|
|
164
|
+
"max_concurrent_calls": 10,
|
|
165
|
+
"allow_session_continuation": True,
|
|
166
|
+
"streaming_enabled": True,
|
|
167
|
+
},
|
|
168
|
+
is_default=False,
|
|
169
|
+
),
|
|
170
|
+
]
|
|
171
|
+
|
|
172
|
+
def validate_configuration(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
|
173
|
+
"""Validate agent communication configuration"""
|
|
174
|
+
try:
|
|
175
|
+
# Validate using Pydantic model
|
|
176
|
+
validated_config = AgentCommunicationConfiguration(**config)
|
|
177
|
+
return validated_config.dict()
|
|
178
|
+
except Exception as e:
|
|
179
|
+
# Fallback to manual validation
|
|
180
|
+
validated = {}
|
|
181
|
+
|
|
182
|
+
# allowed_operations
|
|
183
|
+
allowed_ops = config.get("allowed_operations", ["get_execution_status"])
|
|
184
|
+
if not isinstance(allowed_ops, list):
|
|
185
|
+
allowed_ops = ["get_execution_status"]
|
|
186
|
+
validated["allowed_operations"] = allowed_ops
|
|
187
|
+
|
|
188
|
+
# allowed_agents
|
|
189
|
+
allowed_agents = config.get("allowed_agents", [])
|
|
190
|
+
if allowed_agents == "*":
|
|
191
|
+
validated["allowed_agents"] = "*"
|
|
192
|
+
elif isinstance(allowed_agents, list):
|
|
193
|
+
validated["allowed_agents"] = allowed_agents
|
|
194
|
+
else:
|
|
195
|
+
validated["allowed_agents"] = []
|
|
196
|
+
|
|
197
|
+
# allowed_teams
|
|
198
|
+
allowed_teams = config.get("allowed_teams", [])
|
|
199
|
+
if allowed_teams == "*":
|
|
200
|
+
validated["allowed_teams"] = "*"
|
|
201
|
+
elif isinstance(allowed_teams, list):
|
|
202
|
+
validated["allowed_teams"] = allowed_teams
|
|
203
|
+
else:
|
|
204
|
+
validated["allowed_teams"] = []
|
|
205
|
+
|
|
206
|
+
# max_execution_depth
|
|
207
|
+
validated["max_execution_depth"] = max(0, min(10, config.get("max_execution_depth", 2)))
|
|
208
|
+
|
|
209
|
+
# timeout
|
|
210
|
+
validated["timeout"] = max(30, min(3600, config.get("timeout", 300)))
|
|
211
|
+
|
|
212
|
+
# wait_for_completion
|
|
213
|
+
validated["wait_for_completion"] = bool(config.get("wait_for_completion", True))
|
|
214
|
+
|
|
215
|
+
# inherit_context
|
|
216
|
+
validated["inherit_context"] = bool(config.get("inherit_context", True))
|
|
217
|
+
|
|
218
|
+
# max_concurrent_calls
|
|
219
|
+
validated["max_concurrent_calls"] = max(1, min(20, config.get("max_concurrent_calls", 3)))
|
|
220
|
+
|
|
221
|
+
# allow_session_continuation
|
|
222
|
+
validated["allow_session_continuation"] = bool(config.get("allow_session_continuation", True))
|
|
223
|
+
|
|
224
|
+
# streaming_enabled
|
|
225
|
+
validated["streaming_enabled"] = bool(config.get("streaming_enabled", True))
|
|
226
|
+
|
|
227
|
+
return validated
|
|
228
|
+
|
|
229
|
+
def get_default_configuration(self) -> Dict[str, Any]:
|
|
230
|
+
"""Default: limited agent calling with safeguards"""
|
|
231
|
+
return {
|
|
232
|
+
"allowed_operations": ["execute_agent", "execute_team", "followup_execution", "get_execution_status"],
|
|
233
|
+
"allowed_agents": [],
|
|
234
|
+
"allowed_teams": [],
|
|
235
|
+
"max_execution_depth": 2,
|
|
236
|
+
"timeout": 300,
|
|
237
|
+
"wait_for_completion": True,
|
|
238
|
+
"inherit_context": True,
|
|
239
|
+
"max_concurrent_calls": 3,
|
|
240
|
+
"allow_session_continuation": True,
|
|
241
|
+
"streaming_enabled": True,
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
# Auto-register this skill
|
|
246
|
+
register_skill(AgentCommunicationSkill())
|