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.
Files changed (479) hide show
  1. control_plane_api/LICENSE +676 -0
  2. control_plane_api/README.md +350 -0
  3. control_plane_api/__init__.py +4 -0
  4. control_plane_api/__version__.py +8 -0
  5. control_plane_api/alembic/README +1 -0
  6. control_plane_api/alembic/env.py +121 -0
  7. control_plane_api/alembic/script.py.mako +28 -0
  8. control_plane_api/alembic/versions/2613c65c3dbe_initial_database_setup.py +32 -0
  9. control_plane_api/alembic/versions/2df520d4927d_merge_heads.py +28 -0
  10. control_plane_api/alembic/versions/43abf98d6a01_add_paused_status_to_executions.py +73 -0
  11. control_plane_api/alembic/versions/6289854264cb_merge_multiple_heads.py +28 -0
  12. control_plane_api/alembic/versions/6a4d4dc3d8dc_generate_execution_transitions.py +50 -0
  13. control_plane_api/alembic/versions/87d11cf0a783_add_disconnected_status_to_worker_.py +44 -0
  14. control_plane_api/alembic/versions/add_ephemeral_queue_support.py +85 -0
  15. control_plane_api/alembic/versions/add_model_type_to_llm_models.py +31 -0
  16. control_plane_api/alembic/versions/add_plan_executions_table.py +114 -0
  17. control_plane_api/alembic/versions/add_trace_span_tables.py +154 -0
  18. control_plane_api/alembic/versions/add_user_info_to_traces.py +36 -0
  19. control_plane_api/alembic/versions/adjusting_foreign_keys.py +32 -0
  20. control_plane_api/alembic/versions/b4983d976db2_initial_tables.py +1128 -0
  21. control_plane_api/alembic/versions/d181a3b40e71_rename_custom_metadata_to_metadata_in_.py +50 -0
  22. control_plane_api/alembic/versions/df9117888e82_add_missing_columns.py +82 -0
  23. control_plane_api/alembic/versions/f25de6ad895a_missing_migrations.py +34 -0
  24. control_plane_api/alembic/versions/f71305fb69b9_fix_ephemeral_queue_deletion_foreign_key.py +54 -0
  25. control_plane_api/alembic/versions/mark_local_exec_queues_as_ephemeral.py +68 -0
  26. control_plane_api/alembic.ini +148 -0
  27. control_plane_api/api/index.py +12 -0
  28. control_plane_api/app/__init__.py +11 -0
  29. control_plane_api/app/activities/__init__.py +20 -0
  30. control_plane_api/app/activities/agent_activities.py +384 -0
  31. control_plane_api/app/activities/plan_generation_activities.py +499 -0
  32. control_plane_api/app/activities/team_activities.py +424 -0
  33. control_plane_api/app/activities/temporal_cloud_activities.py +588 -0
  34. control_plane_api/app/config/__init__.py +35 -0
  35. control_plane_api/app/config/api_config.py +469 -0
  36. control_plane_api/app/config/config_loader.py +224 -0
  37. control_plane_api/app/config/model_pricing.py +323 -0
  38. control_plane_api/app/config/storage_config.py +159 -0
  39. control_plane_api/app/config.py +115 -0
  40. control_plane_api/app/controllers/__init__.py +0 -0
  41. control_plane_api/app/controllers/execution_environment_controller.py +1315 -0
  42. control_plane_api/app/database.py +135 -0
  43. control_plane_api/app/exceptions.py +408 -0
  44. control_plane_api/app/lib/__init__.py +11 -0
  45. control_plane_api/app/lib/environment.py +65 -0
  46. control_plane_api/app/lib/event_bus/__init__.py +17 -0
  47. control_plane_api/app/lib/event_bus/base.py +136 -0
  48. control_plane_api/app/lib/event_bus/manager.py +335 -0
  49. control_plane_api/app/lib/event_bus/providers/__init__.py +6 -0
  50. control_plane_api/app/lib/event_bus/providers/http_provider.py +166 -0
  51. control_plane_api/app/lib/event_bus/providers/nats_provider.py +324 -0
  52. control_plane_api/app/lib/event_bus/providers/redis_provider.py +233 -0
  53. control_plane_api/app/lib/event_bus/providers/websocket_provider.py +497 -0
  54. control_plane_api/app/lib/job_executor.py +330 -0
  55. control_plane_api/app/lib/kubiya_client.py +293 -0
  56. control_plane_api/app/lib/litellm_pricing.py +166 -0
  57. control_plane_api/app/lib/mcp_validation.py +163 -0
  58. control_plane_api/app/lib/nats/__init__.py +13 -0
  59. control_plane_api/app/lib/nats/credentials_manager.py +288 -0
  60. control_plane_api/app/lib/nats/listener.py +374 -0
  61. control_plane_api/app/lib/planning_prompt_builder.py +153 -0
  62. control_plane_api/app/lib/planning_tools/__init__.py +41 -0
  63. control_plane_api/app/lib/planning_tools/agents.py +409 -0
  64. control_plane_api/app/lib/planning_tools/agno_toolkit.py +836 -0
  65. control_plane_api/app/lib/planning_tools/base.py +119 -0
  66. control_plane_api/app/lib/planning_tools/cognitive_memory_tools.py +403 -0
  67. control_plane_api/app/lib/planning_tools/context_graph_tools.py +545 -0
  68. control_plane_api/app/lib/planning_tools/environments.py +218 -0
  69. control_plane_api/app/lib/planning_tools/knowledge.py +204 -0
  70. control_plane_api/app/lib/planning_tools/models.py +93 -0
  71. control_plane_api/app/lib/planning_tools/planning_service.py +646 -0
  72. control_plane_api/app/lib/planning_tools/resources.py +242 -0
  73. control_plane_api/app/lib/planning_tools/teams.py +334 -0
  74. control_plane_api/app/lib/policy_enforcer_client.py +1016 -0
  75. control_plane_api/app/lib/redis_client.py +803 -0
  76. control_plane_api/app/lib/sqlalchemy_utils.py +486 -0
  77. control_plane_api/app/lib/state_transition_tools/__init__.py +7 -0
  78. control_plane_api/app/lib/state_transition_tools/execution_context.py +388 -0
  79. control_plane_api/app/lib/storage/__init__.py +20 -0
  80. control_plane_api/app/lib/storage/base_provider.py +274 -0
  81. control_plane_api/app/lib/storage/provider_factory.py +157 -0
  82. control_plane_api/app/lib/storage/vercel_blob_provider.py +468 -0
  83. control_plane_api/app/lib/supabase.py +71 -0
  84. control_plane_api/app/lib/supabase_utils.py +138 -0
  85. control_plane_api/app/lib/task_planning/__init__.py +138 -0
  86. control_plane_api/app/lib/task_planning/agent_factory.py +308 -0
  87. control_plane_api/app/lib/task_planning/agents.py +389 -0
  88. control_plane_api/app/lib/task_planning/cache.py +218 -0
  89. control_plane_api/app/lib/task_planning/entity_resolver.py +273 -0
  90. control_plane_api/app/lib/task_planning/helpers.py +293 -0
  91. control_plane_api/app/lib/task_planning/hooks.py +474 -0
  92. control_plane_api/app/lib/task_planning/models.py +503 -0
  93. control_plane_api/app/lib/task_planning/plan_validator.py +166 -0
  94. control_plane_api/app/lib/task_planning/planning_workflow.py +2911 -0
  95. control_plane_api/app/lib/task_planning/runner.py +656 -0
  96. control_plane_api/app/lib/task_planning/streaming_hook.py +213 -0
  97. control_plane_api/app/lib/task_planning/workflow.py +424 -0
  98. control_plane_api/app/lib/templating/__init__.py +88 -0
  99. control_plane_api/app/lib/templating/compiler.py +278 -0
  100. control_plane_api/app/lib/templating/engine.py +178 -0
  101. control_plane_api/app/lib/templating/parsers/__init__.py +29 -0
  102. control_plane_api/app/lib/templating/parsers/base.py +96 -0
  103. control_plane_api/app/lib/templating/parsers/env.py +85 -0
  104. control_plane_api/app/lib/templating/parsers/graph.py +112 -0
  105. control_plane_api/app/lib/templating/parsers/secret.py +87 -0
  106. control_plane_api/app/lib/templating/parsers/simple.py +81 -0
  107. control_plane_api/app/lib/templating/resolver.py +366 -0
  108. control_plane_api/app/lib/templating/types.py +214 -0
  109. control_plane_api/app/lib/templating/validator.py +201 -0
  110. control_plane_api/app/lib/temporal_client.py +232 -0
  111. control_plane_api/app/lib/temporal_credentials_cache.py +178 -0
  112. control_plane_api/app/lib/temporal_credentials_service.py +203 -0
  113. control_plane_api/app/lib/validation/__init__.py +24 -0
  114. control_plane_api/app/lib/validation/runtime_validation.py +388 -0
  115. control_plane_api/app/main.py +531 -0
  116. control_plane_api/app/middleware/__init__.py +10 -0
  117. control_plane_api/app/middleware/auth.py +645 -0
  118. control_plane_api/app/middleware/exception_handler.py +267 -0
  119. control_plane_api/app/middleware/prometheus_middleware.py +173 -0
  120. control_plane_api/app/middleware/rate_limiting.py +384 -0
  121. control_plane_api/app/middleware/request_id.py +202 -0
  122. control_plane_api/app/models/__init__.py +40 -0
  123. control_plane_api/app/models/agent.py +90 -0
  124. control_plane_api/app/models/analytics.py +206 -0
  125. control_plane_api/app/models/associations.py +107 -0
  126. control_plane_api/app/models/auth_user.py +73 -0
  127. control_plane_api/app/models/context.py +161 -0
  128. control_plane_api/app/models/custom_integration.py +99 -0
  129. control_plane_api/app/models/environment.py +64 -0
  130. control_plane_api/app/models/execution.py +125 -0
  131. control_plane_api/app/models/execution_transition.py +50 -0
  132. control_plane_api/app/models/job.py +159 -0
  133. control_plane_api/app/models/llm_model.py +78 -0
  134. control_plane_api/app/models/orchestration.py +66 -0
  135. control_plane_api/app/models/plan_execution.py +102 -0
  136. control_plane_api/app/models/presence.py +49 -0
  137. control_plane_api/app/models/project.py +61 -0
  138. control_plane_api/app/models/project_management.py +85 -0
  139. control_plane_api/app/models/session.py +29 -0
  140. control_plane_api/app/models/skill.py +155 -0
  141. control_plane_api/app/models/system_tables.py +43 -0
  142. control_plane_api/app/models/task_planning.py +372 -0
  143. control_plane_api/app/models/team.py +86 -0
  144. control_plane_api/app/models/trace.py +257 -0
  145. control_plane_api/app/models/user_profile.py +54 -0
  146. control_plane_api/app/models/worker.py +221 -0
  147. control_plane_api/app/models/workflow.py +161 -0
  148. control_plane_api/app/models/workspace.py +50 -0
  149. control_plane_api/app/observability/__init__.py +177 -0
  150. control_plane_api/app/observability/context_logging.py +475 -0
  151. control_plane_api/app/observability/decorators.py +337 -0
  152. control_plane_api/app/observability/local_span_processor.py +702 -0
  153. control_plane_api/app/observability/metrics.py +303 -0
  154. control_plane_api/app/observability/middleware.py +246 -0
  155. control_plane_api/app/observability/optional.py +115 -0
  156. control_plane_api/app/observability/tracing.py +382 -0
  157. control_plane_api/app/policies/README.md +149 -0
  158. control_plane_api/app/policies/approved_users.rego +62 -0
  159. control_plane_api/app/policies/business_hours.rego +51 -0
  160. control_plane_api/app/policies/rate_limiting.rego +100 -0
  161. control_plane_api/app/policies/tool_enforcement/README.md +336 -0
  162. control_plane_api/app/policies/tool_enforcement/bash_command_validation.rego +71 -0
  163. control_plane_api/app/policies/tool_enforcement/business_hours_enforcement.rego +82 -0
  164. control_plane_api/app/policies/tool_enforcement/mcp_tool_allowlist.rego +58 -0
  165. control_plane_api/app/policies/tool_enforcement/production_safeguards.rego +80 -0
  166. control_plane_api/app/policies/tool_enforcement/role_based_tool_access.rego +44 -0
  167. control_plane_api/app/policies/tool_restrictions.rego +86 -0
  168. control_plane_api/app/routers/__init__.py +4 -0
  169. control_plane_api/app/routers/agents.py +382 -0
  170. control_plane_api/app/routers/agents_v2.py +1598 -0
  171. control_plane_api/app/routers/analytics.py +1310 -0
  172. control_plane_api/app/routers/auth.py +59 -0
  173. control_plane_api/app/routers/client_config.py +57 -0
  174. control_plane_api/app/routers/context_graph.py +561 -0
  175. control_plane_api/app/routers/context_manager.py +577 -0
  176. control_plane_api/app/routers/custom_integrations.py +490 -0
  177. control_plane_api/app/routers/enforcer.py +132 -0
  178. control_plane_api/app/routers/environment_context.py +252 -0
  179. control_plane_api/app/routers/environments.py +761 -0
  180. control_plane_api/app/routers/execution_environment.py +847 -0
  181. control_plane_api/app/routers/executions/__init__.py +28 -0
  182. control_plane_api/app/routers/executions/router.py +286 -0
  183. control_plane_api/app/routers/executions/services/__init__.py +22 -0
  184. control_plane_api/app/routers/executions/services/demo_worker_health.py +156 -0
  185. control_plane_api/app/routers/executions/services/status_service.py +420 -0
  186. control_plane_api/app/routers/executions/services/test_worker_health.py +480 -0
  187. control_plane_api/app/routers/executions/services/worker_health.py +514 -0
  188. control_plane_api/app/routers/executions/streaming/__init__.py +22 -0
  189. control_plane_api/app/routers/executions/streaming/deduplication.py +352 -0
  190. control_plane_api/app/routers/executions/streaming/event_buffer.py +353 -0
  191. control_plane_api/app/routers/executions/streaming/event_formatter.py +964 -0
  192. control_plane_api/app/routers/executions/streaming/history_loader.py +588 -0
  193. control_plane_api/app/routers/executions/streaming/live_source.py +693 -0
  194. control_plane_api/app/routers/executions/streaming/streamer.py +849 -0
  195. control_plane_api/app/routers/executions.py +4888 -0
  196. control_plane_api/app/routers/health.py +165 -0
  197. control_plane_api/app/routers/health_v2.py +394 -0
  198. control_plane_api/app/routers/integration_templates.py +496 -0
  199. control_plane_api/app/routers/integrations.py +287 -0
  200. control_plane_api/app/routers/jobs.py +1809 -0
  201. control_plane_api/app/routers/metrics.py +517 -0
  202. control_plane_api/app/routers/models.py +82 -0
  203. control_plane_api/app/routers/models_v2.py +628 -0
  204. control_plane_api/app/routers/plan_executions.py +1481 -0
  205. control_plane_api/app/routers/plan_generation_async.py +304 -0
  206. control_plane_api/app/routers/policies.py +669 -0
  207. control_plane_api/app/routers/presence.py +234 -0
  208. control_plane_api/app/routers/projects.py +987 -0
  209. control_plane_api/app/routers/runners.py +379 -0
  210. control_plane_api/app/routers/runtimes.py +172 -0
  211. control_plane_api/app/routers/secrets.py +171 -0
  212. control_plane_api/app/routers/skills.py +1010 -0
  213. control_plane_api/app/routers/skills_definitions.py +140 -0
  214. control_plane_api/app/routers/storage.py +456 -0
  215. control_plane_api/app/routers/task_planning.py +611 -0
  216. control_plane_api/app/routers/task_queues.py +650 -0
  217. control_plane_api/app/routers/team_context.py +274 -0
  218. control_plane_api/app/routers/teams.py +1747 -0
  219. control_plane_api/app/routers/templates.py +248 -0
  220. control_plane_api/app/routers/traces.py +571 -0
  221. control_plane_api/app/routers/websocket_client.py +479 -0
  222. control_plane_api/app/routers/websocket_executions_status.py +437 -0
  223. control_plane_api/app/routers/websocket_gateway.py +323 -0
  224. control_plane_api/app/routers/websocket_traces.py +576 -0
  225. control_plane_api/app/routers/worker_queues.py +2555 -0
  226. control_plane_api/app/routers/worker_websocket.py +419 -0
  227. control_plane_api/app/routers/workers.py +1004 -0
  228. control_plane_api/app/routers/workflows.py +204 -0
  229. control_plane_api/app/runtimes/__init__.py +6 -0
  230. control_plane_api/app/runtimes/validation.py +344 -0
  231. control_plane_api/app/schemas/__init__.py +1 -0
  232. control_plane_api/app/schemas/job_schemas.py +302 -0
  233. control_plane_api/app/schemas/mcp_schemas.py +311 -0
  234. control_plane_api/app/schemas/template_schemas.py +133 -0
  235. control_plane_api/app/schemas/trace_schemas.py +168 -0
  236. control_plane_api/app/schemas/worker_queue_observability_schemas.py +165 -0
  237. control_plane_api/app/services/__init__.py +1 -0
  238. control_plane_api/app/services/agno_planning_strategy.py +233 -0
  239. control_plane_api/app/services/agno_service.py +838 -0
  240. control_plane_api/app/services/claude_code_planning_service.py +203 -0
  241. control_plane_api/app/services/context_graph_client.py +224 -0
  242. control_plane_api/app/services/custom_integration_service.py +415 -0
  243. control_plane_api/app/services/integration_resolution_service.py +345 -0
  244. control_plane_api/app/services/litellm_service.py +394 -0
  245. control_plane_api/app/services/plan_generator.py +79 -0
  246. control_plane_api/app/services/planning_strategy.py +66 -0
  247. control_plane_api/app/services/planning_strategy_factory.py +118 -0
  248. control_plane_api/app/services/policy_service.py +615 -0
  249. control_plane_api/app/services/state_transition_service.py +755 -0
  250. control_plane_api/app/services/storage_service.py +593 -0
  251. control_plane_api/app/services/temporal_cloud_provisioning.py +150 -0
  252. control_plane_api/app/services/toolsets/context_graph_skill.py +432 -0
  253. control_plane_api/app/services/trace_retention.py +354 -0
  254. control_plane_api/app/services/worker_queue_metrics_service.py +190 -0
  255. control_plane_api/app/services/workflow_cancellation_manager.py +135 -0
  256. control_plane_api/app/services/workflow_operations_service.py +611 -0
  257. control_plane_api/app/skills/__init__.py +100 -0
  258. control_plane_api/app/skills/base.py +239 -0
  259. control_plane_api/app/skills/builtin/__init__.py +37 -0
  260. control_plane_api/app/skills/builtin/agent_communication/__init__.py +8 -0
  261. control_plane_api/app/skills/builtin/agent_communication/skill.py +246 -0
  262. control_plane_api/app/skills/builtin/code_ingestion/__init__.py +4 -0
  263. control_plane_api/app/skills/builtin/code_ingestion/skill.py +267 -0
  264. control_plane_api/app/skills/builtin/cognitive_memory/__init__.py +4 -0
  265. control_plane_api/app/skills/builtin/cognitive_memory/skill.py +174 -0
  266. control_plane_api/app/skills/builtin/contextual_awareness/__init__.py +4 -0
  267. control_plane_api/app/skills/builtin/contextual_awareness/skill.py +387 -0
  268. control_plane_api/app/skills/builtin/data_visualization/__init__.py +4 -0
  269. control_plane_api/app/skills/builtin/data_visualization/skill.py +154 -0
  270. control_plane_api/app/skills/builtin/docker/__init__.py +4 -0
  271. control_plane_api/app/skills/builtin/docker/skill.py +104 -0
  272. control_plane_api/app/skills/builtin/file_generation/__init__.py +4 -0
  273. control_plane_api/app/skills/builtin/file_generation/skill.py +94 -0
  274. control_plane_api/app/skills/builtin/file_system/__init__.py +4 -0
  275. control_plane_api/app/skills/builtin/file_system/skill.py +110 -0
  276. control_plane_api/app/skills/builtin/knowledge_api/__init__.py +5 -0
  277. control_plane_api/app/skills/builtin/knowledge_api/skill.py +124 -0
  278. control_plane_api/app/skills/builtin/python/__init__.py +4 -0
  279. control_plane_api/app/skills/builtin/python/skill.py +92 -0
  280. control_plane_api/app/skills/builtin/remote_filesystem/__init__.py +5 -0
  281. control_plane_api/app/skills/builtin/remote_filesystem/skill.py +170 -0
  282. control_plane_api/app/skills/builtin/shell/__init__.py +4 -0
  283. control_plane_api/app/skills/builtin/shell/skill.py +161 -0
  284. control_plane_api/app/skills/builtin/slack/__init__.py +3 -0
  285. control_plane_api/app/skills/builtin/slack/skill.py +302 -0
  286. control_plane_api/app/skills/builtin/workflow_executor/__init__.py +4 -0
  287. control_plane_api/app/skills/builtin/workflow_executor/skill.py +469 -0
  288. control_plane_api/app/skills/business_intelligence.py +189 -0
  289. control_plane_api/app/skills/config.py +63 -0
  290. control_plane_api/app/skills/loaders/__init__.py +14 -0
  291. control_plane_api/app/skills/loaders/base.py +73 -0
  292. control_plane_api/app/skills/loaders/filesystem_loader.py +199 -0
  293. control_plane_api/app/skills/registry.py +125 -0
  294. control_plane_api/app/utils/helpers.py +12 -0
  295. control_plane_api/app/utils/workflow_executor.py +354 -0
  296. control_plane_api/app/workflows/__init__.py +11 -0
  297. control_plane_api/app/workflows/agent_execution.py +520 -0
  298. control_plane_api/app/workflows/agent_execution_with_skills.py +223 -0
  299. control_plane_api/app/workflows/namespace_provisioning.py +326 -0
  300. control_plane_api/app/workflows/plan_generation.py +254 -0
  301. control_plane_api/app/workflows/team_execution.py +442 -0
  302. control_plane_api/scripts/seed_models.py +240 -0
  303. control_plane_api/scripts/validate_existing_tool_names.py +492 -0
  304. control_plane_api/shared/__init__.py +8 -0
  305. control_plane_api/shared/version.py +17 -0
  306. control_plane_api/test_deduplication.py +274 -0
  307. control_plane_api/test_executor_deduplication_e2e.py +309 -0
  308. control_plane_api/test_job_execution_e2e.py +283 -0
  309. control_plane_api/test_real_integration.py +193 -0
  310. control_plane_api/version.py +38 -0
  311. control_plane_api/worker/__init__.py +0 -0
  312. control_plane_api/worker/activities/__init__.py +0 -0
  313. control_plane_api/worker/activities/agent_activities.py +1585 -0
  314. control_plane_api/worker/activities/approval_activities.py +234 -0
  315. control_plane_api/worker/activities/job_activities.py +199 -0
  316. control_plane_api/worker/activities/runtime_activities.py +1167 -0
  317. control_plane_api/worker/activities/skill_activities.py +282 -0
  318. control_plane_api/worker/activities/team_activities.py +479 -0
  319. control_plane_api/worker/agent_runtime_server.py +370 -0
  320. control_plane_api/worker/binary_manager.py +333 -0
  321. control_plane_api/worker/config/__init__.py +31 -0
  322. control_plane_api/worker/config/worker_config.py +273 -0
  323. control_plane_api/worker/control_plane_client.py +1491 -0
  324. control_plane_api/worker/examples/analytics_integration_example.py +362 -0
  325. control_plane_api/worker/health_monitor.py +159 -0
  326. control_plane_api/worker/metrics.py +237 -0
  327. control_plane_api/worker/models/__init__.py +1 -0
  328. control_plane_api/worker/models/error_events.py +105 -0
  329. control_plane_api/worker/models/inputs.py +89 -0
  330. control_plane_api/worker/runtimes/__init__.py +35 -0
  331. control_plane_api/worker/runtimes/agent_runtime/runtime.py +485 -0
  332. control_plane_api/worker/runtimes/agno/__init__.py +34 -0
  333. control_plane_api/worker/runtimes/agno/config.py +248 -0
  334. control_plane_api/worker/runtimes/agno/hooks.py +385 -0
  335. control_plane_api/worker/runtimes/agno/mcp_builder.py +195 -0
  336. control_plane_api/worker/runtimes/agno/runtime.py +1063 -0
  337. control_plane_api/worker/runtimes/agno/utils.py +163 -0
  338. control_plane_api/worker/runtimes/base.py +979 -0
  339. control_plane_api/worker/runtimes/claude_code/__init__.py +38 -0
  340. control_plane_api/worker/runtimes/claude_code/cleanup.py +184 -0
  341. control_plane_api/worker/runtimes/claude_code/client_pool.py +529 -0
  342. control_plane_api/worker/runtimes/claude_code/config.py +829 -0
  343. control_plane_api/worker/runtimes/claude_code/hooks.py +482 -0
  344. control_plane_api/worker/runtimes/claude_code/litellm_proxy.py +1702 -0
  345. control_plane_api/worker/runtimes/claude_code/mcp_builder.py +467 -0
  346. control_plane_api/worker/runtimes/claude_code/mcp_discovery.py +558 -0
  347. control_plane_api/worker/runtimes/claude_code/runtime.py +1546 -0
  348. control_plane_api/worker/runtimes/claude_code/tool_mapper.py +403 -0
  349. control_plane_api/worker/runtimes/claude_code/utils.py +149 -0
  350. control_plane_api/worker/runtimes/factory.py +173 -0
  351. control_plane_api/worker/runtimes/model_utils.py +107 -0
  352. control_plane_api/worker/runtimes/validation.py +93 -0
  353. control_plane_api/worker/services/__init__.py +1 -0
  354. control_plane_api/worker/services/agent_communication_tools.py +908 -0
  355. control_plane_api/worker/services/agent_executor.py +485 -0
  356. control_plane_api/worker/services/agent_executor_v2.py +793 -0
  357. control_plane_api/worker/services/analytics_collector.py +457 -0
  358. control_plane_api/worker/services/analytics_service.py +464 -0
  359. control_plane_api/worker/services/approval_tools.py +310 -0
  360. control_plane_api/worker/services/approval_tools_agno.py +207 -0
  361. control_plane_api/worker/services/cancellation_manager.py +177 -0
  362. control_plane_api/worker/services/code_ingestion_tools.py +465 -0
  363. control_plane_api/worker/services/contextual_awareness_tools.py +405 -0
  364. control_plane_api/worker/services/data_visualization.py +834 -0
  365. control_plane_api/worker/services/event_publisher.py +531 -0
  366. control_plane_api/worker/services/jira_tools.py +257 -0
  367. control_plane_api/worker/services/remote_filesystem_tools.py +498 -0
  368. control_plane_api/worker/services/runtime_analytics.py +328 -0
  369. control_plane_api/worker/services/session_service.py +365 -0
  370. control_plane_api/worker/services/skill_context_enhancement.py +181 -0
  371. control_plane_api/worker/services/skill_factory.py +471 -0
  372. control_plane_api/worker/services/system_prompt_enhancement.py +410 -0
  373. control_plane_api/worker/services/team_executor.py +715 -0
  374. control_plane_api/worker/services/team_executor_v2.py +1866 -0
  375. control_plane_api/worker/services/tool_enforcement.py +254 -0
  376. control_plane_api/worker/services/workflow_executor/__init__.py +52 -0
  377. control_plane_api/worker/services/workflow_executor/event_processor.py +287 -0
  378. control_plane_api/worker/services/workflow_executor/event_publisher.py +210 -0
  379. control_plane_api/worker/services/workflow_executor/executors/__init__.py +15 -0
  380. control_plane_api/worker/services/workflow_executor/executors/base.py +270 -0
  381. control_plane_api/worker/services/workflow_executor/executors/json_executor.py +50 -0
  382. control_plane_api/worker/services/workflow_executor/executors/python_executor.py +50 -0
  383. control_plane_api/worker/services/workflow_executor/models.py +142 -0
  384. control_plane_api/worker/services/workflow_executor_tools.py +1748 -0
  385. control_plane_api/worker/skills/__init__.py +12 -0
  386. control_plane_api/worker/skills/builtin/context_graph_search/README.md +213 -0
  387. control_plane_api/worker/skills/builtin/context_graph_search/__init__.py +5 -0
  388. control_plane_api/worker/skills/builtin/context_graph_search/agno_impl.py +808 -0
  389. control_plane_api/worker/skills/builtin/context_graph_search/skill.yaml +67 -0
  390. control_plane_api/worker/skills/builtin/contextual_awareness/__init__.py +4 -0
  391. control_plane_api/worker/skills/builtin/contextual_awareness/agno_impl.py +62 -0
  392. control_plane_api/worker/skills/builtin/data_visualization/agno_impl.py +18 -0
  393. control_plane_api/worker/skills/builtin/data_visualization/skill.yaml +84 -0
  394. control_plane_api/worker/skills/builtin/docker/agno_impl.py +65 -0
  395. control_plane_api/worker/skills/builtin/docker/skill.yaml +60 -0
  396. control_plane_api/worker/skills/builtin/file_generation/agno_impl.py +47 -0
  397. control_plane_api/worker/skills/builtin/file_generation/skill.yaml +64 -0
  398. control_plane_api/worker/skills/builtin/file_system/agno_impl.py +32 -0
  399. control_plane_api/worker/skills/builtin/file_system/skill.yaml +54 -0
  400. control_plane_api/worker/skills/builtin/knowledge_api/__init__.py +4 -0
  401. control_plane_api/worker/skills/builtin/knowledge_api/agno_impl.py +50 -0
  402. control_plane_api/worker/skills/builtin/knowledge_api/skill.yaml +66 -0
  403. control_plane_api/worker/skills/builtin/python/agno_impl.py +25 -0
  404. control_plane_api/worker/skills/builtin/python/skill.yaml +60 -0
  405. control_plane_api/worker/skills/builtin/schema_fix_mixin.py +260 -0
  406. control_plane_api/worker/skills/builtin/shell/agno_impl.py +31 -0
  407. control_plane_api/worker/skills/builtin/shell/skill.yaml +60 -0
  408. control_plane_api/worker/skills/builtin/slack/__init__.py +3 -0
  409. control_plane_api/worker/skills/builtin/slack/agno_impl.py +1282 -0
  410. control_plane_api/worker/skills/builtin/slack/skill.yaml +276 -0
  411. control_plane_api/worker/skills/builtin/workflow_executor/agno_impl.py +62 -0
  412. control_plane_api/worker/skills/builtin/workflow_executor/skill.yaml +79 -0
  413. control_plane_api/worker/skills/loaders/__init__.py +5 -0
  414. control_plane_api/worker/skills/loaders/base.py +23 -0
  415. control_plane_api/worker/skills/loaders/filesystem_loader.py +357 -0
  416. control_plane_api/worker/skills/registry.py +208 -0
  417. control_plane_api/worker/tests/__init__.py +1 -0
  418. control_plane_api/worker/tests/conftest.py +12 -0
  419. control_plane_api/worker/tests/e2e/__init__.py +0 -0
  420. control_plane_api/worker/tests/e2e/test_context_graph_real_api.py +338 -0
  421. control_plane_api/worker/tests/e2e/test_context_graph_templates_e2e.py +523 -0
  422. control_plane_api/worker/tests/e2e/test_enforcement_e2e.py +344 -0
  423. control_plane_api/worker/tests/e2e/test_execution_flow.py +571 -0
  424. control_plane_api/worker/tests/e2e/test_single_execution_mode.py +656 -0
  425. control_plane_api/worker/tests/integration/__init__.py +0 -0
  426. control_plane_api/worker/tests/integration/test_builtin_skills_fixes.py +245 -0
  427. control_plane_api/worker/tests/integration/test_context_graph_search_integration.py +365 -0
  428. control_plane_api/worker/tests/integration/test_control_plane_integration.py +308 -0
  429. control_plane_api/worker/tests/integration/test_hook_enforcement_integration.py +579 -0
  430. control_plane_api/worker/tests/integration/test_scheduled_job_workflow.py +237 -0
  431. control_plane_api/worker/tests/integration/test_system_prompt_enhancement_integration.py +343 -0
  432. control_plane_api/worker/tests/unit/__init__.py +0 -0
  433. control_plane_api/worker/tests/unit/test_builtin_skill_autoload.py +396 -0
  434. control_plane_api/worker/tests/unit/test_context_graph_search.py +450 -0
  435. control_plane_api/worker/tests/unit/test_context_graph_templates.py +403 -0
  436. control_plane_api/worker/tests/unit/test_control_plane_client.py +401 -0
  437. control_plane_api/worker/tests/unit/test_control_plane_client_jobs.py +345 -0
  438. control_plane_api/worker/tests/unit/test_job_activities.py +353 -0
  439. control_plane_api/worker/tests/unit/test_skill_context_enhancement.py +321 -0
  440. control_plane_api/worker/tests/unit/test_system_prompt_enhancement.py +415 -0
  441. control_plane_api/worker/tests/unit/test_tool_enforcement.py +324 -0
  442. control_plane_api/worker/utils/__init__.py +1 -0
  443. control_plane_api/worker/utils/chunk_batcher.py +330 -0
  444. control_plane_api/worker/utils/environment.py +65 -0
  445. control_plane_api/worker/utils/error_publisher.py +260 -0
  446. control_plane_api/worker/utils/event_batcher.py +256 -0
  447. control_plane_api/worker/utils/logging_config.py +335 -0
  448. control_plane_api/worker/utils/logging_helper.py +326 -0
  449. control_plane_api/worker/utils/parameter_validator.py +120 -0
  450. control_plane_api/worker/utils/retry_utils.py +60 -0
  451. control_plane_api/worker/utils/streaming_utils.py +665 -0
  452. control_plane_api/worker/utils/tool_validation.py +332 -0
  453. control_plane_api/worker/utils/workspace_manager.py +163 -0
  454. control_plane_api/worker/websocket_client.py +393 -0
  455. control_plane_api/worker/worker.py +1297 -0
  456. control_plane_api/worker/workflows/__init__.py +0 -0
  457. control_plane_api/worker/workflows/agent_execution.py +909 -0
  458. control_plane_api/worker/workflows/scheduled_job_wrapper.py +332 -0
  459. control_plane_api/worker/workflows/team_execution.py +611 -0
  460. kubiya_control_plane_api-0.9.15.dist-info/METADATA +354 -0
  461. kubiya_control_plane_api-0.9.15.dist-info/RECORD +479 -0
  462. kubiya_control_plane_api-0.9.15.dist-info/WHEEL +5 -0
  463. kubiya_control_plane_api-0.9.15.dist-info/entry_points.txt +5 -0
  464. kubiya_control_plane_api-0.9.15.dist-info/licenses/LICENSE +676 -0
  465. kubiya_control_plane_api-0.9.15.dist-info/top_level.txt +3 -0
  466. scripts/__init__.py +1 -0
  467. scripts/migrations.py +39 -0
  468. scripts/seed_worker_queues.py +128 -0
  469. scripts/setup_agent_runtime.py +142 -0
  470. worker_internal/__init__.py +1 -0
  471. worker_internal/planner/__init__.py +1 -0
  472. worker_internal/planner/activities.py +1499 -0
  473. worker_internal/planner/agent_tools.py +197 -0
  474. worker_internal/planner/event_models.py +148 -0
  475. worker_internal/planner/event_publisher.py +67 -0
  476. worker_internal/planner/models.py +199 -0
  477. worker_internal/planner/retry_logic.py +134 -0
  478. worker_internal/planner/worker.py +300 -0
  479. 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
+ ]