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,479 @@
1
+ """Team-related Temporal activities"""
2
+
3
+ import os
4
+ import httpx
5
+ from dataclasses import dataclass
6
+ from typing import Optional, List, Any, Dict
7
+ from datetime import datetime, timezone
8
+ from temporalio import activity
9
+ import structlog
10
+ from pathlib import Path
11
+ from types import GeneratorType
12
+
13
+ from agno.agent import Agent
14
+ from agno.team import Team
15
+ from agno.models.litellm import LiteLLM
16
+ from agno.tools.shell import ShellTools
17
+ from agno.tools.python import PythonTools
18
+ from agno.tools.file import FileTools
19
+
20
+ from control_plane_api.worker.activities.agent_activities import update_execution_status, ActivityUpdateExecutionInput
21
+ from control_plane_api.worker.control_plane_client import get_control_plane_client
22
+ from control_plane_api.worker.services.skill_factory import SkillFactory
23
+ from control_plane_api.worker.services.team_executor_v2 import TeamExecutorServiceV2
24
+ from control_plane_api.worker.services.session_service import SessionService
25
+ from control_plane_api.worker.services.cancellation_manager import CancellationManager
26
+
27
+ logger = structlog.get_logger()
28
+
29
+
30
+ def serialize_tool_output(output: Any, max_length: int = 10000) -> Optional[str]:
31
+ """
32
+ Safely serialize tool output for JSON encoding.
33
+
34
+ Handles:
35
+ - Generator objects (consumes and converts to string)
36
+ - Large strings (truncates with indication)
37
+ - None values
38
+ - Other types (converts to string)
39
+
40
+ Args:
41
+ output: Tool output to serialize
42
+ max_length: Maximum length for output string (default 10000)
43
+
44
+ Returns:
45
+ Serialized string or None
46
+ """
47
+ if output is None:
48
+ return None
49
+
50
+ try:
51
+ # Check if it's a generator - consume it first
52
+ if isinstance(output, GeneratorType):
53
+ # Consume generator and join results
54
+ output = ''.join(str(item) for item in output)
55
+
56
+ # Convert to string
57
+ output_str = str(output)
58
+
59
+ # Truncate if too long
60
+ if len(output_str) > max_length:
61
+ return output_str[:max_length] + f"\n... (truncated, {len(output_str) - max_length} chars omitted)"
62
+
63
+ return output_str
64
+
65
+ except Exception as e:
66
+ logger.warning("failed_to_serialize_tool_output", error=str(e))
67
+ return f"<Failed to serialize output: {str(e)}>"
68
+
69
+ # Global registry for active Team instances to support cancellation
70
+ # Key: execution_id, Value: {team: Team, run_id: str}
71
+ _active_teams: Dict[str, Dict[str, Any]] = {}
72
+
73
+
74
+ def instantiate_skill(skill_data: dict) -> Optional[Any]:
75
+ """
76
+ Instantiate an Agno toolkit based on skill configuration from Control Plane.
77
+
78
+ Args:
79
+ skill_data: Skill data from Control Plane API containing:
80
+ - type: Skill type (file_system, shell, python, docker, etc.)
81
+ - name: Skill name
82
+ - configuration: Dict with skill-specific config
83
+ - enabled: Whether skill is enabled
84
+
85
+ Returns:
86
+ Instantiated Agno toolkit or None if type not supported/enabled
87
+ """
88
+ if not skill_data.get("enabled", True):
89
+ print(f" ⊗ Skipping disabled skill: {skill_data.get('name')}")
90
+ return None
91
+
92
+ skill_type = skill_data.get("type", "").lower()
93
+ config = skill_data.get("configuration", {})
94
+ name = skill_data.get("name", "Unknown")
95
+
96
+ try:
97
+ # Map Control Plane skill types to Agno toolkit classes
98
+ if skill_type in ["file_system", "file", "file_generation"]:
99
+ # FileTools: file operations (read, write, list, search)
100
+ # Note: file_generation is mapped to FileTools (save_file functionality)
101
+ base_dir = config.get("base_dir")
102
+ toolkit = FileTools(
103
+ base_dir=Path(base_dir) if base_dir else None,
104
+ enable_save_file=config.get("enable_save_file", True),
105
+ enable_read_file=config.get("enable_read_file", True),
106
+ enable_list_files=config.get("enable_list_files", True),
107
+ enable_search_files=config.get("enable_search_files", True),
108
+ )
109
+ print(f" ✓ Instantiated FileTools: {name}")
110
+ if skill_type == "file_generation":
111
+ print(f" - Type: File Generation (using FileTools.save_file)")
112
+ print(f" - Base Dir: {base_dir or 'Current directory'}")
113
+ print(f" - Read: {config.get('enable_read_file', True)}, Write: {config.get('enable_save_file', True)}")
114
+ return toolkit
115
+
116
+ elif skill_type in ["shell", "bash"]:
117
+ # ShellTools: shell command execution
118
+ base_dir = config.get("base_dir")
119
+ toolkit = ShellTools(
120
+ base_dir=Path(base_dir) if base_dir else None,
121
+ enable_run_shell_command=config.get("enable_run_shell_command", True),
122
+ )
123
+ print(f" ✓ Instantiated ShellTools: {name}")
124
+ print(f" - Base Dir: {base_dir or 'Current directory'}")
125
+ print(f" - Run Commands: {config.get('enable_run_shell_command', True)}")
126
+ return toolkit
127
+
128
+ elif skill_type == "python":
129
+ # PythonTools: Python code execution
130
+ base_dir = config.get("base_dir")
131
+ toolkit = PythonTools(
132
+ base_dir=Path(base_dir) if base_dir else None,
133
+ safe_globals=config.get("safe_globals"),
134
+ safe_locals=config.get("safe_locals"),
135
+ )
136
+ print(f" ✓ Instantiated PythonTools: {name}")
137
+ print(f" - Base Dir: {base_dir or 'Current directory'}")
138
+ return toolkit
139
+
140
+ elif skill_type == "docker":
141
+ # DockerTools requires docker package and running Docker daemon
142
+ try:
143
+ from agno.tools.docker import DockerTools
144
+ import docker
145
+
146
+ # Check if Docker daemon is accessible
147
+ try:
148
+ docker_client = docker.from_env()
149
+ docker_client.ping()
150
+
151
+ # Docker is available, instantiate toolkit
152
+ toolkit = DockerTools()
153
+ print(f" ✓ Instantiated DockerTools: {name}")
154
+ print(f" - Docker daemon: Connected")
155
+ docker_client.close()
156
+ return toolkit
157
+
158
+ except Exception as docker_error:
159
+ print(f" ⚠ Docker daemon not available - skipping: {name}")
160
+ print(f" Error: {str(docker_error)}")
161
+ return None
162
+
163
+ except ImportError:
164
+ print(f" ⚠ Docker skill requires 'docker' package - skipping: {name}")
165
+ print(f" Install with: pip install docker")
166
+ return None
167
+
168
+ else:
169
+ print(f" ⚠ Unsupported skill type '{skill_type}': {name}")
170
+ return None
171
+
172
+ except Exception as e:
173
+ print(f" ❌ Error instantiating skill '{name}' (type: {skill_type}): {str(e)}")
174
+ logger.error(
175
+ f"Error instantiating skill",
176
+ extra={
177
+ "skill_name": name,
178
+ "skill_type": skill_type,
179
+ "error": str(e)
180
+ }
181
+ )
182
+ return None
183
+
184
+
185
+ @dataclass
186
+ class ActivityGetTeamAgentsInput:
187
+ """Input for get_team_agents activity"""
188
+ team_id: str
189
+ organization_id: str
190
+
191
+
192
+ @dataclass
193
+ class ActivityExecuteTeamInput:
194
+ """Input for execute_team_coordination activity"""
195
+ execution_id: str
196
+ team_id: str
197
+ organization_id: str
198
+ prompt: str
199
+ system_prompt: Optional[str] = None
200
+ agents: List[dict] = None
201
+ team_config: dict = None
202
+ mcp_servers: dict = None # MCP servers configuration
203
+ session_id: Optional[str] = None # Session ID for session management
204
+ user_id: Optional[str] = None # User ID for multi-user support
205
+ model_id: Optional[str] = None # Model ID for the team coordinator
206
+ model_config: Optional[dict] = None # Model configuration
207
+ # Note: control_plane_url and api_key are read from worker environment variables (CONTROL_PLANE_URL, KUBIYA_API_KEY)
208
+
209
+ def __post_init__(self):
210
+ if self.agents is None:
211
+ self.agents = []
212
+ if self.team_config is None:
213
+ self.team_config = {}
214
+ if self.mcp_servers is None:
215
+ self.mcp_servers = {}
216
+ if self.model_config is None:
217
+ self.model_config = {}
218
+ # Default model_id if not provided
219
+ if self.model_id is None:
220
+ self.model_id = self.team_config.get("llm", {}).get("model", "kubiya/claude-sonnet-4")
221
+
222
+
223
+ @activity.defn
224
+ async def get_team_agents(input: ActivityGetTeamAgentsInput) -> dict:
225
+ """
226
+ Get all agents in a team via Control Plane API.
227
+
228
+ This activity fetches team details including member agents from the Control Plane.
229
+
230
+ Args:
231
+ input: Activity input with team details
232
+
233
+ Returns:
234
+ Dict with agents list
235
+ """
236
+ print(f"\n\n=== GET_TEAM_AGENTS START ===")
237
+ print(f"team_id: {input.team_id} (type: {type(input.team_id).__name__})")
238
+ print(f"organization_id: {input.organization_id} (type: {type(input.organization_id).__name__})")
239
+ print(f"================================\n")
240
+
241
+ activity.logger.info(
242
+ f"[DEBUG] Getting team agents START",
243
+ extra={
244
+ "team_id": input.team_id,
245
+ "team_id_type": type(input.team_id).__name__,
246
+ "organization_id": input.organization_id,
247
+ "organization_id_type": type(input.organization_id).__name__,
248
+ }
249
+ )
250
+
251
+ try:
252
+ # Get Control Plane URL and Kubiya API key from environment
253
+ control_plane_url = os.getenv("CONTROL_PLANE_URL")
254
+ kubiya_api_key = os.getenv("KUBIYA_API_KEY")
255
+
256
+ if not control_plane_url:
257
+ raise ValueError("CONTROL_PLANE_URL environment variable not set")
258
+ if not kubiya_api_key:
259
+ raise ValueError("KUBIYA_API_KEY environment variable not set")
260
+
261
+ print(f"Fetching team from Control Plane API: {control_plane_url}")
262
+
263
+ # Call Control Plane API to get team with agents
264
+ async with httpx.AsyncClient(timeout=30.0) as client:
265
+ response = await client.get(
266
+ f"{control_plane_url}/api/v1/teams/{input.team_id}",
267
+ headers={
268
+ "Authorization": f"Bearer {kubiya_api_key}",
269
+ "Content-Type": "application/json",
270
+ }
271
+ )
272
+
273
+ if response.status_code == 404:
274
+ print(f"Team not found!")
275
+ activity.logger.error(
276
+ f"[DEBUG] Team not found",
277
+ extra={
278
+ "team_id": input.team_id,
279
+ "organization_id": input.organization_id,
280
+ }
281
+ )
282
+ return {"agents": [], "count": 0}
283
+ elif response.status_code != 200:
284
+ raise Exception(f"Failed to get team: {response.status_code} - {response.text}")
285
+
286
+ team_data = response.json()
287
+
288
+ # Extract agents from the API response
289
+ # The API returns a TeamWithAgentsResponse which includes the agents array
290
+ agents = team_data.get("agents", [])
291
+
292
+ print(f"Query executed. Agents found: {len(agents)}")
293
+
294
+ activity.logger.info(
295
+ f"[DEBUG] Query executed, processing results",
296
+ extra={
297
+ "agents_found": len(agents),
298
+ "agent_ids": [a.get("id") for a in agents],
299
+ }
300
+ )
301
+
302
+ print(f"Agents found: {len(agents)}")
303
+ if agents:
304
+ for agent in agents:
305
+ print(f" - {agent.get('name')} (ID: {agent.get('id')})")
306
+
307
+ activity.logger.info(
308
+ f"[DEBUG] Retrieved team agents via API",
309
+ extra={
310
+ "team_id": input.team_id,
311
+ "agent_count": len(agents),
312
+ "agent_names": [a.get("name") for a in agents],
313
+ "agent_ids": [a.get("id") for a in agents],
314
+ }
315
+ )
316
+
317
+ if not agents:
318
+ print(f"\n!!! NO AGENTS FOUND - Team may have no members !!!")
319
+ activity.logger.warning(
320
+ f"[DEBUG] WARNING: No agents found for team",
321
+ extra={
322
+ "team_id": input.team_id,
323
+ "organization_id": input.organization_id,
324
+ }
325
+ )
326
+
327
+ print(f"\n=== GET_TEAM_AGENTS END: Returning {len(agents)} agents ===\n\n")
328
+ return {
329
+ "agents": agents,
330
+ "count": len(agents),
331
+ }
332
+
333
+ except Exception as e:
334
+ print(f"\n!!! EXCEPTION in get_team_agents: {type(e).__name__}: {str(e)} !!!\n")
335
+ activity.logger.error(
336
+ f"[DEBUG] EXCEPTION in get_team_agents",
337
+ extra={
338
+ "team_id": input.team_id,
339
+ "organization_id": input.organization_id,
340
+ "error": str(e),
341
+ "error_type": type(e).__name__,
342
+ }
343
+ )
344
+ raise
345
+
346
+
347
+ @activity.defn
348
+ async def execute_team_coordination(input: ActivityExecuteTeamInput) -> dict:
349
+ """
350
+ Execute team coordination using runtime-abstracted execution (V2).
351
+
352
+ This activity uses TeamExecutorServiceV2 which:
353
+ - Detects the team's runtime configuration (claude_code or agno)
354
+ - Routes to appropriate executor
355
+ - Handles session management
356
+ - Provides streaming support
357
+
358
+ Args:
359
+ input: Activity input with team execution details
360
+
361
+ Returns:
362
+ Dict with aggregated response, usage, success flag
363
+ """
364
+ print("\n" + "="*80)
365
+ print("🚀 TEAM EXECUTION START (V2)")
366
+ print("="*80)
367
+ print(f"Execution ID: {input.execution_id}")
368
+ print(f"Team ID: {input.team_id}")
369
+ print(f"Organization: {input.organization_id}")
370
+ print(f"Agent Count: {len(input.agents)}")
371
+ print(f"MCP Servers: {len(input.mcp_servers)} configured" if input.mcp_servers else "MCP Servers: None")
372
+ print(f"Session ID: {input.session_id}")
373
+ print(f"Prompt: {input.prompt[:100]}..." if len(input.prompt) > 100 else f"Prompt: {input.prompt}")
374
+ print("="*80 + "\n")
375
+
376
+ activity.logger.info(
377
+ f"Executing team coordination with V2 (runtime-abstracted)",
378
+ extra={
379
+ "execution_id": input.execution_id,
380
+ "team_id": input.team_id,
381
+ "organization_id": input.organization_id,
382
+ "agent_count": len(input.agents),
383
+ "has_mcp_servers": bool(input.mcp_servers),
384
+ "mcp_server_count": len(input.mcp_servers) if input.mcp_servers else 0,
385
+ "mcp_server_ids": list(input.mcp_servers.keys()) if input.mcp_servers else [],
386
+ "session_id": input.session_id,
387
+ "team_config_runtime": input.team_config.get("runtime", "default") if input.team_config else "default",
388
+ }
389
+ )
390
+
391
+ try:
392
+ # Initialize services
393
+ control_plane = get_control_plane_client()
394
+ session_service = SessionService(control_plane)
395
+ cancellation_manager = CancellationManager()
396
+
397
+ # Create V2 executor
398
+ executor = TeamExecutorServiceV2(
399
+ control_plane=control_plane,
400
+ session_service=session_service,
401
+ cancellation_manager=cancellation_manager,
402
+ )
403
+
404
+ # Execute using V2 - it will handle runtime detection and routing
405
+ result = await executor.execute(input)
406
+
407
+ print("\n" + "="*80)
408
+ print("🏁 TEAM EXECUTION END (V2)")
409
+ print("="*80 + "\n")
410
+
411
+ return result
412
+
413
+ except Exception as e:
414
+ print("\n" + "="*80)
415
+ print("❌ TEAM EXECUTION FAILED (V2)")
416
+ print("="*80)
417
+ print(f"Error: {str(e)}")
418
+ print("="*80 + "\n")
419
+
420
+ activity.logger.error(
421
+ f"Team coordination failed (V2)",
422
+ extra={
423
+ "execution_id": input.execution_id,
424
+ "error": str(e),
425
+ }
426
+ )
427
+ return {
428
+ "success": False,
429
+ "error": str(e),
430
+ "coordination_type": "unknown",
431
+ "usage": {},
432
+ }
433
+
434
+
435
+
436
+
437
+
438
+ @dataclass
439
+ class ActivityCancelTeamInput:
440
+ execution_id: str
441
+
442
+
443
+ @activity.defn(name="cancel_team_run")
444
+ async def cancel_team_run(input: ActivityCancelTeamInput) -> dict:
445
+ """Cancel an active team run using Agno's cancel_run API."""
446
+ print("\n" + "="*80)
447
+ print("🛑 CANCEL TEAM RUN")
448
+ print("="*80)
449
+ print(f"Execution ID: {input.execution_id}\n")
450
+
451
+ try:
452
+ if input.execution_id not in _active_teams:
453
+ print(f"⚠️ Team not found in registry - may have already completed")
454
+ return {"success": False, "error": "Team not found or already completed", "execution_id": input.execution_id}
455
+
456
+ team_info = _active_teams[input.execution_id]
457
+ team = team_info["team"]
458
+ run_id = team_info.get("run_id")
459
+
460
+ if not run_id:
461
+ print(f"⚠️ No run_id found - execution may not have started yet")
462
+ return {"success": False, "error": "Execution not started yet", "execution_id": input.execution_id}
463
+
464
+ print(f"🆔 Found run_id: {run_id}")
465
+ print(f"🛑 Calling team.cancel_run()...")
466
+
467
+ success = team.cancel_run(run_id)
468
+
469
+ if success:
470
+ print(f"✅ Team run cancelled successfully!\n")
471
+ del _active_teams[input.execution_id]
472
+ return {"success": True, "execution_id": input.execution_id, "run_id": run_id, "cancelled_at": datetime.now(timezone.utc).isoformat()}
473
+ else:
474
+ print(f"⚠️ Cancel failed - run may have already completed\n")
475
+ return {"success": False, "error": "Cancel failed - run may be completed", "execution_id": input.execution_id, "run_id": run_id}
476
+
477
+ except Exception as e:
478
+ print(f"❌ Error cancelling run: {str(e)}\n")
479
+ return {"success": False, "error": str(e), "execution_id": input.execution_id}