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,197 @@
1
+ """Agent tools for plan orchestration.
2
+
3
+ These tools are provided to the Claude Code agent to allow it to:
4
+ - Execute tasks (spawn child agent workflows)
5
+ - Check task status
6
+ - Validate task completion
7
+ - Update plan state
8
+ """
9
+
10
+ from typing import Dict, Any, Optional
11
+ import structlog
12
+ from anthropic import BaseModel as AnthropicBaseModel
13
+
14
+ from worker_internal.planner.models import (
15
+ PlanTask,
16
+ TaskStatus,
17
+ TaskExecutionResult,
18
+ AgentToolContext,
19
+ )
20
+
21
+ logger = structlog.get_logger()
22
+
23
+
24
+ class ExecuteTaskTool(AnthropicBaseModel):
25
+ """Tool for executing tasks from the plan."""
26
+
27
+ name: str = "execute_task"
28
+ description: str = """Execute one or more tasks from the plan.
29
+
30
+ For independent tasks (no dependencies), you can execute multiple tasks IN PARALLEL
31
+ by providing task_ids array instead of single task_id. This is much faster!
32
+
33
+ This will:
34
+ 1. Create enriched prompts with task details
35
+ 2. Spawn agent execution workflows (in parallel if multiple tasks)
36
+ 3. Return execution results
37
+
38
+ Args:
39
+ task_id: Single task ID to execute (optional if task_ids provided)
40
+ task_ids: Array of task IDs to execute in parallel (optional if task_id provided)
41
+
42
+ Returns:
43
+ Dictionary with execution results
44
+
45
+ Examples:
46
+ execute_task(task_id=1) # Execute task 1
47
+ execute_task(task_ids=[1, 2, 3]) # Execute tasks 1, 2, 3 in parallel
48
+ """
49
+
50
+ input_schema: Dict[str, Any] = {
51
+ "type": "object",
52
+ "properties": {
53
+ "task_id": {
54
+ "type": "integer",
55
+ "description": "Single task ID to execute"
56
+ },
57
+ "task_ids": {
58
+ "type": "array",
59
+ "items": {"type": "integer"},
60
+ "description": "Array of task IDs to execute in parallel (for independent tasks)"
61
+ }
62
+ }
63
+ }
64
+
65
+
66
+ class GetTaskStatusTool(AnthropicBaseModel):
67
+ """Tool for checking task execution status."""
68
+
69
+ name: str = "get_task_status"
70
+ description: str = """Check the current status of a task execution.
71
+
72
+ Returns the execution status, output, and metadata for a task.
73
+
74
+ Args:
75
+ task_id: The ID of the task to check
76
+
77
+ Returns:
78
+ Dictionary with status, output, tokens, and other metadata
79
+ """
80
+
81
+ input_schema: Dict[str, Any] = {
82
+ "type": "object",
83
+ "properties": {
84
+ "task_id": {
85
+ "type": "integer",
86
+ "description": "The ID of the task to check status for"
87
+ }
88
+ },
89
+ "required": ["task_id"]
90
+ }
91
+
92
+
93
+ class ValidateTaskTool(AnthropicBaseModel):
94
+ """Tool for validating task completion."""
95
+
96
+ name: str = "validate_task"
97
+ description: str = """Validate that a task completed successfully using LLM analysis.
98
+
99
+ This analyzes the task output and conversation to determine if:
100
+ - The task completed as expected (success)
101
+ - The task failed or produced incorrect output (failed)
102
+ - The task needs more work (pending)
103
+
104
+ Args:
105
+ task_id: The ID of the task to validate
106
+
107
+ Returns:
108
+ Dictionary with validation status, reason, and confidence score
109
+ """
110
+
111
+ input_schema: Dict[str, Any] = {
112
+ "type": "object",
113
+ "properties": {
114
+ "task_id": {
115
+ "type": "integer",
116
+ "description": "The ID of the task to validate"
117
+ }
118
+ },
119
+ "required": ["task_id"]
120
+ }
121
+
122
+
123
+ class UpdatePlanStatusTool(AnthropicBaseModel):
124
+ """Tool for updating overall plan status."""
125
+
126
+ name: str = "update_plan_status"
127
+ description: str = """Update the overall plan execution status and progress.
128
+
129
+ Use this to provide status updates as you progress through the plan.
130
+ This will publish events to the UI for real-time updates.
131
+
132
+ Args:
133
+ status_message: Human-readable status message
134
+ completed_tasks: Number of tasks completed so far
135
+
136
+ Returns:
137
+ Success confirmation
138
+ """
139
+
140
+ input_schema: Dict[str, Any] = {
141
+ "type": "object",
142
+ "properties": {
143
+ "status_message": {
144
+ "type": "string",
145
+ "description": "Human-readable status update message"
146
+ },
147
+ "completed_tasks": {
148
+ "type": "integer",
149
+ "description": "Number of tasks completed so far"
150
+ }
151
+ },
152
+ "required": ["status_message"]
153
+ }
154
+
155
+
156
+ class ListTasksTool(AnthropicBaseModel):
157
+ """Tool for listing all tasks in the plan."""
158
+
159
+ name: str = "list_tasks"
160
+ description: str = """Get a list of all tasks in the plan with their dependencies.
161
+
162
+ Use this to understand the plan structure and task relationships.
163
+
164
+ Returns:
165
+ List of tasks with their IDs, titles, dependencies, and status
166
+ """
167
+
168
+ input_schema: Dict[str, Any] = {
169
+ "type": "object",
170
+ "properties": {},
171
+ "required": []
172
+ }
173
+
174
+
175
+ def get_agent_tools() -> list:
176
+ """Get all tools available to the orchestrator agent."""
177
+ return [
178
+ ExecuteTaskTool(),
179
+ GetTaskStatusTool(),
180
+ ValidateTaskTool(),
181
+ UpdatePlanStatusTool(),
182
+ ListTasksTool(),
183
+ ]
184
+
185
+
186
+ def format_tool_for_anthropic(tool: AnthropicBaseModel) -> Dict[str, Any]:
187
+ """Format a tool definition for Anthropic API."""
188
+ return {
189
+ "name": tool.name,
190
+ "description": tool.description,
191
+ "input_schema": tool.input_schema,
192
+ }
193
+
194
+
195
+ def get_agent_tools_formatted() -> list:
196
+ """Get all tools formatted for Anthropic API."""
197
+ return [format_tool_for_anthropic(tool) for tool in get_agent_tools()]
@@ -0,0 +1,148 @@
1
+ """Pydantic models for plan execution streaming events."""
2
+
3
+ from typing import Optional, List, Dict, Any
4
+ from pydantic import BaseModel, Field
5
+ from datetime import datetime
6
+
7
+
8
+ class PlanEventBase(BaseModel):
9
+ """Base model for all plan events."""
10
+ execution_id: str
11
+ timestamp: Optional[datetime] = Field(default_factory=lambda: datetime.utcnow())
12
+
13
+
14
+ class PlanStartedEvent(PlanEventBase):
15
+ """Plan execution started."""
16
+ title: str
17
+ total_tasks: int
18
+ agent_id: str
19
+
20
+
21
+ class TaskStartedEvent(PlanEventBase):
22
+ """Task execution started."""
23
+ task_id: int
24
+ title: str
25
+ description: str
26
+ agent_id: str
27
+ task_execution_id: str # Agent execution ID for this task
28
+ dependencies: List[int] = Field(default_factory=list)
29
+
30
+
31
+ class TaskRunningEvent(PlanEventBase):
32
+ """Task execution progress update."""
33
+ task_id: int
34
+ status: str
35
+ message: Optional[str] = None
36
+
37
+
38
+ class TasksParallelEvent(PlanEventBase):
39
+ """Multiple tasks running in parallel."""
40
+ task_ids: List[int]
41
+ message: str
42
+
43
+
44
+ class TaskWaitingForInputEvent(PlanEventBase):
45
+ """Task paused, waiting for user input."""
46
+ task_id: int
47
+ question: str
48
+ task_execution_id: str
49
+
50
+
51
+ class TaskValidationStartedEvent(PlanEventBase):
52
+ """Task validation started."""
53
+ task_id: int
54
+ title: str
55
+
56
+
57
+ class TaskValidationCompleteEvent(PlanEventBase):
58
+ """Task validation completed."""
59
+ task_id: int
60
+ is_valid: bool
61
+ reason: str
62
+ confidence: float
63
+
64
+
65
+ class TaskRetryEvent(PlanEventBase):
66
+ """Task is being retried after failure."""
67
+ task_id: int
68
+ title: str
69
+ attempt_number: int
70
+ max_attempts: int
71
+ previous_error: str
72
+
73
+
74
+ class TaskCompletedEvent(PlanEventBase):
75
+ """Task execution completed."""
76
+ task_id: int
77
+ title: str
78
+ status: str
79
+ output: str
80
+ error: Optional[str] = None
81
+ tokens: int = 0
82
+ cost: float = 0.0
83
+ retry_count: int = 0
84
+ had_retries: bool = False
85
+
86
+
87
+ class PlanStatusUpdateEvent(PlanEventBase):
88
+ """Overall plan progress update."""
89
+ completed_tasks: int
90
+ failed_tasks: int
91
+ total_tasks: int
92
+ current_task_id: Optional[int] = None
93
+ progress_percentage: float
94
+
95
+
96
+ class PlanCompletedEvent(PlanEventBase):
97
+ """Plan execution completed."""
98
+ status: str # "completed" or "failed"
99
+ completed_tasks: int
100
+ failed_tasks: int
101
+ total_tasks: int
102
+ total_tokens: int
103
+ total_cost: float
104
+ duration_seconds: float
105
+
106
+
107
+ class TodoItem(BaseModel):
108
+ """Single TODO item for UI checklist."""
109
+ task_id: int
110
+ title: str
111
+ description: str
112
+ status: str # "pending", "running", "completed", "failed", "waiting_for_input"
113
+ dependencies: List[int] = Field(default_factory=list)
114
+ agent_id: Optional[str] = None
115
+
116
+
117
+ class TodoListInitializedEvent(PlanEventBase):
118
+ """Initial TODO list with all tasks."""
119
+ title: str
120
+ total_tasks: int
121
+ items: List[TodoItem]
122
+
123
+
124
+ class TodoItemUpdatedEvent(PlanEventBase):
125
+ """Individual TODO item status update."""
126
+ task_id: int
127
+ title: str
128
+ old_status: str
129
+ new_status: str
130
+ message: Optional[str] = None
131
+
132
+
133
+ # Event type mapping for serialization
134
+ EVENT_TYPE_MAP = {
135
+ "plan_started": PlanStartedEvent,
136
+ "task_started": TaskStartedEvent,
137
+ "task_running": TaskRunningEvent,
138
+ "tasks_parallel": TasksParallelEvent,
139
+ "task_retry": TaskRetryEvent,
140
+ "task_waiting_for_input": TaskWaitingForInputEvent,
141
+ "task_validation_started": TaskValidationStartedEvent,
142
+ "task_validation_complete": TaskValidationCompleteEvent,
143
+ "task_completed": TaskCompletedEvent,
144
+ "plan_status_update": PlanStatusUpdateEvent,
145
+ "plan_completed": PlanCompletedEvent,
146
+ "todo_list_initialized": TodoListInitializedEvent,
147
+ "todo_item_updated": TodoItemUpdatedEvent,
148
+ }
@@ -0,0 +1,67 @@
1
+ """Event publishing utilities for plan orchestration."""
2
+
3
+ from typing import Optional, Dict, Any
4
+ import structlog
5
+ import httpx
6
+ import json as json_lib
7
+ import os
8
+
9
+ from worker_internal.planner.event_models import PlanEventBase
10
+
11
+ logger = structlog.get_logger(__name__)
12
+
13
+
14
+ async def publish_plan_event(
15
+ execution_id: str,
16
+ event_type: str,
17
+ event_data: PlanEventBase,
18
+ ) -> bool:
19
+ """
20
+ Publish plan event via HTTP to control plane (which handles Redis).
21
+
22
+ This approach is more reliable than direct Redis access from activities
23
+ because the control plane manages Redis connections and event storage.
24
+ """
25
+ try:
26
+ control_plane_url = os.getenv("CONTROL_PLANE_URL", "http://localhost:8000")
27
+
28
+ # Build event message (serialize datetime objects to strings)
29
+ event_dict = json_lib.loads(json_lib.dumps(event_data.dict(), default=str))
30
+
31
+ message = {
32
+ "event_type": event_type,
33
+ "data": event_dict,
34
+ "timestamp": event_data.timestamp.isoformat() if event_data.timestamp else None,
35
+ }
36
+
37
+ # Publish via HTTP to control plane
38
+ async with httpx.AsyncClient(timeout=5.0) as client:
39
+ response = await client.post(
40
+ f"{control_plane_url}/api/v1/tasks/plan/events/{execution_id}",
41
+ json=message,
42
+ )
43
+
44
+ if response.status_code in (200, 201, 202):
45
+ logger.debug(
46
+ "plan_event_published",
47
+ execution_id=execution_id[:8],
48
+ event_type=event_type,
49
+ )
50
+ return True
51
+ else:
52
+ logger.warning(
53
+ "plan_event_publish_failed",
54
+ execution_id=execution_id[:8],
55
+ event_type=event_type,
56
+ status=response.status_code,
57
+ )
58
+ return False
59
+
60
+ except Exception as e:
61
+ logger.error(
62
+ "plan_event_publish_error",
63
+ execution_id=execution_id[:8],
64
+ event_type=event_type,
65
+ error=str(e),
66
+ )
67
+ return False
@@ -0,0 +1,199 @@
1
+ """Pydantic models for plan orchestration."""
2
+
3
+ from typing import Optional, List, Dict, Any
4
+ from pydantic import BaseModel, Field
5
+ from datetime import datetime
6
+ from enum import Enum
7
+
8
+
9
+ class PlanStatus(str, Enum):
10
+ """Plan execution status"""
11
+ PENDING = "pending"
12
+ RUNNING = "running"
13
+ PENDING_USER_INPUT = "pending_user_input" # Paused, waiting for user to provide input
14
+ COMPLETED = "completed"
15
+ FAILED = "failed"
16
+ CANCELLED = "cancelled"
17
+
18
+
19
+ class TaskStatus(str, Enum):
20
+ """Task execution status"""
21
+ PENDING = "pending"
22
+ RUNNING = "running"
23
+ SUCCESS = "success"
24
+ FAILED = "failed"
25
+ WAITING_FOR_INPUT = "waiting_for_input" # Task paused, needs user input to continue
26
+ VALIDATING = "validating"
27
+
28
+
29
+ class PlanTask(BaseModel):
30
+ """Task definition from plan"""
31
+ id: int
32
+ title: str
33
+ description: str
34
+ details: str
35
+ test_strategy: Optional[str] = None
36
+ priority: str = "medium"
37
+ dependencies: List[int] = Field(default_factory=list)
38
+ status: TaskStatus = TaskStatus.PENDING
39
+ subtasks: List[Any] = Field(default_factory=list)
40
+ skills_to_use: List[str] = Field(default_factory=list)
41
+ env_vars_to_use: List[str] = Field(default_factory=list)
42
+ secrets_to_use: List[str] = Field(default_factory=list)
43
+ knowledge_references: List[str] = Field(default_factory=list)
44
+ agent_id: Optional[str] = None
45
+ worker_queue_id: Optional[str] = None
46
+
47
+
48
+ class AgentInfo(BaseModel):
49
+ """Agent metadata from plan"""
50
+ team_id: Optional[str] = None
51
+ team_name: str
52
+ agent_id: str
53
+ agent_name: str
54
+ responsibilities: List[str] = Field(default_factory=list)
55
+ estimated_time_hours: float = 0.0
56
+ model_info: Dict[str, Any] = Field(default_factory=dict)
57
+ expected_tools: List[Dict[str, Any]] = Field(default_factory=list)
58
+ agent_cost: float = 0.0
59
+ tasks: List[PlanTask] = Field(default_factory=list)
60
+
61
+
62
+ class Plan(BaseModel):
63
+ """Plan definition"""
64
+ title: str
65
+ summary: str
66
+ complexity: Dict[str, Any] = Field(default_factory=dict)
67
+ team_breakdown: List[AgentInfo] = Field(default_factory=list)
68
+ recommended_execution: Dict[str, Any] = Field(default_factory=dict)
69
+ cost_estimate: Dict[str, Any] = Field(default_factory=dict)
70
+ realized_savings: Dict[str, Any] = Field(default_factory=dict)
71
+ risks: List[str] = Field(default_factory=list)
72
+ prerequisites: List[str] = Field(default_factory=list)
73
+ success_criteria: List[str] = Field(default_factory=list)
74
+ has_questions: bool = False
75
+ questions: Optional[Any] = None
76
+
77
+
78
+ class PlanOrchestratorInput(BaseModel):
79
+ """Input for plan orchestrator workflow"""
80
+ plan: Plan
81
+ organization_id: str
82
+ agent_id: str
83
+ worker_queue_id: str # Worker queue ID for routing task executions
84
+ user_id: Optional[str] = None
85
+ execution_id: Optional[str] = None
86
+ # Auth context
87
+ jwt_token: Optional[str] = None
88
+ # Continuation context
89
+ is_continuation: bool = False # True if this is resuming a paused plan
90
+ previous_task_results: Optional[Dict[int, Dict[str, Any]]] = None # Previous task results for continuation
91
+
92
+
93
+ class TaskRetryAttempt(BaseModel):
94
+ """Single retry attempt record"""
95
+ attempt_number: int
96
+ error: str
97
+ output: str
98
+ events: List[Dict[str, Any]] = Field(default_factory=list)
99
+ started_at: datetime
100
+ completed_at: datetime
101
+
102
+
103
+ class TaskRetryContext(BaseModel):
104
+ """Context for retrying a failed task"""
105
+ current_attempt: int
106
+ max_attempts: int
107
+ previous_failures: List[TaskRetryAttempt]
108
+
109
+
110
+ class TaskExecutionResult(BaseModel):
111
+ """Result of task execution"""
112
+ task_id: int
113
+ status: TaskStatus
114
+ execution_id: str
115
+ output: str
116
+ events: List[Dict[str, Any]] = Field(default_factory=list)
117
+ tokens: int = 0
118
+ cost: float = 0.0
119
+ started_at: Optional[datetime] = None
120
+ completed_at: Optional[datetime] = None
121
+ error: Optional[str] = None
122
+ needs_continuation: bool = False
123
+ user_question: Optional[str] = None
124
+ retry_count: int = 0
125
+ retry_history: List[TaskRetryAttempt] = Field(default_factory=list)
126
+
127
+
128
+ class TaskValidationResult(BaseModel):
129
+ """Result of task validation"""
130
+ task_id: int
131
+ status: TaskStatus
132
+ reason: str
133
+ confidence: float
134
+ suggestions: Optional[str] = None
135
+
136
+
137
+ class PlanExecutionSummary(BaseModel):
138
+ """Final plan execution summary"""
139
+ plan_execution_id: str
140
+ status: PlanStatus
141
+ total_tasks: int
142
+ completed_tasks: int
143
+ failed_tasks: int
144
+ total_tokens: int
145
+ total_cost: float
146
+ started_at: datetime
147
+ completed_at: Optional[datetime] = None
148
+ execution_time_seconds: float = 0.0
149
+ task_results: Dict[int, TaskExecutionResult] = Field(default_factory=dict)
150
+
151
+
152
+ # Activity inputs/outputs
153
+
154
+ class CreatePlanExecutionInput(BaseModel):
155
+ """Input for create_plan_execution activity"""
156
+ execution_id: str
157
+ organization_id: str
158
+ agent_id: str
159
+ title: str
160
+ summary: Optional[str] = None
161
+ total_tasks: int
162
+ plan_json: Dict[str, Any]
163
+ estimated_cost_usd: Optional[float] = None
164
+
165
+
166
+ class UpdatePlanStateInput(BaseModel):
167
+ """Input for update_plan_state activity"""
168
+ plan_execution_id: str
169
+ status: Optional[PlanStatus] = None
170
+ completed_tasks: Optional[int] = None
171
+ failed_tasks: Optional[int] = None
172
+ current_task_id: Optional[int] = None
173
+ current_task_status: Optional[TaskStatus] = None
174
+ dag_state: Optional[Dict[int, Any]] = None
175
+ total_tokens: Optional[int] = None
176
+ actual_cost_usd: Optional[float] = None
177
+ waiting_tasks: Optional[List[Dict[str, Any]]] = None # List of tasks waiting for user input
178
+
179
+
180
+ class ExecuteAgentInput(BaseModel):
181
+ """Input for executing an agent (child workflow)"""
182
+ execution_id: str
183
+ agent_id: str
184
+ organization_id: str
185
+ prompt: str
186
+ system_prompt: Optional[str] = None
187
+ model_id: Optional[str] = None
188
+ task_metadata: Dict[str, Any] = Field(default_factory=dict)
189
+ jwt_token: Optional[str] = None
190
+
191
+
192
+ class AgentToolContext(BaseModel):
193
+ """Context passed to agent tools"""
194
+ plan_execution_id: str
195
+ organization_id: str
196
+ agent_id: str
197
+ plan: Plan
198
+ task_results: Dict[int, TaskExecutionResult] = Field(default_factory=dict)
199
+ jwt_token: Optional[str] = None