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,100 @@
1
+ """
2
+ Skills Module
3
+
4
+ This module manages all available skills (OS-level capabilities) that can be
5
+ assigned to agents and teams. Each skill corresponds to a capability that agents
6
+ can use during execution (file system, shell, Docker, Python, etc.).
7
+
8
+ Skills are defined as Python classes that provide:
9
+ - Metadata (name, description, icon)
10
+ - Default configuration
11
+ - Validation logic
12
+ - Instantiation logic for the underlying framework
13
+
14
+ Skills can be:
15
+ 1. Built-in (imported below)
16
+ 2. Dynamic (loaded from .kubiya/skills/ via loaders)
17
+ """
18
+
19
+ from .base import SkillDefinition, SkillType, SkillCategory, SkillRequirements, SkillVariant
20
+ from .registry import skill_registry, get_skill, get_all_skills, register_skill
21
+ from .config import get_skill_template_paths, is_dynamic_skills_enabled
22
+ from .loaders import FilesystemSkillTemplateLoader
23
+ import logging
24
+
25
+ # Import all built-in skill definitions to auto-register them
26
+ from .builtin import (
27
+ FileSystemSkill,
28
+ ShellSkill,
29
+ DockerSkill,
30
+ PythonSkill,
31
+ FileGenerationSkill,
32
+ DataVisualizationSkill,
33
+ WorkflowExecutorSkill,
34
+ KnowledgeAPISkill,
35
+ AgentCommunicationSkill,
36
+ )
37
+
38
+ logger = logging.getLogger(__name__)
39
+
40
+ __all__ = [
41
+ "SkillDefinition",
42
+ "SkillType",
43
+ "SkillCategory",
44
+ "SkillRequirements",
45
+ "SkillVariant",
46
+ "skill_registry",
47
+ "get_skill",
48
+ "get_all_skills",
49
+ "register_skill",
50
+ "FileSystemSkill",
51
+ "ShellSkill",
52
+ "DockerSkill",
53
+ "PythonSkill",
54
+ "FileGenerationSkill",
55
+ "DataVisualizationSkill",
56
+ "WorkflowExecutorSkill",
57
+ "KnowledgeAPISkill",
58
+ "AgentCommunicationSkill",
59
+ "initialize_dynamic_skills",
60
+ ]
61
+
62
+
63
+ def initialize_dynamic_skills() -> int:
64
+ """
65
+ Initialize and load dynamic skills from configured sources.
66
+
67
+ This should be called during Control Plane startup, after built-in
68
+ skills have been registered.
69
+
70
+ Returns:
71
+ Number of dynamic skills loaded
72
+
73
+ Environment Variables:
74
+ KUBIYA_ENABLE_DYNAMIC_SKILLS: Enable/disable dynamic loading (default: true)
75
+ KUBIYA_SKILLS_TEMPLATES_PATH: Primary skills directory
76
+ KUBIYA_SKILLS_EXTRA_PATHS: Additional paths (colon-separated)
77
+ """
78
+ if not is_dynamic_skills_enabled():
79
+ logger.info("Dynamic skills loading is disabled")
80
+ return 0
81
+
82
+ logger.info("Initializing dynamic skills...")
83
+
84
+ # Get configured paths
85
+ paths = get_skill_template_paths()
86
+
87
+ if not paths:
88
+ logger.info("No skill template paths configured, skipping dynamic loading")
89
+ return 0
90
+
91
+ # Create filesystem loader
92
+ loaders = [
93
+ FilesystemSkillTemplateLoader(base_paths=paths, enabled=True)
94
+ ]
95
+
96
+ # Load from all loaders
97
+ loaded_count = skill_registry.load_from_loaders(loaders)
98
+
99
+ logger.info(f"Dynamic skills initialization complete: {loaded_count} skills loaded")
100
+ return loaded_count
@@ -0,0 +1,239 @@
1
+ """
2
+ Base classes for skill definitions
3
+ """
4
+ from typing import Dict, Any, List, Optional, Set
5
+ from enum import Enum
6
+ from pydantic import BaseModel, Field
7
+ from abc import ABC, abstractmethod
8
+ import platform
9
+
10
+
11
+ class SkillType(str, Enum):
12
+ """Supported skill types"""
13
+ FILE_SYSTEM = "file_system"
14
+ SHELL = "shell"
15
+ DOCKER = "docker"
16
+ PYTHON = "python"
17
+ FILE_GENERATION = "file_generation"
18
+ DATA_VISUALIZATION = "data_visualization"
19
+ SLEEP = "sleep"
20
+ WORKFLOW_EXECUTOR = "workflow_executor"
21
+ CONTEXTUAL_AWARENESS = "contextual_awareness"
22
+ KNOWLEDGE_API = "knowledge_api"
23
+ COGNITIVE_MEMORY = "cognitive_memory" # Context graph + semantic memory operations
24
+ CODE_INGESTION = "code_ingestion" # Code repository ingestion and analysis
25
+ AGENT_COMMUNICATION = "agent_communication"
26
+ REMOTE_FILESYSTEM = "remote_filesystem"
27
+ SLACK = "slack"
28
+ CUSTOM = "custom"
29
+
30
+
31
+ class SkillCategory(str, Enum):
32
+ """Skill categories for organization"""
33
+ COMMON = "common" # Frequently used, safe defaults
34
+ ADVANCED = "advanced" # Advanced features, require more privileges
35
+ SECURITY = "security" # Security-focused, restricted access
36
+ CUSTOM = "custom" # User-defined custom skills
37
+
38
+
39
+ class SkillRequirements(BaseModel):
40
+ """Runtime requirements for a skill"""
41
+ # Python packages required (will be checked/installed by worker)
42
+ python_packages: List[str] = Field(default_factory=list)
43
+
44
+ # System packages required (informational, worker should validate)
45
+ system_packages: List[str] = Field(default_factory=list)
46
+
47
+ # Supported operating systems (e.g., ["linux", "darwin", "windows"])
48
+ supported_os: Optional[List[str]] = None
49
+
50
+ # Minimum Python version (e.g., "3.10")
51
+ min_python_version: Optional[str] = None
52
+
53
+ # Environment variables required
54
+ required_env_vars: List[str] = Field(default_factory=list)
55
+
56
+ # External services/APIs required (informational)
57
+ external_dependencies: List[str] = Field(default_factory=list)
58
+
59
+ # Additional notes about requirements
60
+ notes: Optional[str] = None
61
+
62
+
63
+ class SkillVariant(BaseModel):
64
+ """A specific variant/preset of a skill"""
65
+ id: str
66
+ name: str
67
+ description: str
68
+ category: SkillCategory
69
+ configuration: Dict[str, Any]
70
+ badge: Optional[str] = None # e.g., "Safe", "Recommended", "Advanced"
71
+ icon: Optional[str] = None
72
+ is_default: bool = False
73
+
74
+
75
+ class SkillDefinition(ABC):
76
+ """
77
+ Base class for all skill definitions.
78
+
79
+ Each skill type should subclass this and implement the required methods.
80
+ This provides a clean interface for defining new skills.
81
+ """
82
+
83
+ @property
84
+ @abstractmethod
85
+ def type(self) -> SkillType:
86
+ """The type identifier for this skill"""
87
+ pass
88
+
89
+ @property
90
+ @abstractmethod
91
+ def name(self) -> str:
92
+ """Human-readable name"""
93
+ pass
94
+
95
+ @property
96
+ @abstractmethod
97
+ def description(self) -> str:
98
+ """Description of what this skill does"""
99
+ pass
100
+
101
+ @property
102
+ @abstractmethod
103
+ def icon(self) -> str:
104
+ """Icon name (Lucide or React Icons)"""
105
+ pass
106
+
107
+ @property
108
+ def icon_type(self) -> str:
109
+ """Icon type: 'lucide' or 'react-icon'"""
110
+ return "lucide"
111
+
112
+ @abstractmethod
113
+ def get_variants(self) -> List[SkillVariant]:
114
+ """
115
+ Get all predefined variants/presets for this skill.
116
+
117
+ Returns a list of variants with different configurations
118
+ (e.g., "Read Only", "Full Access", "Sandboxed")
119
+ """
120
+ pass
121
+
122
+ @abstractmethod
123
+ def validate_configuration(self, config: Dict[str, Any]) -> Dict[str, Any]:
124
+ """
125
+ Validate and normalize configuration.
126
+
127
+ Args:
128
+ config: Raw configuration dict
129
+
130
+ Returns:
131
+ Validated and normalized configuration
132
+
133
+ Raises:
134
+ ValueError: If configuration is invalid
135
+ """
136
+ pass
137
+
138
+ @abstractmethod
139
+ def get_default_configuration(self) -> Dict[str, Any]:
140
+ """Get the default configuration for this skill"""
141
+ pass
142
+
143
+ def get_framework_class_name(self) -> str:
144
+ """
145
+ Get the underlying framework tool class name.
146
+ This is used for instantiation during agent execution.
147
+
148
+ Returns:
149
+ Class name (e.g., "FileTools", "ShellTools")
150
+ """
151
+ # Default mapping based on type
152
+ mapping = {
153
+ SkillType.FILE_SYSTEM: "FileTools",
154
+ SkillType.SHELL: "ShellTools",
155
+ SkillType.DOCKER: "DockerTools",
156
+ SkillType.PYTHON: "PythonTools",
157
+ SkillType.FILE_GENERATION: "FileGenerationTools",
158
+ SkillType.DATA_VISUALIZATION: "DataVisualizationTools",
159
+ SkillType.SLEEP: "SleepTools",
160
+ SkillType.CONTEXTUAL_AWARENESS: "ContextualAwarenessTools",
161
+ SkillType.AGENT_COMMUNICATION: "AgentCommunicationTools",
162
+ SkillType.REMOTE_FILESYSTEM: "RemoteFilesystemTools",
163
+ }
164
+ return mapping.get(self.type, "BaseTool")
165
+
166
+ def get_requirements(self) -> SkillRequirements:
167
+ """
168
+ Get runtime requirements for this skill.
169
+
170
+ Override this method to specify requirements like:
171
+ - Python packages
172
+ - System packages
173
+ - OS requirements
174
+ - Environment variables
175
+
176
+ Returns:
177
+ SkillRequirements instance
178
+ """
179
+ # Default: no special requirements
180
+ return SkillRequirements()
181
+
182
+ def check_requirements(self) -> tuple[bool, List[str]]:
183
+ """
184
+ Check if requirements are met in current environment.
185
+
186
+ Returns:
187
+ Tuple of (is_satisfied, missing_requirements)
188
+ """
189
+ requirements = self.get_requirements()
190
+ missing = []
191
+
192
+ # Check OS
193
+ if requirements.supported_os:
194
+ current_os = platform.system().lower()
195
+ if current_os not in requirements.supported_os:
196
+ missing.append(f"OS '{current_os}' not supported (requires: {', '.join(requirements.supported_os)})")
197
+
198
+ # Check Python version
199
+ if requirements.min_python_version:
200
+ import sys
201
+ from packaging import version
202
+ current_version = f"{sys.version_info.major}.{sys.version_info.minor}"
203
+ if version.parse(current_version) < version.parse(requirements.min_python_version):
204
+ missing.append(f"Python {requirements.min_python_version}+ required (current: {current_version})")
205
+
206
+ # Check environment variables
207
+ import os
208
+ for env_var in requirements.required_env_vars:
209
+ if not os.getenv(env_var):
210
+ missing.append(f"Environment variable '{env_var}' not set")
211
+
212
+ # Check Python packages (basic import check)
213
+ for package in requirements.python_packages:
214
+ package_name = package.split('[')[0].split('>=')[0].split('==')[0].strip()
215
+ try:
216
+ __import__(package_name)
217
+ except ImportError:
218
+ missing.append(f"Python package '{package}' not installed")
219
+
220
+ return len(missing) == 0, missing
221
+
222
+ def to_dict(self) -> Dict[str, Any]:
223
+ """Convert to dictionary representation"""
224
+ requirements = self.get_requirements()
225
+ is_satisfied, missing = self.check_requirements()
226
+
227
+ return {
228
+ "type": self.type.value,
229
+ "name": self.name,
230
+ "description": self.description,
231
+ "icon": self.icon,
232
+ "icon_type": self.icon_type,
233
+ "default_configuration": self.get_default_configuration(),
234
+ "variants": [v.model_dump() for v in self.get_variants()],
235
+ "framework_class": self.get_framework_class_name(),
236
+ "requirements": requirements.model_dump(),
237
+ "requirements_satisfied": is_satisfied,
238
+ "missing_requirements": missing,
239
+ }
@@ -0,0 +1,37 @@
1
+ """
2
+ Built-in Skills Module
3
+
4
+ Contains all built-in skill definitions that are part of the Control Plane.
5
+ Each skill is in its own dedicated folder with proper structure.
6
+ """
7
+ from .file_system import FileSystemSkill
8
+ from .shell import ShellSkill
9
+ from .python import PythonSkill
10
+ from .docker import DockerSkill
11
+ from .workflow_executor import WorkflowExecutorSkill
12
+ from .file_generation import FileGenerationSkill
13
+ from .data_visualization import DataVisualizationSkill
14
+ from .contextual_awareness import ContextualAwarenessSkill
15
+ from .knowledge_api import KnowledgeAPISkill
16
+ from .cognitive_memory import CognitiveMemorySkill
17
+ from .code_ingestion import CodeIngestionSkill
18
+ from .agent_communication import AgentCommunicationSkill
19
+ from .remote_filesystem import RemoteFilesystemSkill
20
+ from .slack import SlackSkill
21
+
22
+ __all__ = [
23
+ "FileSystemSkill",
24
+ "ShellSkill",
25
+ "PythonSkill",
26
+ "DockerSkill",
27
+ "WorkflowExecutorSkill",
28
+ "FileGenerationSkill",
29
+ "DataVisualizationSkill",
30
+ "ContextualAwarenessSkill",
31
+ "KnowledgeAPISkill",
32
+ "CognitiveMemorySkill",
33
+ "CodeIngestionSkill",
34
+ "AgentCommunicationSkill",
35
+ "RemoteFilesystemSkill",
36
+ "SlackSkill",
37
+ ]
@@ -0,0 +1,8 @@
1
+ """
2
+ Agent Communication Skill
3
+
4
+ Enables agents to call other agents or agent teams through tool calling.
5
+ """
6
+ from .skill import AgentCommunicationSkill
7
+
8
+ __all__ = ["AgentCommunicationSkill"]
@@ -0,0 +1,246 @@
1
+ """
2
+ Agent Communication Skill
3
+
4
+ Provides agent-to-agent and agent-to-team communication capabilities.
5
+ """
6
+ from typing import Dict, Any, List, Union, Literal, Optional
7
+ from pydantic import BaseModel, Field, validator
8
+ from control_plane_api.app.skills.base import SkillDefinition, SkillType, SkillCategory, SkillVariant
9
+ from control_plane_api.app.skills.registry import register_skill
10
+
11
+
12
+ class AgentCommunicationConfiguration(BaseModel):
13
+ """Configuration for Agent Communication Skill"""
14
+
15
+ allowed_operations: List[Literal[
16
+ "execute_agent",
17
+ "execute_team",
18
+ "followup_execution",
19
+ "get_execution_status"
20
+ ]] = Field(
21
+ default=["get_execution_status"],
22
+ description="List of allowed tool operations"
23
+ )
24
+
25
+ allowed_agents: Union[List[str], Literal["*"]] = Field(
26
+ default=[],
27
+ description="List of agent IDs that can be called, or '*' for all"
28
+ )
29
+
30
+ allowed_teams: Union[List[str], Literal["*"]] = Field(
31
+ default=[],
32
+ description="List of team IDs that can be called, or '*' for all"
33
+ )
34
+
35
+ max_execution_depth: int = Field(
36
+ default=2,
37
+ ge=0,
38
+ le=10,
39
+ description="Maximum nesting depth for child executions (0 = monitoring only)"
40
+ )
41
+
42
+ timeout: int = Field(
43
+ default=300,
44
+ ge=30,
45
+ le=3600,
46
+ description="Maximum wait time for child execution in seconds"
47
+ )
48
+
49
+ wait_for_completion: bool = Field(
50
+ default=True,
51
+ description="Whether to wait for child execution to complete (sync vs async)"
52
+ )
53
+
54
+ inherit_context: bool = Field(
55
+ default=True,
56
+ description="Whether to pass parent execution context to child"
57
+ )
58
+
59
+ max_concurrent_calls: int = Field(
60
+ default=3,
61
+ ge=1,
62
+ le=20,
63
+ description="Maximum number of concurrent child executions"
64
+ )
65
+
66
+ allow_session_continuation: bool = Field(
67
+ default=True,
68
+ description="Allow following up on existing sessions"
69
+ )
70
+
71
+ streaming_enabled: bool = Field(
72
+ default=True,
73
+ description="Stream child execution events to parent"
74
+ )
75
+
76
+ @validator('allowed_agents', 'allowed_teams')
77
+ def validate_allowed_entities(cls, v):
78
+ """Validate allowed entities format"""
79
+ if v == "*":
80
+ return v
81
+ if not isinstance(v, list):
82
+ raise ValueError("Must be a list of IDs or '*'")
83
+ return v
84
+
85
+
86
+ class AgentCommunicationSkill(SkillDefinition):
87
+ """Agent communication skill - orchestrate hierarchical agent execution"""
88
+
89
+ @property
90
+ def type(self) -> SkillType:
91
+ return SkillType.AGENT_COMMUNICATION
92
+
93
+ @property
94
+ def name(self) -> str:
95
+ return "Agent Communication"
96
+
97
+ @property
98
+ def description(self) -> str:
99
+ return "Enable agents to call other agents or teams, creating hierarchical execution workflows"
100
+
101
+ @property
102
+ def icon(self) -> str:
103
+ return "Network"
104
+
105
+ def get_variants(self) -> List[SkillVariant]:
106
+ return [
107
+ SkillVariant(
108
+ id="agent_communication_read_only",
109
+ name="Agent Communication - Read Only",
110
+ description="Monitor execution status only. Cannot initiate agent calls. Safe for observability.",
111
+ category=SkillCategory.COMMON,
112
+ badge="Safe",
113
+ icon="Eye",
114
+ configuration={
115
+ "allowed_operations": ["get_execution_status"],
116
+ "allowed_agents": [],
117
+ "allowed_teams": [],
118
+ "max_execution_depth": 0,
119
+ "timeout": 30,
120
+ "wait_for_completion": False,
121
+ "inherit_context": True,
122
+ "max_concurrent_calls": 1,
123
+ "allow_session_continuation": False,
124
+ "streaming_enabled": True,
125
+ },
126
+ is_default=False,
127
+ ),
128
+ SkillVariant(
129
+ id="agent_communication_limited",
130
+ name="Agent Communication - Limited",
131
+ description="Call specific approved agents and teams with safeguards. Recommended for most use cases.",
132
+ category=SkillCategory.COMMON,
133
+ badge="Recommended",
134
+ icon="Network",
135
+ configuration={
136
+ "allowed_operations": ["execute_agent", "execute_team", "followup_execution", "get_execution_status"],
137
+ "allowed_agents": [], # Must be explicitly configured
138
+ "allowed_teams": [], # Must be explicitly configured
139
+ "max_execution_depth": 2,
140
+ "timeout": 300,
141
+ "wait_for_completion": True,
142
+ "inherit_context": True,
143
+ "max_concurrent_calls": 3,
144
+ "allow_session_continuation": True,
145
+ "streaming_enabled": True,
146
+ },
147
+ is_default=True,
148
+ ),
149
+ SkillVariant(
150
+ id="agent_communication_full",
151
+ name="Agent Communication - Full Orchestration",
152
+ description="Unrestricted agent orchestration for complex workflows. Advanced use cases only.",
153
+ category=SkillCategory.ADVANCED,
154
+ badge="Advanced",
155
+ icon="Workflow",
156
+ configuration={
157
+ "allowed_operations": ["execute_agent", "execute_team", "followup_execution", "get_execution_status"],
158
+ "allowed_agents": "*",
159
+ "allowed_teams": "*",
160
+ "max_execution_depth": 5,
161
+ "timeout": 600,
162
+ "wait_for_completion": True,
163
+ "inherit_context": True,
164
+ "max_concurrent_calls": 10,
165
+ "allow_session_continuation": True,
166
+ "streaming_enabled": True,
167
+ },
168
+ is_default=False,
169
+ ),
170
+ ]
171
+
172
+ def validate_configuration(self, config: Dict[str, Any]) -> Dict[str, Any]:
173
+ """Validate agent communication configuration"""
174
+ try:
175
+ # Validate using Pydantic model
176
+ validated_config = AgentCommunicationConfiguration(**config)
177
+ return validated_config.dict()
178
+ except Exception as e:
179
+ # Fallback to manual validation
180
+ validated = {}
181
+
182
+ # allowed_operations
183
+ allowed_ops = config.get("allowed_operations", ["get_execution_status"])
184
+ if not isinstance(allowed_ops, list):
185
+ allowed_ops = ["get_execution_status"]
186
+ validated["allowed_operations"] = allowed_ops
187
+
188
+ # allowed_agents
189
+ allowed_agents = config.get("allowed_agents", [])
190
+ if allowed_agents == "*":
191
+ validated["allowed_agents"] = "*"
192
+ elif isinstance(allowed_agents, list):
193
+ validated["allowed_agents"] = allowed_agents
194
+ else:
195
+ validated["allowed_agents"] = []
196
+
197
+ # allowed_teams
198
+ allowed_teams = config.get("allowed_teams", [])
199
+ if allowed_teams == "*":
200
+ validated["allowed_teams"] = "*"
201
+ elif isinstance(allowed_teams, list):
202
+ validated["allowed_teams"] = allowed_teams
203
+ else:
204
+ validated["allowed_teams"] = []
205
+
206
+ # max_execution_depth
207
+ validated["max_execution_depth"] = max(0, min(10, config.get("max_execution_depth", 2)))
208
+
209
+ # timeout
210
+ validated["timeout"] = max(30, min(3600, config.get("timeout", 300)))
211
+
212
+ # wait_for_completion
213
+ validated["wait_for_completion"] = bool(config.get("wait_for_completion", True))
214
+
215
+ # inherit_context
216
+ validated["inherit_context"] = bool(config.get("inherit_context", True))
217
+
218
+ # max_concurrent_calls
219
+ validated["max_concurrent_calls"] = max(1, min(20, config.get("max_concurrent_calls", 3)))
220
+
221
+ # allow_session_continuation
222
+ validated["allow_session_continuation"] = bool(config.get("allow_session_continuation", True))
223
+
224
+ # streaming_enabled
225
+ validated["streaming_enabled"] = bool(config.get("streaming_enabled", True))
226
+
227
+ return validated
228
+
229
+ def get_default_configuration(self) -> Dict[str, Any]:
230
+ """Default: limited agent calling with safeguards"""
231
+ return {
232
+ "allowed_operations": ["execute_agent", "execute_team", "followup_execution", "get_execution_status"],
233
+ "allowed_agents": [],
234
+ "allowed_teams": [],
235
+ "max_execution_depth": 2,
236
+ "timeout": 300,
237
+ "wait_for_completion": True,
238
+ "inherit_context": True,
239
+ "max_concurrent_calls": 3,
240
+ "allow_session_continuation": True,
241
+ "streaming_enabled": True,
242
+ }
243
+
244
+
245
+ # Auto-register this skill
246
+ register_skill(AgentCommunicationSkill())
@@ -0,0 +1,4 @@
1
+ """Code Ingestion skill module"""
2
+ from control_plane_api.app.skills.builtin.code_ingestion.skill import CodeIngestionSkill
3
+
4
+ __all__ = ["CodeIngestionSkill"]