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,50 @@
1
+ """generate execution_transitions
2
+ Revision ID: 6a4d4dc3d8dc
3
+ Revises: f71305fb69b9
4
+ Create Date: 2025-12-22 14:34:50.860339
5
+ """
6
+ from typing import Sequence, Union
7
+
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision: str = '6a4d4dc3d8dc'
14
+ down_revision: Union[str, Sequence[str], None] = 'f71305fb69b9'
15
+ branch_labels: Union[str, Sequence[str], None] = None
16
+ depends_on: Union[str, Sequence[str], None] = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ """Upgrade schema."""
21
+ # ### commands auto generated by Alembic - please adjust! ###
22
+ op.create_table('execution_transitions',
23
+ sa.Column('id', sa.UUID(), nullable=False),
24
+ sa.Column('organization_id', sa.String(), nullable=False),
25
+ sa.Column('execution_id', sa.UUID(), nullable=False),
26
+ sa.Column('turn_number', sa.Integer(), nullable=False),
27
+ sa.Column('from_state', sa.String(length=50), nullable=False),
28
+ sa.Column('to_state', sa.String(length=50), nullable=False),
29
+ sa.Column('reasoning', sa.String(), nullable=False),
30
+ sa.Column('confidence', sa.String(length=20), nullable=False),
31
+ sa.Column('decision_factors', sa.JSON(), nullable=True),
32
+ sa.Column('ai_model', sa.String(length=100), nullable=True),
33
+ sa.Column('decision_time_ms', sa.Integer(), nullable=True),
34
+ sa.Column('is_manual_override', sa.Boolean(), nullable=False),
35
+ sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
36
+ sa.ForeignKeyConstraint(['execution_id'], ['executions.id'], ondelete='CASCADE'),
37
+ sa.PrimaryKeyConstraint('id')
38
+ )
39
+ op.create_index(op.f('ix_execution_transitions_execution_id'), 'execution_transitions', ['execution_id'], unique=False)
40
+ op.create_index(op.f('ix_execution_transitions_organization_id'), 'execution_transitions', ['organization_id'], unique=False)
41
+ # ### end Alembic commands ###
42
+
43
+
44
+ def downgrade() -> None:
45
+ """Downgrade schema."""
46
+ # ### commands auto generated by Alembic - please adjust! ###
47
+ op.drop_index(op.f('ix_execution_transitions_organization_id'), table_name='execution_transitions')
48
+ op.drop_index(op.f('ix_execution_transitions_execution_id'), table_name='execution_transitions')
49
+ op.drop_table('execution_transitions')
50
+ # ### end Alembic commands ###
@@ -0,0 +1,44 @@
1
+ """add_disconnected_status_to_worker_heartbeats
2
+
3
+ Revision ID: 87d11cf0a783
4
+ Revises: 43abf98d6a01
5
+ Create Date: 2025-12-08 21:37:05.347985
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+
10
+ from alembic import op
11
+ import sqlalchemy as sa
12
+
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = '87d11cf0a783'
16
+ down_revision: Union[str, Sequence[str], None] = '43abf98d6a01'
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Upgrade schema."""
23
+ # Drop the old constraint
24
+ op.drop_constraint('worker_heartbeats_status_check', 'worker_heartbeats', type_='check')
25
+
26
+ # Create the new constraint with 'disconnected' added
27
+ op.create_check_constraint(
28
+ 'worker_heartbeats_status_check',
29
+ 'worker_heartbeats',
30
+ "status IN ('active', 'idle', 'busy', 'offline', 'disconnected')"
31
+ )
32
+
33
+
34
+ def downgrade() -> None:
35
+ """Downgrade schema."""
36
+ # Drop the new constraint
37
+ op.drop_constraint('worker_heartbeats_status_check', 'worker_heartbeats', type_='check')
38
+
39
+ # Recreate the old constraint without 'disconnected'
40
+ op.create_check_constraint(
41
+ 'worker_heartbeats_status_check',
42
+ 'worker_heartbeats',
43
+ "status IN ('active', 'idle', 'busy', 'offline')"
44
+ )
@@ -0,0 +1,85 @@
1
+ """add_ephemeral_queue_support
2
+
3
+ Adds ephemeral queue support for on-demand workers.
4
+ This enables automatic provisioning and cleanup of temporary worker queues.
5
+
6
+ Revision ID: e9f2a3b4c5d6
7
+ Revises: 87d11cf0a783
8
+ Create Date: 2025-12-11 08:00:00.000000
9
+
10
+ """
11
+ from typing import Sequence, Union
12
+
13
+ from alembic import op
14
+ import sqlalchemy as sa
15
+
16
+
17
+ # revision identifiers, used by Alembic.
18
+ revision: str = 'e9f2a3b4c5d6'
19
+ down_revision: Union[str, Sequence[str], None] = '87d11cf0a783'
20
+ branch_labels: Union[str, Sequence[str], None] = None
21
+ depends_on: Union[str, Sequence[str], None] = None
22
+
23
+
24
+ def upgrade() -> None:
25
+ """
26
+ Add ephemeral queue support columns to worker_queues table.
27
+
28
+ New columns:
29
+ - ephemeral: Mark queue as temporary/ephemeral
30
+ - single_execution_mode: Worker processes one task then exits
31
+ - auto_cleanup_after_seconds: TTL for automatic cleanup
32
+ - parent_execution_id: Track the execution that created this queue
33
+ """
34
+
35
+ # Add ephemeral flag (default false for backward compatibility)
36
+ op.add_column('worker_queues',
37
+ sa.Column('ephemeral', sa.Boolean(), server_default=sa.text('false'), nullable=False)
38
+ )
39
+
40
+ # Add single execution mode flag (default false)
41
+ op.add_column('worker_queues',
42
+ sa.Column('single_execution_mode', sa.Boolean(), server_default=sa.text('false'), nullable=False)
43
+ )
44
+
45
+ # Add auto cleanup TTL (nullable - only set for ephemeral queues)
46
+ op.add_column('worker_queues',
47
+ sa.Column('auto_cleanup_after_seconds', sa.Integer(), nullable=True)
48
+ )
49
+
50
+ # Add parent execution ID for tracking (nullable)
51
+ op.add_column('worker_queues',
52
+ sa.Column('parent_execution_id', sa.Text(), nullable=True)
53
+ )
54
+
55
+ # Create index for efficient ephemeral queue cleanup queries
56
+ op.create_index(
57
+ 'idx_worker_queues_ephemeral_cleanup',
58
+ 'worker_queues',
59
+ ['ephemeral', 'created_at'],
60
+ postgresql_where=sa.text("ephemeral = true")
61
+ )
62
+
63
+ # Create index for parent execution tracking
64
+ op.create_index(
65
+ 'idx_worker_queues_parent_execution',
66
+ 'worker_queues',
67
+ ['parent_execution_id'],
68
+ postgresql_where=sa.text("parent_execution_id IS NOT NULL")
69
+ )
70
+
71
+
72
+ def downgrade() -> None:
73
+ """
74
+ Remove ephemeral queue support columns.
75
+ """
76
+
77
+ # Drop indexes first
78
+ op.drop_index('idx_worker_queues_parent_execution', table_name='worker_queues')
79
+ op.drop_index('idx_worker_queues_ephemeral_cleanup', table_name='worker_queues')
80
+
81
+ # Drop columns
82
+ op.drop_column('worker_queues', 'parent_execution_id')
83
+ op.drop_column('worker_queues', 'auto_cleanup_after_seconds')
84
+ op.drop_column('worker_queues', 'single_execution_mode')
85
+ op.drop_column('worker_queues', 'ephemeral')
@@ -0,0 +1,31 @@
1
+ """add model_type column to llm_models
2
+
3
+ Revision ID: add_model_type_to_llm_models
4
+ Revises: f25de6ad895a
5
+ Create Date: 2025-01-10 00:00:00.000000
6
+
7
+ """
8
+ from alembic import op
9
+ import sqlalchemy as sa
10
+
11
+ # revision identifiers, used by Alembic.
12
+ revision = 'add_model_type_to_llm_models'
13
+ down_revision = 'f25de6ad895a'
14
+ branch_labels = None
15
+ depends_on = None
16
+
17
+
18
+ def upgrade():
19
+ # Add model_type column with default value 'text-generation'
20
+ op.add_column('llm_models', sa.Column('model_type', sa.String(), nullable=False, server_default='text-generation'))
21
+
22
+ # Create index on model_type for efficient filtering
23
+ op.create_index(op.f('ix_llm_models_model_type'), 'llm_models', ['model_type'], unique=False)
24
+
25
+
26
+ def downgrade():
27
+ # Remove index
28
+ op.drop_index(op.f('ix_llm_models_model_type'), table_name='llm_models')
29
+
30
+ # Remove column
31
+ op.drop_column('llm_models', 'model_type')
@@ -0,0 +1,114 @@
1
+ """add_plan_executions_table
2
+
3
+ Creates the plan_executions table for tracking multi-task plan orchestration.
4
+ Also adds plan_execution_id foreign key to executions table.
5
+
6
+ Revision ID: add_plan_executions
7
+ Revises: 43abf98d6a01
8
+ Create Date: 2025-12-11 00:00:00.000000
9
+
10
+ """
11
+ from typing import Sequence, Union
12
+
13
+ from alembic import op
14
+ import sqlalchemy as sa
15
+ from sqlalchemy.dialects import postgresql
16
+
17
+ # revision identifiers, used by Alembic.
18
+ revision: str = 'add_plan_executions'
19
+ down_revision: Union[str, Sequence[str], None] = '43abf98d6a01'
20
+ branch_labels: Union[str, Sequence[str], None] = None
21
+ depends_on: Union[str, Sequence[str], None] = None
22
+
23
+
24
+ def upgrade() -> None:
25
+ """
26
+ Create plan_executions table and add foreign key to executions.
27
+ """
28
+
29
+ # Create plan_executions table
30
+ op.create_table(
31
+ 'plan_executions',
32
+ sa.Column('id', postgresql.UUID(as_uuid=True), primary_key=True, nullable=False),
33
+ sa.Column('execution_id', sa.String(255), unique=True, nullable=False, index=True),
34
+ sa.Column('organization_id', sa.String(255), nullable=False, index=True),
35
+ sa.Column('agent_id', postgresql.UUID(as_uuid=True), nullable=True),
36
+ sa.Column('title', sa.Text(), nullable=False),
37
+ sa.Column('summary', sa.Text(), nullable=True),
38
+ sa.Column('total_tasks', sa.Integer(), nullable=False, server_default='0'),
39
+ sa.Column('completed_tasks', sa.Integer(), nullable=False, server_default='0'),
40
+ sa.Column('failed_tasks', sa.Integer(), nullable=True, server_default='0'),
41
+ sa.Column('status', sa.String(50), nullable=False, server_default='running', index=True),
42
+ sa.Column('dag_state', postgresql.JSONB(astext_type=sa.Text()), nullable=True, server_default='{}'),
43
+ sa.Column('total_tokens', sa.Integer(), nullable=True, server_default='0'),
44
+ sa.Column('total_execution_time_seconds', sa.Integer(), nullable=True, server_default='0'),
45
+ sa.Column('estimated_cost_usd', sa.Numeric(10, 4), nullable=True),
46
+ sa.Column('actual_cost_usd', sa.Numeric(10, 4), nullable=True),
47
+ sa.Column('plan_json', postgresql.JSONB(astext_type=sa.Text()), nullable=True),
48
+ sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
49
+ sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
50
+ sa.Column('started_at', sa.DateTime(timezone=True), nullable=True),
51
+ sa.Column('completed_at', sa.DateTime(timezone=True), nullable=True),
52
+ )
53
+
54
+ # Create indexes
55
+ op.create_index(
56
+ 'idx_plan_executions_org_status',
57
+ 'plan_executions',
58
+ ['organization_id', 'status']
59
+ )
60
+ op.create_index(
61
+ 'idx_plan_executions_created',
62
+ 'plan_executions',
63
+ ['created_at']
64
+ )
65
+
66
+ # Add plan_execution_id to executions table
67
+ op.add_column(
68
+ 'executions',
69
+ sa.Column('plan_execution_id', postgresql.UUID(as_uuid=True), nullable=True)
70
+ )
71
+
72
+ # Create foreign key constraint
73
+ op.create_foreign_key(
74
+ 'fk_executions_plan_execution',
75
+ 'executions',
76
+ 'plan_executions',
77
+ ['plan_execution_id'],
78
+ ['id'],
79
+ ondelete='CASCADE'
80
+ )
81
+
82
+ # Create index on plan_execution_id
83
+ op.create_index(
84
+ 'idx_executions_plan_execution_id',
85
+ 'executions',
86
+ ['plan_execution_id']
87
+ )
88
+
89
+ print("✅ Created plan_executions table")
90
+ print("✅ Added plan_execution_id to executions table")
91
+
92
+
93
+ def downgrade() -> None:
94
+ """
95
+ Remove plan_executions table and foreign key.
96
+ """
97
+
98
+ # Drop index
99
+ op.drop_index('idx_executions_plan_execution_id', table_name='executions')
100
+
101
+ # Drop foreign key
102
+ op.drop_constraint('fk_executions_plan_execution', 'executions', type_='foreignkey')
103
+
104
+ # Drop column from executions
105
+ op.drop_column('executions', 'plan_execution_id')
106
+
107
+ # Drop indexes
108
+ op.drop_index('idx_plan_executions_created', table_name='plan_executions')
109
+ op.drop_index('idx_plan_executions_org_status', table_name='plan_executions')
110
+
111
+ # Drop table
112
+ op.drop_table('plan_executions')
113
+
114
+ print("✅ Removed plan_executions table and related changes")
@@ -0,0 +1,154 @@
1
+ """add_trace_span_tables
2
+
3
+ Creates traces and spans tables for OTEL observability with
4
+ real-time streaming support.
5
+
6
+ Revision ID: add_trace_span_tables
7
+ Revises: f71305fb69b9
8
+ Create Date: 2026-01-13
9
+
10
+ """
11
+ from typing import Sequence, Union
12
+
13
+ from alembic import op
14
+ import sqlalchemy as sa
15
+ from sqlalchemy.dialects import postgresql
16
+
17
+ # revision identifiers, used by Alembic.
18
+ revision: str = 'add_trace_span_tables'
19
+ down_revision: Union[str, Sequence[str], None] = 'f71305fb69b9'
20
+ branch_labels: Union[str, Sequence[str], None] = None
21
+ depends_on: Union[str, Sequence[str], None] = None
22
+
23
+
24
+ # Pre-create enum types to reference in columns
25
+ trace_status_enum = postgresql.ENUM('success', 'error', 'running', name='trace_status', create_type=False)
26
+ span_kind_enum = postgresql.ENUM('INTERNAL', 'SERVER', 'CLIENT', 'PRODUCER', 'CONSUMER', name='span_kind', create_type=False)
27
+ span_status_code_enum = postgresql.ENUM('UNSET', 'OK', 'ERROR', name='span_status_code', create_type=False)
28
+
29
+
30
+ def upgrade() -> None:
31
+ """Create traces and spans tables with enums and indexes."""
32
+
33
+ # Create trace_status enum
34
+ op.execute("""
35
+ DO $$ BEGIN
36
+ CREATE TYPE trace_status AS ENUM ('success', 'error', 'running');
37
+ EXCEPTION
38
+ WHEN duplicate_object THEN null;
39
+ END $$;
40
+ """)
41
+
42
+ # Create span_kind enum (OTEL standard)
43
+ op.execute("""
44
+ DO $$ BEGIN
45
+ CREATE TYPE span_kind AS ENUM ('INTERNAL', 'SERVER', 'CLIENT', 'PRODUCER', 'CONSUMER');
46
+ EXCEPTION
47
+ WHEN duplicate_object THEN null;
48
+ END $$;
49
+ """)
50
+
51
+ # Create span_status_code enum (OTEL standard)
52
+ op.execute("""
53
+ DO $$ BEGIN
54
+ CREATE TYPE span_status_code AS ENUM ('UNSET', 'OK', 'ERROR');
55
+ EXCEPTION
56
+ WHEN duplicate_object THEN null;
57
+ END $$;
58
+ """)
59
+
60
+ # Create traces table
61
+ op.create_table(
62
+ 'traces',
63
+ sa.Column('id', postgresql.UUID(as_uuid=True), primary_key=True, server_default=sa.text('gen_random_uuid()')),
64
+ sa.Column('trace_id', sa.String(64), nullable=False, unique=True),
65
+ sa.Column('organization_id', sa.String(255), nullable=False),
66
+ sa.Column('name', sa.String(512), nullable=False),
67
+ sa.Column('service_name', sa.String(255), nullable=True),
68
+ sa.Column('status', trace_status_enum, nullable=False, server_default='running'),
69
+ sa.Column('execution_id', sa.String(255), nullable=True),
70
+ sa.Column('execution_type', sa.String(50), nullable=True),
71
+ sa.Column('user_id', sa.String(255), nullable=True),
72
+ sa.Column('user_email', sa.String(255), nullable=True),
73
+ sa.Column('started_at', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('NOW()')),
74
+ sa.Column('ended_at', sa.DateTime(timezone=True), nullable=True),
75
+ sa.Column('duration_ms', sa.BigInteger(), nullable=True),
76
+ sa.Column('span_count', sa.Integer(), nullable=False, server_default='0'),
77
+ sa.Column('error_count', sa.Integer(), nullable=False, server_default='0'),
78
+ sa.Column('created_at', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('NOW()')),
79
+ sa.Column('updated_at', sa.DateTime(timezone=True), nullable=True, server_default=sa.text('NOW()')),
80
+ )
81
+
82
+ # Create traces indexes
83
+ op.create_index('ix_traces_trace_id', 'traces', ['trace_id'])
84
+ op.create_index('ix_traces_org_id', 'traces', ['organization_id'])
85
+ op.create_index('ix_traces_org_started', 'traces', ['organization_id', 'started_at'])
86
+ op.create_index('ix_traces_org_status', 'traces', ['organization_id', 'status'])
87
+ op.create_index('ix_traces_org_service', 'traces', ['organization_id', 'service_name'])
88
+ op.create_index('ix_traces_org_user', 'traces', ['organization_id', 'user_id'])
89
+ op.create_index('ix_traces_user_id', 'traces', ['user_id'])
90
+
91
+ # Create partial index for execution_id
92
+ op.execute("""
93
+ CREATE INDEX IF NOT EXISTS ix_traces_execution
94
+ ON traces(execution_id)
95
+ WHERE execution_id IS NOT NULL
96
+ """)
97
+
98
+ # Create spans table
99
+ op.create_table(
100
+ 'spans',
101
+ sa.Column('id', postgresql.UUID(as_uuid=True), primary_key=True, server_default=sa.text('gen_random_uuid()')),
102
+ sa.Column('trace_id', sa.String(64), sa.ForeignKey('traces.trace_id', ondelete='CASCADE'), nullable=False),
103
+ sa.Column('span_id', sa.String(32), nullable=False),
104
+ sa.Column('parent_span_id', sa.String(32), nullable=True),
105
+ sa.Column('organization_id', sa.String(255), nullable=False),
106
+ sa.Column('name', sa.String(512), nullable=False),
107
+ sa.Column('kind', span_kind_enum, nullable=False, server_default='INTERNAL'),
108
+ sa.Column('status_code', span_status_code_enum, nullable=False, server_default='UNSET'),
109
+ sa.Column('status_message', sa.Text(), nullable=True),
110
+ sa.Column('start_time_unix_nano', sa.BigInteger(), nullable=False),
111
+ sa.Column('end_time_unix_nano', sa.BigInteger(), nullable=True),
112
+ sa.Column('duration_ns', sa.BigInteger(), nullable=True),
113
+ sa.Column('attributes', postgresql.JSONB(astext_type=sa.Text()), nullable=True, server_default='{}'),
114
+ sa.Column('resource_attributes', postgresql.JSONB(astext_type=sa.Text()), nullable=True, server_default='{}'),
115
+ sa.Column('events', postgresql.JSONB(astext_type=sa.Text()), nullable=True, server_default='[]'),
116
+ sa.Column('links', postgresql.JSONB(astext_type=sa.Text()), nullable=True, server_default='[]'),
117
+ sa.Column('created_at', sa.DateTime(timezone=True), nullable=False, server_default=sa.text('NOW()')),
118
+ )
119
+
120
+ # Create spans indexes
121
+ op.create_index('ix_spans_trace_id', 'spans', ['trace_id'])
122
+ op.create_index('ix_spans_span_id', 'spans', ['span_id'])
123
+ op.create_index('ix_spans_parent_span_id', 'spans', ['parent_span_id'])
124
+ op.create_index('ix_spans_org_id', 'spans', ['organization_id'])
125
+ op.create_index('ix_spans_trace_parent', 'spans', ['trace_id', 'parent_span_id'])
126
+ op.create_index('ix_spans_trace_start', 'spans', ['trace_id', 'start_time_unix_nano'])
127
+ op.create_index('ix_spans_org_name', 'spans', ['organization_id', 'name'])
128
+ op.create_index('ix_spans_org_start', 'spans', ['organization_id', 'start_time_unix_nano'])
129
+
130
+ # Unique constraint on span_id within a trace
131
+ op.create_index('ix_spans_trace_span_unique', 'spans', ['trace_id', 'span_id'], unique=True)
132
+
133
+ # GIN indexes for JSONB columns
134
+ op.execute("CREATE INDEX IF NOT EXISTS ix_spans_attributes_gin ON spans USING GIN (attributes)")
135
+ op.execute("CREATE INDEX IF NOT EXISTS ix_spans_resource_attrs_gin ON spans USING GIN (resource_attributes)")
136
+
137
+ # Add table comments
138
+ op.execute("COMMENT ON TABLE traces IS 'Aggregated OTEL traces for observability'")
139
+ op.execute("COMMENT ON TABLE spans IS 'Individual OTEL spans within traces'")
140
+ op.execute("COMMENT ON COLUMN traces.trace_id IS 'OpenTelemetry trace ID (32-char hex)'")
141
+ op.execute("COMMENT ON COLUMN spans.span_id IS 'OpenTelemetry span ID (16-char hex)'")
142
+
143
+
144
+ def downgrade() -> None:
145
+ """Drop traces and spans tables with enums."""
146
+
147
+ # Drop tables (cascades to indexes)
148
+ op.drop_table('spans')
149
+ op.drop_table('traces')
150
+
151
+ # Drop enums
152
+ op.execute("DROP TYPE IF EXISTS trace_status")
153
+ op.execute("DROP TYPE IF EXISTS span_kind")
154
+ op.execute("DROP TYPE IF EXISTS span_status_code")
@@ -0,0 +1,36 @@
1
+ """add_user_info_to_traces
2
+
3
+ Add user_name and user_avatar columns to traces table for
4
+ displaying user attribution in the observability UI.
5
+
6
+ Revision ID: add_user_info_to_traces
7
+ Revises: add_trace_span_tables
8
+ Create Date: 2026-01-13
9
+
10
+ """
11
+ from typing import Sequence, Union
12
+
13
+ from alembic import op
14
+ import sqlalchemy as sa
15
+
16
+ # revision identifiers, used by Alembic.
17
+ revision: str = 'add_user_info_to_traces'
18
+ down_revision: Union[str, Sequence[str], None] = 'add_trace_span_tables'
19
+ branch_labels: Union[str, Sequence[str], None] = None
20
+ depends_on: Union[str, Sequence[str], None] = None
21
+
22
+
23
+ def upgrade() -> None:
24
+ """Add user_name and user_avatar columns to traces table."""
25
+ op.add_column('traces', sa.Column('user_name', sa.String(255), nullable=True))
26
+ op.add_column('traces', sa.Column('user_avatar', sa.String(512), nullable=True))
27
+
28
+ # Add comment for documentation
29
+ op.execute("COMMENT ON COLUMN traces.user_name IS 'Display name of user who triggered the trace'")
30
+ op.execute("COMMENT ON COLUMN traces.user_avatar IS 'URL to user avatar image'")
31
+
32
+
33
+ def downgrade() -> None:
34
+ """Remove user_name and user_avatar columns from traces table."""
35
+ op.drop_column('traces', 'user_avatar')
36
+ op.drop_column('traces', 'user_name')
@@ -0,0 +1,32 @@
1
+ """a
2
+
3
+ Revision ID: 91520433aafc
4
+ Revises: f25de6ad895a
5
+ Create Date: 2025-11-29 10:57:24.435772
6
+
7
+ """
8
+ from typing import Sequence, Union
9
+
10
+ from alembic import op
11
+ import sqlalchemy as sa
12
+
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = '91520433aafc'
16
+ down_revision: Union[str, Sequence[str], None] = 'f25de6ad895a'
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ """Upgrade schema."""
23
+ op.drop_constraint(op.f('executions_worker_queue_id_fkey'), 'executions', type_='foreignkey')
24
+ op.create_foreign_key(None, 'executions', 'worker_queues', ['worker_queue_id'], ['id'], ondelete='CASCADE')
25
+ op.create_unique_constraint('uq_team_org_name', 'teams', ['organization_id', 'name'])
26
+
27
+
28
+ def downgrade() -> None:
29
+ """Downgrade schema."""
30
+ op.drop_constraint('uq_team_org_name', 'teams', type_='unique')
31
+ op.drop_constraint(None, 'executions', type_='foreignkey')
32
+ op.create_foreign_key(op.f('executions_worker_queue_id_fkey'), 'executions', 'worker_queues', ['worker_queue_id'], ['id'])