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,161 @@
1
+ """
2
+ Shell Skill
3
+
4
+ Provides shell command execution capabilities with configurable restrictions.
5
+ """
6
+ from typing import Dict, Any, List
7
+ from control_plane_api.app.skills.base import SkillDefinition, SkillType, SkillCategory, SkillVariant
8
+ from control_plane_api.app.skills.registry import register_skill
9
+
10
+
11
+ class ShellSkill(SkillDefinition):
12
+ """Shell command execution skill"""
13
+
14
+ @property
15
+ def type(self) -> SkillType:
16
+ return SkillType.SHELL
17
+
18
+ @property
19
+ def name(self) -> str:
20
+ return "Shell"
21
+
22
+ @property
23
+ def description(self) -> str:
24
+ return "Execute shell commands on the local system with configurable restrictions"
25
+
26
+ @property
27
+ def icon(self) -> str:
28
+ return "Terminal"
29
+
30
+ def get_variants(self) -> List[SkillVariant]:
31
+ return [
32
+ SkillVariant(
33
+ id="shell_safe_commands",
34
+ name="Shell - Safe Commands",
35
+ description="Execute read-only shell commands on the local system (ls, cat, grep, ps)",
36
+ category=SkillCategory.COMMON,
37
+ badge="Safe",
38
+ icon="Terminal",
39
+ configuration={
40
+ "allowed_commands": ["ls", "cat", "grep", "find", "ps", "top", "pwd", "echo", "head", "tail"],
41
+ "timeout": 30,
42
+ "usage_guidelines": (
43
+ "Use this skill for safe, read-only operations:\n"
44
+ "- File exploration: ls, find, cat\n"
45
+ "- Text processing: grep, head, tail\n"
46
+ "- Process monitoring: ps, top\n"
47
+ "- Working directory: pwd\n"
48
+ "Note: Destructive operations are blocked for safety."
49
+ ),
50
+ },
51
+ is_default=True,
52
+ ),
53
+ SkillVariant(
54
+ id="shell_full_access",
55
+ name="Shell - Full Access",
56
+ description="Unrestricted shell access to execute any command on local system",
57
+ category=SkillCategory.ADVANCED,
58
+ badge="Advanced",
59
+ icon="Terminal",
60
+ configuration={
61
+ "timeout": 300,
62
+ "usage_guidelines": (
63
+ "Full shell access with no restrictions. Use responsibly:\n"
64
+ "- Package management: apt, yum, brew\n"
65
+ "- System administration: systemctl, service\n"
66
+ "- File operations: cp, mv, rm\n"
67
+ "- Network tools: curl, wget, ssh\n"
68
+ "Warning: All commands are permitted - exercise caution with destructive operations."
69
+ ),
70
+ },
71
+ is_default=False,
72
+ ),
73
+ SkillVariant(
74
+ id="shell_read_only",
75
+ name="Shell - Read Only",
76
+ description="Maximum security: only non-destructive read commands allowed",
77
+ category=SkillCategory.SECURITY,
78
+ badge="Secure",
79
+ icon="ShieldCheck",
80
+ configuration={
81
+ "allowed_commands": ["ls", "cat", "head", "tail", "grep", "find", "pwd"],
82
+ "blocked_commands": ["rm", "mv", "cp", "chmod", "chown", "kill"],
83
+ "timeout": 15,
84
+ "usage_guidelines": (
85
+ "Highly restricted read-only shell access:\n"
86
+ "- View files: cat, head, tail\n"
87
+ "- Search: grep, find\n"
88
+ "- Navigate: ls, pwd\n"
89
+ "Security: Destructive commands explicitly blocked."
90
+ ),
91
+ },
92
+ is_default=False,
93
+ ),
94
+ SkillVariant(
95
+ id="shell_debug_mode",
96
+ name="Shell - Debug Mode",
97
+ description="Shell with debug tracing enabled for troubleshooting",
98
+ category=SkillCategory.ADVANCED,
99
+ badge="Debug",
100
+ icon="Bug",
101
+ configuration={
102
+ "timeout": 60,
103
+ "shell_binary": "/bin/bash",
104
+ "shell_args": ["-x", "-e"],
105
+ "usage_guidelines": (
106
+ "Debug shell with command tracing:\n"
107
+ "- All executed commands are logged\n"
108
+ "- Script execution stops on first error\n"
109
+ "- Useful for troubleshooting complex workflows\n"
110
+ "- Review output carefully as it includes trace information"
111
+ ),
112
+ "environment_context": "Running in debug mode with command tracing enabled.",
113
+ },
114
+ is_default=False,
115
+ ),
116
+ ]
117
+
118
+ def validate_configuration(self, config: Dict[str, Any]) -> Dict[str, Any]:
119
+ """Validate shell configuration"""
120
+ validated = {
121
+ "timeout": min(config.get("timeout", 30), 600), # Max 10 minutes
122
+ }
123
+
124
+ # Add allowed_commands if specified
125
+ if "allowed_commands" in config:
126
+ validated["allowed_commands"] = list(config["allowed_commands"])
127
+
128
+ # Add blocked_commands if specified
129
+ if "blocked_commands" in config:
130
+ validated["blocked_commands"] = list(config["blocked_commands"])
131
+
132
+ # Add working_directory if specified
133
+ if "working_directory" in config:
134
+ validated["working_directory"] = str(config["working_directory"])
135
+
136
+ # Context fields for system prompt injection
137
+ if "usage_guidelines" in config:
138
+ validated["usage_guidelines"] = str(config["usage_guidelines"])
139
+
140
+ if "environment_context" in config:
141
+ validated["environment_context"] = str(config["environment_context"])
142
+
143
+ # Custom shell binary configuration
144
+ if "shell_binary" in config:
145
+ validated["shell_binary"] = str(config["shell_binary"])
146
+
147
+ if "shell_args" in config:
148
+ validated["shell_args"] = list(config["shell_args"])
149
+
150
+ return validated
151
+
152
+ def get_default_configuration(self) -> Dict[str, Any]:
153
+ """Default: safe commands only"""
154
+ return {
155
+ "allowed_commands": ["ls", "cat", "grep", "find", "ps", "top", "pwd", "echo", "head", "tail"],
156
+ "timeout": 30,
157
+ }
158
+
159
+
160
+ # Auto-register this skill
161
+ register_skill(ShellSkill())
@@ -0,0 +1,3 @@
1
+ from .skill import SlackSkill
2
+
3
+ __all__ = ["SlackSkill"]
@@ -0,0 +1,302 @@
1
+ """
2
+ Slack Skill
3
+
4
+ Provides Slack integration capabilities with OAuth support and configurable permissions.
5
+ """
6
+ from typing import Dict, Any, List
7
+ from control_plane_api.app.skills.base import (
8
+ SkillDefinition,
9
+ SkillType,
10
+ SkillCategory,
11
+ SkillVariant,
12
+ SkillRequirements,
13
+ )
14
+ from control_plane_api.app.skills.registry import register_skill
15
+
16
+
17
+ class SlackSkill(SkillDefinition):
18
+ """Slack integration skill with OAuth and configurable capabilities"""
19
+
20
+ @property
21
+ def type(self) -> SkillType:
22
+ return SkillType.SLACK
23
+
24
+ @property
25
+ def name(self) -> str:
26
+ return "Slack"
27
+
28
+ @property
29
+ def description(self) -> str:
30
+ return "Slack integration with OAuth support and configurable capabilities for messaging, reactions, and channel management"
31
+
32
+ @property
33
+ def icon(self) -> str:
34
+ return "Slack"
35
+
36
+ def get_variants(self) -> List[SkillVariant]:
37
+ return [
38
+ SkillVariant(
39
+ id="slack_read_only",
40
+ name="Slack - Read Only",
41
+ description="Read-only access to Slack: list channels, read messages, search, view threads and users",
42
+ category=SkillCategory.COMMON,
43
+ badge="Safe",
44
+ icon="Eye",
45
+ configuration={
46
+ "use_env_fallback": True,
47
+ "enable_read_messages": True,
48
+ "enable_write_messages": False,
49
+ "enable_reactions": False,
50
+ "enable_channel_management": False,
51
+ "read_channels": True,
52
+ "read_messages": True,
53
+ "search_messages": True,
54
+ "read_threads": True,
55
+ "read_users": True,
56
+ "timeout": 30,
57
+ "usage_guidelines": (
58
+ "Read-only Slack access for monitoring and information gathering:\n"
59
+ "- List and browse channels\n"
60
+ "- Read message history\n"
61
+ "- Search for messages\n"
62
+ "- View thread replies\n"
63
+ "- Get user information\n"
64
+ "Note: Cannot send messages, add reactions, or manage channels."
65
+ ),
66
+ },
67
+ is_default=True,
68
+ ),
69
+ SkillVariant(
70
+ id="slack_communication",
71
+ name="Slack - Communication",
72
+ description="Full communication capabilities: read and write messages, manage threads, add reactions",
73
+ category=SkillCategory.COMMON,
74
+ badge="Recommended",
75
+ icon="MessageSquare",
76
+ configuration={
77
+ "use_env_fallback": True,
78
+ "enable_read_messages": True,
79
+ "enable_write_messages": True,
80
+ "enable_reactions": True,
81
+ "enable_channel_management": False,
82
+ "read_channels": True,
83
+ "read_messages": True,
84
+ "search_messages": True,
85
+ "read_threads": True,
86
+ "read_users": True,
87
+ "send_messages": True,
88
+ "post_messages": True,
89
+ "reply_to_threads": True,
90
+ "update_messages": True,
91
+ "add_reactions": True,
92
+ "remove_reactions": True,
93
+ "timeout": 30,
94
+ "usage_guidelines": (
95
+ "Full Slack communication capabilities:\n"
96
+ "- Send and post messages to channels\n"
97
+ "- Reply to and manage threads\n"
98
+ "- Update and delete messages\n"
99
+ "- Add and remove reactions\n"
100
+ "- Search and read message history\n"
101
+ "Note: Cannot create or manage channels."
102
+ ),
103
+ },
104
+ is_default=False,
105
+ ),
106
+ SkillVariant(
107
+ id="slack_bot_assistant",
108
+ name="Slack - Bot Assistant",
109
+ description="Optimized for conversational bots: read/write messages, reactions, optimized for rapid responses",
110
+ category=SkillCategory.COMMON,
111
+ badge="Bot",
112
+ icon="Bot",
113
+ configuration={
114
+ "use_env_fallback": True,
115
+ "enable_read_messages": True,
116
+ "enable_write_messages": True,
117
+ "enable_reactions": True,
118
+ "enable_channel_management": False,
119
+ "read_channels": True,
120
+ "read_messages": True,
121
+ "search_messages": False, # Disabled for performance
122
+ "read_threads": True,
123
+ "read_users": True,
124
+ "send_messages": True,
125
+ "post_messages": True,
126
+ "reply_to_threads": True,
127
+ "update_messages": False, # Bots typically don't edit
128
+ "add_reactions": True,
129
+ "remove_reactions": False, # Bots typically don't remove
130
+ "timeout": 20, # Faster timeout for bot responses
131
+ "usage_guidelines": (
132
+ "Bot-optimized Slack configuration:\n"
133
+ "- Rapid message sending and thread replies\n"
134
+ "- React to messages for acknowledgment\n"
135
+ "- Read channels and threads for context\n"
136
+ "- Lightweight operations for fast responses\n"
137
+ "Optimized for: Chatbots, notifications, automated responses."
138
+ ),
139
+ },
140
+ is_default=False,
141
+ ),
142
+ SkillVariant(
143
+ id="slack_full_access",
144
+ name="Slack - Full Access",
145
+ description="Complete Slack management: all messaging, reactions, and channel administration capabilities",
146
+ category=SkillCategory.ADVANCED,
147
+ badge="Advanced",
148
+ icon="Slack",
149
+ configuration={
150
+ "use_env_fallback": True,
151
+ "enable_read_messages": True,
152
+ "enable_write_messages": True,
153
+ "enable_reactions": True,
154
+ "enable_channel_management": True,
155
+ "read_channels": True,
156
+ "read_messages": True,
157
+ "search_messages": True,
158
+ "read_threads": True,
159
+ "read_users": True,
160
+ "send_messages": True,
161
+ "post_messages": True,
162
+ "reply_to_threads": True,
163
+ "update_messages": True,
164
+ "add_reactions": True,
165
+ "remove_reactions": True,
166
+ "create_channels": True,
167
+ "invite_to_channels": True,
168
+ "archive_channels": True,
169
+ "set_channel_topic": True,
170
+ "timeout": 30,
171
+ "usage_guidelines": (
172
+ "Full Slack workspace management capabilities:\n"
173
+ "- Complete messaging and communication\n"
174
+ "- Channel creation and management\n"
175
+ "- User invitations and permissions\n"
176
+ "- Channel archiving and topics\n"
177
+ "- All reaction and thread operations\n"
178
+ "Warning: Use responsibly - includes administrative permissions."
179
+ ),
180
+ },
181
+ is_default=False,
182
+ ),
183
+ ]
184
+
185
+ def validate_configuration(self, config: Dict[str, Any]) -> Dict[str, Any]:
186
+ """Validate Slack configuration"""
187
+ validated = {}
188
+
189
+ # Authentication settings
190
+ if "integration_id" in config:
191
+ validated["integration_id"] = str(config["integration_id"])
192
+
193
+ # Handle both secret_name (single) and secrets (list) for backwards compatibility
194
+ if "secret_name" in config and config["secret_name"]:
195
+ # Single secret - convert to list
196
+ validated["secrets"] = [str(config["secret_name"])]
197
+ elif "secrets" in config:
198
+ secrets = config["secrets"]
199
+ if isinstance(secrets, str):
200
+ # Comma-separated string to list
201
+ validated["secrets"] = [s.strip() for s in secrets.split(",") if s.strip()]
202
+ elif isinstance(secrets, list):
203
+ validated["secrets"] = [str(s).strip() for s in secrets if s]
204
+
205
+ validated["use_env_fallback"] = config.get("use_env_fallback", True)
206
+
207
+ # Channel scoping
208
+ if "allowed_channels" in config:
209
+ channels = config["allowed_channels"]
210
+ if isinstance(channels, str):
211
+ # Convert comma-separated string to list
212
+ validated["allowed_channels"] = [ch.strip() for ch in channels.split(",") if ch.strip()]
213
+ elif isinstance(channels, list):
214
+ validated["allowed_channels"] = [str(ch).strip() for ch in channels if ch]
215
+
216
+ if "blocked_channels" in config:
217
+ channels = config["blocked_channels"]
218
+ if isinstance(channels, str):
219
+ validated["blocked_channels"] = [ch.strip() for ch in channels.split(",") if ch.strip()]
220
+ elif isinstance(channels, list):
221
+ validated["blocked_channels"] = [str(ch).strip() for ch in channels if ch]
222
+
223
+ # Capability groups
224
+ validated["enable_read_messages"] = config.get("enable_read_messages", True)
225
+ validated["enable_write_messages"] = config.get("enable_write_messages", False)
226
+ validated["enable_reactions"] = config.get("enable_reactions", False)
227
+ validated["enable_channel_management"] = config.get("enable_channel_management", False)
228
+
229
+ # Fine-grained read permissions
230
+ if validated["enable_read_messages"]:
231
+ validated["read_channels"] = config.get("read_channels", True)
232
+ validated["read_messages"] = config.get("read_messages", True)
233
+ validated["search_messages"] = config.get("search_messages", True)
234
+ validated["read_threads"] = config.get("read_threads", True)
235
+ validated["read_users"] = config.get("read_users", True)
236
+
237
+ # Fine-grained write permissions
238
+ if validated["enable_write_messages"]:
239
+ validated["send_messages"] = config.get("send_messages", True)
240
+ validated["post_messages"] = config.get("post_messages", True)
241
+ validated["reply_to_threads"] = config.get("reply_to_threads", True)
242
+ validated["update_messages"] = config.get("update_messages", True)
243
+
244
+ # Fine-grained reaction permissions
245
+ if validated["enable_reactions"]:
246
+ validated["add_reactions"] = config.get("add_reactions", True)
247
+ validated["remove_reactions"] = config.get("remove_reactions", True)
248
+
249
+ # Fine-grained channel management permissions
250
+ if validated["enable_channel_management"]:
251
+ validated["create_channels"] = config.get("create_channels", True)
252
+ validated["invite_to_channels"] = config.get("invite_to_channels", True)
253
+ validated["archive_channels"] = config.get("archive_channels", True)
254
+ validated["set_channel_topic"] = config.get("set_channel_topic", True)
255
+
256
+ # General settings
257
+ validated["timeout"] = max(5, min(config.get("timeout", 30), 300)) # 5s to 5min
258
+
259
+ if "default_channel" in config:
260
+ validated["default_channel"] = str(config["default_channel"])
261
+
262
+ # Context fields for system prompt injection
263
+ if "usage_guidelines" in config:
264
+ validated["usage_guidelines"] = str(config["usage_guidelines"])
265
+
266
+ return validated
267
+
268
+ def get_default_configuration(self) -> Dict[str, Any]:
269
+ """Get default configuration (read-only)"""
270
+ return {
271
+ "use_env_fallback": True,
272
+ "enable_read_messages": True,
273
+ "enable_write_messages": False,
274
+ "enable_reactions": False,
275
+ "enable_channel_management": False,
276
+ "read_channels": True,
277
+ "read_messages": True,
278
+ "search_messages": True,
279
+ "read_threads": True,
280
+ "read_users": True,
281
+ "timeout": 30,
282
+ }
283
+
284
+ def get_requirements(self) -> SkillRequirements:
285
+ """Get skill runtime requirements"""
286
+ return SkillRequirements(
287
+ python_packages=["slack-sdk>=3.27.0", "httpx>=0.27.0"],
288
+ supported_os=["linux", "darwin", "win32"],
289
+ min_python_version="3.10",
290
+ required_env_vars=[], # All optional: SLACK_BOT_TOKEN, KUBIYA_API_KEY, INTEGRATION_API_BASE
291
+ external_dependencies=["Slack API"],
292
+ notes=(
293
+ "Requires either:\n"
294
+ "1. Integration API with OAuth authentication (via integration_id), OR\n"
295
+ "2. SLACK_BOT_TOKEN environment variable (Bot User OAuth Token)\n\n"
296
+ "For Integration API: Set KUBIYA_API_KEY and optionally INTEGRATION_API_BASE"
297
+ ),
298
+ )
299
+
300
+
301
+ # Register the skill
302
+ register_skill(SlackSkill())
@@ -0,0 +1,4 @@
1
+ """Workflow Executor Skill - Execute workflows defined via JSON or Python DSL."""
2
+ from .skill import WorkflowExecutorSkill
3
+
4
+ __all__ = ["WorkflowExecutorSkill"]