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,223 @@
1
+ """
2
+ Agent Execution Workflow with Skill Support.
3
+
4
+ This workflow demonstrates how to execute an agent with skills resolved
5
+ from the Control Plane API.
6
+ """
7
+
8
+ from datetime import timedelta
9
+ from dataclasses import dataclass
10
+ from temporalio import workflow
11
+ from temporalio.common import RetryPolicy
12
+ import structlog
13
+
14
+ # Import activities
15
+ from control_plane_api.app.activities.agent_activities import (
16
+ execute_agent_llm,
17
+ update_execution_status,
18
+ )
19
+ from control_plane_api.app.activities.skill_activities import (
20
+ resolve_agent_skills,
21
+ instantiate_agent_skills,
22
+ )
23
+
24
+ logger = structlog.get_logger()
25
+
26
+
27
+ @dataclass
28
+ class AgentExecutionInput:
29
+ """Input for agent execution workflow"""
30
+ execution_id: str
31
+ organization_id: str
32
+ agent_id: str
33
+ prompt: str
34
+ system_prompt: str | None = None
35
+ control_plane_url: str = "https://agent-control-plane.vercel.app"
36
+ api_key: str = None # Kubiya API key for authentication
37
+
38
+
39
+ @dataclass
40
+ class AgentExecutionResult:
41
+ """Result of agent execution workflow"""
42
+ execution_id: str
43
+ response: str
44
+ usage: dict
45
+ status: str
46
+ skills_used: list[str] | None = None
47
+
48
+
49
+ @workflow.defn
50
+ class AgentExecutionWithToolSetsWorkflow:
51
+ """
52
+ Orchestrates agent execution with skill resolution.
53
+
54
+ Flow:
55
+ 1. Fetch agent configuration from Control Plane
56
+ 2. Resolve skills from Control Plane (with inheritance)
57
+ 3. Instantiate agno tool instances
58
+ 4. Create agent with tools
59
+ 5. Execute agent
60
+ 6. Return results
61
+ """
62
+
63
+ @workflow.run
64
+ async def run(self, input: AgentExecutionInput) -> AgentExecutionResult:
65
+ """
66
+ Execute agent workflow with skills.
67
+
68
+ Args:
69
+ input: AgentExecutionInput with agent_id, prompt, etc.
70
+
71
+ Returns:
72
+ AgentExecutionResult with response and metadata
73
+ """
74
+ workflow.logger.info(
75
+ "agent_execution_workflow_started",
76
+ execution_id=input.execution_id,
77
+ agent_id=input.agent_id,
78
+ organization_id=input.organization_id
79
+ )
80
+
81
+ # 1. Update execution status to 'running'
82
+ await workflow.execute_activity(
83
+ update_execution_status,
84
+ args=[input.execution_id, "running"],
85
+ start_to_close_timeout=timedelta(seconds=10)
86
+ )
87
+
88
+ try:
89
+ # 2. Resolve skills from Control Plane
90
+ # The Control Plane handles inheritance: Environment → Team → Agent
91
+ skill_definitions = await workflow.execute_activity(
92
+ resolve_agent_skills,
93
+ args=[
94
+ input.agent_id,
95
+ input.control_plane_url,
96
+ input.api_key
97
+ ],
98
+ start_to_close_timeout=timedelta(seconds=30)
99
+ )
100
+
101
+ workflow.logger.info(
102
+ "skills_resolved",
103
+ execution_id=input.execution_id,
104
+ skill_count=len(skill_definitions),
105
+ skill_types=[t.get("type") for t in skill_definitions]
106
+ )
107
+
108
+ # 3. Instantiate agno tool instances
109
+ agent_tools = await workflow.execute_activity(
110
+ instantiate_agent_skills,
111
+ args=[skill_definitions],
112
+ start_to_close_timeout=timedelta(seconds=10)
113
+ )
114
+
115
+ workflow.logger.info(
116
+ "tools_instantiated",
117
+ execution_id=input.execution_id,
118
+ tool_count=len(agent_tools)
119
+ )
120
+
121
+ # 4. Execute agent with LLM
122
+ # Pass tools to the execution activity
123
+ llm_result = await workflow.execute_activity(
124
+ execute_agent_llm,
125
+ args=[
126
+ input.agent_id,
127
+ input.prompt,
128
+ input.system_prompt,
129
+ agent_tools, # Pass instantiated tools
130
+ input.control_plane_url,
131
+ input.api_key
132
+ ],
133
+ start_to_close_timeout=timedelta(minutes=10),
134
+ retry_policy=RetryPolicy(
135
+ maximum_attempts=3,
136
+ initial_interval=timedelta(seconds=1),
137
+ backoff_coefficient=2.0
138
+ )
139
+ )
140
+
141
+ # 5. Update execution status to 'completed'
142
+ await workflow.execute_activity(
143
+ update_execution_status,
144
+ args=[input.execution_id, "completed", llm_result],
145
+ start_to_close_timeout=timedelta(seconds=30)
146
+ )
147
+
148
+ workflow.logger.info(
149
+ "agent_execution_workflow_completed",
150
+ execution_id=input.execution_id,
151
+ agent_id=input.agent_id
152
+ )
153
+
154
+ return AgentExecutionResult(
155
+ execution_id=input.execution_id,
156
+ response=llm_result.get("response", ""),
157
+ usage=llm_result.get("usage", {}),
158
+ status="completed",
159
+ skills_used=[t.get("name") for t in skill_definitions]
160
+ )
161
+
162
+ except Exception as e:
163
+ workflow.logger.error(
164
+ "agent_execution_workflow_failed",
165
+ execution_id=input.execution_id,
166
+ error=str(e)
167
+ )
168
+
169
+ # Update execution status to 'failed'
170
+ await workflow.execute_activity(
171
+ update_execution_status,
172
+ args=[input.execution_id, "failed", {"error": str(e)}],
173
+ start_to_close_timeout=timedelta(seconds=30)
174
+ )
175
+
176
+ raise
177
+
178
+
179
+ # Example usage in Control Plane API:
180
+ """
181
+ from temporalio.client import Client
182
+ from control_plane_api.app.workflows.agent_execution_with_skills import (
183
+ AgentExecutionWithToolSetsWorkflow,
184
+ AgentExecutionInput
185
+ )
186
+
187
+ # In your agent execution endpoint:
188
+ @router.post("/api/v1/agents/{agent_id}/execute")
189
+ async def execute_agent(
190
+ agent_id: str,
191
+ request: AgentExecutionRequest,
192
+ organization: dict = Depends(get_current_organization),
193
+ ):
194
+ # Get Temporal client
195
+ temporal_client = await get_temporal_client()
196
+
197
+ # Create execution record
198
+ execution_id = str(uuid.uuid4())
199
+
200
+ # Submit workflow to Temporal
201
+ workflow_handle = await temporal_client.start_workflow(
202
+ AgentExecutionWithToolSetsWorkflow.run,
203
+ AgentExecutionInput(
204
+ execution_id=execution_id,
205
+ organization_id=organization["id"],
206
+ agent_id=agent_id,
207
+ prompt=request.prompt,
208
+ system_prompt=request.system_prompt,
209
+ control_plane_url=settings.CONTROL_PLANE_URL,
210
+ api_key=organization["api_key"] # Or get from auth
211
+ ),
212
+ id=f"agent-exec-{execution_id}",
213
+ task_queue=request.worker_queue_id, # Route to specific worker queue
214
+ execution_timeout=timedelta(hours=1)
215
+ )
216
+
217
+ return AgentExecutionResponse(
218
+ execution_id=execution_id,
219
+ workflow_id=workflow_handle.id,
220
+ status="pending",
221
+ message="Agent execution submitted successfully"
222
+ )
223
+ """
@@ -0,0 +1,326 @@
1
+ """
2
+ Temporal Cloud Namespace Provisioning Workflow
3
+
4
+ This workflow handles the provisioning of Temporal Cloud namespaces using tcld CLI.
5
+ Since Temporal doesn't provide SDK/API for namespace creation, we use the CLI tool.
6
+
7
+ Flow:
8
+ 1. Check if namespace already exists
9
+ 2. Create namespace if needed
10
+ 3. Poll until namespace is ready
11
+ 4. Generate API key
12
+ 5. Store credentials
13
+ 6. Update task queue status to 'ready'
14
+ """
15
+
16
+ from dataclasses import dataclass
17
+ from datetime import timedelta
18
+ from temporalio import workflow
19
+ from temporalio.common import RetryPolicy
20
+ import structlog
21
+
22
+ # Import activities
23
+ with workflow.unsafe.imports_passed_through():
24
+ from control_plane_api.app.activities.temporal_cloud_activities import (
25
+ check_namespace_exists,
26
+ create_namespace,
27
+ poll_namespace_status,
28
+ generate_namespace_api_key,
29
+ store_namespace_credentials,
30
+ update_task_queue_status,
31
+ CheckNamespaceInput,
32
+ CreateNamespaceInput,
33
+ PollNamespaceStatusInput,
34
+ GenerateApiKeyInput,
35
+ StoreNamespaceCredentialsInput,
36
+ )
37
+
38
+ logger = structlog.get_logger()
39
+
40
+
41
+ @dataclass
42
+ class ProvisionNamespaceInput:
43
+ """Input for namespace provisioning workflow"""
44
+ organization_id: str
45
+ organization_name: str
46
+ task_queue_id: str
47
+ account_id: str
48
+ region: str = "aws-us-east-1"
49
+ retention_days: int = 30
50
+
51
+
52
+ @dataclass
53
+ class ProvisionNamespaceOutput:
54
+ """Output from namespace provisioning workflow"""
55
+ success: bool
56
+ namespace_name: str
57
+ namespace_id: str | None = None
58
+ status: str = "pending"
59
+ error_message: str | None = None
60
+
61
+
62
+ @workflow.defn
63
+ class ProvisionTemporalNamespaceWorkflow:
64
+ """
65
+ Workflow to provision a Temporal Cloud namespace for an organization.
66
+
67
+ This workflow is triggered when the first task queue is created for an org.
68
+ It handles the entire provisioning process including retries and error handling.
69
+ """
70
+
71
+ @workflow.run
72
+ async def run(self, input: ProvisionNamespaceInput) -> ProvisionNamespaceOutput:
73
+ """
74
+ Main workflow execution.
75
+
76
+ Args:
77
+ input: Provisioning input with org details
78
+
79
+ Returns:
80
+ ProvisionNamespaceOutput with result
81
+ """
82
+ workflow.logger.info(
83
+ f"Starting namespace provisioning workflow",
84
+ extra={
85
+ "organization_id": input.organization_id,
86
+ "task_queue_id": input.task_queue_id,
87
+ }
88
+ )
89
+
90
+ # Generate namespace name: kubiya-{org_slug}-{short_id}
91
+ # Format: kubiya-acme-corp-a1b2c3
92
+ org_slug = input.organization_name.lower().replace(" ", "-")[:20]
93
+ org_short_id = input.organization_id[:6]
94
+ namespace_name = f"kubiya-{org_slug}-{org_short_id}"
95
+
96
+ try:
97
+ # Step 1: Check if namespace already exists
98
+ workflow.logger.info("Step 1: Checking if namespace exists")
99
+
100
+ check_result = await workflow.execute_activity(
101
+ check_namespace_exists,
102
+ CheckNamespaceInput(
103
+ organization_id=input.organization_id,
104
+ namespace_name=namespace_name,
105
+ ),
106
+ start_to_close_timeout=timedelta(seconds=30),
107
+ retry_policy=RetryPolicy(
108
+ maximum_attempts=3,
109
+ initial_interval=timedelta(seconds=1),
110
+ maximum_interval=timedelta(seconds=10),
111
+ ),
112
+ )
113
+
114
+ if check_result.get("exists"):
115
+ workflow.logger.info(
116
+ f"Namespace already exists",
117
+ extra={"namespace_name": namespace_name}
118
+ )
119
+
120
+ # If it exists and is ready, update task queue and we're done
121
+ if check_result.get("status") == "ready":
122
+ namespace_id = check_result.get("details", {}).get("id")
123
+
124
+ await workflow.execute_activity(
125
+ update_task_queue_status,
126
+ args=[input.task_queue_id, "ready", None, namespace_id],
127
+ start_to_close_timeout=timedelta(seconds=15),
128
+ )
129
+
130
+ return ProvisionNamespaceOutput(
131
+ success=True,
132
+ namespace_name=namespace_name,
133
+ namespace_id=namespace_id,
134
+ status="ready",
135
+ )
136
+
137
+ # Step 2: Create namespace
138
+ workflow.logger.info("Step 2: Creating namespace")
139
+
140
+ create_result = await workflow.execute_activity(
141
+ create_namespace,
142
+ CreateNamespaceInput(
143
+ organization_id=input.organization_id,
144
+ namespace_name=namespace_name,
145
+ account_id=input.account_id,
146
+ region=input.region,
147
+ retention_days=input.retention_days,
148
+ ),
149
+ start_to_close_timeout=timedelta(seconds=60),
150
+ retry_policy=RetryPolicy(
151
+ maximum_attempts=3,
152
+ initial_interval=timedelta(seconds=2),
153
+ maximum_interval=timedelta(seconds=10),
154
+ ),
155
+ )
156
+
157
+ if not create_result.get("success"):
158
+ error_msg = create_result.get("error", "Failed to create namespace")
159
+ workflow.logger.error(
160
+ f"Namespace creation failed",
161
+ extra={"error": error_msg}
162
+ )
163
+
164
+ # Update task queue with error
165
+ await workflow.execute_activity(
166
+ update_task_queue_status,
167
+ args=[input.task_queue_id, "error", error_msg, None],
168
+ start_to_close_timeout=timedelta(seconds=15),
169
+ )
170
+
171
+ return ProvisionNamespaceOutput(
172
+ success=False,
173
+ namespace_name=namespace_name,
174
+ status="error",
175
+ error_message=error_msg,
176
+ )
177
+
178
+ namespace_id = create_result.get("namespace_id")
179
+
180
+ # Step 3: Poll namespace status until ready
181
+ workflow.logger.info("Step 3: Polling namespace status")
182
+
183
+ poll_result = await workflow.execute_activity(
184
+ poll_namespace_status,
185
+ PollNamespaceStatusInput(
186
+ namespace_name=namespace_name,
187
+ max_attempts=60, # 5 minutes max
188
+ poll_interval_seconds=5,
189
+ ),
190
+ start_to_close_timeout=timedelta(minutes=6),
191
+ retry_policy=RetryPolicy(
192
+ maximum_attempts=2,
193
+ initial_interval=timedelta(seconds=5),
194
+ ),
195
+ )
196
+
197
+ if not poll_result.get("ready"):
198
+ error_msg = poll_result.get("error", "Namespace not ready")
199
+ workflow.logger.error(
200
+ f"Namespace provisioning timed out",
201
+ extra={"attempts": poll_result.get("attempts")}
202
+ )
203
+
204
+ # Update task queue with error
205
+ await workflow.execute_activity(
206
+ update_task_queue_status,
207
+ args=[input.task_queue_id, "error", error_msg, namespace_id],
208
+ start_to_close_timeout=timedelta(seconds=15),
209
+ )
210
+
211
+ return ProvisionNamespaceOutput(
212
+ success=False,
213
+ namespace_name=namespace_name,
214
+ namespace_id=namespace_id,
215
+ status="error",
216
+ error_message=error_msg,
217
+ )
218
+
219
+ # Step 4: Generate API key
220
+ workflow.logger.info("Step 4: Generating API key")
221
+
222
+ api_key_result = await workflow.execute_activity(
223
+ generate_namespace_api_key,
224
+ GenerateApiKeyInput(
225
+ namespace_name=namespace_name,
226
+ key_description=f"Control Plane API Key for {input.organization_name}",
227
+ ),
228
+ start_to_close_timeout=timedelta(seconds=30),
229
+ retry_policy=RetryPolicy(
230
+ maximum_attempts=3,
231
+ initial_interval=timedelta(seconds=2),
232
+ maximum_interval=timedelta(seconds=10),
233
+ ),
234
+ )
235
+
236
+ if not api_key_result.get("success"):
237
+ error_msg = api_key_result.get("error", "Failed to generate API key")
238
+ workflow.logger.error(
239
+ f"API key generation failed",
240
+ extra={"error": error_msg}
241
+ )
242
+
243
+ # Update task queue with error
244
+ await workflow.execute_activity(
245
+ update_task_queue_status,
246
+ args=[input.task_queue_id, "error", error_msg, namespace_id],
247
+ start_to_close_timeout=timedelta(seconds=15),
248
+ )
249
+
250
+ return ProvisionNamespaceOutput(
251
+ success=False,
252
+ namespace_name=namespace_name,
253
+ namespace_id=namespace_id,
254
+ status="error",
255
+ error_message=error_msg,
256
+ )
257
+
258
+ api_key = api_key_result.get("api_key")
259
+
260
+ # Step 5: Store credentials
261
+ workflow.logger.info("Step 5: Storing credentials")
262
+
263
+ store_result = await workflow.execute_activity(
264
+ store_namespace_credentials,
265
+ StoreNamespaceCredentialsInput(
266
+ organization_id=input.organization_id,
267
+ namespace_name=namespace_name,
268
+ api_key=api_key,
269
+ status="ready",
270
+ ),
271
+ start_to_close_timeout=timedelta(seconds=15),
272
+ retry_policy=RetryPolicy(
273
+ maximum_attempts=3,
274
+ initial_interval=timedelta(seconds=1),
275
+ ),
276
+ )
277
+
278
+ stored_namespace_id = store_result.get("namespace_id")
279
+
280
+ # Step 6: Update task queue status to ready
281
+ workflow.logger.info("Step 6: Updating task queue status")
282
+
283
+ await workflow.execute_activity(
284
+ update_task_queue_status,
285
+ args=[input.task_queue_id, "ready", None, stored_namespace_id],
286
+ start_to_close_timeout=timedelta(seconds=15),
287
+ )
288
+
289
+ workflow.logger.info(
290
+ f"Namespace provisioning complete",
291
+ extra={
292
+ "namespace_name": namespace_name,
293
+ "namespace_id": stored_namespace_id,
294
+ }
295
+ )
296
+
297
+ return ProvisionNamespaceOutput(
298
+ success=True,
299
+ namespace_name=namespace_name,
300
+ namespace_id=stored_namespace_id,
301
+ status="ready",
302
+ )
303
+
304
+ except Exception as e:
305
+ error_msg = f"Workflow failed: {str(e)}"
306
+ workflow.logger.error(
307
+ f"Namespace provisioning workflow failed",
308
+ extra={"error": str(e)}
309
+ )
310
+
311
+ # Update task queue with error
312
+ try:
313
+ await workflow.execute_activity(
314
+ update_task_queue_status,
315
+ args=[input.task_queue_id, "error", error_msg, None],
316
+ start_to_close_timeout=timedelta(seconds=15),
317
+ )
318
+ except Exception:
319
+ pass # Best effort
320
+
321
+ return ProvisionNamespaceOutput(
322
+ success=False,
323
+ namespace_name=namespace_name,
324
+ status="error",
325
+ error_message=error_msg,
326
+ )