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,63 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Skills Configuration
|
|
3
|
+
|
|
4
|
+
Environment variable based configuration for dynamic skill loading.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import List
|
|
10
|
+
import logging
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_skill_template_paths() -> List[str]:
|
|
16
|
+
"""
|
|
17
|
+
Get skill template paths from environment variables.
|
|
18
|
+
|
|
19
|
+
Environment Variables:
|
|
20
|
+
KUBIYA_SKILLS_TEMPLATES_PATH: Primary skills template directory
|
|
21
|
+
KUBIYA_SKILLS_EXTRA_PATHS: Additional paths (colon-separated on Unix, semicolon on Windows)
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
List of paths to search for skill templates
|
|
25
|
+
"""
|
|
26
|
+
paths = []
|
|
27
|
+
|
|
28
|
+
# Primary path from environment
|
|
29
|
+
primary_path = os.getenv("KUBIYA_SKILLS_TEMPLATES_PATH")
|
|
30
|
+
if primary_path:
|
|
31
|
+
paths.append(primary_path)
|
|
32
|
+
|
|
33
|
+
# Extra paths (colon-separated on Unix, semicolon on Windows)
|
|
34
|
+
extra_paths_str = os.getenv("KUBIYA_SKILLS_EXTRA_PATHS", "")
|
|
35
|
+
separator = ";" if os.name == "nt" else ":"
|
|
36
|
+
extra_paths = [p.strip() for p in extra_paths_str.split(separator) if p.strip()]
|
|
37
|
+
paths.extend(extra_paths)
|
|
38
|
+
|
|
39
|
+
# Default: ~/.kubiya/skills if nothing configured
|
|
40
|
+
if not paths:
|
|
41
|
+
default_path = Path.home() / ".kubiya" / "skills"
|
|
42
|
+
if default_path.exists():
|
|
43
|
+
paths.append(str(default_path))
|
|
44
|
+
|
|
45
|
+
logger.info(f"Skill template paths configured: {paths}")
|
|
46
|
+
return paths
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def is_dynamic_skills_enabled() -> bool:
|
|
50
|
+
"""
|
|
51
|
+
Check if dynamic skill loading is enabled.
|
|
52
|
+
|
|
53
|
+
Environment Variable:
|
|
54
|
+
KUBIYA_ENABLE_DYNAMIC_SKILLS: Set to 'true', '1', or 'yes' to enable
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
True if dynamic skills are enabled
|
|
58
|
+
"""
|
|
59
|
+
enabled_str = os.getenv("KUBIYA_ENABLE_DYNAMIC_SKILLS", "true").lower()
|
|
60
|
+
enabled = enabled_str in ("true", "1", "yes")
|
|
61
|
+
|
|
62
|
+
logger.info(f"Dynamic skills loading enabled: {enabled}")
|
|
63
|
+
return enabled
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Skill Template Loaders
|
|
3
|
+
|
|
4
|
+
Loaders for discovering and loading skill templates from various sources.
|
|
5
|
+
Control Plane uses these to dynamically discover available skills.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .base import BaseSkillTemplateLoader
|
|
9
|
+
from .filesystem_loader import FilesystemSkillTemplateLoader
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"BaseSkillTemplateLoader",
|
|
13
|
+
"FilesystemSkillTemplateLoader",
|
|
14
|
+
]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base Skill Template Loader
|
|
3
|
+
|
|
4
|
+
Abstract interface for all skill template loaders.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from typing import List
|
|
9
|
+
import logging
|
|
10
|
+
|
|
11
|
+
from control_plane_api.app.skills.base import SkillDefinition
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class BaseSkillTemplateLoader(ABC):
|
|
17
|
+
"""
|
|
18
|
+
Abstract base class for skill template loaders.
|
|
19
|
+
|
|
20
|
+
Loaders discover skill templates from various sources and return
|
|
21
|
+
SkillDefinition instances that can be registered in the skill registry.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, enabled: bool = True):
|
|
25
|
+
"""
|
|
26
|
+
Initialize loader.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
enabled: Whether this loader is enabled
|
|
30
|
+
"""
|
|
31
|
+
self.enabled = enabled
|
|
32
|
+
self.logger = logger
|
|
33
|
+
|
|
34
|
+
@abstractmethod
|
|
35
|
+
def discover(self) -> List[SkillDefinition]:
|
|
36
|
+
"""
|
|
37
|
+
Discover skill templates from this source.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
List of SkillDefinition instances
|
|
41
|
+
|
|
42
|
+
Raises:
|
|
43
|
+
Exception: If discovery fails
|
|
44
|
+
"""
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
def get_source_name(self) -> str:
|
|
48
|
+
"""
|
|
49
|
+
Get the name of this loader source.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Source name for logging
|
|
53
|
+
"""
|
|
54
|
+
return self.__class__.__name__
|
|
55
|
+
|
|
56
|
+
def is_enabled(self) -> bool:
|
|
57
|
+
"""
|
|
58
|
+
Check if this loader is enabled.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
True if enabled
|
|
62
|
+
"""
|
|
63
|
+
return self.enabled
|
|
64
|
+
|
|
65
|
+
def enable(self) -> None:
|
|
66
|
+
"""Enable this loader."""
|
|
67
|
+
self.enabled = True
|
|
68
|
+
self.logger.info(f"{self.get_source_name()} enabled")
|
|
69
|
+
|
|
70
|
+
def disable(self) -> None:
|
|
71
|
+
"""Disable this loader."""
|
|
72
|
+
self.enabled = False
|
|
73
|
+
self.logger.info(f"{self.get_source_name()} disabled")
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Filesystem Skill Template Loader
|
|
3
|
+
|
|
4
|
+
Loads skill templates from filesystem directories containing Python skill definitions.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import importlib.util
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import List
|
|
11
|
+
import logging
|
|
12
|
+
|
|
13
|
+
from .base import BaseSkillTemplateLoader
|
|
14
|
+
from control_plane_api.app.skills.base import SkillDefinition
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class FilesystemSkillTemplateLoader(BaseSkillTemplateLoader):
|
|
20
|
+
"""
|
|
21
|
+
Loader for filesystem-based skill templates.
|
|
22
|
+
|
|
23
|
+
Discovers skill templates by searching for skill_template.py files
|
|
24
|
+
in configured directories (e.g., ~/.kubiya/skills/).
|
|
25
|
+
|
|
26
|
+
Directory structure:
|
|
27
|
+
~/.kubiya/skills/
|
|
28
|
+
├── my_custom_skill/
|
|
29
|
+
│ └── skill_template.py # Contains SkillDefinition subclass
|
|
30
|
+
└── another_skill/
|
|
31
|
+
└── skill_template.py
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(
|
|
35
|
+
self,
|
|
36
|
+
base_paths: List[str] = None,
|
|
37
|
+
enabled: bool = True,
|
|
38
|
+
):
|
|
39
|
+
"""
|
|
40
|
+
Initialize filesystem loader.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
base_paths: List of base directories to search
|
|
44
|
+
enabled: Whether this loader is enabled
|
|
45
|
+
"""
|
|
46
|
+
super().__init__(enabled=enabled)
|
|
47
|
+
|
|
48
|
+
# Default paths
|
|
49
|
+
if base_paths is None:
|
|
50
|
+
base_paths = []
|
|
51
|
+
# Add .kubiya/skills/ from home directory
|
|
52
|
+
home_skills = Path.home() / ".kubiya" / "skills"
|
|
53
|
+
if home_skills.exists():
|
|
54
|
+
base_paths.append(str(home_skills))
|
|
55
|
+
|
|
56
|
+
self.base_paths = [Path(p) for p in base_paths]
|
|
57
|
+
logger.info(
|
|
58
|
+
f"FilesystemSkillTemplateLoader initialized with paths: {[str(p) for p in self.base_paths]}"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
def discover(self) -> List[SkillDefinition]:
|
|
62
|
+
"""
|
|
63
|
+
Discover skill templates by scanning for skill_template.py files.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
List of discovered SkillDefinition instances
|
|
67
|
+
"""
|
|
68
|
+
discovered = []
|
|
69
|
+
|
|
70
|
+
for base_path in self.base_paths:
|
|
71
|
+
if not base_path.exists():
|
|
72
|
+
logger.warning(f"Base path not found: {base_path}")
|
|
73
|
+
continue
|
|
74
|
+
|
|
75
|
+
# Search for skill template files
|
|
76
|
+
skill_dirs = self._find_skill_directories(base_path)
|
|
77
|
+
|
|
78
|
+
for skill_dir in skill_dirs:
|
|
79
|
+
try:
|
|
80
|
+
skill_def = self._load_skill_template(skill_dir)
|
|
81
|
+
if skill_def:
|
|
82
|
+
discovered.append(skill_def)
|
|
83
|
+
logger.info(
|
|
84
|
+
f"Loaded skill template: {skill_def.name} from {skill_dir}"
|
|
85
|
+
)
|
|
86
|
+
except Exception as e:
|
|
87
|
+
logger.error(
|
|
88
|
+
f"Failed to load skill template from {skill_dir}: {e}",
|
|
89
|
+
exc_info=True
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
logger.info(f"Discovered {len(discovered)} skill templates from filesystem")
|
|
93
|
+
return discovered
|
|
94
|
+
|
|
95
|
+
def _find_skill_directories(self, base_path: Path) -> List[Path]:
|
|
96
|
+
"""
|
|
97
|
+
Find all directories containing skill_template.py files.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
base_path: Base directory to search
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
List of directories containing skill templates
|
|
104
|
+
"""
|
|
105
|
+
skill_dirs = []
|
|
106
|
+
|
|
107
|
+
for item in base_path.iterdir():
|
|
108
|
+
if item.is_dir():
|
|
109
|
+
skill_template = item / "skill_template.py"
|
|
110
|
+
if skill_template.exists():
|
|
111
|
+
skill_dirs.append(item)
|
|
112
|
+
|
|
113
|
+
return skill_dirs
|
|
114
|
+
|
|
115
|
+
def _load_skill_template(self, skill_dir: Path) -> SkillDefinition:
|
|
116
|
+
"""
|
|
117
|
+
Load skill template from a directory.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
skill_dir: Directory containing skill_template.py
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
SkillDefinition instance
|
|
124
|
+
|
|
125
|
+
Raises:
|
|
126
|
+
Exception: If loading fails
|
|
127
|
+
"""
|
|
128
|
+
skill_template_path = skill_dir / "skill_template.py"
|
|
129
|
+
|
|
130
|
+
# Add skill directory to path temporarily
|
|
131
|
+
skill_dir_str = str(skill_dir)
|
|
132
|
+
if skill_dir_str not in sys.path:
|
|
133
|
+
sys.path.insert(0, skill_dir_str)
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
# Load the module dynamically
|
|
137
|
+
module_name = f"skill_template_{skill_dir.name}"
|
|
138
|
+
spec = importlib.util.spec_from_file_location(
|
|
139
|
+
module_name,
|
|
140
|
+
skill_template_path
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
if spec is None or spec.loader is None:
|
|
144
|
+
raise ImportError(f"Could not load module spec from {skill_template_path}")
|
|
145
|
+
|
|
146
|
+
module = importlib.util.module_from_spec(spec)
|
|
147
|
+
sys.modules[module_name] = module
|
|
148
|
+
spec.loader.exec_module(module)
|
|
149
|
+
|
|
150
|
+
# Find SkillDefinition subclass in module
|
|
151
|
+
skill_class = None
|
|
152
|
+
for attr_name in dir(module):
|
|
153
|
+
attr = getattr(module, attr_name)
|
|
154
|
+
if (
|
|
155
|
+
isinstance(attr, type) and
|
|
156
|
+
issubclass(attr, SkillDefinition) and
|
|
157
|
+
attr is not SkillDefinition
|
|
158
|
+
):
|
|
159
|
+
skill_class = attr
|
|
160
|
+
break
|
|
161
|
+
|
|
162
|
+
if skill_class is None:
|
|
163
|
+
raise ValueError(
|
|
164
|
+
f"No SkillDefinition subclass found in {skill_template_path}"
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
# Instantiate the skill definition
|
|
168
|
+
skill_instance = skill_class()
|
|
169
|
+
|
|
170
|
+
return skill_instance
|
|
171
|
+
|
|
172
|
+
finally:
|
|
173
|
+
# Clean up sys.path
|
|
174
|
+
if skill_dir_str in sys.path:
|
|
175
|
+
sys.path.remove(skill_dir_str)
|
|
176
|
+
|
|
177
|
+
def add_base_path(self, path: str) -> None:
|
|
178
|
+
"""
|
|
179
|
+
Add an additional base path to search.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
path: Path to add
|
|
183
|
+
"""
|
|
184
|
+
path_obj = Path(path)
|
|
185
|
+
if path_obj not in self.base_paths:
|
|
186
|
+
self.base_paths.append(path_obj)
|
|
187
|
+
logger.info(f"Added base path: {path_obj}")
|
|
188
|
+
|
|
189
|
+
def remove_base_path(self, path: str) -> None:
|
|
190
|
+
"""
|
|
191
|
+
Remove a base path from search.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
path: Path to remove
|
|
195
|
+
"""
|
|
196
|
+
path_obj = Path(path)
|
|
197
|
+
if path_obj in self.base_paths:
|
|
198
|
+
self.base_paths.remove(path_obj)
|
|
199
|
+
logger.info(f"Removed base path: {path_obj}")
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Skill Registry
|
|
3
|
+
|
|
4
|
+
Central registry for all available skills. Skills self-register
|
|
5
|
+
when their modules are imported, or can be loaded dynamically from external sources.
|
|
6
|
+
"""
|
|
7
|
+
from typing import Dict, List, Optional
|
|
8
|
+
from .base import SkillDefinition, SkillType
|
|
9
|
+
import logging
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SkillRegistry:
|
|
15
|
+
"""Registry for all available skill definitions"""
|
|
16
|
+
|
|
17
|
+
def __init__(self):
|
|
18
|
+
self._skills: Dict[SkillType, SkillDefinition] = {}
|
|
19
|
+
self._dynamic_loaded = False
|
|
20
|
+
|
|
21
|
+
def register(self, skill: SkillDefinition):
|
|
22
|
+
"""Register a skill definition"""
|
|
23
|
+
if skill.type in self._skills:
|
|
24
|
+
logger.warning(f"Skill {skill.type} is already registered, overwriting")
|
|
25
|
+
|
|
26
|
+
self._skills[skill.type] = skill
|
|
27
|
+
logger.info(f"Registered skill: {skill.type} - {skill.name}")
|
|
28
|
+
|
|
29
|
+
def load_from_loaders(self, loaders: List) -> int:
|
|
30
|
+
"""
|
|
31
|
+
Load skills from multiple loaders.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
loaders: List of BaseSkillTemplateLoader instances
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Number of skills loaded
|
|
38
|
+
"""
|
|
39
|
+
loaded_count = 0
|
|
40
|
+
|
|
41
|
+
for loader in loaders:
|
|
42
|
+
if not loader.is_enabled():
|
|
43
|
+
logger.info(f"Skipping disabled loader: {loader.get_source_name()}")
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
logger.info(f"Loading skills from: {loader.get_source_name()}")
|
|
48
|
+
skills = loader.discover()
|
|
49
|
+
|
|
50
|
+
for skill in skills:
|
|
51
|
+
try:
|
|
52
|
+
self.register(skill)
|
|
53
|
+
loaded_count += 1
|
|
54
|
+
except Exception as e:
|
|
55
|
+
logger.error(
|
|
56
|
+
f"Failed to register skill {skill.name}: {e}",
|
|
57
|
+
exc_info=True
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.error(
|
|
62
|
+
f"Loader {loader.get_source_name()} failed: {e}",
|
|
63
|
+
exc_info=True
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
self._dynamic_loaded = True
|
|
67
|
+
logger.info(f"Loaded {loaded_count} skills from {len(loaders)} loaders")
|
|
68
|
+
return loaded_count
|
|
69
|
+
|
|
70
|
+
def get(self, skill_type: SkillType) -> Optional[SkillDefinition]:
|
|
71
|
+
"""Get a skill definition by type"""
|
|
72
|
+
return self._skills.get(skill_type)
|
|
73
|
+
|
|
74
|
+
def get_all(self) -> List[SkillDefinition]:
|
|
75
|
+
"""Get all registered skills"""
|
|
76
|
+
return list(self._skills.values())
|
|
77
|
+
|
|
78
|
+
def get_by_name(self, name: str) -> Optional[SkillDefinition]:
|
|
79
|
+
"""Get a skill by name"""
|
|
80
|
+
for skill in self._skills.values():
|
|
81
|
+
if skill.name.lower() == name.lower():
|
|
82
|
+
return skill
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
def list_types(self) -> List[SkillType]:
|
|
86
|
+
"""List all registered skill types"""
|
|
87
|
+
return list(self._skills.keys())
|
|
88
|
+
|
|
89
|
+
def is_dynamic_loaded(self) -> bool:
|
|
90
|
+
"""Check if dynamic skills have been loaded"""
|
|
91
|
+
return self._dynamic_loaded
|
|
92
|
+
|
|
93
|
+
def get_stats(self) -> Dict[str, any]:
|
|
94
|
+
"""
|
|
95
|
+
Get registry statistics.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
Dictionary with registry stats
|
|
99
|
+
"""
|
|
100
|
+
return {
|
|
101
|
+
"total_skills": len(self._skills),
|
|
102
|
+
"skill_types": [str(st) for st in self._skills.keys()],
|
|
103
|
+
"skill_names": [skill.name for skill in self._skills.values()],
|
|
104
|
+
"dynamic_loaded": self._dynamic_loaded,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# Global registry instance
|
|
109
|
+
skill_registry = SkillRegistry()
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def register_skill(skill: SkillDefinition):
|
|
113
|
+
"""Decorator or function to register a skill"""
|
|
114
|
+
skill_registry.register(skill)
|
|
115
|
+
return skill
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def get_skill(skill_type: SkillType) -> Optional[SkillDefinition]:
|
|
119
|
+
"""Get a skill definition by type"""
|
|
120
|
+
return skill_registry.get(skill_type)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def get_all_skills() -> List[SkillDefinition]:
|
|
124
|
+
"""Get all registered skills"""
|
|
125
|
+
return skill_registry.get_all()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def is_local_temporal() -> bool:
|
|
5
|
+
"""
|
|
6
|
+
Check if the Temporal running temporal is in a docker container or not.
|
|
7
|
+
"""
|
|
8
|
+
temporal_host = os.getenv("TEMPORAL_HOST", "us-east-1.aws.api.temporal.io:7233")
|
|
9
|
+
return any([
|
|
10
|
+
temporal_host.startswith("temporal:"),
|
|
11
|
+
temporal_host.startswith("host.docker.internal"),
|
|
12
|
+
])
|