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,25 @@
|
|
|
1
|
+
"""Python skill implementation for agno runtime."""
|
|
2
|
+
from agno.tools.python import PythonTools as AgnoPythonTools
|
|
3
|
+
from agno.tools.function import Function
|
|
4
|
+
from control_plane_api.worker.skills.builtin.schema_fix_mixin import SchemaFixMixin
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PythonTools(SchemaFixMixin, AgnoPythonTools):
|
|
8
|
+
"""
|
|
9
|
+
Python code execution using agno PythonTools.
|
|
10
|
+
|
|
11
|
+
Wraps agno's PythonTools to provide Python execution with proper parameter schemas.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def __init__(self, **kwargs):
|
|
15
|
+
"""
|
|
16
|
+
Initialize Python tools.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
**kwargs: Configuration (enable_code_execution, blocked_imports, etc.)
|
|
20
|
+
"""
|
|
21
|
+
super().__init__()
|
|
22
|
+
self.config = kwargs
|
|
23
|
+
|
|
24
|
+
# Fix: Rebuild function schemas with proper parameters
|
|
25
|
+
self._rebuild_function_schemas()
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
apiVersion: kubiya.ai/v1
|
|
2
|
+
kind: Skill
|
|
3
|
+
metadata:
|
|
4
|
+
name: python
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
description: Execute Python code locally
|
|
7
|
+
author: Kubiya
|
|
8
|
+
icon: FaPython
|
|
9
|
+
icon_type: react-icon
|
|
10
|
+
|
|
11
|
+
spec:
|
|
12
|
+
type: python
|
|
13
|
+
|
|
14
|
+
implementations:
|
|
15
|
+
agno:
|
|
16
|
+
module: agno_impl
|
|
17
|
+
class: PythonTools
|
|
18
|
+
claude_code:
|
|
19
|
+
# Claude Code has Python execution via Bash tool
|
|
20
|
+
# Executes Python code using shell commands
|
|
21
|
+
builtin: true
|
|
22
|
+
tools: ["Bash"]
|
|
23
|
+
default:
|
|
24
|
+
module: agno_impl
|
|
25
|
+
class: PythonTools
|
|
26
|
+
|
|
27
|
+
pythonDependencies:
|
|
28
|
+
- agno>=0.1.0
|
|
29
|
+
|
|
30
|
+
systemRequirements:
|
|
31
|
+
supportedOS: [linux, darwin, win32]
|
|
32
|
+
minPythonVersion: "3.10"
|
|
33
|
+
|
|
34
|
+
environmentVariables: []
|
|
35
|
+
|
|
36
|
+
configSchema:
|
|
37
|
+
type: object
|
|
38
|
+
properties:
|
|
39
|
+
enable_code_execution:
|
|
40
|
+
type: boolean
|
|
41
|
+
description: Enable Python code execution
|
|
42
|
+
default: true
|
|
43
|
+
blocked_imports:
|
|
44
|
+
type: array
|
|
45
|
+
items:
|
|
46
|
+
type: string
|
|
47
|
+
description: Blocked imports for security
|
|
48
|
+
default: ["os", "subprocess", "sys", "socket", "shutil"]
|
|
49
|
+
allowed_imports:
|
|
50
|
+
type: array
|
|
51
|
+
items:
|
|
52
|
+
type: string
|
|
53
|
+
description: Whitelist mode - only allow these imports
|
|
54
|
+
default: []
|
|
55
|
+
timeout:
|
|
56
|
+
type: integer
|
|
57
|
+
description: Execution timeout in seconds
|
|
58
|
+
default: 30
|
|
59
|
+
minimum: 1
|
|
60
|
+
maximum: 300
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Schema Fix Mixin for Agno Tool Wrappers
|
|
3
|
+
|
|
4
|
+
This module provides a mixin class that fixes empty parameter schemas in agno tools.
|
|
5
|
+
|
|
6
|
+
PROBLEM:
|
|
7
|
+
The agno library (versions tested: all current versions) has a critical bug where
|
|
8
|
+
tool functions have empty parameter schemas:
|
|
9
|
+
{'type': 'object', 'properties': {}, 'required': []}
|
|
10
|
+
|
|
11
|
+
This causes LLMs to call functions without required parameters, leading to
|
|
12
|
+
validation errors like:
|
|
13
|
+
"pydantic_core.ValidationError: X validation errors... Missing required argument"
|
|
14
|
+
|
|
15
|
+
SOLUTION:
|
|
16
|
+
This mixin class provides a _rebuild_function_schemas() method that:
|
|
17
|
+
1. Inspects actual method signatures using Python's inspect module
|
|
18
|
+
2. Extracts parameter types from type hints
|
|
19
|
+
3. Extracts parameter descriptions from docstrings
|
|
20
|
+
4. Rebuilds the function.parameters dict with correct schema
|
|
21
|
+
5. Marks parameters without defaults as required
|
|
22
|
+
|
|
23
|
+
USAGE:
|
|
24
|
+
Add SchemaFixMixin as a base class to any agno tool wrapper:
|
|
25
|
+
|
|
26
|
+
from agno.tools.shell import ShellTools as AgnoShellTools
|
|
27
|
+
from control_plane_api.worker.skills.builtin.schema_fix_mixin import SchemaFixMixin
|
|
28
|
+
|
|
29
|
+
class ShellTools(SchemaFixMixin, AgnoShellTools):
|
|
30
|
+
def __init__(self, **kwargs):
|
|
31
|
+
super().__init__(**kwargs)
|
|
32
|
+
self._rebuild_function_schemas() # Fix schemas after parent init
|
|
33
|
+
|
|
34
|
+
AFFECTED TOOLS:
|
|
35
|
+
All agno-based tools need this fix:
|
|
36
|
+
- FileTools (save_file, read_file, etc.) ✅ FIXED
|
|
37
|
+
- PythonTools (save_to_file_and_run, etc.) ✅ FIXED
|
|
38
|
+
- ShellTools (run_shell_command) ⚠️ NEEDS FIX
|
|
39
|
+
- DockerTools (all docker functions) ⚠️ NEEDS FIX
|
|
40
|
+
- SlackTools (all slack functions) ⚠️ NEEDS FIX
|
|
41
|
+
- Custom Toolkit subclasses ⚠️ NEEDS FIX
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
import inspect
|
|
45
|
+
from typing import get_type_hints, get_origin, get_args
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class SchemaFixMixin:
|
|
49
|
+
"""
|
|
50
|
+
Mixin class that fixes empty parameter schemas in agno tool functions.
|
|
51
|
+
|
|
52
|
+
CRITICAL: Call _rebuild_function_schemas() in your __init__ method
|
|
53
|
+
after calling super().__init__() to ensure agno has initialized functions.
|
|
54
|
+
|
|
55
|
+
Example:
|
|
56
|
+
class MyTools(SchemaFixMixin, AgnoTools):
|
|
57
|
+
def __init__(self, **kwargs):
|
|
58
|
+
super().__init__(**kwargs)
|
|
59
|
+
self._rebuild_function_schemas() # Fix empty schemas
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
def _rebuild_function_schemas(self):
|
|
63
|
+
"""
|
|
64
|
+
Rebuild function schemas to include proper parameter definitions.
|
|
65
|
+
|
|
66
|
+
This method:
|
|
67
|
+
1. Iterates through all functions in self.functions
|
|
68
|
+
2. Gets the actual method from the class
|
|
69
|
+
3. Extracts parameter info from signature and type hints
|
|
70
|
+
4. Builds proper JSON schema for parameters
|
|
71
|
+
5. Updates the function.parameters dict
|
|
72
|
+
|
|
73
|
+
Handles:
|
|
74
|
+
- Type hints (str, int, bool, float, list, dict, Optional)
|
|
75
|
+
- Default values (parameters without defaults are marked required)
|
|
76
|
+
- Docstring descriptions (:param name: description)
|
|
77
|
+
"""
|
|
78
|
+
if not hasattr(self, 'functions') or not self.functions:
|
|
79
|
+
return
|
|
80
|
+
|
|
81
|
+
# Rebuild each function with proper parameter schema
|
|
82
|
+
for func_name, func_obj in list(self.functions.items()):
|
|
83
|
+
try:
|
|
84
|
+
# Get the actual method
|
|
85
|
+
method = getattr(self, func_name, None)
|
|
86
|
+
if not method or not callable(method):
|
|
87
|
+
continue
|
|
88
|
+
|
|
89
|
+
# Extract parameter schema from function signature
|
|
90
|
+
sig = inspect.signature(method)
|
|
91
|
+
type_hints = get_type_hints(method)
|
|
92
|
+
|
|
93
|
+
properties = {}
|
|
94
|
+
required = []
|
|
95
|
+
|
|
96
|
+
for param_name, param in sig.parameters.items():
|
|
97
|
+
# Skip 'self'
|
|
98
|
+
if param_name == 'self':
|
|
99
|
+
continue
|
|
100
|
+
|
|
101
|
+
# Get type hint
|
|
102
|
+
param_type = type_hints.get(param_name, str)
|
|
103
|
+
|
|
104
|
+
# Determine JSON schema type and items type for arrays
|
|
105
|
+
json_type, items_type = self._python_type_to_json_schema(param_type)
|
|
106
|
+
|
|
107
|
+
# Build parameter schema
|
|
108
|
+
param_schema = {"type": json_type}
|
|
109
|
+
|
|
110
|
+
# Add items schema for arrays
|
|
111
|
+
if json_type == "array" and items_type:
|
|
112
|
+
param_schema["items"] = {"type": items_type}
|
|
113
|
+
|
|
114
|
+
# Add description from docstring if available
|
|
115
|
+
if method.__doc__:
|
|
116
|
+
# Try to extract parameter description from docstring
|
|
117
|
+
desc = self._extract_param_description(method.__doc__, param_name)
|
|
118
|
+
if desc:
|
|
119
|
+
param_schema["description"] = desc
|
|
120
|
+
|
|
121
|
+
properties[param_name] = param_schema
|
|
122
|
+
|
|
123
|
+
# Mark as required if no default value
|
|
124
|
+
if param.default == inspect.Parameter.empty:
|
|
125
|
+
required.append(param_name)
|
|
126
|
+
|
|
127
|
+
# Update function parameters
|
|
128
|
+
if properties:
|
|
129
|
+
func_obj.parameters = {
|
|
130
|
+
"type": "object",
|
|
131
|
+
"properties": properties,
|
|
132
|
+
"required": required
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
except Exception as e:
|
|
136
|
+
# Log but don't fail - some functions might not need schema fixing
|
|
137
|
+
print(f"Warning: Could not rebuild schema for {func_name}: {e}")
|
|
138
|
+
|
|
139
|
+
@staticmethod
|
|
140
|
+
def _python_type_to_json_schema(python_type):
|
|
141
|
+
"""
|
|
142
|
+
Convert Python type hint to JSON schema type and items type.
|
|
143
|
+
|
|
144
|
+
Handles:
|
|
145
|
+
- Basic types: str, int, bool, float
|
|
146
|
+
- Collections: list, dict, List[T], Dict[K,V]
|
|
147
|
+
- Optional types: Optional[str] -> str
|
|
148
|
+
- Union types: Union[str, None] -> str
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
python_type: Python type from type hints
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Tuple of (json_type: str, items_type: Optional[str])
|
|
155
|
+
- json_type: The JSON schema type (string, integer, array, etc.)
|
|
156
|
+
- items_type: For arrays, the type of items; None otherwise
|
|
157
|
+
"""
|
|
158
|
+
# Check for generic types first (List[str], Dict[str, int], etc.)
|
|
159
|
+
origin = get_origin(python_type)
|
|
160
|
+
items_type = None
|
|
161
|
+
|
|
162
|
+
# Handle generic List[T] -> array with items type
|
|
163
|
+
if origin is list:
|
|
164
|
+
args = get_args(python_type)
|
|
165
|
+
if args:
|
|
166
|
+
# Get the item type from List[T]
|
|
167
|
+
item_type = args[0]
|
|
168
|
+
items_type = SchemaFixMixin._get_basic_json_type(item_type)
|
|
169
|
+
return "array", items_type
|
|
170
|
+
|
|
171
|
+
# Handle generic Dict[K, V] -> object
|
|
172
|
+
if origin is dict:
|
|
173
|
+
return "object", None
|
|
174
|
+
|
|
175
|
+
# Handle Optional types (Union with None)
|
|
176
|
+
if origin is not None:
|
|
177
|
+
# For Optional, Union, etc., get the non-None type
|
|
178
|
+
args = get_args(python_type)
|
|
179
|
+
if args:
|
|
180
|
+
for arg in args:
|
|
181
|
+
if arg is not type(None):
|
|
182
|
+
python_type = arg
|
|
183
|
+
# Recursively handle the unwrapped type
|
|
184
|
+
return SchemaFixMixin._python_type_to_json_schema(python_type)
|
|
185
|
+
|
|
186
|
+
# Get basic type
|
|
187
|
+
json_type = SchemaFixMixin._get_basic_json_type(python_type)
|
|
188
|
+
return json_type, None
|
|
189
|
+
|
|
190
|
+
@staticmethod
|
|
191
|
+
def _get_basic_json_type(python_type) -> str:
|
|
192
|
+
"""
|
|
193
|
+
Convert a basic Python type to JSON schema type.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
python_type: Python type (str, int, list, etc.)
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
JSON schema type string
|
|
200
|
+
"""
|
|
201
|
+
if python_type == str or python_type == 'str':
|
|
202
|
+
return "string"
|
|
203
|
+
elif python_type == int or python_type == 'int':
|
|
204
|
+
return "integer"
|
|
205
|
+
elif python_type == float or python_type == 'float':
|
|
206
|
+
return "number"
|
|
207
|
+
elif python_type == bool or python_type == 'bool':
|
|
208
|
+
return "boolean"
|
|
209
|
+
elif python_type == list or python_type == 'list':
|
|
210
|
+
return "array"
|
|
211
|
+
elif python_type == dict or python_type == 'dict':
|
|
212
|
+
return "object"
|
|
213
|
+
else:
|
|
214
|
+
return "string" # Default to string for unknown types
|
|
215
|
+
|
|
216
|
+
@staticmethod
|
|
217
|
+
def _extract_param_description(docstring: str, param_name: str) -> str:
|
|
218
|
+
"""
|
|
219
|
+
Extract parameter description from docstring.
|
|
220
|
+
|
|
221
|
+
Supports formats:
|
|
222
|
+
- :param name: description
|
|
223
|
+
- Args:\n name: description
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
docstring: Method docstring
|
|
227
|
+
param_name: Parameter name to find
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
Description string or empty string if not found
|
|
231
|
+
"""
|
|
232
|
+
if not docstring:
|
|
233
|
+
return ""
|
|
234
|
+
|
|
235
|
+
lines = docstring.split('\n')
|
|
236
|
+
|
|
237
|
+
# Try :param format
|
|
238
|
+
for line in lines:
|
|
239
|
+
if f":param {param_name}:" in line:
|
|
240
|
+
# Extract description after ":param param_name:"
|
|
241
|
+
parts = line.split(f":param {param_name}:")
|
|
242
|
+
if len(parts) > 1:
|
|
243
|
+
return parts[1].strip()
|
|
244
|
+
|
|
245
|
+
# Try Args: format
|
|
246
|
+
in_args_section = False
|
|
247
|
+
for line in lines:
|
|
248
|
+
line = line.strip()
|
|
249
|
+
if line == "Args:":
|
|
250
|
+
in_args_section = True
|
|
251
|
+
continue
|
|
252
|
+
if in_args_section:
|
|
253
|
+
if line.startswith(param_name + ":"):
|
|
254
|
+
desc = line.split(":", 1)[1].strip()
|
|
255
|
+
return desc
|
|
256
|
+
# Stop at next section
|
|
257
|
+
if line.endswith(":") and not line.startswith(" "):
|
|
258
|
+
break
|
|
259
|
+
|
|
260
|
+
return ""
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Shell skill implementation for agno runtime."""
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from agno.tools.shell import ShellTools as AgnoShellTools
|
|
5
|
+
from control_plane_api.worker.skills.builtin.schema_fix_mixin import SchemaFixMixin
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ShellTools(SchemaFixMixin, AgnoShellTools):
|
|
9
|
+
"""
|
|
10
|
+
Shell command execution using agno ShellTools.
|
|
11
|
+
|
|
12
|
+
Wraps agno's ShellTools to provide shell access.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(self, base_directory: Optional[str] = None, **kwargs):
|
|
16
|
+
"""
|
|
17
|
+
Initialize shell tools.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
base_directory: Base directory for shell operations.
|
|
21
|
+
If None and execution_id provided, uses .kubiya/workspaces/<execution-id>
|
|
22
|
+
If None and no execution_id, uses current working directory
|
|
23
|
+
If set explicitly, uses provided path (user override)
|
|
24
|
+
**kwargs: Configuration (allowed_commands, blocked_commands, timeout, etc.)
|
|
25
|
+
"""
|
|
26
|
+
base_dir_path = Path(base_directory) if base_directory else None
|
|
27
|
+
super().__init__(base_dir=base_dir_path)
|
|
28
|
+
self.config = kwargs
|
|
29
|
+
|
|
30
|
+
# Fix: Rebuild function schemas with proper parameters
|
|
31
|
+
self._rebuild_function_schemas()
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
apiVersion: kubiya.ai/v1
|
|
2
|
+
kind: Skill
|
|
3
|
+
metadata:
|
|
4
|
+
name: shell
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
description: Execute shell commands on the local system
|
|
7
|
+
author: Kubiya
|
|
8
|
+
icon: Terminal
|
|
9
|
+
icon_type: lucide
|
|
10
|
+
|
|
11
|
+
spec:
|
|
12
|
+
type: shell
|
|
13
|
+
|
|
14
|
+
implementations:
|
|
15
|
+
agno:
|
|
16
|
+
module: agno_impl
|
|
17
|
+
class: ShellTools
|
|
18
|
+
claude_code:
|
|
19
|
+
# Claude Code has built-in shell tools (Bash, BashOutput, KillShell)
|
|
20
|
+
# No implementation needed - mapped via ClaudeCodeRuntime._map_skills_to_tools()
|
|
21
|
+
builtin: true
|
|
22
|
+
tools: ["Bash", "BashOutput", "KillShell"]
|
|
23
|
+
default:
|
|
24
|
+
module: agno_impl
|
|
25
|
+
class: ShellTools
|
|
26
|
+
|
|
27
|
+
pythonDependencies:
|
|
28
|
+
- agno>=0.1.0
|
|
29
|
+
|
|
30
|
+
systemRequirements:
|
|
31
|
+
supportedOS: [linux, darwin, win32]
|
|
32
|
+
minPythonVersion: "3.10"
|
|
33
|
+
|
|
34
|
+
environmentVariables: []
|
|
35
|
+
|
|
36
|
+
configSchema:
|
|
37
|
+
type: object
|
|
38
|
+
properties:
|
|
39
|
+
allowed_commands:
|
|
40
|
+
type: array
|
|
41
|
+
items:
|
|
42
|
+
type: string
|
|
43
|
+
description: List of allowed commands (empty = all allowed)
|
|
44
|
+
default: []
|
|
45
|
+
blocked_commands:
|
|
46
|
+
type: array
|
|
47
|
+
items:
|
|
48
|
+
type: string
|
|
49
|
+
description: List of blocked commands
|
|
50
|
+
default: []
|
|
51
|
+
timeout:
|
|
52
|
+
type: integer
|
|
53
|
+
description: Command timeout in seconds
|
|
54
|
+
default: 30
|
|
55
|
+
minimum: 1
|
|
56
|
+
maximum: 600
|
|
57
|
+
working_directory:
|
|
58
|
+
type: string
|
|
59
|
+
description: Working directory for commands
|
|
60
|
+
default: ""
|