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,396 @@
|
|
|
1
|
+
"""Unit tests for built-in skill auto-loading mechanism."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from unittest.mock import Mock, patch, MagicMock
|
|
5
|
+
|
|
6
|
+
# Add worker to sys.path
|
|
7
|
+
import sys
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
sys.path.insert(0, str(Path(__file__).parent.parent.parent))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TestBuiltinSkillAutoLoadAgentExecutor:
|
|
13
|
+
"""Test auto-loading of built-in skills in AgentExecutorV2"""
|
|
14
|
+
|
|
15
|
+
@pytest.fixture
|
|
16
|
+
def mock_control_plane(self):
|
|
17
|
+
"""Mock control plane client"""
|
|
18
|
+
mock_cp = Mock()
|
|
19
|
+
mock_cp.get_skills.return_value = [
|
|
20
|
+
{"name": "shell", "type": "shell", "enabled": True, "configuration": {}}
|
|
21
|
+
]
|
|
22
|
+
return mock_cp
|
|
23
|
+
|
|
24
|
+
@pytest.fixture
|
|
25
|
+
def mock_runtime(self):
|
|
26
|
+
"""Mock runtime"""
|
|
27
|
+
mock_rt = Mock()
|
|
28
|
+
mock_rt.supports_tools.return_value = True
|
|
29
|
+
return mock_rt
|
|
30
|
+
|
|
31
|
+
@patch('services.agent_executor_v2.SkillFactory')
|
|
32
|
+
def test_context_graph_search_added_to_existing_skills(self, mock_factory_class, mock_control_plane):
|
|
33
|
+
"""Test that context_graph_search is added when other skills exist"""
|
|
34
|
+
from services.agent_executor_v2 import AgentExecutorV2
|
|
35
|
+
|
|
36
|
+
# Setup mock factory
|
|
37
|
+
mock_factory = Mock()
|
|
38
|
+
mock_factory.create_skills_from_list.return_value = []
|
|
39
|
+
mock_factory_class.return_value = mock_factory
|
|
40
|
+
|
|
41
|
+
# Execute the skill loading code
|
|
42
|
+
executor = AgentExecutorV2()
|
|
43
|
+
executor.control_plane = mock_control_plane
|
|
44
|
+
|
|
45
|
+
# Simulate the skill loading logic from agent_executor_v2.py
|
|
46
|
+
skill_configs = mock_control_plane.get_skills("test_agent_id")
|
|
47
|
+
|
|
48
|
+
# Apply the auto-loading logic
|
|
49
|
+
builtin_skill_types = {'context_graph_search'}
|
|
50
|
+
existing_skill_types = {cfg.get('type') for cfg in skill_configs}
|
|
51
|
+
|
|
52
|
+
for builtin_type in builtin_skill_types:
|
|
53
|
+
if builtin_type not in existing_skill_types:
|
|
54
|
+
builtin_config = {
|
|
55
|
+
'name': builtin_type,
|
|
56
|
+
'type': builtin_type,
|
|
57
|
+
'enabled': True,
|
|
58
|
+
'configuration': {}
|
|
59
|
+
}
|
|
60
|
+
skill_configs.append(builtin_config)
|
|
61
|
+
|
|
62
|
+
# Verify context_graph_search was added
|
|
63
|
+
skill_types = [cfg['type'] for cfg in skill_configs]
|
|
64
|
+
assert 'context_graph_search' in skill_types
|
|
65
|
+
assert 'shell' in skill_types # Original skill still present
|
|
66
|
+
assert len(skill_configs) == 2
|
|
67
|
+
|
|
68
|
+
@patch('services.agent_executor_v2.SkillFactory')
|
|
69
|
+
def test_context_graph_search_not_duplicated(self, mock_factory_class, mock_control_plane):
|
|
70
|
+
"""Test that context_graph_search is not added if already present"""
|
|
71
|
+
from services.agent_executor_v2 import AgentExecutorV2
|
|
72
|
+
|
|
73
|
+
# Mock control plane to return context_graph_search already
|
|
74
|
+
mock_control_plane.get_skills.return_value = [
|
|
75
|
+
{"name": "shell", "type": "shell", "enabled": True, "configuration": {}},
|
|
76
|
+
{"name": "context_graph_search", "type": "context_graph_search", "enabled": True, "configuration": {}}
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
executor = AgentExecutorV2()
|
|
80
|
+
executor.control_plane = mock_control_plane
|
|
81
|
+
|
|
82
|
+
# Simulate the skill loading logic
|
|
83
|
+
skill_configs = mock_control_plane.get_skills("test_agent_id")
|
|
84
|
+
|
|
85
|
+
# Apply the auto-loading logic
|
|
86
|
+
builtin_skill_types = {'context_graph_search'}
|
|
87
|
+
existing_skill_types = {cfg.get('type') for cfg in skill_configs}
|
|
88
|
+
|
|
89
|
+
initial_count = len(skill_configs)
|
|
90
|
+
|
|
91
|
+
for builtin_type in builtin_skill_types:
|
|
92
|
+
if builtin_type not in existing_skill_types:
|
|
93
|
+
builtin_config = {
|
|
94
|
+
'name': builtin_type,
|
|
95
|
+
'type': builtin_type,
|
|
96
|
+
'enabled': True,
|
|
97
|
+
'configuration': {}
|
|
98
|
+
}
|
|
99
|
+
skill_configs.append(builtin_config)
|
|
100
|
+
|
|
101
|
+
# Verify no duplication
|
|
102
|
+
assert len(skill_configs) == initial_count
|
|
103
|
+
skill_types = [cfg['type'] for cfg in skill_configs]
|
|
104
|
+
assert skill_types.count('context_graph_search') == 1
|
|
105
|
+
|
|
106
|
+
@patch('services.agent_executor_v2.SkillFactory')
|
|
107
|
+
def test_context_graph_search_added_when_no_skills(self, mock_factory_class):
|
|
108
|
+
"""Test that context_graph_search is added even when no other skills exist"""
|
|
109
|
+
from services.agent_executor_v2 import AgentExecutorV2
|
|
110
|
+
|
|
111
|
+
# Mock control plane to return empty skills
|
|
112
|
+
mock_cp = Mock()
|
|
113
|
+
mock_cp.get_skills.return_value = None
|
|
114
|
+
|
|
115
|
+
executor = AgentExecutorV2()
|
|
116
|
+
executor.control_plane = mock_cp
|
|
117
|
+
|
|
118
|
+
# Simulate the "else" branch where no skills are found
|
|
119
|
+
skill_configs = []
|
|
120
|
+
builtin_skill_types = {'context_graph_search'}
|
|
121
|
+
|
|
122
|
+
for builtin_type in builtin_skill_types:
|
|
123
|
+
builtin_config = {
|
|
124
|
+
'name': builtin_type,
|
|
125
|
+
'type': builtin_type,
|
|
126
|
+
'enabled': True,
|
|
127
|
+
'configuration': {}
|
|
128
|
+
}
|
|
129
|
+
skill_configs.append(builtin_config)
|
|
130
|
+
|
|
131
|
+
# Verify context_graph_search was added
|
|
132
|
+
assert len(skill_configs) == 1
|
|
133
|
+
assert skill_configs[0]['type'] == 'context_graph_search'
|
|
134
|
+
assert skill_configs[0]['enabled'] is True
|
|
135
|
+
|
|
136
|
+
def test_builtin_skill_config_structure(self):
|
|
137
|
+
"""Test that built-in skill config has correct structure"""
|
|
138
|
+
builtin_config = {
|
|
139
|
+
'name': 'context_graph_search',
|
|
140
|
+
'type': 'context_graph_search',
|
|
141
|
+
'enabled': True,
|
|
142
|
+
'configuration': {}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
# Verify structure matches what SkillFactory expects
|
|
146
|
+
assert 'name' in builtin_config
|
|
147
|
+
assert 'type' in builtin_config
|
|
148
|
+
assert 'enabled' in builtin_config
|
|
149
|
+
assert 'configuration' in builtin_config
|
|
150
|
+
assert isinstance(builtin_config['configuration'], dict)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class TestBuiltinSkillAutoLoadTeamExecutor:
|
|
154
|
+
"""Test auto-loading of built-in skills in TeamExecutorV2"""
|
|
155
|
+
|
|
156
|
+
@pytest.fixture
|
|
157
|
+
def mock_control_plane(self):
|
|
158
|
+
"""Mock control plane client"""
|
|
159
|
+
mock_cp = Mock()
|
|
160
|
+
mock_cp.get_skills.return_value = [
|
|
161
|
+
{"name": "shell", "type": "shell", "enabled": True, "configuration": {}}
|
|
162
|
+
]
|
|
163
|
+
return mock_cp
|
|
164
|
+
|
|
165
|
+
@patch('services.team_executor_v2.SkillFactory')
|
|
166
|
+
def test_team_executor_adds_context_graph_search(self, mock_factory_class, mock_control_plane):
|
|
167
|
+
"""Test that TeamExecutorV2 also adds context_graph_search"""
|
|
168
|
+
from services.team_executor_v2 import TeamExecutorV2
|
|
169
|
+
|
|
170
|
+
# Setup mock factory
|
|
171
|
+
mock_factory = Mock()
|
|
172
|
+
mock_factory.create_skills_from_list.return_value = []
|
|
173
|
+
mock_factory_class.return_value = mock_factory
|
|
174
|
+
|
|
175
|
+
executor = TeamExecutorV2()
|
|
176
|
+
executor.control_plane = mock_control_plane
|
|
177
|
+
|
|
178
|
+
# Simulate team executor skill loading
|
|
179
|
+
skill_configs = mock_control_plane.get_skills("leader_agent_id")
|
|
180
|
+
|
|
181
|
+
# Apply the auto-loading logic (same as agent executor)
|
|
182
|
+
builtin_skill_types = {'context_graph_search'}
|
|
183
|
+
existing_skill_types = {cfg.get('type') for cfg in skill_configs}
|
|
184
|
+
|
|
185
|
+
for builtin_type in builtin_skill_types:
|
|
186
|
+
if builtin_type not in existing_skill_types:
|
|
187
|
+
builtin_config = {
|
|
188
|
+
'name': builtin_type,
|
|
189
|
+
'type': builtin_type,
|
|
190
|
+
'enabled': True,
|
|
191
|
+
'configuration': {}
|
|
192
|
+
}
|
|
193
|
+
skill_configs.append(builtin_config)
|
|
194
|
+
|
|
195
|
+
# Verify
|
|
196
|
+
skill_types = [cfg['type'] for cfg in skill_configs]
|
|
197
|
+
assert 'context_graph_search' in skill_types
|
|
198
|
+
|
|
199
|
+
@patch('services.team_executor_v2.SkillFactory')
|
|
200
|
+
def test_team_executor_handles_empty_skills(self, mock_factory_class):
|
|
201
|
+
"""Test TeamExecutorV2 handles empty skill list"""
|
|
202
|
+
from services.team_executor_v2 import TeamExecutorV2
|
|
203
|
+
|
|
204
|
+
mock_cp = Mock()
|
|
205
|
+
mock_cp.get_skills.return_value = None
|
|
206
|
+
|
|
207
|
+
executor = TeamExecutorV2()
|
|
208
|
+
executor.control_plane = mock_cp
|
|
209
|
+
|
|
210
|
+
# Simulate empty skills scenario
|
|
211
|
+
skill_configs = []
|
|
212
|
+
builtin_skill_types = {'context_graph_search'}
|
|
213
|
+
|
|
214
|
+
for builtin_type in builtin_skill_types:
|
|
215
|
+
builtin_config = {
|
|
216
|
+
'name': builtin_type,
|
|
217
|
+
'type': builtin_type,
|
|
218
|
+
'enabled': True,
|
|
219
|
+
'configuration': {}
|
|
220
|
+
}
|
|
221
|
+
skill_configs.append(builtin_config)
|
|
222
|
+
|
|
223
|
+
# Verify context_graph_search was added
|
|
224
|
+
assert len(skill_configs) == 1
|
|
225
|
+
assert skill_configs[0]['type'] == 'context_graph_search'
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class TestBuiltinSkillSetExtensibility:
|
|
229
|
+
"""Test that the builtin skill set is extensible"""
|
|
230
|
+
|
|
231
|
+
def test_multiple_builtin_skills_can_be_added(self):
|
|
232
|
+
"""Test that multiple built-in skills can be configured"""
|
|
233
|
+
# Define multiple built-in skills
|
|
234
|
+
builtin_skill_types = {'context_graph_search', 'hypothetical_new_skill'}
|
|
235
|
+
|
|
236
|
+
# Existing skills from agent
|
|
237
|
+
existing_skills = [
|
|
238
|
+
{"name": "shell", "type": "shell", "enabled": True, "configuration": {}}
|
|
239
|
+
]
|
|
240
|
+
|
|
241
|
+
existing_skill_types = {cfg.get('type') for cfg in existing_skills}
|
|
242
|
+
|
|
243
|
+
# Apply auto-loading for all built-in skills
|
|
244
|
+
for builtin_type in builtin_skill_types:
|
|
245
|
+
if builtin_type not in existing_skill_types:
|
|
246
|
+
builtin_config = {
|
|
247
|
+
'name': builtin_type,
|
|
248
|
+
'type': builtin_type,
|
|
249
|
+
'enabled': True,
|
|
250
|
+
'configuration': {}
|
|
251
|
+
}
|
|
252
|
+
existing_skills.append(builtin_config)
|
|
253
|
+
|
|
254
|
+
# Verify both built-in skills were added
|
|
255
|
+
skill_types = [cfg['type'] for cfg in existing_skills]
|
|
256
|
+
assert 'context_graph_search' in skill_types
|
|
257
|
+
assert 'hypothetical_new_skill' in skill_types
|
|
258
|
+
assert 'shell' in skill_types
|
|
259
|
+
assert len(existing_skills) == 3
|
|
260
|
+
|
|
261
|
+
def test_builtin_skill_types_is_a_set(self):
|
|
262
|
+
"""Test that builtin_skill_types is defined as a set"""
|
|
263
|
+
builtin_skill_types = {'context_graph_search'}
|
|
264
|
+
|
|
265
|
+
assert isinstance(builtin_skill_types, set)
|
|
266
|
+
assert 'context_graph_search' in builtin_skill_types
|
|
267
|
+
|
|
268
|
+
def test_adding_builtin_skill_preserves_original_skills(self):
|
|
269
|
+
"""Test that adding built-in skills doesn't modify original skill configs"""
|
|
270
|
+
original_skills = [
|
|
271
|
+
{"name": "shell", "type": "shell", "enabled": True, "configuration": {"timeout": 30}},
|
|
272
|
+
{"name": "python", "type": "python", "enabled": False, "configuration": {}}
|
|
273
|
+
]
|
|
274
|
+
|
|
275
|
+
skill_configs = original_skills.copy()
|
|
276
|
+
builtin_skill_types = {'context_graph_search'}
|
|
277
|
+
existing_skill_types = {cfg.get('type') for cfg in skill_configs}
|
|
278
|
+
|
|
279
|
+
for builtin_type in builtin_skill_types:
|
|
280
|
+
if builtin_type not in existing_skill_types:
|
|
281
|
+
builtin_config = {
|
|
282
|
+
'name': builtin_type,
|
|
283
|
+
'type': builtin_type,
|
|
284
|
+
'enabled': True,
|
|
285
|
+
'configuration': {}
|
|
286
|
+
}
|
|
287
|
+
skill_configs.append(builtin_config)
|
|
288
|
+
|
|
289
|
+
# Verify original skills unchanged
|
|
290
|
+
assert skill_configs[0] == original_skills[0]
|
|
291
|
+
assert skill_configs[1] == original_skills[1]
|
|
292
|
+
# Verify new skill added
|
|
293
|
+
assert skill_configs[2]['type'] == 'context_graph_search'
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
class TestBuiltinSkillConfiguration:
|
|
297
|
+
"""Test built-in skill configuration options"""
|
|
298
|
+
|
|
299
|
+
def test_builtin_skill_default_configuration(self):
|
|
300
|
+
"""Test that built-in skills have empty default configuration"""
|
|
301
|
+
builtin_config = {
|
|
302
|
+
'name': 'context_graph_search',
|
|
303
|
+
'type': 'context_graph_search',
|
|
304
|
+
'enabled': True,
|
|
305
|
+
'configuration': {}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
assert builtin_config['configuration'] == {}
|
|
309
|
+
|
|
310
|
+
def test_builtin_skill_can_have_custom_configuration(self):
|
|
311
|
+
"""Test that built-in skills can accept custom configuration"""
|
|
312
|
+
builtin_config = {
|
|
313
|
+
'name': 'context_graph_search',
|
|
314
|
+
'type': 'context_graph_search',
|
|
315
|
+
'enabled': True,
|
|
316
|
+
'configuration': {
|
|
317
|
+
'timeout': 60,
|
|
318
|
+
'default_limit': 50
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
assert builtin_config['configuration']['timeout'] == 60
|
|
323
|
+
assert builtin_config['configuration']['default_limit'] == 50
|
|
324
|
+
|
|
325
|
+
def test_builtin_skills_always_enabled(self):
|
|
326
|
+
"""Test that built-in skills are always enabled by default"""
|
|
327
|
+
builtin_skill_types = {'context_graph_search'}
|
|
328
|
+
|
|
329
|
+
for builtin_type in builtin_skill_types:
|
|
330
|
+
builtin_config = {
|
|
331
|
+
'name': builtin_type,
|
|
332
|
+
'type': builtin_type,
|
|
333
|
+
'enabled': True,
|
|
334
|
+
'configuration': {}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
assert builtin_config['enabled'] is True
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
class TestSkillLoadingOrder:
|
|
341
|
+
"""Test skill loading order and priority"""
|
|
342
|
+
|
|
343
|
+
def test_builtin_skills_loaded_after_agent_skills(self):
|
|
344
|
+
"""Test that built-in skills are added after agent-specific skills"""
|
|
345
|
+
agent_skills = [
|
|
346
|
+
{"name": "shell", "type": "shell", "enabled": True, "configuration": {}},
|
|
347
|
+
{"name": "python", "type": "python", "enabled": True, "configuration": {}}
|
|
348
|
+
]
|
|
349
|
+
|
|
350
|
+
skill_configs = agent_skills.copy()
|
|
351
|
+
builtin_skill_types = {'context_graph_search'}
|
|
352
|
+
existing_skill_types = {cfg.get('type') for cfg in skill_configs}
|
|
353
|
+
|
|
354
|
+
for builtin_type in builtin_skill_types:
|
|
355
|
+
if builtin_type not in existing_skill_types:
|
|
356
|
+
builtin_config = {
|
|
357
|
+
'name': builtin_type,
|
|
358
|
+
'type': builtin_type,
|
|
359
|
+
'enabled': True,
|
|
360
|
+
'configuration': {}
|
|
361
|
+
}
|
|
362
|
+
skill_configs.append(builtin_config)
|
|
363
|
+
|
|
364
|
+
# Verify order: agent skills first, then built-in
|
|
365
|
+
assert skill_configs[0]['type'] == 'shell'
|
|
366
|
+
assert skill_configs[1]['type'] == 'python'
|
|
367
|
+
assert skill_configs[2]['type'] == 'context_graph_search'
|
|
368
|
+
|
|
369
|
+
def test_agent_configured_builtin_takes_precedence(self):
|
|
370
|
+
"""Test that if agent has configured a built-in skill, that config is used"""
|
|
371
|
+
agent_skills = [
|
|
372
|
+
{"name": "shell", "type": "shell", "enabled": True, "configuration": {}},
|
|
373
|
+
{"name": "context_graph_search", "type": "context_graph_search", "enabled": True,
|
|
374
|
+
"configuration": {"timeout": 120}}
|
|
375
|
+
]
|
|
376
|
+
|
|
377
|
+
skill_configs = agent_skills.copy()
|
|
378
|
+
builtin_skill_types = {'context_graph_search'}
|
|
379
|
+
existing_skill_types = {cfg.get('type') for cfg in skill_configs}
|
|
380
|
+
|
|
381
|
+
initial_count = len(skill_configs)
|
|
382
|
+
|
|
383
|
+
for builtin_type in builtin_skill_types:
|
|
384
|
+
if builtin_type not in existing_skill_types:
|
|
385
|
+
builtin_config = {
|
|
386
|
+
'name': builtin_type,
|
|
387
|
+
'type': builtin_type,
|
|
388
|
+
'enabled': True,
|
|
389
|
+
'configuration': {}
|
|
390
|
+
}
|
|
391
|
+
skill_configs.append(builtin_config)
|
|
392
|
+
|
|
393
|
+
# Verify no duplication and custom config preserved
|
|
394
|
+
assert len(skill_configs) == initial_count
|
|
395
|
+
context_graph_skill = next(s for s in skill_configs if s['type'] == 'context_graph_search')
|
|
396
|
+
assert context_graph_skill['configuration']['timeout'] == 120
|