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,531 @@
|
|
|
1
|
+
from fastapi import FastAPI
|
|
2
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
3
|
+
from contextlib import asynccontextmanager
|
|
4
|
+
import structlog
|
|
5
|
+
|
|
6
|
+
from control_plane_api.app.config import settings
|
|
7
|
+
from control_plane_api.app.routers import agents, teams, workflows, health, executions, presence, runners, workers, projects, models, models_v2, task_queues, worker_queues, environment_context, team_context, context_manager, skills, skills_definitions, environments, runtimes, secrets, integrations, custom_integrations, integration_templates, execution_environment, policies, task_planning, jobs, analytics, context_graph, templates, enforcer, auth, storage, client_config, traces, plan_executions
|
|
8
|
+
from control_plane_api.app.routers import agents_v2 # New multi-tenant agent router
|
|
9
|
+
from control_plane_api.app.routers import plan_generation_async # Async plan generation
|
|
10
|
+
from control_plane_api.app.routers import websocket_client # WebSocket client endpoint for execution streaming
|
|
11
|
+
from control_plane_api.app.routers import metrics as metrics_router # Prometheus metrics endpoint
|
|
12
|
+
from control_plane_api.app.routers import websocket_traces # WebSocket endpoint for trace streaming
|
|
13
|
+
from control_plane_api.app.routers import websocket_executions_status # WebSocket endpoint for kanban status updates
|
|
14
|
+
|
|
15
|
+
# Configure OpenTelemetry BEFORE importing instrumentation
|
|
16
|
+
from control_plane_api.app.observability import setup_telemetry, shutdown_telemetry
|
|
17
|
+
from control_plane_api.app.observability.middleware import TraceContextMiddleware
|
|
18
|
+
|
|
19
|
+
# Configure structured logging
|
|
20
|
+
import logging
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def add_trace_context_processor(logger, method_name, event_dict):
|
|
24
|
+
"""
|
|
25
|
+
Automatically inject OpenTelemetry trace context into all log messages.
|
|
26
|
+
|
|
27
|
+
This processor adds trace_id and span_id to every log, enabling:
|
|
28
|
+
1. Trace-log correlation (copy trace_id from logs → search in Jaeger)
|
|
29
|
+
2. Understanding which logs belong to which distributed trace
|
|
30
|
+
3. Debugging production issues by correlating logs with spans
|
|
31
|
+
|
|
32
|
+
Gracefully degrades if OpenTelemetry is not enabled or unavailable.
|
|
33
|
+
"""
|
|
34
|
+
try:
|
|
35
|
+
from control_plane_api.app.observability.optional import get_current_span
|
|
36
|
+
|
|
37
|
+
span = get_current_span()
|
|
38
|
+
if span and span.is_recording():
|
|
39
|
+
span_context = span.get_span_context()
|
|
40
|
+
if span_context and span_context.is_valid:
|
|
41
|
+
event_dict["trace_id"] = format(span_context.trace_id, '032x')
|
|
42
|
+
event_dict["span_id"] = format(span_context.span_id, '016x')
|
|
43
|
+
except Exception:
|
|
44
|
+
# Graceful degradation: logs work fine without trace context
|
|
45
|
+
pass
|
|
46
|
+
|
|
47
|
+
return event_dict
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
structlog.configure(
|
|
51
|
+
processors=[
|
|
52
|
+
structlog.contextvars.merge_contextvars,
|
|
53
|
+
structlog.processors.add_log_level,
|
|
54
|
+
add_trace_context_processor, # ← Automatically adds trace_id and span_id
|
|
55
|
+
structlog.processors.TimeStamper(fmt="iso"),
|
|
56
|
+
structlog.processors.JSONRenderer(),
|
|
57
|
+
],
|
|
58
|
+
wrapper_class=structlog.make_filtering_bound_logger(
|
|
59
|
+
getattr(logging, settings.log_level.upper(), logging.INFO)
|
|
60
|
+
),
|
|
61
|
+
logger_factory=structlog.PrintLoggerFactory(),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
logger = structlog.get_logger()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@asynccontextmanager
|
|
68
|
+
async def lifespan(app: FastAPI):
|
|
69
|
+
"""Application lifespan manager"""
|
|
70
|
+
# Initialize OpenTelemetry first
|
|
71
|
+
setup_telemetry()
|
|
72
|
+
|
|
73
|
+
logger.info(
|
|
74
|
+
"agent_control_plane_starting",
|
|
75
|
+
version=settings.api_version,
|
|
76
|
+
environment=settings.environment
|
|
77
|
+
)
|
|
78
|
+
# No database initialization needed for serverless
|
|
79
|
+
# Supabase client is initialized on-demand
|
|
80
|
+
|
|
81
|
+
# Start trace retention cleanup scheduler
|
|
82
|
+
retention_task = None
|
|
83
|
+
if getattr(settings, 'OTEL_LOCAL_STORAGE_ENABLED', True):
|
|
84
|
+
try:
|
|
85
|
+
from control_plane_api.app.services.trace_retention import start_retention_scheduler
|
|
86
|
+
retention_task = await start_retention_scheduler()
|
|
87
|
+
logger.info("trace_retention_scheduler_started")
|
|
88
|
+
except Exception as e:
|
|
89
|
+
logger.warning(
|
|
90
|
+
"trace_retention_scheduler_failed",
|
|
91
|
+
error=str(e),
|
|
92
|
+
message="Trace retention cleanup will not run automatically"
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
# Initialize event bus if configured
|
|
96
|
+
event_bus_manager = None
|
|
97
|
+
if hasattr(settings, 'event_bus') and settings.event_bus:
|
|
98
|
+
try:
|
|
99
|
+
from control_plane_api.app.lib.event_bus.manager import EventBusManager, EventBusManagerConfig
|
|
100
|
+
|
|
101
|
+
manager_config = EventBusManagerConfig(**settings.event_bus)
|
|
102
|
+
event_bus_manager = EventBusManager(manager_config)
|
|
103
|
+
await event_bus_manager.initialize()
|
|
104
|
+
|
|
105
|
+
# Store in app state for access by routes
|
|
106
|
+
app.state.event_bus = event_bus_manager
|
|
107
|
+
|
|
108
|
+
logger.info(
|
|
109
|
+
"event_bus_initialized",
|
|
110
|
+
providers=event_bus_manager.get_provider_names(),
|
|
111
|
+
count=len(event_bus_manager.providers)
|
|
112
|
+
)
|
|
113
|
+
except ImportError as e:
|
|
114
|
+
logger.warning(
|
|
115
|
+
"event_bus_dependencies_missing",
|
|
116
|
+
error=str(e),
|
|
117
|
+
message="Install event bus dependencies with: pip install kubiya-control-plane-api[event-bus]"
|
|
118
|
+
)
|
|
119
|
+
except Exception as e:
|
|
120
|
+
logger.error(
|
|
121
|
+
"event_bus_initialization_failed",
|
|
122
|
+
error=str(e),
|
|
123
|
+
message="Event bus will not be available"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# Log Prometheus metrics status
|
|
127
|
+
if settings.metrics_enabled:
|
|
128
|
+
logger.info("prometheus_metrics_enabled")
|
|
129
|
+
|
|
130
|
+
yield
|
|
131
|
+
|
|
132
|
+
# Stop retention scheduler
|
|
133
|
+
if retention_task:
|
|
134
|
+
try:
|
|
135
|
+
from control_plane_api.app.services.trace_retention import stop_retention_scheduler
|
|
136
|
+
await stop_retention_scheduler(retention_task)
|
|
137
|
+
logger.info("trace_retention_scheduler_stopped")
|
|
138
|
+
except Exception as e:
|
|
139
|
+
logger.warning("trace_retention_scheduler_stop_failed", error=str(e))
|
|
140
|
+
|
|
141
|
+
# Shutdown event bus
|
|
142
|
+
if event_bus_manager:
|
|
143
|
+
try:
|
|
144
|
+
await event_bus_manager.shutdown()
|
|
145
|
+
logger.info("event_bus_shutdown")
|
|
146
|
+
except Exception as e:
|
|
147
|
+
logger.error("event_bus_shutdown_failed", error=str(e))
|
|
148
|
+
|
|
149
|
+
# Shutdown OpenTelemetry and flush remaining spans
|
|
150
|
+
shutdown_telemetry()
|
|
151
|
+
|
|
152
|
+
logger.info("agent_control_plane_shutting_down")
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
# Create FastAPI application
|
|
156
|
+
app = FastAPI(
|
|
157
|
+
title=settings.api_title,
|
|
158
|
+
version=settings.api_version,
|
|
159
|
+
description="""
|
|
160
|
+
## Kubiya Agent Control Plane API
|
|
161
|
+
|
|
162
|
+
Complete API for managing AI agents, skills, integrations, and workflows.
|
|
163
|
+
|
|
164
|
+
### Features
|
|
165
|
+
- 🤖 **Agent Management** - Create and manage AI agents with custom skills
|
|
166
|
+
- 🔌 **Integrations** - Connect to databases, APIs, and services
|
|
167
|
+
- 🛠️ **Tool Sets** - Manage agent capabilities and tools
|
|
168
|
+
- 📊 **Workflows** - Orchestrate complex automation flows
|
|
169
|
+
- 🔐 **Security** - Secrets management and access control
|
|
170
|
+
- 📈 **Analytics** - Monitor agent performance and usage
|
|
171
|
+
|
|
172
|
+
### Getting Started
|
|
173
|
+
1. Obtain your API token from the Kubiya dashboard
|
|
174
|
+
2. Click "Authorize" button and enter your token
|
|
175
|
+
3. Explore the API endpoints organized by category
|
|
176
|
+
4. Try the interactive examples with "Try it out"
|
|
177
|
+
|
|
178
|
+
### Support
|
|
179
|
+
- [Documentation](https://docs.kubiya.ai)
|
|
180
|
+
- [API Reference](https://docs.kubiya.ai/api)
|
|
181
|
+
- [Support Portal](https://support.kubiya.ai)
|
|
182
|
+
""",
|
|
183
|
+
lifespan=lifespan,
|
|
184
|
+
# Disable lifespan for Vercel (will be "off" via Mangum)
|
|
185
|
+
openapi_url="/api/openapi.json",
|
|
186
|
+
docs_url="/api/docs",
|
|
187
|
+
redoc_url=None, # Using custom ReDoc page instead
|
|
188
|
+
# Configure OpenAPI security scheme for Swagger UI
|
|
189
|
+
swagger_ui_parameters={
|
|
190
|
+
"persistAuthorization": True, # Remember auth token across page refreshes
|
|
191
|
+
"deepLinking": True, # Enable deep linking for sharing specific endpoint URLs
|
|
192
|
+
"displayOperationId": False, # Hide operation IDs for cleaner UI
|
|
193
|
+
"defaultModelsExpandDepth": 1, # Collapse models by default
|
|
194
|
+
"defaultModelExpandDepth": 1, # Show only first level of model properties
|
|
195
|
+
"displayRequestDuration": True, # Show request duration in UI
|
|
196
|
+
"filter": True, # Enable search/filter functionality
|
|
197
|
+
"showExtensions": True, # Show vendor extensions
|
|
198
|
+
"showCommonExtensions": True, # Show common extensions
|
|
199
|
+
"syntaxHighlight.theme": "monokai", # Better syntax highlighting theme
|
|
200
|
+
"docExpansion": "list", # Show tags/operations but collapse details (none/list/full)
|
|
201
|
+
},
|
|
202
|
+
contact={
|
|
203
|
+
"name": "Kubiya Support",
|
|
204
|
+
"url": "https://support.kubiya.ai",
|
|
205
|
+
"email": "support@kubiya.ai"
|
|
206
|
+
},
|
|
207
|
+
license_info={
|
|
208
|
+
"name": "Proprietary",
|
|
209
|
+
"url": "https://kubiya.ai/terms"
|
|
210
|
+
},
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Configure security scheme for OpenAPI/Swagger
|
|
214
|
+
from fastapi.openapi.utils import get_openapi
|
|
215
|
+
|
|
216
|
+
def custom_openapi():
|
|
217
|
+
if app.openapi_schema:
|
|
218
|
+
return app.openapi_schema
|
|
219
|
+
|
|
220
|
+
openapi_schema = get_openapi(
|
|
221
|
+
title=settings.api_title,
|
|
222
|
+
version=settings.api_version,
|
|
223
|
+
description=settings.api_description,
|
|
224
|
+
routes=app.routes,
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
# Add security scheme for Bearer token
|
|
228
|
+
openapi_schema["components"]["securitySchemes"] = {
|
|
229
|
+
"BearerAuth": {
|
|
230
|
+
"type": "http",
|
|
231
|
+
"scheme": "bearer",
|
|
232
|
+
"bearerFormat": "JWT",
|
|
233
|
+
"description": "Enter your Kubiya API token (format: Bearer <token>)",
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
# Apply security globally to all endpoints
|
|
238
|
+
openapi_schema["security"] = [{"BearerAuth": []}]
|
|
239
|
+
|
|
240
|
+
# Add tags metadata for better organization in Swagger UI
|
|
241
|
+
openapi_schema["tags"] = [
|
|
242
|
+
{
|
|
243
|
+
"name": "health",
|
|
244
|
+
"description": "🏥 **Health & Status** - Check API health and availability"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"name": "authentication",
|
|
248
|
+
"description": "🔐 **Authentication** - Token validation and auth management"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"name": "agents",
|
|
252
|
+
"description": "🤖 **Agents** - Create and manage AI agents with custom capabilities"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"name": "skills",
|
|
256
|
+
"description": "🛠️ **Tool Sets** - Manage agent skills and tool configurations"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"name": "integrations",
|
|
260
|
+
"description": "🔌 **Integrations** - Connect to external services (Kubiya managed)"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"name": "custom-integrations",
|
|
264
|
+
"description": "⚙️ **Custom Integrations** - User-defined integration instances with env vars, secrets, and files"
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
"name": "integration-templates",
|
|
268
|
+
"description": "📦 **Integration Templates** - Pre-configured templates for common services (PostgreSQL, Redis, MongoDB, etc.)"
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
"name": "secrets",
|
|
272
|
+
"description": "🔑 **Secrets** - Secure credential storage and retrieval"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"name": "teams",
|
|
276
|
+
"description": "👥 **Teams** - Team management and collaboration"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"name": "workflows",
|
|
280
|
+
"description": "📊 **Workflows** - Multi-step automation and orchestration"
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"name": "executions",
|
|
284
|
+
"description": "▶️ **Executions** - Track and monitor workflow runs"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"name": "jobs",
|
|
288
|
+
"description": "⏰ **Jobs** - Scheduled and webhook-triggered tasks"
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"name": "policies",
|
|
292
|
+
"description": "🛡️ **Policies** - Access control and security policies"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"name": "analytics",
|
|
296
|
+
"description": "📈 **Analytics** - Usage metrics and performance monitoring"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"name": "projects",
|
|
300
|
+
"description": "📁 **Projects** - Project organization and management"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"name": "environments",
|
|
304
|
+
"description": "🌍 **Environments** - Environment configuration (dev, staging, prod)"
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
"name": "models",
|
|
308
|
+
"description": "🧠 **Models** - LLM model configuration and management"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"name": "runtimes",
|
|
312
|
+
"description": "⚡ **Runtimes** - Agent execution runtime environments"
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"name": "workers",
|
|
316
|
+
"description": "👷 **Workers** - Worker registration and heartbeat monitoring"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"name": "storage",
|
|
320
|
+
"description": "💾 **Storage** - File storage and cloud integration"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"name": "context-graph",
|
|
324
|
+
"description": "🕸️ **Context Graph** - Knowledge graph and context management"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"name": "templates",
|
|
328
|
+
"description": "📝 **Templates** - Reusable configuration templates"
|
|
329
|
+
},
|
|
330
|
+
]
|
|
331
|
+
|
|
332
|
+
app.openapi_schema = openapi_schema
|
|
333
|
+
return app.openapi_schema
|
|
334
|
+
|
|
335
|
+
app.openapi = custom_openapi
|
|
336
|
+
|
|
337
|
+
# Add OpenTelemetry automatic instrumentation (optional - gracefully degrades if not available)
|
|
338
|
+
from control_plane_api.app.observability.optional import HAS_OPENTELEMETRY
|
|
339
|
+
|
|
340
|
+
if HAS_OPENTELEMETRY and settings.OTEL_ENABLED and settings.OTEL_EXPORTER_OTLP_ENDPOINT:
|
|
341
|
+
try:
|
|
342
|
+
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
|
|
343
|
+
from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor
|
|
344
|
+
from opentelemetry.instrumentation.redis import RedisInstrumentor
|
|
345
|
+
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
|
|
346
|
+
|
|
347
|
+
# Define paths to exclude from automatic instrumentation
|
|
348
|
+
# Health checks happen very frequently and don't need tracing
|
|
349
|
+
EXCLUDED_URLS = [
|
|
350
|
+
"/api/health",
|
|
351
|
+
"/health",
|
|
352
|
+
"/health/live",
|
|
353
|
+
"/health/ready",
|
|
354
|
+
"/health/detailed",
|
|
355
|
+
"/health/event-bus",
|
|
356
|
+
"/health/temporal-credentials",
|
|
357
|
+
"/ready",
|
|
358
|
+
"/metrics",
|
|
359
|
+
"/favicon.ico",
|
|
360
|
+
]
|
|
361
|
+
|
|
362
|
+
def should_exclude_url(url: str) -> bool:
|
|
363
|
+
"""Check if URL should be excluded from tracing."""
|
|
364
|
+
return any(url.startswith(excluded) for excluded in EXCLUDED_URLS)
|
|
365
|
+
|
|
366
|
+
# Instrument FastAPI (creates spans for all HTTP requests except health checks)
|
|
367
|
+
FastAPIInstrumentor.instrument_app(
|
|
368
|
+
app,
|
|
369
|
+
excluded_urls=",".join(EXCLUDED_URLS)
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
# Instrument SQLAlchemy (creates spans for database queries)
|
|
373
|
+
try:
|
|
374
|
+
from control_plane_api.app.database import engine
|
|
375
|
+
SQLAlchemyInstrumentor().instrument(engine=engine)
|
|
376
|
+
except Exception as e:
|
|
377
|
+
logger.warning("sqlalchemy_instrumentation_failed", error=str(e))
|
|
378
|
+
|
|
379
|
+
# Instrument Redis (creates spans for Redis operations)
|
|
380
|
+
try:
|
|
381
|
+
RedisInstrumentor().instrument()
|
|
382
|
+
except Exception as e:
|
|
383
|
+
logger.warning("redis_instrumentation_failed", error=str(e))
|
|
384
|
+
|
|
385
|
+
# Instrument HTTPX (creates spans for HTTP client calls)
|
|
386
|
+
try:
|
|
387
|
+
HTTPXClientInstrumentor().instrument()
|
|
388
|
+
except Exception as e:
|
|
389
|
+
logger.warning("httpx_instrumentation_failed", error=str(e))
|
|
390
|
+
|
|
391
|
+
logger.info("otel_automatic_instrumentation_enabled")
|
|
392
|
+
|
|
393
|
+
except ImportError as e:
|
|
394
|
+
logger.warning(
|
|
395
|
+
"otel_instrumentation_dependencies_missing",
|
|
396
|
+
error=str(e),
|
|
397
|
+
message="Some OTEL instrumentation packages may be missing"
|
|
398
|
+
)
|
|
399
|
+
except Exception as e:
|
|
400
|
+
logger.error("otel_instrumentation_failed", error=str(e), exc_info=True)
|
|
401
|
+
|
|
402
|
+
# Add custom trace context middleware (AFTER OTEL instrumentation)
|
|
403
|
+
if settings.OTEL_ENABLED and settings.OTEL_EXPORTER_OTLP_ENDPOINT:
|
|
404
|
+
app.add_middleware(TraceContextMiddleware)
|
|
405
|
+
|
|
406
|
+
# Add Prometheus metrics middleware (BEFORE CORS, AFTER TraceContext for trace_id access)
|
|
407
|
+
if settings.metrics_enabled:
|
|
408
|
+
from control_plane_api.app.middleware.prometheus_middleware import PrometheusMiddleware
|
|
409
|
+
app.add_middleware(PrometheusMiddleware)
|
|
410
|
+
logger.info("prometheus_metrics_middleware_enabled")
|
|
411
|
+
|
|
412
|
+
# Add CORS middleware
|
|
413
|
+
app.add_middleware(
|
|
414
|
+
CORSMiddleware,
|
|
415
|
+
allow_origins=settings.cors_origins,
|
|
416
|
+
allow_credentials=True,
|
|
417
|
+
allow_methods=["*"],
|
|
418
|
+
allow_headers=["*"],
|
|
419
|
+
)
|
|
420
|
+
|
|
421
|
+
# Include routers (all routes under /api/v1)
|
|
422
|
+
# NOTE: tags parameter is omitted to use tags defined in each router, preventing duplicates in Swagger UI
|
|
423
|
+
app.include_router(metrics_router.router) # Prometheus metrics endpoint at /metrics (no prefix)
|
|
424
|
+
app.include_router(health.router, prefix="/api")
|
|
425
|
+
app.include_router(auth.router) # Auth validation for delegated auth from other services
|
|
426
|
+
app.include_router(client_config.router, prefix="/api/v1") # Client configuration for service discovery
|
|
427
|
+
app.include_router(models_v2.router, prefix="/api/v1/models") # LLM models CRUD (database-backed)
|
|
428
|
+
app.include_router(runtimes.router, prefix="/api/v1") # Agent runtime types
|
|
429
|
+
app.include_router(secrets.router, prefix="/api/v1") # Kubiya secrets proxy
|
|
430
|
+
app.include_router(integrations.router, prefix="/api/v1") # Kubiya integrations proxy
|
|
431
|
+
app.include_router(custom_integrations.router, prefix="/api/v1") # Custom user-defined integrations
|
|
432
|
+
app.include_router(integration_templates.router, prefix="/api/v1") # Pre-configured integration templates
|
|
433
|
+
app.include_router(context_graph.router, prefix="/api/v1") # Context Graph API proxy
|
|
434
|
+
app.include_router(templates.router, prefix="/api/v1") # Template compilation and validation
|
|
435
|
+
app.include_router(execution_environment.router, prefix="/api/v1") # Resolved execution environment for workers
|
|
436
|
+
app.include_router(projects.router, prefix="/api/v1/projects") # Multi-project management
|
|
437
|
+
app.include_router(environments.router, prefix="/api/v1/environments") # Environment management
|
|
438
|
+
app.include_router(task_queues.router, prefix="/api/v1/task-queues") # Legacy endpoint (use /environments)
|
|
439
|
+
app.include_router(worker_queues.router, prefix="/api/v1") # Worker queue management per environment
|
|
440
|
+
app.include_router(environment_context.router, prefix="/api/v1") # Environment context management
|
|
441
|
+
app.include_router(team_context.router, prefix="/api/v1") # Team context management
|
|
442
|
+
app.include_router(context_manager.router, prefix="/api/v1") # Unified context management
|
|
443
|
+
app.include_router(skills_definitions.router, prefix="/api/v1/skills") # Skill definitions and templates (must be before skills.router)
|
|
444
|
+
app.include_router(skills.router, prefix="/api/v1/skills") # Tool sets management
|
|
445
|
+
app.include_router(enforcer.router, prefix="/api/v1") # OPA Watchdog enforcer proxy
|
|
446
|
+
app.include_router(policies.router, prefix="/api/v1/policies") # Policy management and enforcement
|
|
447
|
+
app.include_router(task_planning.router, prefix="/api/v1") # AI-powered task planning
|
|
448
|
+
app.include_router(plan_generation_async.router, prefix="/api/v1", tags=["Async Plan Generation"]) # Async plan generation
|
|
449
|
+
app.include_router(agents_v2.router, prefix="/api/v1/agents") # Use new multi-tenant router
|
|
450
|
+
app.include_router(runners.router, prefix="/api/v1/runners") # Proxy to Kubiya API
|
|
451
|
+
app.include_router(workers.router, prefix="/api/v1/workers") # Worker registration and heartbeats
|
|
452
|
+
app.include_router(teams.router, prefix="/api/v1/teams")
|
|
453
|
+
app.include_router(workflows.router, prefix="/api/v1/workflows")
|
|
454
|
+
app.include_router(executions.router, prefix="/api/v1/executions")
|
|
455
|
+
app.include_router(websocket_executions_status.router) # WebSocket endpoint for kanban status updates (MUST be before websocket_client to avoid {execution_id} capturing "status")
|
|
456
|
+
app.include_router(websocket_client.router) # WebSocket endpoint for client streaming
|
|
457
|
+
app.include_router(presence.router, prefix="/api/v1/presence")
|
|
458
|
+
app.include_router(jobs.router, prefix="/api/v1/jobs") # Scheduled and webhook-triggered jobs
|
|
459
|
+
app.include_router(analytics.router, prefix="/api/v1/analytics") # Execution metrics and reporting
|
|
460
|
+
app.include_router(storage.router, prefix="/api/v1/storage") # Remote filesystem and cloud storage
|
|
461
|
+
app.include_router(plan_executions.router, prefix="/api/v1/tasks/plan", tags=["Plan Execution"]) # Plan orchestration
|
|
462
|
+
app.include_router(traces.router, prefix="/api/v1") # OTEL traces and spans for observability
|
|
463
|
+
app.include_router(websocket_traces.router) # WebSocket endpoint for trace streaming
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
@app.get("/", include_in_schema=False)
|
|
467
|
+
async def root():
|
|
468
|
+
"""Root endpoint - Beautiful landing page with service status"""
|
|
469
|
+
from fastapi.responses import HTMLResponse
|
|
470
|
+
from pathlib import Path
|
|
471
|
+
|
|
472
|
+
template_path = Path(__file__).parent / "templates" / "index.html"
|
|
473
|
+
|
|
474
|
+
if template_path.exists():
|
|
475
|
+
html_content = template_path.read_text()
|
|
476
|
+
# Replace template variables
|
|
477
|
+
html_content = html_content.replace("{{ version }}", settings.api_version)
|
|
478
|
+
return HTMLResponse(content=html_content)
|
|
479
|
+
|
|
480
|
+
# Fallback to JSON if template not found
|
|
481
|
+
return {
|
|
482
|
+
"message": "Welcome to Agent Control Plane",
|
|
483
|
+
"version": settings.api_version,
|
|
484
|
+
"environment": settings.environment,
|
|
485
|
+
"docs": "/api/docs" if settings.environment != "production" else None,
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
@app.get("/api/spec", include_in_schema=False)
|
|
490
|
+
async def openapi_viewer():
|
|
491
|
+
"""OpenAPI JSON viewer with search and formatting"""
|
|
492
|
+
from fastapi.responses import HTMLResponse
|
|
493
|
+
from pathlib import Path
|
|
494
|
+
|
|
495
|
+
template_path = Path(__file__).parent / "templates" / "openapi-viewer.html"
|
|
496
|
+
|
|
497
|
+
if template_path.exists():
|
|
498
|
+
html_content = template_path.read_text()
|
|
499
|
+
return HTMLResponse(content=html_content)
|
|
500
|
+
|
|
501
|
+
# Fallback to raw JSON
|
|
502
|
+
from fastapi.responses import JSONResponse
|
|
503
|
+
return JSONResponse(content=app.openapi())
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
@app.get("/api")
|
|
507
|
+
async def api_root():
|
|
508
|
+
"""API root endpoint"""
|
|
509
|
+
return {
|
|
510
|
+
"message": "Agent Control Plane API",
|
|
511
|
+
"version": settings.api_version,
|
|
512
|
+
"endpoints": {
|
|
513
|
+
"projects": "/api/v1/projects",
|
|
514
|
+
"task_queues": "/api/v1/task-queues",
|
|
515
|
+
"agents": "/api/v1/agents",
|
|
516
|
+
"teams": "/api/v1/teams",
|
|
517
|
+
"skills": "/api/v1/skills",
|
|
518
|
+
"policies": "/api/v1/policies",
|
|
519
|
+
"workflows": "/api/v1/workflows",
|
|
520
|
+
"executions": "/api/v1/executions",
|
|
521
|
+
"presence": "/api/v1/presence",
|
|
522
|
+
"runners": "/api/v1/runners",
|
|
523
|
+
"workers": "/api/v1/workers",
|
|
524
|
+
"models": "/api/v1/models",
|
|
525
|
+
"runtimes": "/api/v1/runtimes",
|
|
526
|
+
"secrets": "/api/v1/secrets",
|
|
527
|
+
"integrations": "/api/v1/integrations",
|
|
528
|
+
"context_graph": "/api/v1/context-graph",
|
|
529
|
+
"health": "/api/health",
|
|
530
|
+
}
|
|
531
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"""Middleware modules"""
|
|
2
|
+
|
|
3
|
+
from control_plane_api.app.middleware.auth import get_current_organization, extract_token_from_headers
|
|
4
|
+
from control_plane_api.app.middleware.prometheus_middleware import PrometheusMiddleware
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
"get_current_organization",
|
|
8
|
+
"extract_token_from_headers",
|
|
9
|
+
"PrometheusMiddleware",
|
|
10
|
+
]
|