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,99 @@
1
+ """
2
+ Custom Integration Model
3
+
4
+ Allows users to define custom integration instances with:
5
+ - Environment variables
6
+ - Secrets (references to secrets vault)
7
+ - Files (content to be written to workspace)
8
+ - Contextual prompt (guidance for the agent)
9
+ """
10
+ from sqlalchemy import Column, String, DateTime, Text, JSON, Enum, Index, CheckConstraint, text, func
11
+ from sqlalchemy.dialects.postgresql import UUID, JSONB
12
+ import enum
13
+
14
+ from control_plane_api.app.database import Base
15
+
16
+
17
+ class CustomIntegrationStatus(str, enum.Enum):
18
+ """Custom integration status"""
19
+ ACTIVE = "active"
20
+ INACTIVE = "inactive"
21
+ DELETED = "deleted"
22
+
23
+
24
+ class CustomIntegration(Base):
25
+ """
26
+ Custom Integration Model
27
+
28
+ Allows users to define custom integrations that can be referenced
29
+ in execution environments, providing:
30
+ - Environment variables for credentials/config
31
+ - Secrets vault references
32
+ - Files to be written to workspace (e.g., config files, certificates)
33
+ - Contextual prompts to guide the agent
34
+ """
35
+ __tablename__ = "custom_integrations"
36
+
37
+ id = Column(UUID(as_uuid=False), primary_key=True, server_default=text("gen_random_uuid()"))
38
+ organization_id = Column(String(255), nullable=False, index=True)
39
+
40
+ # Identification
41
+ name = Column(String(255), nullable=False) # e.g., "production-database"
42
+ integration_type = Column(String(100), nullable=False) # e.g., "postgres", "mongodb", "redis", "custom"
43
+ description = Column(Text, nullable=True)
44
+
45
+ # Status
46
+ status = Column(Enum(CustomIntegrationStatus), nullable=False, server_default="active")
47
+
48
+ # Configuration
49
+ config = Column(JSONB, nullable=False, server_default=text("'{}'::jsonb"))
50
+ # Structure:
51
+ # {
52
+ # "env_vars": {
53
+ # "DB_HOST": "postgres.prod.example.com",
54
+ # "DB_PORT": "5432",
55
+ # "DB_NAME": "production"
56
+ # },
57
+ # "secrets": [
58
+ # "DB_PASSWORD", # Reference to secrets vault
59
+ # "DB_SSL_CERT" # Another secret reference
60
+ # ],
61
+ # "files": [
62
+ # {
63
+ # "path": "~/.postgresql/client.crt",
64
+ # "content": "-----BEGIN CERTIFICATE-----...",
65
+ # "mode": "0600",
66
+ # "description": "PostgreSQL client certificate"
67
+ # },
68
+ # {
69
+ # "path": "~/.postgresql/client.key",
70
+ # "secret_ref": "POSTGRES_CLIENT_KEY", # Load content from secret
71
+ # "mode": "0600",
72
+ # "description": "PostgreSQL client key"
73
+ # }
74
+ # ],
75
+ # "context_prompt": "This is a PostgreSQL production database. Always use connection pooling. Max connections: 100.",
76
+ # "connection_test": {
77
+ # "enabled": true,
78
+ # "command": "pg_isready -h $DB_HOST -p $DB_PORT",
79
+ # "timeout": 5
80
+ # }
81
+ # }
82
+
83
+ # Metadata
84
+ tags = Column(JSONB, nullable=True, server_default=text("'[]'::jsonb"))
85
+ created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
86
+ updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)
87
+ created_by = Column(String(255), nullable=True)
88
+
89
+ # Constraints
90
+ __table_args__ = (
91
+ Index("idx_custom_integrations_org_name", "organization_id", "name", unique=True),
92
+ Index("idx_custom_integrations_org_type", "organization_id", "integration_type"),
93
+ Index("idx_custom_integrations_status", "status"),
94
+ CheckConstraint("name != ''", name="ck_custom_integration_name_not_empty"),
95
+ CheckConstraint("integration_type != ''", name="ck_custom_integration_type_not_empty"),
96
+ )
97
+
98
+ def __repr__(self):
99
+ return f"<CustomIntegration(id={self.id}, name={self.name}, type={self.integration_type})>"
@@ -0,0 +1,64 @@
1
+ """Environment model for execution environments"""
2
+ from sqlalchemy import Column, String, DateTime, Text, ARRAY, ForeignKey, UniqueConstraint, Index, CheckConstraint, text
3
+ from sqlalchemy.dialects.postgresql import UUID, JSONB
4
+ import enum
5
+
6
+ from control_plane_api.app.database import Base
7
+
8
+
9
+ class EnvironmentStatus(str, enum.Enum):
10
+ """Environment status"""
11
+ PENDING = "pending"
12
+ PROVISIONING = "provisioning"
13
+ READY = "ready"
14
+ ACTIVE = "active"
15
+ INACTIVE = "inactive"
16
+ ERROR = "error"
17
+ ARCHIVED = "archived"
18
+
19
+
20
+ class Environment(Base):
21
+ """
22
+ Execution environment - represents a worker queue environment.
23
+ Maps to task queues in Temporal.
24
+ """
25
+
26
+ __tablename__ = "environments"
27
+
28
+ id = Column(UUID(as_uuid=True), primary_key=True, nullable=False, server_default=text("gen_random_uuid()"))
29
+ organization_id = Column(String(255), nullable=False)
30
+ name = Column(String(100), nullable=False)
31
+ display_name = Column(String(255), nullable=True)
32
+ description = Column(Text, nullable=True)
33
+ tags = Column(JSONB, nullable=True, server_default=text("'[]'::jsonb"))
34
+ settings = Column(JSONB, nullable=True, server_default=text("'{}'::jsonb"))
35
+ status = Column(String(50), nullable=True, server_default=text("'active'::character varying"))
36
+ created_at = Column(DateTime(timezone=True), nullable=True, server_default=text("now()"))
37
+ updated_at = Column(DateTime(timezone=True), nullable=True, server_default=text("now()"))
38
+ created_by = Column(String(255), nullable=True)
39
+ temporal_namespace_id = Column(UUID(as_uuid=True), nullable=True) # TODO add foreign key to temporal_namespaces table later or totally remove.
40
+ worker_token = Column(UUID(as_uuid=True), nullable=True, server_default=text("gen_random_uuid()"))
41
+ provisioning_workflow_id = Column(String(255), nullable=True)
42
+ error_message = Column(Text, nullable=True)
43
+ provisioned_at = Column(DateTime(timezone=True), nullable=True)
44
+ execution_environment = Column(JSONB, nullable=False, server_default=text("'{}'::jsonb"))
45
+ policy_ids = Column(ARRAY(String(255)), nullable=True, server_default=text("'{}'::character varying[]"))
46
+
47
+ __table_args__ = (
48
+ UniqueConstraint('organization_id', 'name', name='unique_queue_name_per_org'),
49
+ CheckConstraint(
50
+ "status::text = ANY (ARRAY['pending'::character varying, 'provisioning'::character varying, 'ready'::character varying, 'active'::character varying, 'inactive'::character varying, 'error'::character varying, 'archived'::character varying]::text[])",
51
+ name='task_queues_status_check'
52
+ ),
53
+ Index('idx_task_queues_namespace', 'temporal_namespace_id'),
54
+ Index('idx_task_queues_worker_token', 'worker_token'),
55
+ Index('idx_task_queues_org', 'organization_id'),
56
+ Index('idx_task_queues_status', 'organization_id', 'status', postgresql_where=text("status::text = 'active'::text")),
57
+ Index('idx_task_queues_name', 'organization_id', 'name'),
58
+ Index('idx_environments_execution_environment', 'execution_environment', postgresql_using='gin'),
59
+ Index('idx_environments_policy_ids', 'policy_ids', postgresql_using='gin'),
60
+ )
61
+
62
+ def __repr__(self):
63
+ return f"<Environment(id={self.id}, name={self.name}, organization_id={self.organization_id}, status={self.status})>"
64
+
@@ -0,0 +1,125 @@
1
+ from sqlalchemy import Column, String, DateTime, Text, JSON, Enum as SQLEnum, ForeignKey, Index, desc
2
+ from sqlalchemy.dialects.postgresql import UUID, JSONB
3
+ from sqlalchemy.orm import relationship
4
+ from sqlalchemy.sql import func
5
+ from datetime import datetime
6
+ import uuid
7
+ import enum
8
+
9
+ from control_plane_api.app.database import Base
10
+
11
+
12
+ class ExecutionStatus(str, enum.Enum):
13
+ PENDING = "pending"
14
+ QUEUED = "queued" # Message received and queued for processing
15
+ RUNNING = "running"
16
+ WAITING_FOR_INPUT = "waiting_for_input"
17
+ PAUSED = "paused"
18
+ COMPLETED = "completed"
19
+ FAILED = "failed"
20
+ CANCELLED = "cancelled"
21
+
22
+
23
+ class ExecutionType(str, enum.Enum):
24
+ AGENT = "agent"
25
+ TEAM = "team"
26
+ WORKFLOW = "workflow"
27
+ PLAN_GENERATION = "plan_generation"
28
+
29
+
30
+ class ExecutionTriggerSource(str, enum.Enum):
31
+ """How the execution was triggered"""
32
+ USER = "user" # Triggered by a user directly via UI/API
33
+ JOB_CRON = "job_cron" # Triggered by a scheduled job (cron)
34
+ JOB_WEBHOOK = "job_webhook" # Triggered by a webhook job
35
+ JOB_MANUAL = "job_manual" # Triggered manually through job trigger API
36
+ SYSTEM = "system" # Triggered by system/automation
37
+ API = "api" # Triggered directly via API
38
+ CHAT = "chat" # Triggered from chat interface
39
+
40
+
41
+ class Execution(Base):
42
+ """Model for tracking agent/team/workflow executions with user attribution"""
43
+
44
+ __tablename__ = "executions"
45
+
46
+ id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, nullable=False)
47
+
48
+ # Organization
49
+ organization_id = Column(String(255), nullable=False, index=True)
50
+
51
+ # What is being executed
52
+ execution_type = Column(String(50), nullable=False)
53
+ entity_id = Column(UUID(as_uuid=True), nullable=False) # agent_id, team_id, or workflow_id
54
+ entity_name = Column(String(255), nullable=True) # Cached name for display
55
+ runner_name = Column(String(100), nullable=False) # Cached runner name for filtering
56
+
57
+ # User attribution - who initiated this execution
58
+ user_id = Column(String(255), nullable=True, index=True)
59
+ user_email = Column(String(255), nullable=True)
60
+ user_name = Column(String(255), nullable=True)
61
+ user_avatar = Column(Text, nullable=True)
62
+
63
+ # Trigger source - how this execution was initiated
64
+ trigger_source = Column(
65
+ SQLEnum(ExecutionTriggerSource, name='executiontriggersource', values_callable=lambda x: [e.value for e in x]),
66
+ server_default=ExecutionTriggerSource.USER.value,
67
+ nullable=False,
68
+ index=True
69
+ )
70
+ trigger_metadata = Column(JSON, default={}, nullable=True) # Additional context about the trigger (job_id, webhook payload, etc.)
71
+
72
+ # Execution details
73
+ prompt = Column(Text, nullable=False)
74
+ system_prompt = Column(Text, nullable=True)
75
+ config = Column(JSONB, default={}, nullable=True)
76
+
77
+ # Status and results
78
+ status = Column(String(50), default='pending', nullable=True)
79
+ response = Column(Text, nullable=True)
80
+ error_message = Column(Text, nullable=True)
81
+
82
+ # Temporal workflow information
83
+ temporal_workflow_id = Column(String(255), nullable=True, unique=True)
84
+ temporal_run_id = Column(String(255), nullable=True)
85
+
86
+ # Task queue information
87
+ task_queue_name = Column(String(100), default='default', nullable=True)
88
+
89
+ # Metadata
90
+ usage = Column(JSONB, default={}, nullable=True) # Token usage, cost, etc.
91
+ execution_metadata = Column(JSONB, default={}, nullable=True) # Additional metadata
92
+ plan_json = Column(JSONB, default={}, nullable=True) # Generated plan (for PLAN_GENERATION type)
93
+
94
+ # Worker queue assignment
95
+ # Using SET NULL to preserve execution history when ephemeral queues are deleted
96
+ worker_queue_id = Column(UUID(as_uuid=True), ForeignKey('worker_queues.id', ondelete="SET NULL"), nullable=True, index=True)
97
+
98
+ # Timestamps
99
+ created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=True)
100
+ started_at = Column(DateTime(timezone=True), nullable=True)
101
+ completed_at = Column(DateTime(timezone=True), nullable=True)
102
+ updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=True)
103
+
104
+ # Relationships
105
+ participants = relationship("ExecutionParticipant", back_populates="execution", cascade="all, delete-orphan", lazy="selectin")
106
+ worker_queue = relationship("WorkerQueue", foreign_keys=[worker_queue_id])
107
+
108
+ __table_args__ = (
109
+ Index('idx_executions_workflow', 'temporal_workflow_id', postgresql_where='temporal_workflow_id IS NOT NULL'),
110
+ Index('idx_executions_run', 'temporal_run_id', postgresql_where='temporal_run_id IS NOT NULL'),
111
+ Index('idx_executions_runner', 'runner_name'),
112
+ Index('idx_executions_status', 'status'),
113
+ Index('idx_executions_user', 'user_id'),
114
+ Index('idx_executions_created', desc('created_at')),
115
+ Index('idx_executions_entity', 'entity_id'),
116
+ Index('idx_executions_org', 'organization_id'),
117
+ Index('idx_executions_task_queue', 'task_queue_name'),
118
+ Index('idx_executions_worker_queue_id', 'worker_queue_id'),
119
+ Index('idx_executions_user_id', 'user_id'),
120
+ Index('idx_executions_user_email', 'user_email'),
121
+ Index('ix_executions_trigger_source', 'trigger_source'),
122
+ )
123
+
124
+ def __repr__(self):
125
+ return f"<Execution {self.id} ({self.execution_type}:{self.entity_id}) - {self.status} by {self.user_email}>"
@@ -0,0 +1,50 @@
1
+ """
2
+ Execution Transition Model
3
+
4
+ Tracks state transitions for executions with AI reasoning.
5
+ """
6
+
7
+ from sqlalchemy import Column, String, Integer, DateTime, Boolean, JSON, ForeignKey
8
+ from sqlalchemy.dialects.postgresql import UUID
9
+ from sqlalchemy.sql import func
10
+ from datetime import datetime
11
+ import uuid
12
+
13
+ from control_plane_api.app.database import Base
14
+
15
+
16
+ class ExecutionTransition(Base):
17
+ """Model for tracking execution state transitions with AI reasoning"""
18
+
19
+ __tablename__ = "execution_transitions"
20
+
21
+ id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, nullable=False)
22
+
23
+ # Organization and execution references
24
+ organization_id = Column(String, nullable=False, index=True)
25
+ execution_id = Column(UUID(as_uuid=True), ForeignKey('executions.id', ondelete='CASCADE'), nullable=False, index=True)
26
+
27
+ # Turn context
28
+ turn_number = Column(Integer, nullable=False)
29
+
30
+ # State transition
31
+ from_state = Column(String(50), nullable=False)
32
+ to_state = Column(String(50), nullable=False)
33
+
34
+ # AI decision details
35
+ reasoning = Column(String, nullable=False)
36
+ confidence = Column(String(20), nullable=False) # low, medium, high
37
+ decision_factors = Column(JSON, default={}, nullable=True)
38
+
39
+ # Model and timing
40
+ ai_model = Column(String(100), nullable=True)
41
+ decision_time_ms = Column(Integer, nullable=True)
42
+
43
+ # Manual override flag
44
+ is_manual_override = Column(Boolean, default=False, nullable=False)
45
+
46
+ # Timestamps
47
+ created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
48
+
49
+ def __repr__(self):
50
+ return f"<ExecutionTransition {self.id} ({self.from_state} → {self.to_state}) confidence={self.confidence}>"
@@ -0,0 +1,159 @@
1
+ from sqlalchemy import Column, String, DateTime, Text, JSON, Boolean, ForeignKey, Integer, Index
2
+ from sqlalchemy.dialects.postgresql import UUID
3
+ from sqlalchemy.orm import relationship
4
+ from sqlalchemy.sql import func
5
+ import uuid
6
+ import enum
7
+
8
+ from control_plane_api.app.database import Base
9
+
10
+
11
+ class JobStatus(str, enum.Enum):
12
+ """Job status enumeration"""
13
+ ACTIVE = "active"
14
+ PAUSED = "paused"
15
+ FAILED = "failed"
16
+ DISABLED = "disabled"
17
+
18
+
19
+ class JobTriggerType(str, enum.Enum):
20
+ """Job trigger type enumeration"""
21
+ CRON = "cron"
22
+ WEBHOOK = "webhook"
23
+ MANUAL = "manual"
24
+
25
+
26
+ class ExecutorType(str, enum.Enum):
27
+ """Job executor routing type"""
28
+ AUTO = "auto" # First available worker queue with active workers
29
+ SPECIFIC_QUEUE = "specific_queue" # Explicit worker queue selection
30
+ ENVIRONMENT = "environment" # Route to specific environment
31
+
32
+
33
+ class PlanningMode(str, enum.Enum):
34
+ """Planning mode for job execution"""
35
+ ON_THE_FLY = "on_the_fly" # Use planner to determine execution
36
+ PREDEFINED_AGENT = "predefined_agent" # Execute specific agent
37
+ PREDEFINED_TEAM = "predefined_team" # Execute specific team
38
+ PREDEFINED_WORKFLOW = "predefined_workflow" # Execute specific workflow
39
+
40
+
41
+ class Job(Base):
42
+ """
43
+ Model for scheduled and webhook-triggered jobs.
44
+
45
+ Jobs can be triggered via:
46
+ - Cron schedule (using Temporal Schedules)
47
+ - Webhook URL (with HMAC signature verification)
48
+ - Manual API trigger
49
+
50
+ Jobs execute agents, teams, or workflows with configurable routing.
51
+ """
52
+
53
+ __tablename__ = "jobs"
54
+
55
+ # Column order matches SQL schema
56
+ id = Column(String(255), primary_key=True, default=lambda: f"job_{uuid.uuid4()}", nullable=False)
57
+ organization_id = Column(String(255), nullable=False)
58
+ name = Column(String(255), nullable=False)
59
+ description = Column(Text, nullable=True)
60
+ enabled = Column(Boolean, default=True, nullable=False)
61
+ status = Column(
62
+ String(50),
63
+ default="active",
64
+ nullable=False
65
+ )
66
+ trigger_type = Column(
67
+ String(50),
68
+ nullable=False
69
+ )
70
+ cron_schedule = Column(String(255), nullable=True)
71
+ cron_timezone = Column(String(100), default="UTC", nullable=True)
72
+ webhook_url_path = Column(String(500), nullable=True, unique=True)
73
+ webhook_secret = Column(String(500), nullable=True)
74
+ temporal_schedule_id = Column(String(255), nullable=True, unique=True)
75
+ planning_mode = Column(
76
+ String(50),
77
+ default="predefined_agent",
78
+ nullable=False
79
+ )
80
+ entity_type = Column(String(50), nullable=True)
81
+ entity_id = Column(String(255), nullable=True)
82
+ entity_name = Column(String(255), nullable=True)
83
+ prompt_template = Column(Text, nullable=False)
84
+ system_prompt = Column(Text, nullable=True)
85
+ executor_type = Column(
86
+ String(50),
87
+ default="auto",
88
+ nullable=False
89
+ )
90
+ worker_queue_name = Column(String(255), nullable=True)
91
+ environment_name = Column(String(255), nullable=True)
92
+ config = Column(JSON, nullable=True, default={})
93
+ execution_environment = Column(JSON, nullable=True, default={})
94
+ last_execution_at = Column(DateTime(timezone=True), nullable=True)
95
+ next_execution_at = Column(DateTime(timezone=True), nullable=True)
96
+ total_executions = Column(Integer, default=0, nullable=False)
97
+ successful_executions = Column(Integer, default=0, nullable=False)
98
+ failed_executions = Column(Integer, default=0, nullable=False)
99
+ execution_history = Column(JSON, nullable=True, default=[])
100
+ created_by = Column(String(255), nullable=True)
101
+ updated_by = Column(String(255), nullable=True)
102
+ created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
103
+ updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)
104
+ last_triggered_at = Column(DateTime(timezone=True), nullable=True)
105
+ last_execution_id = Column(UUID(as_uuid=True), ForeignKey("executions.id", ondelete="SET NULL"), nullable=True)
106
+
107
+ # Relationships
108
+ last_execution = relationship("Execution", foreign_keys=[last_execution_id], lazy="select")
109
+
110
+ __table_args__ = (
111
+ Index('idx_jobs_organization_id', 'organization_id'),
112
+ Index('idx_jobs_name', 'organization_id', 'name'),
113
+ Index('idx_jobs_enabled', 'enabled'),
114
+ Index('idx_jobs_status', 'status'),
115
+ Index('idx_jobs_trigger_type', 'trigger_type'),
116
+ Index('idx_jobs_webhook_url_path', 'webhook_url_path'),
117
+ Index('idx_jobs_temporal_schedule_id', 'temporal_schedule_id'),
118
+ Index('idx_jobs_created_at', 'created_at'),
119
+ Index('idx_jobs_next_execution_at', 'next_execution_at'),
120
+ )
121
+
122
+ def __repr__(self):
123
+ return f"<Job {self.id} ({self.name}) - {self.trigger_type}:{self.status}>"
124
+
125
+
126
+ class JobExecution(Base):
127
+ """
128
+ Junction table linking Jobs to Executions.
129
+ Tracks which executions were triggered by which jobs.
130
+ """
131
+
132
+ __tablename__ = "job_executions"
133
+
134
+ # Column order matches SQL schema
135
+ id = Column(String(255), primary_key=True, default=lambda: f"jobexec_{uuid.uuid4()}", nullable=False)
136
+ job_id = Column(String(255), ForeignKey("jobs.id", ondelete="CASCADE"), nullable=False)
137
+ organization_id = Column(String(255), nullable=False)
138
+ trigger_type = Column(String(50), nullable=False)
139
+ trigger_metadata = Column(JSON, nullable=True, default={})
140
+ execution_status = Column(String(50), nullable=True)
141
+ execution_duration_ms = Column(Integer, nullable=True)
142
+ created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
143
+ execution_id = Column(UUID(as_uuid=True), ForeignKey("executions.id", ondelete="CASCADE"), nullable=False)
144
+
145
+ # Relationships
146
+ job = relationship("Job", foreign_keys=[job_id], lazy="select")
147
+ execution = relationship("Execution", foreign_keys=[execution_id], lazy="select")
148
+
149
+ __table_args__ = (
150
+ Index('idx_job_executions_job_id', 'job_id'),
151
+ Index('idx_job_executions_organization_id', 'organization_id'),
152
+ Index('idx_job_executions_created_at', 'created_at'),
153
+ Index('idx_job_executions_trigger_type', 'trigger_type'),
154
+ Index('idx_job_executions_execution_status', 'execution_status'),
155
+ Index('idx_job_executions_execution_id', 'execution_id'),
156
+ )
157
+
158
+ def __repr__(self):
159
+ return f"<JobExecution job={self.job_id} execution={self.execution_id}>"
@@ -0,0 +1,78 @@
1
+ """LLM Model database model"""
2
+ from sqlalchemy import Column, String, Boolean, Text, JSON, Integer
3
+ from datetime import datetime
4
+ from sqlalchemy import DateTime
5
+ import uuid as uuid_module
6
+
7
+ from control_plane_api.app.database import Base
8
+
9
+
10
+ class LLMModel(Base):
11
+ """
12
+ LLM Model configuration for agent execution.
13
+
14
+ Stores available LLM models that can be used by agents and teams,
15
+ including provider information, compatibility, and UI metadata.
16
+ """
17
+
18
+ __tablename__ = "llm_models"
19
+
20
+ id = Column(String, primary_key=True, default=lambda: str(uuid_module.uuid4()))
21
+
22
+ # Model identification
23
+ value = Column(String, unique=True, nullable=False, index=True)
24
+ label = Column(String, nullable=False)
25
+ provider = Column(String, nullable=False, index=True)
26
+ model_type = Column(String, default="text-generation", nullable=False, index=True)
27
+ # Model type: "text-generation" (LLM), "embedding" (embedding model), "multimodal", etc.
28
+
29
+ # UI metadata
30
+ logo = Column(String, nullable=True)
31
+ description = Column(Text, nullable=True)
32
+
33
+ # Status and flags
34
+ enabled = Column(Boolean, default=True, nullable=False, index=True)
35
+ recommended = Column(Boolean, default=False, nullable=False)
36
+
37
+ # Runtime compatibility
38
+ # Store list of compatible runtime types (e.g., ["default", "claude_code"])
39
+ compatible_runtimes = Column(JSON, default=list, nullable=False)
40
+
41
+ # Model capabilities and metadata
42
+ capabilities = Column(JSON, default=dict, nullable=False)
43
+ # Example: {"vision": true, "function_calling": true, "max_tokens": 4096}
44
+
45
+ # Pricing information (optional)
46
+ pricing = Column(JSON, default=dict, nullable=True)
47
+ # Example: {"input_cost_per_1k": 0.01, "output_cost_per_1k": 0.03}
48
+
49
+ # Display order (lower = shown first)
50
+ display_order = Column(Integer, default=1000, nullable=False)
51
+
52
+ # Metadata
53
+ created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
54
+ updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
55
+ created_by = Column(String, nullable=True) # User ID who created this model entry
56
+
57
+ def __repr__(self):
58
+ return f"<LLMModel(id={self.id}, value={self.value}, provider={self.provider})>"
59
+
60
+ def to_dict(self):
61
+ """Convert to dictionary for API responses"""
62
+ return {
63
+ "id": self.id,
64
+ "value": self.value,
65
+ "label": self.label,
66
+ "provider": self.provider,
67
+ "model_type": self.model_type,
68
+ "logo": self.logo,
69
+ "description": self.description,
70
+ "enabled": self.enabled,
71
+ "recommended": self.recommended,
72
+ "compatible_runtimes": self.compatible_runtimes,
73
+ "capabilities": self.capabilities,
74
+ "pricing": self.pricing,
75
+ "display_order": self.display_order,
76
+ "created_at": self.created_at.isoformat() if self.created_at else None,
77
+ "updated_at": self.updated_at.isoformat() if self.updated_at else None,
78
+ }
@@ -0,0 +1,66 @@
1
+ """Orchestration and namespace models"""
2
+ from sqlalchemy import Column, String, DateTime, Text, JSON, UUID, CheckConstraint, Index, UniqueConstraint, text
3
+ from sqlalchemy.sql import func
4
+ from datetime import datetime
5
+ import uuid
6
+
7
+ from control_plane_api.app.database import Base
8
+
9
+
10
+ class Namespace(Base):
11
+ """Model for Temporal Cloud namespaces provisioned for each organization"""
12
+
13
+ __tablename__ = "namespaces"
14
+
15
+ id = Column(UUID(as_uuid=True), primary_key=True, server_default=text('gen_random_uuid()'), nullable=False)
16
+ organization_id = Column(String(255), nullable=False)
17
+ namespace_name = Column(String(255), nullable=False)
18
+ status = Column(String(50), server_default=text("'provisioning'::character varying"), nullable=False)
19
+ temporal_host = Column(String(255), nullable=True)
20
+ api_key_encrypted = Column(Text, nullable=True)
21
+
22
+ # Metadata
23
+ created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=True)
24
+ updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=True)
25
+
26
+ __table_args__ = (
27
+ UniqueConstraint('namespace_name', name='namespaces_namespace_name_key'),
28
+ Index('idx_namespaces_organization_id', 'organization_id'),
29
+ Index('idx_namespaces_status', 'status'),
30
+ )
31
+
32
+ def __repr__(self):
33
+ return f"<Namespace(namespace_name={self.namespace_name}, status={self.status})>"
34
+
35
+
36
+ class TemporalNamespace(Base):
37
+ """Model for Temporal Cloud namespaces provisioned per organization"""
38
+
39
+ __tablename__ = "temporal_namespaces"
40
+
41
+ id = Column(UUID(as_uuid=True), primary_key=True, server_default=text('gen_random_uuid()'), nullable=False)
42
+ organization_id = Column(String(255), nullable=False)
43
+ namespace_name = Column(String(255), nullable=False)
44
+ account_id = Column(String(255), nullable=True)
45
+ region = Column(String(50), server_default=text("'aws-us-east-1'::character varying"), nullable=True)
46
+ api_key_encrypted = Column(Text, nullable=True)
47
+ certificate_encrypted = Column(Text, nullable=True)
48
+ status = Column(String(50), server_default=text("'pending'::character varying"), nullable=True)
49
+ provisioning_workflow_id = Column(String(255), nullable=True)
50
+ error_message = Column(Text, nullable=True)
51
+ created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=True)
52
+ updated_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=True)
53
+ provisioned_at = Column(DateTime(timezone=True), nullable=True)
54
+ created_by = Column(String(255), nullable=True)
55
+
56
+ __table_args__ = (
57
+ CheckConstraint(
58
+ "status::text = ANY (ARRAY['pending'::character varying, 'provisioning'::character varying, 'ready'::character varying, 'error'::character varying, 'archived'::character varying]::text[])",
59
+ name='temporal_namespaces_status_check'
60
+ ),
61
+ Index('idx_temporal_namespaces_organization_id', 'organization_id'),
62
+ Index('idx_temporal_namespaces_status', 'status'),
63
+ )
64
+
65
+ def __repr__(self):
66
+ return f"<TemporalNamespace(namespace_name={self.namespace_name}, status={self.status}, organization_id={self.organization_id})>"