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,100 @@
1
+ # Rate Limiting Policy
2
+ # Limits the number of executions per user/agent within a time window
3
+
4
+ package rate_limiting
5
+
6
+ import future.keywords.if
7
+ import future.keywords.in
8
+
9
+ # Default deny
10
+ default allow = false
11
+
12
+ # Maximum executions per hour per user
13
+ max_executions_per_hour := 100
14
+
15
+ # Maximum executions per hour per agent
16
+ max_agent_executions_per_hour := 50
17
+
18
+ # Maximum concurrent executions per user
19
+ max_concurrent_executions := 5
20
+
21
+ # Allow if under user rate limit
22
+ allow if {
23
+ input.user
24
+ input.executions_last_hour < max_executions_per_hour
25
+ }
26
+
27
+ # Allow if under agent rate limit
28
+ allow if {
29
+ input.agent_id
30
+ input.agent_executions_last_hour < max_agent_executions_per_hour
31
+ }
32
+
33
+ # Allow if under concurrent execution limit
34
+ allow if {
35
+ input.user
36
+ input.concurrent_executions < max_concurrent_executions
37
+ }
38
+
39
+ # Special handling for admin users (higher limits)
40
+ allow if {
41
+ is_admin_user
42
+ input.executions_last_hour < (max_executions_per_hour * 2)
43
+ }
44
+
45
+ # Check if user is admin
46
+ is_admin_user if {
47
+ input.user
48
+ contains(input.user, "admin@")
49
+ }
50
+
51
+ is_admin_user if {
52
+ input.user_role == "admin"
53
+ }
54
+
55
+ # Violations
56
+ violations[msg] if {
57
+ input.user
58
+ input.executions_last_hour >= max_executions_per_hour
59
+ not is_admin_user
60
+ msg := sprintf("User '%v' has exceeded rate limit: %v executions in the last hour (max: %v)", [
61
+ input.user,
62
+ input.executions_last_hour,
63
+ max_executions_per_hour
64
+ ])
65
+ }
66
+
67
+ violations[msg] if {
68
+ input.agent_id
69
+ input.agent_executions_last_hour >= max_agent_executions_per_hour
70
+ msg := sprintf("Agent '%v' has exceeded rate limit: %v executions in the last hour (max: %v)", [
71
+ input.agent_id,
72
+ input.agent_executions_last_hour,
73
+ max_agent_executions_per_hour
74
+ ])
75
+ }
76
+
77
+ violations[msg] if {
78
+ input.user
79
+ input.concurrent_executions >= max_concurrent_executions
80
+ msg := sprintf("User '%v' has too many concurrent executions: %v (max: %v)", [
81
+ input.user,
82
+ input.concurrent_executions,
83
+ max_concurrent_executions
84
+ ])
85
+ }
86
+
87
+ violations[msg] if {
88
+ not input.user
89
+ not input.agent_id
90
+ msg := "No user or agent_id specified for rate limiting check"
91
+ }
92
+
93
+ # Metadata
94
+ metadata := {
95
+ "name": "rate-limiting",
96
+ "description": "Limit execution frequency per user and agent to prevent abuse",
97
+ "version": "1.0.0",
98
+ "author": "Kubiya",
99
+ "tags": ["security", "rate-limiting", "quota"]
100
+ }
@@ -0,0 +1,336 @@
1
+ # Tool Enforcement Policies
2
+
3
+ This directory contains OPA policies for **real-time tool call enforcement** during agent execution. These policies validate tool executions before they happen and can inject violation messages into tool outputs (non-blocking).
4
+
5
+ ## Overview
6
+
7
+ All policies in this directory use the package `kubiya.tool_enforcement` and evaluate against a structured input that includes:
8
+
9
+ - Tool information (name, arguments, source, category, risk level)
10
+ - User context (email, ID, roles)
11
+ - Organization and team context
12
+ - Execution environment (production/staging/dev)
13
+ - Timestamp
14
+
15
+ ## Input Schema
16
+
17
+ Policies receive this input structure:
18
+
19
+ ```json
20
+ {
21
+ "action": "tool_execution",
22
+ "tool": {
23
+ "name": "Bash",
24
+ "arguments": {"command": "ls -la"},
25
+ "source": "builtin",
26
+ "category": "command_execution",
27
+ "risk_level": "high"
28
+ },
29
+ "user": {
30
+ "email": "alice@company.com",
31
+ "id": "user-123",
32
+ "roles": ["developer"]
33
+ },
34
+ "organization": {
35
+ "id": "org-456"
36
+ },
37
+ "team": {
38
+ "id": "team-789",
39
+ "name": "Platform Team"
40
+ },
41
+ "execution": {
42
+ "agent_id": "agent-abc",
43
+ "execution_id": "exec-def",
44
+ "environment": "production",
45
+ "timestamp": "2025-01-15T14:30:00Z"
46
+ }
47
+ }
48
+ ```
49
+
50
+ ## Available Policies
51
+
52
+ ### 1. Role-Based Tool Access (`role_based_tool_access.rego`)
53
+
54
+ **Purpose**: Restrict command execution tools to admin/devops roles
55
+
56
+ **Rules**:
57
+ - Allows command execution tools only for users with `admin` or `devops` roles
58
+ - All other users can use non-command-execution tools
59
+ - Admins can use any tool
60
+
61
+ **Example Violation**:
62
+ ```
63
+ Tool execution blocked by policy enforcement.
64
+
65
+ Tool: Bash
66
+ Blocked by policies: role_based_tool_access
67
+
68
+ Only admin and devops roles can execute command tools.
69
+ Contact your team lead to request elevated permissions.
70
+ ```
71
+
72
+ ### 2. Production Safeguards (`production_safeguards.rego`)
73
+
74
+ **Purpose**: Block critical/high-risk tools in production environment
75
+
76
+ **Rules**:
77
+ - Denies critical-risk tools in production environment
78
+ - Denies high-risk tools in production environment
79
+ - Allows all tools in dev/staging environments
80
+ - Admins can bypass restrictions
81
+
82
+ **Example Violation**:
83
+ ```
84
+ Tool execution blocked by policy enforcement.
85
+
86
+ Tool: Bash
87
+ Blocked by policies: production_safeguards
88
+
89
+ Critical and high-risk tools are restricted in production.
90
+ Use dev or staging environments for testing, or request admin approval.
91
+ ```
92
+
93
+ ### 3. Bash Command Validation (`bash_command_validation.rego`)
94
+
95
+ **Purpose**: Block dangerous bash command patterns
96
+
97
+ **Rules**:
98
+ - Denies commands containing `rm -rf /`
99
+ - Denies commands containing `dd if=/dev/zero`
100
+ - Denies commands containing `mkfs`
101
+ - Denies fork bombs `:(){ :|:& };:`
102
+ - Denies commands writing to `/dev/sda*` or `/dev/nvme*`
103
+ - Admins can bypass restrictions
104
+
105
+ **Example Violation**:
106
+ ```
107
+ Tool execution blocked by policy enforcement.
108
+
109
+ Tool: Bash
110
+ Blocked by policies: bash_command_validation
111
+
112
+ This bash command contains dangerous patterns that can cause system damage.
113
+ Blocked pattern: rm -rf /
114
+ Contact security team if you need to run this command.
115
+ ```
116
+
117
+ ### 4. Business Hours Enforcement (`business_hours_enforcement.rego`)
118
+
119
+ **Purpose**: Restrict high-risk tools to business hours
120
+
121
+ **Rules**:
122
+ - Denies high-risk tools outside business hours (9 AM - 6 PM UTC)
123
+ - Denies critical-risk tools outside business hours
124
+ - Only enforced Monday-Friday
125
+ - Allows low/medium-risk tools anytime
126
+ - Admins can bypass restrictions
127
+
128
+ **Example Violation**:
129
+ ```
130
+ Tool execution blocked by policy enforcement.
131
+
132
+ Tool: Bash
133
+ Blocked by policies: business_hours_enforcement
134
+
135
+ High-risk tools are restricted to business hours (9 AM - 6 PM UTC, Monday-Friday).
136
+ Contact admin for urgent requests outside business hours.
137
+ ```
138
+
139
+ ### 5. MCP Tool Allowlist (`mcp_tool_allowlist.rego`)
140
+
141
+ **Purpose**: Whitelist approved MCP tools
142
+
143
+ **Rules**:
144
+ - Only allows MCP tools in the approved list
145
+ - Approved tools include common integrations: GitHub, Slack, Jira, AWS
146
+ - All non-MCP tools are allowed (governed by other policies)
147
+ - Admins can use any MCP tool
148
+
149
+ **Approved MCP Tools**:
150
+ - `mcp__github__list_repos`
151
+ - `mcp__github__create_issue`
152
+ - `mcp__github__get_issue`
153
+ - `mcp__slack__send_message`
154
+ - `mcp__slack__list_channels`
155
+ - `mcp__jira__create_ticket`
156
+ - `mcp__jira__update_ticket`
157
+ - `mcp__aws__list_instances`
158
+ - `mcp__aws__describe_instance`
159
+
160
+ **Example Violation**:
161
+ ```
162
+ Tool execution blocked by policy enforcement.
163
+
164
+ Tool: mcp__pagerduty__create_incident
165
+ Blocked by policies: mcp_tool_allowlist
166
+
167
+ MCP tool 'mcp__pagerduty__create_incident' is not in the approved list.
168
+ Approved tools: [mcp__github__list_repos, mcp__slack__send_message, ...]
169
+ Contact admin to request access.
170
+ ```
171
+
172
+ ## Tool Classification
173
+
174
+ ### Risk Levels
175
+
176
+ Policies use the following risk levels automatically assigned by the enforcement service:
177
+
178
+ - **Critical**: Destructive commands (`rm -rf /`, `dd`, `mkfs`, fork bombs)
179
+ - **High**: Command execution tools, sensitive file access
180
+ - **Medium**: File write/edit operations
181
+ - **Low**: Read operations, safe tools
182
+
183
+ ### Tool Sources
184
+
185
+ - **MCP**: Tools starting with `mcp__` prefix
186
+ - **Builtin**: Platform tools (Bash, Read, Write, Edit, Grep, Glob, etc.)
187
+ - **Skill**: Custom user-defined tools
188
+
189
+ ### Tool Categories
190
+
191
+ - **command_execution**: Bash and similar command tools
192
+ - **file_operation**: Read, Write, Edit
193
+ - **file_search**: Grep, Glob
194
+ - **network**: WebFetch, API calls
195
+ - **general**: Other tools
196
+
197
+ ## Policy Development
198
+
199
+ ### Creating Custom Policies
200
+
201
+ All tool enforcement policies should:
202
+
203
+ 1. Use package `kubiya.tool_enforcement`
204
+ 2. Start with `default allow = false` (deny by default)
205
+ 3. Define clear `allow` rules
206
+ 4. Provide helpful `violation` messages
207
+ 5. Include metadata (name, description, version)
208
+
209
+ Example template:
210
+
211
+ ```rego
212
+ package kubiya.tool_enforcement
213
+
214
+ import future.keywords.if
215
+
216
+ # Default deny
217
+ default allow = false
218
+
219
+ # Allow rule
220
+ allow if {
221
+ # Your conditions here
222
+ input.user.roles[_] == "approved_role"
223
+ }
224
+
225
+ # Violation message
226
+ violation[msg] if {
227
+ not allow
228
+ msg := "Clear explanation of why the tool was blocked and what to do next"
229
+ }
230
+
231
+ # Metadata
232
+ metadata := {
233
+ "name": "my_custom_policy",
234
+ "description": "Description of what this policy does",
235
+ "version": "1.0.0",
236
+ "author": "Your Name",
237
+ "tags": ["security", "custom"]
238
+ }
239
+ ```
240
+
241
+ ### Testing Policies
242
+
243
+ Test policies locally using OPA CLI:
244
+
245
+ ```bash
246
+ # Test a single policy
247
+ opa test control_plane_api/app/policies/tool_enforcement/role_based_tool_access.rego
248
+
249
+ # Test with input
250
+ opa eval -d control_plane_api/app/policies/tool_enforcement/ \
251
+ -i test_input.json \
252
+ 'data.kubiya.tool_enforcement.allow'
253
+
254
+ # Run policy benchmarks
255
+ opa test --benchmark control_plane_api/app/policies/tool_enforcement/
256
+ ```
257
+
258
+ ### Deploying Policies
259
+
260
+ Upload policies through the Control Plane API:
261
+
262
+ ```bash
263
+ # Create policy
264
+ curl -X POST https://control-plane.example.com/api/v1/policies \
265
+ -H "Authorization: Bearer $TOKEN" \
266
+ -H "Content-Type: application/json" \
267
+ -d @policy.json
268
+
269
+ # Enable policy
270
+ curl -X PATCH https://control-plane.example.com/api/v1/policies/{id} \
271
+ -H "Authorization: Bearer $TOKEN" \
272
+ -d '{"enabled": true}'
273
+ ```
274
+
275
+ ## Best Practices
276
+
277
+ 1. **Start restrictive**: Begin with deny-by-default and explicit allow rules
278
+ 2. **Clear messages**: Provide actionable violation messages
279
+ 3. **Test thoroughly**: Test with various inputs before deploying
280
+ 4. **Version policies**: Use metadata to track policy versions
281
+ 5. **Document assumptions**: Comment complex logic in Rego code
282
+ 6. **Monitor impact**: Track policy allow/deny metrics after deployment
283
+ 7. **Admin overrides**: Always provide admin bypass for emergencies
284
+
285
+ ## Troubleshooting
286
+
287
+ ### Policy Not Applied
288
+
289
+ If a policy isn't being enforced:
290
+
291
+ 1. Verify policy is loaded in enforcer:
292
+ ```bash
293
+ curl https://control-plane.example.com/api/v1/policies
294
+ ```
295
+
296
+ 2. Check policy is enabled:
297
+ ```bash
298
+ curl https://control-plane.example.com/api/v1/policies/{id}
299
+ ```
300
+
301
+ 3. Review worker logs for enforcement errors:
302
+ ```bash
303
+ tail -f /var/log/worker/worker.log | grep enforcement
304
+ ```
305
+
306
+ ### False Positives
307
+
308
+ If safe tools are being blocked incorrectly:
309
+
310
+ 1. Review policy conditions with test input
311
+ 2. Add exemptions for specific users/roles
312
+ 3. Adjust risk level classifications if needed
313
+ 4. Consider environment-specific policies
314
+
315
+ ### Performance Issues
316
+
317
+ If policy evaluation is slow:
318
+
319
+ 1. Simplify complex Rego logic
320
+ 2. Profile policies with `opa test --bench`
321
+ 3. Reduce policy count if possible
322
+ 4. Consider caching frequently-evaluated decisions
323
+
324
+ ## References
325
+
326
+ - [Tool Enforcement Guide](../../../../../docs/TOOL_ENFORCEMENT.md) - Complete documentation
327
+ - [OPA Documentation](https://www.openpolicyagent.org/docs/latest/)
328
+ - [Rego Language Reference](https://www.openpolicyagent.org/docs/latest/policy-reference/)
329
+ - [Policy Management API](../../README.md)
330
+
331
+ ## Support
332
+
333
+ For issues with tool enforcement policies:
334
+ - [GitHub Issues](https://github.com/kubiyabot/agent-control-plane/issues)
335
+ - [Discord Community](https://discord.gg/kubiya)
336
+ - Email: support@kubiya.ai
@@ -0,0 +1,71 @@
1
+ # Bash Command Validation Policy
2
+ # Block dangerous bash command patterns
3
+
4
+ package kubiya.tool_enforcement
5
+
6
+ import future.keywords.if
7
+
8
+ # Default deny
9
+ default allow = false
10
+
11
+ # Dangerous command patterns
12
+ dangerous_patterns := [
13
+ "rm -rf /",
14
+ "dd if=",
15
+ "mkfs",
16
+ ":(){:|:&};:", # Fork bomb
17
+ "> /dev/sda",
18
+ "chmod 777",
19
+ "wget http://", # Untrusted downloads
20
+ "curl http://", # Untrusted downloads (non-HTTPS)
21
+ "nc -l", # Netcat listener
22
+ "python -m http.server", # Exposing server
23
+ ]
24
+
25
+ # Check if command contains dangerous patterns
26
+ has_dangerous_pattern if {
27
+ input.tool.name == "Bash"
28
+ command := input.tool.arguments.command
29
+ pattern := dangerous_patterns[_]
30
+ contains(command, pattern)
31
+ }
32
+
33
+ # Block Bash commands with dangerous patterns
34
+ deny if {
35
+ input.tool.name == "Bash"
36
+ has_dangerous_pattern
37
+ }
38
+
39
+ # Allow Bash if no dangerous patterns
40
+ allow if {
41
+ input.tool.name == "Bash"
42
+ not has_dangerous_pattern
43
+ input.user.email != ""
44
+ }
45
+
46
+ # Allow non-Bash tools
47
+ allow if {
48
+ input.tool.name != "Bash"
49
+ input.user.email != ""
50
+ }
51
+
52
+ # Admin override
53
+ allow if {
54
+ input.user.roles[_] == "admin"
55
+ }
56
+
57
+ # Violation message
58
+ violation[msg] if {
59
+ deny
60
+ has_dangerous_pattern
61
+ msg := sprintf("Bash command contains dangerous pattern: '%s'. This command is blocked for security reasons.", [input.tool.arguments.command])
62
+ }
63
+
64
+ # Metadata
65
+ metadata := {
66
+ "name": "bash_command_validation",
67
+ "description": "Block dangerous bash command patterns",
68
+ "version": "1.0.0",
69
+ "author": "Kubiya",
70
+ "tags": ["bash", "security", "command_validation"]
71
+ }
@@ -0,0 +1,82 @@
1
+ # Business Hours Enforcement Policy
2
+ # Restrict high-risk tools to business hours (9 AM - 6 PM UTC, Monday-Friday)
3
+
4
+ package kubiya.tool_enforcement
5
+
6
+ import future.keywords.if
7
+
8
+ # Default deny
9
+ default allow = false
10
+
11
+ # Parse timestamp and check business hours
12
+ is_business_hours if {
13
+ # Parse the ISO 8601 timestamp
14
+ time_ns := time.parse_rfc3339_ns(input.execution.timestamp)
15
+
16
+ # Get time components [year, month, day, hour, minute, second, day_of_week]
17
+ time_parts := time.clock(time_ns)
18
+ hour := time_parts[3]
19
+
20
+ # Get day of week (0 = Sunday, 1 = Monday, ..., 6 = Saturday)
21
+ day_of_week := time.weekday(time_ns)
22
+
23
+ # Business hours: 9 AM - 6 PM
24
+ hour >= 9
25
+ hour < 18
26
+
27
+ # Business days: Monday-Friday
28
+ day_of_week in ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
29
+ }
30
+
31
+ # High-risk tools only during business hours
32
+ deny if {
33
+ input.tool.risk_level == "high"
34
+ not is_business_hours
35
+ }
36
+
37
+ deny if {
38
+ input.tool.risk_level == "critical"
39
+ not is_business_hours
40
+ }
41
+
42
+ # Allow low/medium risk anytime
43
+ allow if {
44
+ input.tool.risk_level == "low"
45
+ }
46
+
47
+ allow if {
48
+ input.tool.risk_level == "medium"
49
+ }
50
+
51
+ # Allow high-risk during business hours
52
+ allow if {
53
+ input.tool.risk_level == "high"
54
+ is_business_hours
55
+ }
56
+
57
+ allow if {
58
+ input.tool.risk_level == "critical"
59
+ is_business_hours
60
+ }
61
+
62
+ # Admins bypass time restrictions
63
+ allow if {
64
+ input.user.roles[_] == "admin"
65
+ }
66
+
67
+ # Violation message
68
+ violation[msg] if {
69
+ deny
70
+ input.tool.risk_level in ["high", "critical"]
71
+ not is_business_hours
72
+ msg := "High-risk tools are restricted to business hours (9 AM - 6 PM UTC, Monday-Friday). Contact admin for urgent requests."
73
+ }
74
+
75
+ # Metadata
76
+ metadata := {
77
+ "name": "business_hours_enforcement",
78
+ "description": "Restrict high-risk tools to business hours",
79
+ "version": "1.0.0",
80
+ "author": "Kubiya",
81
+ "tags": ["time_based", "security", "business_hours"]
82
+ }
@@ -0,0 +1,58 @@
1
+ # MCP Tool Allowlist Policy
2
+ # Only allow approved MCP tools to be executed
3
+
4
+ package kubiya.tool_enforcement
5
+
6
+ import future.keywords.if
7
+ import future.keywords.in
8
+
9
+ # Default deny
10
+ default allow = false
11
+
12
+ # Approved MCP tools (whitelist)
13
+ approved_mcp_tools := [
14
+ "mcp__github__list_repos",
15
+ "mcp__github__create_issue",
16
+ "mcp__github__get_issue",
17
+ "mcp__slack__send_message",
18
+ "mcp__slack__list_channels",
19
+ "mcp__jira__create_ticket",
20
+ "mcp__jira__update_ticket",
21
+ "mcp__aws__list_instances",
22
+ "mcp__aws__describe_instance",
23
+ ]
24
+
25
+ # Allow approved MCP tools
26
+ allow if {
27
+ input.tool.source == "mcp"
28
+ input.tool.name in approved_mcp_tools
29
+ }
30
+
31
+ # Allow non-MCP tools (governed by other policies)
32
+ allow if {
33
+ input.tool.source != "mcp"
34
+ input.user.email != ""
35
+ }
36
+
37
+ # Admins can use any MCP tool
38
+ allow if {
39
+ input.tool.source == "mcp"
40
+ input.user.roles[_] == "admin"
41
+ }
42
+
43
+ # Violation message
44
+ violation[msg] if {
45
+ input.tool.source == "mcp"
46
+ not input.tool.name in approved_mcp_tools
47
+ not input.user.roles[_] == "admin"
48
+ msg := sprintf("MCP tool '%s' is not in the approved list. Approved tools: %v. Contact admin to request access.", [input.tool.name, approved_mcp_tools])
49
+ }
50
+
51
+ # Metadata
52
+ metadata := {
53
+ "name": "mcp_tool_allowlist",
54
+ "description": "Whitelist of approved MCP tools",
55
+ "version": "1.0.0",
56
+ "author": "Kubiya",
57
+ "tags": ["mcp", "whitelist", "security"]
58
+ }