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,496 @@
1
+ """
2
+ Integration Templates Router
3
+
4
+ API endpoints for managing and using integration templates.
5
+ Templates provide pre-configured integration definitions for common providers.
6
+ """
7
+ from fastapi import APIRouter, HTTPException, Query
8
+ from typing import List, Optional, Dict, Any
9
+ from pydantic import BaseModel, Field
10
+ import structlog
11
+
12
+ logger = structlog.get_logger()
13
+
14
+ router = APIRouter(prefix="/integration-templates", tags=["integration-templates"])
15
+
16
+
17
+ # Integration Templates for Common Providers
18
+ INTEGRATION_TEMPLATES = {
19
+ "postgres": {
20
+ "name": "PostgreSQL Database",
21
+ "integration_type": "postgres",
22
+ "description": "PostgreSQL database connection with SSL support",
23
+ "icon": "PostgreSQL",
24
+ "category": "database",
25
+ "config": {
26
+ "env_vars": {
27
+ "DB_HOST": "localhost",
28
+ "DB_PORT": "5432",
29
+ "DB_NAME": "postgres",
30
+ "DB_USER": "postgres"
31
+ },
32
+ "secrets": ["DB_PASSWORD"],
33
+ "files": [
34
+ {
35
+ "path": "~/.postgresql/client.crt",
36
+ "secret_ref": "POSTGRES_CLIENT_CERT",
37
+ "mode": "0600",
38
+ "description": "PostgreSQL client certificate"
39
+ },
40
+ {
41
+ "path": "~/.postgresql/client.key",
42
+ "secret_ref": "POSTGRES_CLIENT_KEY",
43
+ "mode": "0600",
44
+ "description": "PostgreSQL client key"
45
+ }
46
+ ],
47
+ "context_prompt": "PostgreSQL relational database. Use parameterized queries to prevent SQL injection. Connection pooling is recommended for better performance.",
48
+ "connection_test": {
49
+ "enabled": True,
50
+ "command": "pg_isready -h $DB_HOST -p $DB_PORT -U $DB_USER",
51
+ "timeout": 5
52
+ }
53
+ },
54
+ "tags": ["database", "postgres", "sql", "relational"]
55
+ },
56
+ "mysql": {
57
+ "name": "MySQL Database",
58
+ "integration_type": "mysql",
59
+ "description": "MySQL relational database connection",
60
+ "icon": "MySQL",
61
+ "category": "database",
62
+ "config": {
63
+ "env_vars": {
64
+ "MYSQL_HOST": "localhost",
65
+ "MYSQL_PORT": "3306",
66
+ "MYSQL_DATABASE": "mysql",
67
+ "MYSQL_USER": "root"
68
+ },
69
+ "secrets": ["MYSQL_PASSWORD"],
70
+ "files": [
71
+ {
72
+ "path": "~/.my.cnf",
73
+ "content": "[client]\nhost=${MYSQL_HOST}\nport=${MYSQL_PORT}\nuser=${MYSQL_USER}\npassword=${MYSQL_PASSWORD}",
74
+ "mode": "0600",
75
+ "description": "MySQL client configuration"
76
+ }
77
+ ],
78
+ "context_prompt": "MySQL relational database. Use transactions for data consistency. Avoid SELECT * in production queries.",
79
+ "connection_test": {
80
+ "enabled": True,
81
+ "command": "mysqladmin -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER ping",
82
+ "timeout": 5
83
+ }
84
+ },
85
+ "tags": ["database", "mysql", "sql", "relational"]
86
+ },
87
+ "mongodb": {
88
+ "name": "MongoDB Database",
89
+ "integration_type": "mongodb",
90
+ "description": "MongoDB NoSQL document database",
91
+ "icon": "MongoDB",
92
+ "category": "database",
93
+ "config": {
94
+ "env_vars": {
95
+ "MONGO_HOST": "localhost",
96
+ "MONGO_PORT": "27017",
97
+ "MONGO_DATABASE": "admin"
98
+ },
99
+ "secrets": ["MONGO_CONNECTION_STRING"],
100
+ "context_prompt": "MongoDB NoSQL database. Use connection pooling for better performance. Always use indexes for query optimization.",
101
+ "connection_test": {
102
+ "enabled": True,
103
+ "command": "mongosh $MONGO_CONNECTION_STRING --eval 'db.runCommand({ping: 1})'",
104
+ "timeout": 5
105
+ }
106
+ },
107
+ "tags": ["database", "mongodb", "nosql", "document"]
108
+ },
109
+ "redis": {
110
+ "name": "Redis Cache",
111
+ "integration_type": "redis",
112
+ "description": "Redis in-memory data store and cache",
113
+ "icon": "Redis",
114
+ "category": "cache",
115
+ "config": {
116
+ "env_vars": {
117
+ "REDIS_HOST": "localhost",
118
+ "REDIS_PORT": "6379",
119
+ "REDIS_DB": "0"
120
+ },
121
+ "secrets": ["REDIS_PASSWORD"],
122
+ "context_prompt": "Redis in-memory cache. All keys have TTL. Use for session storage, caching, and rate limiting. Data is not persistent by default.",
123
+ "connection_test": {
124
+ "enabled": True,
125
+ "command": "redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD ping",
126
+ "timeout": 5
127
+ }
128
+ },
129
+ "tags": ["cache", "redis", "in-memory", "key-value"]
130
+ },
131
+ "elasticsearch": {
132
+ "name": "Elasticsearch Cluster",
133
+ "integration_type": "elasticsearch",
134
+ "description": "Elasticsearch search and analytics engine",
135
+ "icon": "Elasticsearch",
136
+ "category": "search",
137
+ "config": {
138
+ "env_vars": {
139
+ "ES_HOST": "localhost",
140
+ "ES_PORT": "9200",
141
+ "ES_SCHEME": "https"
142
+ },
143
+ "secrets": ["ES_USERNAME", "ES_PASSWORD", "ES_API_KEY"],
144
+ "files": [
145
+ {
146
+ "path": "~/.elasticsearch/ca.crt",
147
+ "secret_ref": "ES_CA_CERT",
148
+ "mode": "0644",
149
+ "description": "Elasticsearch CA certificate"
150
+ }
151
+ ],
152
+ "context_prompt": "Elasticsearch for full-text search and analytics. Use bulk API for large datasets. Optimize mappings for your use case.",
153
+ "connection_test": {
154
+ "enabled": True,
155
+ "command": "curl -k $ES_SCHEME://$ES_HOST:$ES_PORT/_cluster/health",
156
+ "timeout": 10
157
+ }
158
+ },
159
+ "tags": ["search", "elasticsearch", "analytics", "full-text"]
160
+ },
161
+ "rabbitmq": {
162
+ "name": "RabbitMQ Message Broker",
163
+ "integration_type": "rabbitmq",
164
+ "description": "RabbitMQ message queue and broker",
165
+ "icon": "RabbitMQ",
166
+ "category": "messaging",
167
+ "config": {
168
+ "env_vars": {
169
+ "RABBITMQ_HOST": "localhost",
170
+ "RABBITMQ_PORT": "5672",
171
+ "RABBITMQ_VHOST": "/"
172
+ },
173
+ "secrets": ["RABBITMQ_USER", "RABBITMQ_PASSWORD"],
174
+ "context_prompt": "RabbitMQ message broker. Use acknowledgments for reliable message processing. Configure dead letter queues for failed messages.",
175
+ "connection_test": {
176
+ "enabled": True,
177
+ "command": "rabbitmqctl status",
178
+ "timeout": 5
179
+ }
180
+ },
181
+ "tags": ["messaging", "rabbitmq", "queue", "amqp"]
182
+ },
183
+ "kafka": {
184
+ "name": "Apache Kafka",
185
+ "integration_type": "kafka",
186
+ "description": "Apache Kafka distributed streaming platform",
187
+ "icon": "Kafka",
188
+ "category": "messaging",
189
+ "config": {
190
+ "env_vars": {
191
+ "KAFKA_BOOTSTRAP_SERVERS": "localhost:9092",
192
+ "KAFKA_GROUP_ID": "default"
193
+ },
194
+ "secrets": ["KAFKA_SASL_USERNAME", "KAFKA_SASL_PASSWORD"],
195
+ "context_prompt": "Apache Kafka streaming platform. Use consumer groups for scalability. Configure retention policies appropriately.",
196
+ "connection_test": {
197
+ "enabled": True,
198
+ "command": "kafka-broker-api-versions --bootstrap-server $KAFKA_BOOTSTRAP_SERVERS",
199
+ "timeout": 10
200
+ }
201
+ },
202
+ "tags": ["messaging", "kafka", "streaming", "event-driven"]
203
+ },
204
+ "api": {
205
+ "name": "Custom REST API",
206
+ "integration_type": "api",
207
+ "description": "Generic REST API integration",
208
+ "icon": "API",
209
+ "category": "api",
210
+ "config": {
211
+ "env_vars": {
212
+ "API_BASE_URL": "https://api.example.com",
213
+ "API_VERSION": "v1",
214
+ "API_TIMEOUT": "30"
215
+ },
216
+ "secrets": ["API_KEY", "API_SECRET"],
217
+ "context_prompt": "REST API integration. Always check rate limits. Use exponential backoff for retries. Handle errors gracefully.",
218
+ },
219
+ "tags": ["api", "rest", "http", "web-service"]
220
+ },
221
+ "sftp": {
222
+ "name": "SFTP Server",
223
+ "integration_type": "sftp",
224
+ "description": "SFTP file transfer server",
225
+ "icon": "SFTP",
226
+ "category": "file-transfer",
227
+ "config": {
228
+ "env_vars": {
229
+ "SFTP_HOST": "sftp.example.com",
230
+ "SFTP_PORT": "22",
231
+ "SFTP_USER": "user"
232
+ },
233
+ "secrets": ["SFTP_PASSWORD"],
234
+ "files": [
235
+ {
236
+ "path": "~/.ssh/sftp_key",
237
+ "secret_ref": "SFTP_PRIVATE_KEY",
238
+ "mode": "0600",
239
+ "description": "SFTP private key for authentication"
240
+ }
241
+ ],
242
+ "context_prompt": "SFTP server for secure file transfers. Always verify file integrity after upload. Use batch operations when possible.",
243
+ },
244
+ "tags": ["file-transfer", "sftp", "ssh", "secure"]
245
+ },
246
+ "s3": {
247
+ "name": "AWS S3 Storage",
248
+ "integration_type": "s3",
249
+ "description": "AWS S3 object storage",
250
+ "icon": "S3",
251
+ "category": "storage",
252
+ "config": {
253
+ "env_vars": {
254
+ "S3_BUCKET": "my-bucket",
255
+ "S3_REGION": "us-east-1",
256
+ "S3_ENDPOINT": ""
257
+ },
258
+ "secrets": ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
259
+ "context_prompt": "AWS S3 object storage. Use multipart upload for large files. Consider lifecycle policies for cost optimization.",
260
+ "connection_test": {
261
+ "enabled": True,
262
+ "command": "aws s3 ls s3://$S3_BUCKET --region $S3_REGION",
263
+ "timeout": 10
264
+ }
265
+ },
266
+ "tags": ["storage", "s3", "aws", "object-storage"]
267
+ }
268
+ }
269
+
270
+
271
+ # Pydantic Models
272
+ class IntegrationTemplateResponse(BaseModel):
273
+ """Integration template response"""
274
+ template_id: str
275
+ name: str
276
+ integration_type: str
277
+ description: str
278
+ icon: Optional[str] = None
279
+ category: str
280
+ config: Dict[str, Any]
281
+ tags: List[str]
282
+
283
+ class Config:
284
+ json_schema_extra = {
285
+ "example": {
286
+ "template_id": "postgres",
287
+ "name": "PostgreSQL Database",
288
+ "integration_type": "postgres",
289
+ "description": "PostgreSQL database connection with SSL support",
290
+ "icon": "PostgreSQL",
291
+ "category": "database",
292
+ "config": {
293
+ "env_vars": {"DB_HOST": "localhost"},
294
+ "secrets": ["DB_PASSWORD"]
295
+ },
296
+ "tags": ["database", "postgres", "sql"]
297
+ }
298
+ }
299
+
300
+
301
+ class IntegrationTemplateSummary(BaseModel):
302
+ """Brief template summary for listing"""
303
+ template_id: str
304
+ name: str
305
+ integration_type: str
306
+ description: str
307
+ icon: Optional[str] = None
308
+ category: str
309
+ tags: List[str]
310
+
311
+
312
+ # API Endpoints
313
+
314
+ @router.get(
315
+ "",
316
+ response_model=List[IntegrationTemplateSummary],
317
+ summary="List Integration Templates",
318
+ description="""
319
+ List all pre-configured integration templates.
320
+
321
+ **Available Categories:**
322
+ - database (PostgreSQL, MySQL, MongoDB, Elasticsearch)
323
+ - cache (Redis)
324
+ - messaging (RabbitMQ, Kafka)
325
+ - storage (S3, SFTP)
326
+ - api (Generic REST API)
327
+
328
+ **Filtering:**
329
+ - `category`: Filter by category name
330
+ - `tag`: Filter by single tag
331
+ - `search`: Search in name and description
332
+
333
+ **Usage:**
334
+ Templates provide pre-configured integration definitions that can be
335
+ customized when creating a custom integration instance.
336
+
337
+ **Example:**
338
+ ```
339
+ GET /api/v1/integration-templates?category=database
340
+ GET /api/v1/integration-templates?tag=sql
341
+ GET /api/v1/integration-templates?search=postgres
342
+ ```
343
+ """,
344
+ responses={
345
+ 200: {
346
+ "description": "List of integration templates",
347
+ "content": {
348
+ "application/json": {
349
+ "example": [
350
+ {
351
+ "template_id": "postgres",
352
+ "name": "PostgreSQL Database",
353
+ "integration_type": "postgres",
354
+ "description": "PostgreSQL database with SSL support",
355
+ "icon": "PostgreSQL",
356
+ "category": "database",
357
+ "tags": ["database", "postgres", "sql", "relational"]
358
+ }
359
+ ]
360
+ }
361
+ }
362
+ }
363
+ }
364
+ )
365
+ async def list_integration_templates(
366
+ category: Optional[str] = Query(None, description="Filter by category (database, cache, messaging, storage, api)"),
367
+ tag: Optional[str] = Query(None, description="Filter by tag (e.g., sql, nosql, messaging)"),
368
+ search: Optional[str] = Query(None, description="Search in template name and description"),
369
+ ):
370
+ """List all available pre-configured integration templates."""
371
+ templates = []
372
+
373
+ for template_id, template_data in INTEGRATION_TEMPLATES.items():
374
+ # Apply filters
375
+ if category and template_data.get("category") != category:
376
+ continue
377
+
378
+ if tag and tag not in template_data.get("tags", []):
379
+ continue
380
+
381
+ if search:
382
+ search_lower = search.lower()
383
+ if (search_lower not in template_data.get("name", "").lower() and
384
+ search_lower not in template_data.get("description", "").lower()):
385
+ continue
386
+
387
+ templates.append(IntegrationTemplateSummary(
388
+ template_id=template_id,
389
+ name=template_data["name"],
390
+ integration_type=template_data["integration_type"],
391
+ description=template_data["description"],
392
+ icon=template_data.get("icon"),
393
+ category=template_data.get("category", "other"),
394
+ tags=template_data.get("tags", [])
395
+ ))
396
+
397
+ logger.info(
398
+ "integration_templates_listed",
399
+ count=len(templates),
400
+ filters={"category": category, "tag": tag, "search": search}
401
+ )
402
+
403
+ return templates
404
+
405
+
406
+ @router.get(
407
+ "/{template_id}",
408
+ response_model=IntegrationTemplateResponse,
409
+ summary="Get Integration Template",
410
+ description="""
411
+ Retrieve complete configuration for a specific integration template.
412
+
413
+ **Returns:**
414
+ - Full template configuration
415
+ - Environment variable definitions
416
+ - Required secrets list
417
+ - File configurations (with examples)
418
+ - Context prompt for AI agents
419
+ - Connection test command (if applicable)
420
+ - Tags and metadata
421
+
422
+ **Available Templates:**
423
+ - postgres, mysql, mongodb, elasticsearch
424
+ - redis
425
+ - rabbitmq, kafka
426
+ - s3, sftp
427
+ - api (generic)
428
+
429
+ **Usage:**
430
+ Use this endpoint to get the template configuration before creating
431
+ a custom integration instance. Customize the returned config as needed.
432
+
433
+ **Example:**
434
+ ```
435
+ GET /api/v1/integration-templates/postgres
436
+ ```
437
+ """,
438
+ responses={
439
+ 200: {"description": "Template details with full configuration"},
440
+ 404: {"description": "Template not found"}
441
+ }
442
+ )
443
+ async def get_integration_template(template_id: str):
444
+ """Retrieve detailed configuration for a specific integration template."""
445
+ if template_id not in INTEGRATION_TEMPLATES:
446
+ raise HTTPException(
447
+ status_code=404,
448
+ detail=f"Integration template '{template_id}' not found"
449
+ )
450
+
451
+ template_data = INTEGRATION_TEMPLATES[template_id]
452
+
453
+ logger.info(
454
+ "integration_template_fetched",
455
+ template_id=template_id,
456
+ template_name=template_data["name"]
457
+ )
458
+
459
+ return IntegrationTemplateResponse(
460
+ template_id=template_id,
461
+ name=template_data["name"],
462
+ integration_type=template_data["integration_type"],
463
+ description=template_data["description"],
464
+ icon=template_data.get("icon"),
465
+ category=template_data.get("category", "other"),
466
+ config=template_data["config"],
467
+ tags=template_data.get("tags", [])
468
+ )
469
+
470
+
471
+ @router.get("/categories/list", response_model=List[str])
472
+ async def list_template_categories():
473
+ """
474
+ List all available template categories.
475
+
476
+ Returns a list of unique categories across all templates.
477
+ """
478
+ categories = set()
479
+ for template_data in INTEGRATION_TEMPLATES.values():
480
+ categories.add(template_data.get("category", "other"))
481
+
482
+ return sorted(list(categories))
483
+
484
+
485
+ @router.get("/tags/list", response_model=List[str])
486
+ async def list_template_tags():
487
+ """
488
+ List all available template tags.
489
+
490
+ Returns a list of unique tags across all templates.
491
+ """
492
+ tags = set()
493
+ for template_data in INTEGRATION_TEMPLATES.values():
494
+ tags.update(template_data.get("tags", []))
495
+
496
+ return sorted(list(tags))