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,372 @@
1
+ """
2
+ Task Planning Pydantic Models
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from pydantic import BaseModel, Field, field_validator
7
+ from typing import List, Dict, Optional, Literal
8
+
9
+
10
+ class AgentInfo(BaseModel):
11
+ """Lightweight agent info from CLI"""
12
+ id: str
13
+ name: str
14
+ model_id: str
15
+ description: Optional[str] = None
16
+ capabilities: List[str] = Field(default_factory=list, description="Agent capabilities")
17
+ status: str = Field(default="active", description="Agent status")
18
+
19
+ @field_validator('description', mode='before')
20
+ @classmethod
21
+ def empty_str_to_none(cls, v):
22
+ """Convert empty string to None for optional fields"""
23
+ if v == '':
24
+ return None
25
+ return v
26
+
27
+ @field_validator('model_id', mode='before')
28
+ @classmethod
29
+ def default_model(cls, v):
30
+ """Provide default model if empty"""
31
+ if not v or v == '':
32
+ return 'claude-sonnet-4'
33
+ return v
34
+
35
+
36
+ class TeamInfo(BaseModel):
37
+ """Lightweight team info from CLI"""
38
+ id: str
39
+ name: str
40
+ description: Optional[str] = None
41
+ agent_count: int = Field(default=0, description="Number of agents in team")
42
+ status: str = Field(default="active", description="Team status")
43
+
44
+ @field_validator('description', mode='before')
45
+ @classmethod
46
+ def empty_str_to_none(cls, v):
47
+ """Convert empty string to None for optional fields"""
48
+ if v == '':
49
+ return None
50
+ return v
51
+
52
+
53
+ class EnvironmentInfo(BaseModel):
54
+ """Environment info from CLI"""
55
+ id: str
56
+ name: str
57
+ display_name: Optional[str] = Field(default=None, description="Display name for environment")
58
+ status: str = Field(default="active", description="Environment status")
59
+
60
+
61
+ class WorkerQueueInfo(BaseModel):
62
+ """Worker queue info from CLI"""
63
+ id: str
64
+ name: str
65
+ environment_id: str = Field(..., description="Associated environment ID")
66
+ status: str = Field(default="active", description="Worker queue status")
67
+ active_workers: int = Field(default=0, description="Number of active workers (key for queue selection!)")
68
+
69
+
70
+ class TaskPlanRequest(BaseModel):
71
+ """Request to plan a task"""
72
+ description: str = Field(..., description="Task description")
73
+ priority: Literal['low', 'medium', 'high', 'critical'] = Field('medium', description="Task priority")
74
+ project_id: Optional[str] = Field(None, description="Associated project ID")
75
+ agents: List[AgentInfo] = Field(default_factory=list, description="Available agents (outer context from CLI)")
76
+ teams: List[TeamInfo] = Field(default_factory=list, description="Available teams (outer context from CLI)")
77
+ environments: List[EnvironmentInfo] = Field(default_factory=list, description="Available execution environments")
78
+ worker_queues: List[WorkerQueueInfo] = Field(default_factory=list, description="Available worker queues")
79
+ refinement_feedback: Optional[str] = Field(None, description="User feedback for plan refinement")
80
+ conversation_context: Optional[str] = Field(None, description="Conversation history for context")
81
+ previous_plan: Optional[Dict] = Field(None, description="Previous plan for refinement")
82
+ iteration: int = Field(1, description="Planning iteration number")
83
+ planning_strategy: Optional[Literal['claude_code_sdk', 'agno']] = Field('claude_code_sdk', description="Planning strategy to use (claude_code_sdk or agno)")
84
+ quick_mode: bool = Field(default=False, description="Use fast planning for --local mode (Haiku vs Sonnet)")
85
+
86
+
87
+ class ComplexityInfo(BaseModel):
88
+ """Task complexity assessment"""
89
+ story_points: int = Field(..., ge=1, le=21, description="Story points (1-21)")
90
+ confidence: Literal['low', 'medium', 'high'] = Field(..., description="Confidence level")
91
+ reasoning: str = Field(..., description="Reasoning for complexity assessment")
92
+
93
+
94
+ class AnalysisAndSelectionOutput(BaseModel):
95
+ """Combined output from Step 1: Analysis + Resource Selection
96
+
97
+ This model combines the old Step 1 (Task Analysis) and Step 2 (Resource Discovery)
98
+ into a single output for the simplified 2-step workflow.
99
+ """
100
+
101
+ # Task Analysis (from old Step 1)
102
+ task_summary: str = Field(..., description="Brief summary of the task")
103
+ required_capabilities: List[str] = Field(default_factory=list, description="Required capabilities (e.g., kubernetes, aws, python)")
104
+ task_type: str = Field(..., description="Type of task (e.g., deployment, investigation, automation)")
105
+ complexity_estimate: Literal["simple", "moderate", "complex"] = Field(..., description="Complexity assessment")
106
+ story_points_estimate: int = Field(..., ge=1, le=21, description="Story points (1-21)")
107
+ needs_multi_agent: bool = Field(..., description="Whether task requires multiple agents/team")
108
+ reasoning: str = Field(..., description="Reasoning for analysis and selection")
109
+
110
+ # Resource Selection (from old Step 2)
111
+ selected_entity_type: Literal["agent", "team"] = Field(..., description="Selected entity type")
112
+ selected_entity_id: str = Field(..., description="UUID of selected agent or team")
113
+ selected_entity_name: str = Field(..., description="Name of selected agent or team")
114
+ selection_reasoning: str = Field(..., description="Why this agent/team was selected")
115
+
116
+ # Selected agent runtime and model info (for preference-based selection)
117
+ selected_agent_runtime: Optional[str] = Field(None, description="Runtime of selected agent ('default' or 'claude_code')")
118
+ selected_agent_model_id: Optional[str] = Field(None, description="Model ID of selected agent (e.g., 'claude-sonnet-4')")
119
+
120
+ # Environment Selection
121
+ selected_environment_id: Optional[str] = Field(None, description="UUID of selected environment (if any)")
122
+ selected_environment_name: Optional[str] = Field(None, description="Name of selected environment")
123
+ selected_worker_queue_id: Optional[str] = Field(None, description="UUID of selected worker queue (if any)")
124
+ selected_worker_queue_name: Optional[str] = Field(None, description="Name of selected worker queue")
125
+
126
+ # Basic Cost Estimate
127
+ estimated_cost_usd: float = Field(..., description="Estimated cost in USD")
128
+ estimated_time_hours: float = Field(..., description="Estimated execution time in hours")
129
+
130
+ # Discovery Data (for Step 2 reference)
131
+ discovered_agents: List[Dict] = Field(default_factory=list, description="Agents discovered during selection")
132
+ discovered_teams: List[Dict] = Field(default_factory=list, description="Teams discovered during selection")
133
+
134
+
135
+ class AgentModelInfo(BaseModel):
136
+ """Information about the model an agent will use"""
137
+ model_id: str # e.g., "claude-sonnet-4", "gpt-4o"
138
+ estimated_input_tokens: int
139
+ estimated_output_tokens: int
140
+ cost_per_1k_input_tokens: float
141
+ cost_per_1k_output_tokens: float
142
+ total_model_cost: float
143
+
144
+
145
+ class ToolUsageInfo(BaseModel):
146
+ """Expected tool usage for an agent"""
147
+ tool_name: str # e.g., "aws_s3", "kubectl", "bash"
148
+ estimated_calls: int
149
+ cost_per_call: float
150
+ total_tool_cost: float
151
+
152
+
153
+ class TaskItem(BaseModel):
154
+ """Detailed task breakdown item with dependencies and testing strategy"""
155
+ id: int = Field(..., description="Unique task ID for tracking dependencies")
156
+ title: str = Field(..., description="Short, clear task title")
157
+ description: str = Field(..., description="Brief overview of what needs to be done")
158
+ details: str = Field(..., description="Step-by-step implementation details, code snippets, and specific instructions")
159
+ test_strategy: str = Field(..., description="How to verify this task was completed correctly")
160
+ priority: Literal["high", "medium", "low"] = Field(default="medium", description="Task priority level")
161
+ dependencies: List[int] = Field(default_factory=list, description="List of task IDs that must be completed before this one")
162
+ status: Literal["pending", "in_progress", "done"] = Field(default="pending", description="Current task status")
163
+ subtasks: List["TaskItem"] = Field(default_factory=list, description="Optional nested subtasks")
164
+ # Execution routing - REQUIRED for plan execution
165
+ agent_id: str = Field(..., description="UUID of agent that will execute this task")
166
+ worker_queue_id: Optional[str] = Field(None, description="UUID of worker queue for execution routing (optional, can be assigned later)")
167
+ # Optional context-driven fields - planner decides what to use based on agent capabilities
168
+ skills_to_use: Optional[List[str]] = Field(default=None, description="Optional: Specific skills from agent's skillset to use (e.g., ['aws_s3', 'kubectl'])")
169
+ env_vars_to_use: Optional[List[str]] = Field(default=None, description="Optional: Environment variables from execution_environment to use (e.g., ['AWS_REGION', 'KUBECONFIG'])")
170
+ secrets_to_use: Optional[List[str]] = Field(default=None, description="Optional: Secrets/credentials from execution_environment to use (e.g., ['AWS_ACCESS_KEY_ID', 'GITHUB_TOKEN'])")
171
+ knowledge_references: Optional[List[str]] = Field(default=None, description="Optional: References to organizational knowledge used for this task")
172
+
173
+
174
+ class TeamBreakdownItem(BaseModel):
175
+ """Breakdown of work for a specific team/agent"""
176
+ team_id: Optional[str] = None
177
+ team_name: str
178
+ agent_id: Optional[str] = None
179
+ agent_name: Optional[str] = None
180
+ responsibilities: List[str]
181
+ estimated_time_hours: float
182
+ model_info: Optional[AgentModelInfo] = None
183
+ expected_tools: List[ToolUsageInfo] = []
184
+ agent_cost: float = 0.0 # Total cost for this agent (model + tools)
185
+ # REQUIRED: Detailed task breakdown with dependencies for execution
186
+ tasks: List[TaskItem] = Field(..., min_length=1, description="REQUIRED: Ordered list of tasks with dependencies. Must have at least one task for plan execution.")
187
+
188
+
189
+ class RecommendedExecution(BaseModel):
190
+ """AI recommendation for which entity should execute the task"""
191
+ entity_type: Literal['agent', 'team']
192
+ entity_id: str
193
+ entity_name: str
194
+ reasoning: str
195
+ recommended_environment_id: Optional[str] = None
196
+ recommended_environment_name: Optional[str] = None
197
+ recommended_worker_queue_id: Optional[str] = None
198
+ recommended_worker_queue_name: Optional[str] = None
199
+ execution_reasoning: Optional[str] = None
200
+
201
+
202
+ class LLMCostBreakdown(BaseModel):
203
+ """Detailed LLM cost breakdown by model"""
204
+ model_id: str
205
+ estimated_input_tokens: int
206
+ estimated_output_tokens: int
207
+ cost_per_1k_input_tokens: float
208
+ cost_per_1k_output_tokens: float
209
+ total_cost: float
210
+
211
+
212
+ class ToolCostBreakdown(BaseModel):
213
+ """Tool execution cost breakdown"""
214
+ category: str # e.g., "AWS APIs", "Database Queries", "External APIs"
215
+ tools: List[ToolUsageInfo]
216
+ category_total: float
217
+
218
+
219
+ class RuntimeCostBreakdown(BaseModel):
220
+ """Runtime and compute costs"""
221
+ worker_execution_hours: float
222
+ cost_per_hour: float
223
+ total_cost: float
224
+
225
+
226
+ class CostBreakdownItem(BaseModel):
227
+ """Individual cost breakdown item (legacy, kept for backwards compatibility)"""
228
+ item: str
229
+ cost: float
230
+
231
+
232
+ class HumanResourceCost(BaseModel):
233
+ """Human resource cost breakdown by role"""
234
+ role: str # e.g., "Senior DevOps Engineer", "Security Engineer"
235
+ hourly_rate: float # e.g., 150.00
236
+ estimated_hours: float # e.g., 8.0
237
+ total_cost: float # e.g., 1200.00
238
+
239
+
240
+ class CostEstimate(BaseModel):
241
+ """Enhanced cost estimation for the task"""
242
+ estimated_cost_usd: float
243
+ # Legacy breakdown (keep for backwards compatibility)
244
+ breakdown: List[CostBreakdownItem] = []
245
+ # New detailed breakdowns
246
+ llm_costs: List[LLMCostBreakdown] = []
247
+ tool_costs: List[ToolCostBreakdown] = []
248
+ runtime_cost: Optional[RuntimeCostBreakdown] = None
249
+
250
+
251
+ class RealizedSavings(BaseModel):
252
+ """Realized savings by using Kubiya orchestration platform"""
253
+ # Without Kubiya (manual execution)
254
+ without_kubiya_cost: float # Total cost if done manually
255
+ without_kubiya_hours: float # Total time if done manually
256
+ without_kubiya_resources: List[HumanResourceCost] # Resource breakdown
257
+
258
+ # With Kubiya (AI orchestration)
259
+ with_kubiya_cost: float # AI execution cost
260
+ with_kubiya_hours: float # AI execution time
261
+
262
+ # Realized Savings
263
+ money_saved: float # Dollars saved
264
+ time_saved_hours: float # Hours saved
265
+ time_saved_percentage: int # Percentage of time saved
266
+
267
+ # Summary
268
+ savings_summary: str # Compelling savings narrative
269
+
270
+
271
+ class TaskPlanResponse(BaseModel):
272
+ """AI-generated task plan"""
273
+ title: str
274
+ summary: str
275
+ complexity: ComplexityInfo
276
+ team_breakdown: List[TeamBreakdownItem]
277
+ recommended_execution: RecommendedExecution
278
+ cost_estimate: CostEstimate
279
+ realized_savings: RealizedSavings
280
+ risks: List[str] = []
281
+ prerequisites: List[str] = []
282
+ success_criteria: List[str] = []
283
+ # Optional fields for when AI needs clarification
284
+ has_questions: bool = False
285
+ questions: Optional[str] = None
286
+ # Engineered prompt for execution - includes full context from plan
287
+ execution_prompt: Optional[str] = Field(
288
+ None,
289
+ description="Detailed, engineered prompt for the executing agent that includes "
290
+ "original request, summary, responsibilities, prerequisites, "
291
+ "success criteria, risks, and execution context. Max 2000 words.",
292
+ max_length=10000 # ~2000 words
293
+ )
294
+ # Top-level environment selection fields for convenience (mirrors recommended_execution)
295
+ selected_environment_id: Optional[str] = Field(
296
+ None,
297
+ description="UUID of the selected environment for execution. "
298
+ "Convenience field - same value as recommended_execution.recommended_environment_id"
299
+ )
300
+ selected_environment_name: Optional[str] = Field(
301
+ None,
302
+ description="Name of the selected environment for execution. "
303
+ "Convenience field - same value as recommended_execution.recommended_environment_name"
304
+ )
305
+ # Selected agent/team runtime and model info
306
+ selected_agent_runtime: Optional[str] = Field(
307
+ None,
308
+ description="Runtime of the selected agent (e.g., 'default', 'claude_code')"
309
+ )
310
+ selected_agent_model_id: Optional[str] = Field(
311
+ None,
312
+ description="Model ID of the selected agent (e.g., 'claude-sonnet-4', 'gpt-4o')"
313
+ )
314
+
315
+
316
+ # ============================================================================
317
+ # Streaming Event Models
318
+ # ============================================================================
319
+
320
+ class StepStartedEvent(BaseModel):
321
+ """Event emitted when a workflow step begins execution"""
322
+ event: Literal["step_started"] = "step_started"
323
+ step: int = Field(..., ge=1, le=4, description="Step number (1-4)")
324
+ step_name: str = Field(..., description="Human-readable step name")
325
+ step_description: str = Field(..., description="What this step does")
326
+ progress: int = Field(..., ge=0, le=100, description="Overall workflow progress percentage")
327
+
328
+
329
+ class StepCompletedEvent(BaseModel):
330
+ """Event emitted when a workflow step completes with its output"""
331
+ event: Literal["step_completed"] = "step_completed"
332
+ step: int = Field(..., ge=1, le=4, description="Step number (1-4)")
333
+ step_name: str = Field(..., description="Human-readable step name")
334
+ output: Dict = Field(..., description="Structured output from this step (TaskAnalysisOutput, etc.)")
335
+ progress: int = Field(..., ge=0, le=100, description="Overall workflow progress percentage")
336
+
337
+
338
+ class ToolCallEvent(BaseModel):
339
+ """Event emitted when a tool begins execution"""
340
+ event: Literal["tool_call"] = "tool_call"
341
+ tool_id: str = Field(..., description="Unique ID for this tool execution")
342
+ tool_name: str = Field(..., description="Name of the tool being called")
343
+ tool_description: Optional[str] = Field(None, description="What the tool does")
344
+ arguments: Dict = Field(default_factory=dict, description="Arguments passed to the tool")
345
+ step: int = Field(..., ge=1, le=4, description="Which workflow step is executing this tool")
346
+ timestamp: str = Field(..., description="ISO 8601 timestamp of tool call")
347
+
348
+
349
+ class ToolResultEvent(BaseModel):
350
+ """Event emitted when a tool completes execution"""
351
+ event: Literal["tool_result"] = "tool_result"
352
+ tool_id: str = Field(..., description="Unique ID matching the tool_call event")
353
+ tool_name: str = Field(..., description="Name of the tool that executed")
354
+ status: Literal["success", "failed"] = Field(..., description="Tool execution status")
355
+ result: Optional[str] = Field(None, description="Tool output (truncated if large)")
356
+ error: Optional[str] = Field(None, description="Error message if status=failed")
357
+ duration: float = Field(..., description="Execution time in seconds")
358
+ step: int = Field(..., ge=1, le=4, description="Which workflow step executed this tool")
359
+ timestamp: str = Field(..., description="ISO 8601 timestamp of completion")
360
+
361
+
362
+ class ValidationErrorEvent(BaseModel):
363
+ """Event emitted when step output validation fails"""
364
+ event: Literal["validation_error"] = "validation_error"
365
+ step: int = Field(..., ge=1, le=4, description="Which workflow step failed validation")
366
+ attempt: int = Field(..., ge=1, description="Retry attempt number (1-based)")
367
+ error: str = Field(..., description="Detailed validation error message explaining what went wrong")
368
+ retrying: bool = Field(..., description="Whether the step will be retried (true) or if this was the final attempt (false)")
369
+
370
+
371
+ # Rebuild models to support forward references (for TaskItem.subtasks)
372
+ TaskItem.model_rebuild()
@@ -0,0 +1,86 @@
1
+ from sqlalchemy import Column, String, DateTime, Text, Enum as SQLEnum, ForeignKey, UniqueConstraint, ARRAY, Index, CheckConstraint, text
2
+ from sqlalchemy.dialects.postgresql import UUID as PG_UUID, JSONB
3
+ from sqlalchemy.orm import relationship
4
+ import enum
5
+
6
+ from control_plane_api.app.database import Base
7
+
8
+
9
+ class TeamStatus(str, enum.Enum):
10
+ """Team status enumeration"""
11
+
12
+ ACTIVE = "active"
13
+ INACTIVE = "inactive"
14
+ ARCHIVED = "archived"
15
+ IDLE = "idle"
16
+
17
+
18
+ class RuntimeType(str, enum.Enum):
19
+ """Team runtime type enumeration"""
20
+
21
+ DEFAULT = "default"
22
+ CLAUDE_CODE = "claude_code"
23
+
24
+
25
+ class Team(Base):
26
+ """Team model for storing team information"""
27
+
28
+ __tablename__ = "teams"
29
+
30
+ id = Column(PG_UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), nullable=False)
31
+ organization_id = Column(String(255), nullable=False)
32
+ name = Column(String(255), nullable=False)
33
+ description = Column(Text, nullable=True)
34
+ status = Column(String(50), server_default=text("'active'::character varying"), nullable=True)
35
+ coordination_type = Column(String(50), server_default=text("'sequential'::character varying"), nullable=True)
36
+ configuration = Column(JSONB, server_default=text("'{}'::jsonb"), nullable=True)
37
+ created_at = Column(DateTime(timezone=True), server_default=text("now()"), nullable=True)
38
+ updated_at = Column(DateTime(timezone=True), server_default=text("now()"), nullable=True)
39
+ last_active_at = Column(DateTime(timezone=True), nullable=True)
40
+ state = Column(JSONB, server_default=text("'{}'::jsonb"), nullable=True)
41
+ error_message = Column(Text, nullable=True)
42
+ visibility = Column(String(20), server_default=text("'private'::character varying"), nullable=True)
43
+ environment_id = Column(PG_UUID(as_uuid=True), ForeignKey("environments.id", ondelete="SET NULL"), nullable=True)
44
+ skill_ids = Column(ARRAY(PG_UUID(as_uuid=True)), server_default=text("'{}'::uuid[]"), nullable=True)
45
+ execution_environment = Column(JSONB, server_default=text("'{}'::jsonb"), nullable=False)
46
+ policy_ids = Column(ARRAY(String(255)), server_default=text("'{}'::character varying[]"), nullable=True)
47
+ runtime = Column(
48
+ SQLEnum(RuntimeType, name="runtimetype", values_callable=lambda x: [e.value for e in x]),
49
+ server_default=RuntimeType.DEFAULT.value,
50
+ nullable=False,
51
+ )
52
+ model_id = Column(String, nullable=True)
53
+
54
+ # Relationships
55
+ environment = relationship("Environment", foreign_keys=[environment_id])
56
+ agents = relationship("Agent", back_populates="team")
57
+
58
+ # Many-to-many relationship with environments
59
+ environment_associations = relationship(
60
+ "TeamEnvironment",
61
+ foreign_keys="TeamEnvironment.team_id",
62
+ cascade="all, delete-orphan",
63
+ lazy="select"
64
+ )
65
+
66
+ __table_args__ = (
67
+ UniqueConstraint('organization_id', 'name', name='teams_organization_id_name_key'),
68
+ UniqueConstraint('organization_id', 'name', name='uq_team_org_name'),
69
+ CheckConstraint("visibility IN ('private', 'org')", name='teams_visibility_check'),
70
+ Index('idx_teams_status', 'status'),
71
+ Index('idx_teams_org', 'organization_id'),
72
+ Index('idx_teams_visibility', 'organization_id', 'visibility'),
73
+ Index('ix_teams_runtime', 'runtime'),
74
+ Index('idx_teams_environment_id', 'environment_id'),
75
+ Index('idx_teams_toolset_ids', 'skill_ids', postgresql_using='gin'),
76
+ Index('idx_teams_execution_environment', 'execution_environment', postgresql_using='gin'),
77
+ Index('idx_teams_policy_ids', 'policy_ids', postgresql_using='gin'),
78
+ )
79
+
80
+ def __repr__(self):
81
+ return f"<Team(id={self.id}, name={self.name}, status={self.status})>"
82
+
83
+ @property
84
+ def environment_ids(self):
85
+ return [assoc.environment_id for assoc in self.environment_associations]
86
+