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,350 @@
|
|
|
1
|
+
# Kubiya Control Plane API
|
|
2
|
+
|
|
3
|
+
A multi-tenant AI agent orchestration and management platform built with FastAPI, Temporal, and PostgreSQL.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Multi-tenant Architecture**: Manage multiple projects, teams, and agents
|
|
8
|
+
- **Workflow Orchestration**: Temporal-based workflow execution
|
|
9
|
+
- **Flexible Agent Runtime**: Support for multiple agent types and skills
|
|
10
|
+
- **Policy Enforcement**: OPA-based policy engine for agent governance
|
|
11
|
+
- **Tool Call Enforcement**: Non-blocking validation of tool executions against policies
|
|
12
|
+
- **Event Bus System**: Pluggable multi-provider event streaming (HTTP, Redis, WebSocket, NATS)
|
|
13
|
+
- **Scalable Workers**: Distributed worker architecture for agent execution
|
|
14
|
+
- **Context Management**: Environment and team-specific context handling
|
|
15
|
+
- **LLM Integration**: Support for multiple LLM providers via LiteLLM
|
|
16
|
+
- **Comprehensive APIs**: RESTful APIs for all platform features
|
|
17
|
+
|
|
18
|
+
### Tool Call Enforcement
|
|
19
|
+
|
|
20
|
+
The platform includes **end-to-end tool call enforcement** that validates agent tool executions against OPA policies:
|
|
21
|
+
|
|
22
|
+
- **Non-blocking enforcement**: Policy violations are injected into tool outputs without failing workflows
|
|
23
|
+
- **Fail-open strategy**: Graceful degradation on timeout or error prevents blocking workflows
|
|
24
|
+
- **Automatic risk assessment**: Tools classified as critical/high/medium/low risk
|
|
25
|
+
- **Full context enrichment**: User, organization, team, and environment data included in policy evaluation
|
|
26
|
+
- **5 example policies**: Role-based access, production safeguards, bash validation, business hours, MCP allowlist
|
|
27
|
+
|
|
28
|
+
See the [Tool Enforcement Guide](../docs/TOOL_ENFORCEMENT.md) for detailed documentation.
|
|
29
|
+
|
|
30
|
+
### Event Bus System
|
|
31
|
+
|
|
32
|
+
The platform includes a **production-grade event bus abstraction** for real-time event streaming:
|
|
33
|
+
|
|
34
|
+
- **Multi-provider support**: HTTP, Redis, WebSocket, NATS
|
|
35
|
+
- **Parallel publishing**: Events sent to all providers simultaneously
|
|
36
|
+
- **Graceful degradation**: Continues if one provider fails
|
|
37
|
+
- **Optional dependencies**: Lightweight base package with optional providers
|
|
38
|
+
- **Comprehensive logging**: Structured JSON logs at every step
|
|
39
|
+
- **Health monitoring**: Per-provider and overall system health checks
|
|
40
|
+
- **Backwards compatible**: Falls back to direct Redis if not configured
|
|
41
|
+
|
|
42
|
+
**Quick Start:**
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Base package (HTTP, Redis, WebSocket)
|
|
46
|
+
pip install kubiya-control-plane-api
|
|
47
|
+
|
|
48
|
+
# With YAML config support
|
|
49
|
+
pip install kubiya-control-plane-api[yaml]
|
|
50
|
+
|
|
51
|
+
# With NATS provider
|
|
52
|
+
pip install kubiya-control-plane-api[nats]
|
|
53
|
+
|
|
54
|
+
# All event bus features
|
|
55
|
+
pip install kubiya-control-plane-api[event-bus]
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Configuration Example:**
|
|
59
|
+
|
|
60
|
+
```yaml
|
|
61
|
+
# config.yaml
|
|
62
|
+
event_bus:
|
|
63
|
+
http:
|
|
64
|
+
enabled: true
|
|
65
|
+
base_url: http://localhost:8000
|
|
66
|
+
redis:
|
|
67
|
+
enabled: true
|
|
68
|
+
redis_url: redis://localhost:6379
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
See the [Event Bus README](app/lib/event_bus/README.md) for detailed documentation.
|
|
72
|
+
|
|
73
|
+
## Installation
|
|
74
|
+
|
|
75
|
+
### Using pip
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pip install kubiya-control_plane_api
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### From source
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
git clone https://github.com/kubiyabot/agent-control-plane.git
|
|
85
|
+
cd agent-control-plane/control_plane_api
|
|
86
|
+
pip install -e .
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### With development dependencies
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pip install kubiya-control_plane_api[dev]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Quick Start
|
|
96
|
+
|
|
97
|
+
### 1. Set up environment variables
|
|
98
|
+
|
|
99
|
+
Create a `.env` file or set the following environment variables:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Database Configuration
|
|
103
|
+
DATABASE_URL=postgresql://user:password@localhost:5432/control_plane
|
|
104
|
+
|
|
105
|
+
# Supabase (for serverless deployments)
|
|
106
|
+
SUPABASE_URL=your-supabase-url
|
|
107
|
+
SUPABASE_KEY=your-supabase-key
|
|
108
|
+
|
|
109
|
+
# Temporal Configuration
|
|
110
|
+
TEMPORAL_HOST=localhost:7233
|
|
111
|
+
TEMPORAL_NAMESPACE=default
|
|
112
|
+
|
|
113
|
+
# API Configuration
|
|
114
|
+
API_TITLE="Agent Control Plane"
|
|
115
|
+
API_VERSION="1.0.0"
|
|
116
|
+
ENVIRONMENT=development
|
|
117
|
+
LOG_LEVEL=info
|
|
118
|
+
|
|
119
|
+
# Security
|
|
120
|
+
SECRET_KEY=your-secret-key-here
|
|
121
|
+
|
|
122
|
+
# Optional: Kubiya Integration
|
|
123
|
+
KUBIYA_API_KEY=your-kubiya-api-key
|
|
124
|
+
KUBIYA_API_URL=https://api.kubiya.ai
|
|
125
|
+
|
|
126
|
+
# Optional: Event Bus Configuration (or use YAML config)
|
|
127
|
+
EVENT_BUS_HTTP_ENABLED=true
|
|
128
|
+
EVENT_BUS_HTTP_BASE_URL=http://localhost:8000
|
|
129
|
+
EVENT_BUS_REDIS_ENABLED=true
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Alternatively, use YAML configuration** (recommended):
|
|
133
|
+
|
|
134
|
+
Create `config.yaml` or set `KUBIYA_CONFIG_FILE=/path/to/config.yaml`:
|
|
135
|
+
|
|
136
|
+
```yaml
|
|
137
|
+
event_bus:
|
|
138
|
+
http:
|
|
139
|
+
enabled: true
|
|
140
|
+
base_url: http://localhost:8000
|
|
141
|
+
batching_enabled: true
|
|
142
|
+
redis:
|
|
143
|
+
enabled: true
|
|
144
|
+
redis_url: redis://localhost:6379
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 2. Run database migrations
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
alembic upgrade head
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 3. Start the API server
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
uvicorn app.main:app --host 0.0.0.0 --port 7777 --reload
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
The API will be available at `http://localhost:7777`
|
|
160
|
+
|
|
161
|
+
### 4. Access the API documentation
|
|
162
|
+
|
|
163
|
+
Open your browser and navigate to:
|
|
164
|
+
- Swagger UI: `http://localhost:7777/api/docs`
|
|
165
|
+
- ReDoc: `http://localhost:7777/api/redoc`
|
|
166
|
+
|
|
167
|
+
### 5. Start a worker (optional)
|
|
168
|
+
|
|
169
|
+
To process agent execution workflows:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
python worker.py
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Package Structure
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
app/
|
|
179
|
+
├── activities/ # Temporal activities
|
|
180
|
+
├── lib/ # Client libraries and utilities
|
|
181
|
+
│ ├── event_bus/ # Event bus abstraction (multi-provider)
|
|
182
|
+
│ │ ├── base.py # Provider interface
|
|
183
|
+
│ │ ├── manager.py # Manager orchestrator
|
|
184
|
+
│ │ └── providers/ # HTTP, Redis, WebSocket, NATS providers
|
|
185
|
+
│ ├── redis_client.py # Redis connection
|
|
186
|
+
│ └── temporal_client.py # Temporal connection
|
|
187
|
+
├── middleware/ # FastAPI middleware (auth, etc.)
|
|
188
|
+
├── models/ # SQLAlchemy models
|
|
189
|
+
├── policies/ # OPA policy files (.rego)
|
|
190
|
+
├── routers/ # FastAPI route handlers
|
|
191
|
+
├── services/ # Business logic services
|
|
192
|
+
├── skills/ # Agent skills
|
|
193
|
+
├── workflows/ # Temporal workflows
|
|
194
|
+
├── config.py # Configuration management
|
|
195
|
+
├── database.py # Database connection
|
|
196
|
+
└── main.py # FastAPI application entry point
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## API Endpoints
|
|
200
|
+
|
|
201
|
+
### Core Resources
|
|
202
|
+
|
|
203
|
+
- **Projects**: `/api/v1/projects` - Multi-project management
|
|
204
|
+
- **Environments**: `/api/v1/environments` - Environment configuration
|
|
205
|
+
- **Agents**: `/api/v1/agents` - Agent management
|
|
206
|
+
- **Teams**: `/api/v1/teams` - Team management
|
|
207
|
+
- **Workflows**: `/api/v1/workflows` - Workflow definitions
|
|
208
|
+
- **Executions**: `/api/v1/executions` - Execution tracking
|
|
209
|
+
- **Workers**: `/api/v1/workers` - Worker registration and management
|
|
210
|
+
|
|
211
|
+
### Skills and Policies
|
|
212
|
+
|
|
213
|
+
- **Skills**: `/api/v1/skills` - Tool sets and definitions
|
|
214
|
+
- **Policies**: `/api/v1/policies` - Policy management and enforcement
|
|
215
|
+
|
|
216
|
+
### Integration
|
|
217
|
+
|
|
218
|
+
- **Secrets**: `/api/v1/secrets` - Secrets management (proxies to Kubiya)
|
|
219
|
+
- **Integrations**: `/api/v1/integrations` - Third-party integrations
|
|
220
|
+
- **Models**: `/api/v1/models` - LLM model configuration
|
|
221
|
+
|
|
222
|
+
### Utilities
|
|
223
|
+
|
|
224
|
+
- **Health**: `/api/health` - Health check endpoint
|
|
225
|
+
- **Event Bus Health**: `/api/health/event-bus` - Event bus provider health
|
|
226
|
+
- **Task Planning**: `/api/v1/task-planning` - AI-powered task planning
|
|
227
|
+
|
|
228
|
+
## Configuration
|
|
229
|
+
|
|
230
|
+
The application uses Pydantic Settings for configuration management. All settings can be configured via environment variables or a `.env` file.
|
|
231
|
+
|
|
232
|
+
### Key Configuration Options
|
|
233
|
+
|
|
234
|
+
- `DATABASE_URL`: PostgreSQL connection string
|
|
235
|
+
- `SUPABASE_URL`, `SUPABASE_KEY`: Supabase configuration for serverless
|
|
236
|
+
- `TEMPORAL_HOST`: Temporal server address
|
|
237
|
+
- `KUBIYA_API_KEY`: Kubiya platform API key
|
|
238
|
+
- `SECRET_KEY`: Secret key for JWT token signing
|
|
239
|
+
- `LOG_LEVEL`: Logging level (debug, info, warning, error)
|
|
240
|
+
- `ENVIRONMENT`: Deployment environment (development, staging, production)
|
|
241
|
+
|
|
242
|
+
## Development
|
|
243
|
+
|
|
244
|
+
### Install development dependencies
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
pip install -e ".[dev]"
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Run tests
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
# All tests
|
|
254
|
+
pytest
|
|
255
|
+
|
|
256
|
+
# Unit tests only
|
|
257
|
+
pytest -m unit
|
|
258
|
+
|
|
259
|
+
# Integration tests
|
|
260
|
+
pytest -m integration
|
|
261
|
+
|
|
262
|
+
# With coverage
|
|
263
|
+
pytest --cov=app --cov-report=html
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Code formatting
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
# Format code with black
|
|
270
|
+
black .
|
|
271
|
+
|
|
272
|
+
# Lint with ruff
|
|
273
|
+
ruff check .
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Database migrations
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Create a new migration
|
|
280
|
+
alembic revision --autogenerate -m "Description of changes"
|
|
281
|
+
|
|
282
|
+
# Apply migrations
|
|
283
|
+
alembic upgrade head
|
|
284
|
+
|
|
285
|
+
# Rollback migration
|
|
286
|
+
alembic downgrade -1
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Deployment
|
|
290
|
+
|
|
291
|
+
### Docker
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
docker build -t control_plane_api .
|
|
295
|
+
docker run -p 7777:7777 --env-file .env control_plane_api
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Vercel (Serverless)
|
|
299
|
+
|
|
300
|
+
The API is configured for Vercel deployment with `vercel.json` and the Mangum adapter.
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
vercel deploy
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Architecture
|
|
307
|
+
|
|
308
|
+
### Workflow Orchestration
|
|
309
|
+
|
|
310
|
+
The platform uses Temporal for reliable workflow execution:
|
|
311
|
+
- Durable execution with automatic retries
|
|
312
|
+
- Activity-based task decomposition
|
|
313
|
+
- Support for long-running workflows
|
|
314
|
+
- Built-in observability and monitoring
|
|
315
|
+
|
|
316
|
+
### Multi-tenancy
|
|
317
|
+
|
|
318
|
+
- **Projects**: Top-level isolation boundary
|
|
319
|
+
- **Environments**: Isolated execution contexts within projects
|
|
320
|
+
- **Teams**: Collaborative agent groups
|
|
321
|
+
- **Agents**: Individual agent instances
|
|
322
|
+
|
|
323
|
+
### Worker Architecture
|
|
324
|
+
|
|
325
|
+
Workers pull tasks from environment-specific queues and execute agent workflows using Temporal.
|
|
326
|
+
|
|
327
|
+
## Contributing
|
|
328
|
+
|
|
329
|
+
1. Fork the repository
|
|
330
|
+
2. Create a feature branch
|
|
331
|
+
3. Make your changes
|
|
332
|
+
4. Run tests and linting
|
|
333
|
+
5. Submit a pull request
|
|
334
|
+
|
|
335
|
+
## License
|
|
336
|
+
|
|
337
|
+
GNU Affero General Public License v3.0 (AGPL-3.0) - see LICENSE file for details
|
|
338
|
+
|
|
339
|
+
## Support
|
|
340
|
+
|
|
341
|
+
For issues and questions:
|
|
342
|
+
- GitHub Issues: https://github.com/kubiyabot/agent-control-plane/issues
|
|
343
|
+
- Email: support@kubiya.ai
|
|
344
|
+
|
|
345
|
+
## Links
|
|
346
|
+
|
|
347
|
+
- [Documentation](https://github.com/kubiyabot/agent-control-plane/blob/main/README.md)
|
|
348
|
+
- [GitHub Repository](https://github.com/kubiyabot/agent-control-plane)
|
|
349
|
+
- [Kubiya Platform](https://kubiya.ai)
|
|
350
|
+
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""DEPRECATED: Use control_plane_api.version instead
|
|
2
|
+
|
|
3
|
+
This file is kept for backward compatibility only.
|
|
4
|
+
All new code should import from control_plane_api.version
|
|
5
|
+
"""
|
|
6
|
+
from control_plane_api.version import get_sdk_version, __version__
|
|
7
|
+
|
|
8
|
+
__all__ = ["__version__", "get_sdk_version"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Generic single-database configuration.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
from logging.config import fileConfig
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import engine_from_config
|
|
4
|
+
from sqlalchemy import pool
|
|
5
|
+
|
|
6
|
+
from alembic import context
|
|
7
|
+
|
|
8
|
+
# Import application settings and models
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
# Add parent directory to path so control_plane_api is importable
|
|
13
|
+
# env.py location: /app/control_plane_api/alembic/env.py
|
|
14
|
+
# We need: /app (which is parent.parent.parent)
|
|
15
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent))
|
|
16
|
+
|
|
17
|
+
from control_plane_api.app.config import settings
|
|
18
|
+
from control_plane_api.app.database import Base
|
|
19
|
+
|
|
20
|
+
from control_plane_api.app.models.project import Project, ProjectStatus
|
|
21
|
+
from control_plane_api.app.models.agent import Agent, AgentStatus, RuntimeType as AgentRuntimeType
|
|
22
|
+
from control_plane_api.app.models.team import Team, TeamStatus, RuntimeType as TeamRuntimeType
|
|
23
|
+
from control_plane_api.app.models.session import Session
|
|
24
|
+
from control_plane_api.app.models.execution import Execution, ExecutionStatus, ExecutionType, ExecutionTriggerSource
|
|
25
|
+
from control_plane_api.app.models.execution_transition import ExecutionTransition
|
|
26
|
+
from control_plane_api.app.models.environment import Environment, EnvironmentStatus
|
|
27
|
+
from control_plane_api.app.models.associations import AgentEnvironment, TeamEnvironment, ExecutionParticipant, ParticipantRole
|
|
28
|
+
from control_plane_api.app.models.job import Job, JobExecution, JobStatus, JobTriggerType, ExecutorType, PlanningMode
|
|
29
|
+
from control_plane_api.app.models.skill import Skill, SkillAssociation, SlashCommand, SlashCommandExecution, SkillType, SkillEntityType, SlashCommandStatus
|
|
30
|
+
from control_plane_api.app.models.worker import Worker, WorkerHeartbeat, WorkerQueue, OrchestrationServer, OrchestrationServerHealth, WorkerStatus, WorkerRegistrationStatus, QueueStatus, ServerHealthStatus
|
|
31
|
+
from control_plane_api.app.models.orchestration import Namespace
|
|
32
|
+
from control_plane_api.app.models.context import AgentContext, EnvironmentContext, ProjectContext, TeamContext, ContextResource
|
|
33
|
+
from control_plane_api.app.models.analytics import ExecutionTurn, ExecutionToolCall, ExecutionTask
|
|
34
|
+
from control_plane_api.app.models.project_management import Profile, ProjectAgent, ProjectTeam
|
|
35
|
+
from control_plane_api.app.models.llm_model import LLMModel
|
|
36
|
+
from control_plane_api.app.models.presence import UserPresence
|
|
37
|
+
from control_plane_api.app.models.workflow import Workflow
|
|
38
|
+
from control_plane_api.app.models.system_tables import (PolicyAssociation)
|
|
39
|
+
# NOTE: auth_user is NOT imported because auth.users is an external table managed by Supabase
|
|
40
|
+
# The foreign key from profiles uses use_alter=True to handle the reference
|
|
41
|
+
from control_plane_api.app.models.workspace import Workspace
|
|
42
|
+
from control_plane_api.app.models.user_profile import UserProfile
|
|
43
|
+
from control_plane_api.app.models.plan_execution import PlanExecution, PlanExecutionStatus
|
|
44
|
+
from control_plane_api.app.models.trace import Trace, Span, TraceStatus, SpanKind, SpanStatusCode
|
|
45
|
+
from control_plane_api.app.models.custom_integration import CustomIntegration, CustomIntegrationStatus
|
|
46
|
+
|
|
47
|
+
# this is the Alembic Config object, which provides
|
|
48
|
+
# access to the values within the .ini file in use.
|
|
49
|
+
config = context.config
|
|
50
|
+
|
|
51
|
+
# Override sqlalchemy.url with our DATABASE_URL from settings
|
|
52
|
+
if settings.database_url:
|
|
53
|
+
# Escape % characters for ConfigParser (% -> %%)
|
|
54
|
+
escaped_url = settings.database_url.replace("%", "%%")
|
|
55
|
+
config.set_main_option("sqlalchemy.url", escaped_url)
|
|
56
|
+
|
|
57
|
+
# Interpret the config file for Python logging.
|
|
58
|
+
# This line sets up loggers basically.
|
|
59
|
+
if config.config_file_name is not None:
|
|
60
|
+
fileConfig(config.config_file_name)
|
|
61
|
+
|
|
62
|
+
# add your model's MetaData object here
|
|
63
|
+
# for 'autogenerate' support
|
|
64
|
+
target_metadata = Base.metadata
|
|
65
|
+
|
|
66
|
+
# other values from the config, defined by the needs of env.py,
|
|
67
|
+
# can be acquired:
|
|
68
|
+
# my_important_option = config.get_main_option("my_important_option")
|
|
69
|
+
# ... etc.
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def run_migrations_offline() -> None:
|
|
73
|
+
"""Run migrations in 'offline' mode.
|
|
74
|
+
|
|
75
|
+
This configures the context with just a URL
|
|
76
|
+
and not an Engine, though an Engine is acceptable
|
|
77
|
+
here as well. By skipping the Engine creation
|
|
78
|
+
we don't even need a DBAPI to be available.
|
|
79
|
+
|
|
80
|
+
Calls to context.execute() here emit the given string to the
|
|
81
|
+
script output.
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
url = config.get_main_option("sqlalchemy.url")
|
|
85
|
+
context.configure(
|
|
86
|
+
url=url,
|
|
87
|
+
target_metadata=target_metadata,
|
|
88
|
+
literal_binds=True,
|
|
89
|
+
dialect_opts={"paramstyle": "named"},
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
with context.begin_transaction():
|
|
93
|
+
context.run_migrations()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def run_migrations_online() -> None:
|
|
97
|
+
"""Run migrations in 'online' mode.
|
|
98
|
+
|
|
99
|
+
In this scenario we need to create an Engine
|
|
100
|
+
and associate a connection with the context.
|
|
101
|
+
|
|
102
|
+
"""
|
|
103
|
+
connectable = engine_from_config(
|
|
104
|
+
config.get_section(config.config_ini_section, {}),
|
|
105
|
+
prefix="sqlalchemy.",
|
|
106
|
+
poolclass=pool.NullPool,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
with connectable.connect() as connection:
|
|
110
|
+
context.configure(
|
|
111
|
+
connection=connection, target_metadata=target_metadata
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
with context.begin_transaction():
|
|
115
|
+
context.run_migrations()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
if context.is_offline_mode():
|
|
119
|
+
run_migrations_offline()
|
|
120
|
+
else:
|
|
121
|
+
run_migrations_online()
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""${message}
|
|
2
|
+
|
|
3
|
+
Revision ID: ${up_revision}
|
|
4
|
+
Revises: ${down_revision | comma,n}
|
|
5
|
+
Create Date: ${create_date}
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from typing import Sequence, Union
|
|
9
|
+
|
|
10
|
+
from alembic import op
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
${imports if imports else ""}
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = ${repr(up_revision)}
|
|
16
|
+
down_revision: Union[str, Sequence[str], None] = ${repr(down_revision)}
|
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
|
|
18
|
+
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Upgrade schema."""
|
|
23
|
+
${upgrades if upgrades else "pass"}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
"""Downgrade schema."""
|
|
28
|
+
${downgrades if downgrades else "pass"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""initial_database_setup
|
|
2
|
+
|
|
3
|
+
Revision ID: 2613c65c3dbe
|
|
4
|
+
Revises:
|
|
5
|
+
Create Date: 2025-11-18 15:17:49.174839
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from typing import Sequence, Union
|
|
9
|
+
|
|
10
|
+
from alembic import op
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = '2613c65c3dbe'
|
|
16
|
+
down_revision: Union[str, Sequence[str], None] = None
|
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
18
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Upgrade schema."""
|
|
23
|
+
# Create PostgreSQL extensions required for the application
|
|
24
|
+
op.execute('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"')
|
|
25
|
+
op.execute('CREATE EXTENSION IF NOT EXISTS "pg_trgm"')
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def downgrade() -> None:
|
|
29
|
+
"""Downgrade schema."""
|
|
30
|
+
# Drop PostgreSQL extensions
|
|
31
|
+
op.execute('DROP EXTENSION IF EXISTS "pg_trgm"')
|
|
32
|
+
op.execute('DROP EXTENSION IF EXISTS "uuid-ossp"')
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""merge_heads
|
|
2
|
+
|
|
3
|
+
Revision ID: 2df520d4927d
|
|
4
|
+
Revises: add_model_type_to_llm_models, 91520433aafc
|
|
5
|
+
Create Date: 2025-12-08 14:55:51.006126
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from typing import Sequence, Union
|
|
9
|
+
|
|
10
|
+
from alembic import op
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = '2df520d4927d'
|
|
16
|
+
down_revision: Union[str, Sequence[str], None] = ('add_model_type_to_llm_models', '91520433aafc')
|
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
18
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Upgrade schema."""
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
"""Downgrade schema."""
|
|
28
|
+
pass
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""add_paused_status_to_executions
|
|
2
|
+
|
|
3
|
+
Adds PAUSED status to the executionstatus enum type,
|
|
4
|
+
enabling pause/resume functionality for executions.
|
|
5
|
+
|
|
6
|
+
Revision ID: 43abf98d6a01
|
|
7
|
+
Revises: 2df520d4927d
|
|
8
|
+
Create Date: 2025-12-08 14:55:54.974711
|
|
9
|
+
|
|
10
|
+
"""
|
|
11
|
+
from typing import Sequence, Union
|
|
12
|
+
|
|
13
|
+
from alembic import op
|
|
14
|
+
import sqlalchemy as sa
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# revision identifiers, used by Alembic.
|
|
18
|
+
revision: str = '43abf98d6a01'
|
|
19
|
+
down_revision: Union[str, Sequence[str], None] = '2df520d4927d'
|
|
20
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
21
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def upgrade() -> None:
|
|
25
|
+
"""
|
|
26
|
+
Add 'paused' value to executionstatus enum.
|
|
27
|
+
|
|
28
|
+
Note: The status column in the executions table is actually String(50) in the ORM,
|
|
29
|
+
but we add this to the enum type for database-level validation if it exists.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
op.execute("""
|
|
33
|
+
DO $$
|
|
34
|
+
BEGIN
|
|
35
|
+
-- Check if executionstatus enum type exists
|
|
36
|
+
IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'executionstatus') THEN
|
|
37
|
+
-- Check if 'paused' value doesn't already exist
|
|
38
|
+
IF NOT EXISTS (
|
|
39
|
+
SELECT 1 FROM pg_enum
|
|
40
|
+
WHERE enumlabel = 'paused'
|
|
41
|
+
AND enumtypid = (SELECT oid FROM pg_type WHERE typname = 'executionstatus')
|
|
42
|
+
) THEN
|
|
43
|
+
ALTER TYPE executionstatus ADD VALUE 'paused';
|
|
44
|
+
RAISE NOTICE 'Added "paused" value to executionstatus enum';
|
|
45
|
+
ELSE
|
|
46
|
+
RAISE NOTICE '"paused" value already exists in executionstatus enum';
|
|
47
|
+
END IF;
|
|
48
|
+
ELSE
|
|
49
|
+
RAISE NOTICE 'executionstatus enum does not exist (column is String type) - no action needed';
|
|
50
|
+
END IF;
|
|
51
|
+
END $$;
|
|
52
|
+
""")
|
|
53
|
+
|
|
54
|
+
# Update type comment
|
|
55
|
+
op.execute("""
|
|
56
|
+
DO $$
|
|
57
|
+
BEGIN
|
|
58
|
+
IF EXISTS (SELECT 1 FROM pg_type WHERE typname = 'executionstatus') THEN
|
|
59
|
+
COMMENT ON TYPE executionstatus IS
|
|
60
|
+
'Execution status: pending, running, waiting_for_input, paused, completed, failed, cancelled';
|
|
61
|
+
END IF;
|
|
62
|
+
END $$;
|
|
63
|
+
""")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def downgrade() -> None:
|
|
67
|
+
"""
|
|
68
|
+
Downgrade is not supported for enum value additions.
|
|
69
|
+
|
|
70
|
+
PostgreSQL does not support removing enum values without recreating
|
|
71
|
+
the type, which would require table recreation and downtime.
|
|
72
|
+
"""
|
|
73
|
+
pass
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""merge_multiple_heads
|
|
2
|
+
|
|
3
|
+
Revision ID: 6289854264cb
|
|
4
|
+
Revises: 6a4d4dc3d8dc, add_plan_executions, add_user_info_to_traces
|
|
5
|
+
Create Date: 2026-01-15 09:03:43.072711
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from typing import Sequence, Union
|
|
9
|
+
|
|
10
|
+
from alembic import op
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = '6289854264cb'
|
|
16
|
+
down_revision: Union[str, Sequence[str], None] = ('6a4d4dc3d8dc', 'add_plan_executions', 'add_user_info_to_traces')
|
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
18
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Upgrade schema."""
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
"""Downgrade schema."""
|
|
28
|
+
pass
|