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.
- control_plane_api/LICENSE +676 -0
- control_plane_api/README.md +350 -0
- control_plane_api/__init__.py +4 -0
- control_plane_api/__version__.py +8 -0
- control_plane_api/alembic/README +1 -0
- control_plane_api/alembic/env.py +121 -0
- control_plane_api/alembic/script.py.mako +28 -0
- control_plane_api/alembic/versions/2613c65c3dbe_initial_database_setup.py +32 -0
- control_plane_api/alembic/versions/2df520d4927d_merge_heads.py +28 -0
- control_plane_api/alembic/versions/43abf98d6a01_add_paused_status_to_executions.py +73 -0
- control_plane_api/alembic/versions/6289854264cb_merge_multiple_heads.py +28 -0
- control_plane_api/alembic/versions/6a4d4dc3d8dc_generate_execution_transitions.py +50 -0
- control_plane_api/alembic/versions/87d11cf0a783_add_disconnected_status_to_worker_.py +44 -0
- control_plane_api/alembic/versions/add_ephemeral_queue_support.py +85 -0
- control_plane_api/alembic/versions/add_model_type_to_llm_models.py +31 -0
- control_plane_api/alembic/versions/add_plan_executions_table.py +114 -0
- control_plane_api/alembic/versions/add_trace_span_tables.py +154 -0
- control_plane_api/alembic/versions/add_user_info_to_traces.py +36 -0
- control_plane_api/alembic/versions/adjusting_foreign_keys.py +32 -0
- control_plane_api/alembic/versions/b4983d976db2_initial_tables.py +1128 -0
- control_plane_api/alembic/versions/d181a3b40e71_rename_custom_metadata_to_metadata_in_.py +50 -0
- control_plane_api/alembic/versions/df9117888e82_add_missing_columns.py +82 -0
- control_plane_api/alembic/versions/f25de6ad895a_missing_migrations.py +34 -0
- control_plane_api/alembic/versions/f71305fb69b9_fix_ephemeral_queue_deletion_foreign_key.py +54 -0
- control_plane_api/alembic/versions/mark_local_exec_queues_as_ephemeral.py +68 -0
- control_plane_api/alembic.ini +148 -0
- control_plane_api/api/index.py +12 -0
- control_plane_api/app/__init__.py +11 -0
- control_plane_api/app/activities/__init__.py +20 -0
- control_plane_api/app/activities/agent_activities.py +384 -0
- control_plane_api/app/activities/plan_generation_activities.py +499 -0
- control_plane_api/app/activities/team_activities.py +424 -0
- control_plane_api/app/activities/temporal_cloud_activities.py +588 -0
- control_plane_api/app/config/__init__.py +35 -0
- control_plane_api/app/config/api_config.py +469 -0
- control_plane_api/app/config/config_loader.py +224 -0
- control_plane_api/app/config/model_pricing.py +323 -0
- control_plane_api/app/config/storage_config.py +159 -0
- control_plane_api/app/config.py +115 -0
- control_plane_api/app/controllers/__init__.py +0 -0
- control_plane_api/app/controllers/execution_environment_controller.py +1315 -0
- control_plane_api/app/database.py +135 -0
- control_plane_api/app/exceptions.py +408 -0
- control_plane_api/app/lib/__init__.py +11 -0
- control_plane_api/app/lib/environment.py +65 -0
- control_plane_api/app/lib/event_bus/__init__.py +17 -0
- control_plane_api/app/lib/event_bus/base.py +136 -0
- control_plane_api/app/lib/event_bus/manager.py +335 -0
- control_plane_api/app/lib/event_bus/providers/__init__.py +6 -0
- control_plane_api/app/lib/event_bus/providers/http_provider.py +166 -0
- control_plane_api/app/lib/event_bus/providers/nats_provider.py +324 -0
- control_plane_api/app/lib/event_bus/providers/redis_provider.py +233 -0
- control_plane_api/app/lib/event_bus/providers/websocket_provider.py +497 -0
- control_plane_api/app/lib/job_executor.py +330 -0
- control_plane_api/app/lib/kubiya_client.py +293 -0
- control_plane_api/app/lib/litellm_pricing.py +166 -0
- control_plane_api/app/lib/mcp_validation.py +163 -0
- control_plane_api/app/lib/nats/__init__.py +13 -0
- control_plane_api/app/lib/nats/credentials_manager.py +288 -0
- control_plane_api/app/lib/nats/listener.py +374 -0
- control_plane_api/app/lib/planning_prompt_builder.py +153 -0
- control_plane_api/app/lib/planning_tools/__init__.py +41 -0
- control_plane_api/app/lib/planning_tools/agents.py +409 -0
- control_plane_api/app/lib/planning_tools/agno_toolkit.py +836 -0
- control_plane_api/app/lib/planning_tools/base.py +119 -0
- control_plane_api/app/lib/planning_tools/cognitive_memory_tools.py +403 -0
- control_plane_api/app/lib/planning_tools/context_graph_tools.py +545 -0
- control_plane_api/app/lib/planning_tools/environments.py +218 -0
- control_plane_api/app/lib/planning_tools/knowledge.py +204 -0
- control_plane_api/app/lib/planning_tools/models.py +93 -0
- control_plane_api/app/lib/planning_tools/planning_service.py +646 -0
- control_plane_api/app/lib/planning_tools/resources.py +242 -0
- control_plane_api/app/lib/planning_tools/teams.py +334 -0
- control_plane_api/app/lib/policy_enforcer_client.py +1016 -0
- control_plane_api/app/lib/redis_client.py +803 -0
- control_plane_api/app/lib/sqlalchemy_utils.py +486 -0
- control_plane_api/app/lib/state_transition_tools/__init__.py +7 -0
- control_plane_api/app/lib/state_transition_tools/execution_context.py +388 -0
- control_plane_api/app/lib/storage/__init__.py +20 -0
- control_plane_api/app/lib/storage/base_provider.py +274 -0
- control_plane_api/app/lib/storage/provider_factory.py +157 -0
- control_plane_api/app/lib/storage/vercel_blob_provider.py +468 -0
- control_plane_api/app/lib/supabase.py +71 -0
- control_plane_api/app/lib/supabase_utils.py +138 -0
- control_plane_api/app/lib/task_planning/__init__.py +138 -0
- control_plane_api/app/lib/task_planning/agent_factory.py +308 -0
- control_plane_api/app/lib/task_planning/agents.py +389 -0
- control_plane_api/app/lib/task_planning/cache.py +218 -0
- control_plane_api/app/lib/task_planning/entity_resolver.py +273 -0
- control_plane_api/app/lib/task_planning/helpers.py +293 -0
- control_plane_api/app/lib/task_planning/hooks.py +474 -0
- control_plane_api/app/lib/task_planning/models.py +503 -0
- control_plane_api/app/lib/task_planning/plan_validator.py +166 -0
- control_plane_api/app/lib/task_planning/planning_workflow.py +2911 -0
- control_plane_api/app/lib/task_planning/runner.py +656 -0
- control_plane_api/app/lib/task_planning/streaming_hook.py +213 -0
- control_plane_api/app/lib/task_planning/workflow.py +424 -0
- control_plane_api/app/lib/templating/__init__.py +88 -0
- control_plane_api/app/lib/templating/compiler.py +278 -0
- control_plane_api/app/lib/templating/engine.py +178 -0
- control_plane_api/app/lib/templating/parsers/__init__.py +29 -0
- control_plane_api/app/lib/templating/parsers/base.py +96 -0
- control_plane_api/app/lib/templating/parsers/env.py +85 -0
- control_plane_api/app/lib/templating/parsers/graph.py +112 -0
- control_plane_api/app/lib/templating/parsers/secret.py +87 -0
- control_plane_api/app/lib/templating/parsers/simple.py +81 -0
- control_plane_api/app/lib/templating/resolver.py +366 -0
- control_plane_api/app/lib/templating/types.py +214 -0
- control_plane_api/app/lib/templating/validator.py +201 -0
- control_plane_api/app/lib/temporal_client.py +232 -0
- control_plane_api/app/lib/temporal_credentials_cache.py +178 -0
- control_plane_api/app/lib/temporal_credentials_service.py +203 -0
- control_plane_api/app/lib/validation/__init__.py +24 -0
- control_plane_api/app/lib/validation/runtime_validation.py +388 -0
- control_plane_api/app/main.py +531 -0
- control_plane_api/app/middleware/__init__.py +10 -0
- control_plane_api/app/middleware/auth.py +645 -0
- control_plane_api/app/middleware/exception_handler.py +267 -0
- control_plane_api/app/middleware/prometheus_middleware.py +173 -0
- control_plane_api/app/middleware/rate_limiting.py +384 -0
- control_plane_api/app/middleware/request_id.py +202 -0
- control_plane_api/app/models/__init__.py +40 -0
- control_plane_api/app/models/agent.py +90 -0
- control_plane_api/app/models/analytics.py +206 -0
- control_plane_api/app/models/associations.py +107 -0
- control_plane_api/app/models/auth_user.py +73 -0
- control_plane_api/app/models/context.py +161 -0
- control_plane_api/app/models/custom_integration.py +99 -0
- control_plane_api/app/models/environment.py +64 -0
- control_plane_api/app/models/execution.py +125 -0
- control_plane_api/app/models/execution_transition.py +50 -0
- control_plane_api/app/models/job.py +159 -0
- control_plane_api/app/models/llm_model.py +78 -0
- control_plane_api/app/models/orchestration.py +66 -0
- control_plane_api/app/models/plan_execution.py +102 -0
- control_plane_api/app/models/presence.py +49 -0
- control_plane_api/app/models/project.py +61 -0
- control_plane_api/app/models/project_management.py +85 -0
- control_plane_api/app/models/session.py +29 -0
- control_plane_api/app/models/skill.py +155 -0
- control_plane_api/app/models/system_tables.py +43 -0
- control_plane_api/app/models/task_planning.py +372 -0
- control_plane_api/app/models/team.py +86 -0
- control_plane_api/app/models/trace.py +257 -0
- control_plane_api/app/models/user_profile.py +54 -0
- control_plane_api/app/models/worker.py +221 -0
- control_plane_api/app/models/workflow.py +161 -0
- control_plane_api/app/models/workspace.py +50 -0
- control_plane_api/app/observability/__init__.py +177 -0
- control_plane_api/app/observability/context_logging.py +475 -0
- control_plane_api/app/observability/decorators.py +337 -0
- control_plane_api/app/observability/local_span_processor.py +702 -0
- control_plane_api/app/observability/metrics.py +303 -0
- control_plane_api/app/observability/middleware.py +246 -0
- control_plane_api/app/observability/optional.py +115 -0
- control_plane_api/app/observability/tracing.py +382 -0
- control_plane_api/app/policies/README.md +149 -0
- control_plane_api/app/policies/approved_users.rego +62 -0
- control_plane_api/app/policies/business_hours.rego +51 -0
- control_plane_api/app/policies/rate_limiting.rego +100 -0
- control_plane_api/app/policies/tool_enforcement/README.md +336 -0
- control_plane_api/app/policies/tool_enforcement/bash_command_validation.rego +71 -0
- control_plane_api/app/policies/tool_enforcement/business_hours_enforcement.rego +82 -0
- control_plane_api/app/policies/tool_enforcement/mcp_tool_allowlist.rego +58 -0
- control_plane_api/app/policies/tool_enforcement/production_safeguards.rego +80 -0
- control_plane_api/app/policies/tool_enforcement/role_based_tool_access.rego +44 -0
- control_plane_api/app/policies/tool_restrictions.rego +86 -0
- control_plane_api/app/routers/__init__.py +4 -0
- control_plane_api/app/routers/agents.py +382 -0
- control_plane_api/app/routers/agents_v2.py +1598 -0
- control_plane_api/app/routers/analytics.py +1310 -0
- control_plane_api/app/routers/auth.py +59 -0
- control_plane_api/app/routers/client_config.py +57 -0
- control_plane_api/app/routers/context_graph.py +561 -0
- control_plane_api/app/routers/context_manager.py +577 -0
- control_plane_api/app/routers/custom_integrations.py +490 -0
- control_plane_api/app/routers/enforcer.py +132 -0
- control_plane_api/app/routers/environment_context.py +252 -0
- control_plane_api/app/routers/environments.py +761 -0
- control_plane_api/app/routers/execution_environment.py +847 -0
- control_plane_api/app/routers/executions/__init__.py +28 -0
- control_plane_api/app/routers/executions/router.py +286 -0
- control_plane_api/app/routers/executions/services/__init__.py +22 -0
- control_plane_api/app/routers/executions/services/demo_worker_health.py +156 -0
- control_plane_api/app/routers/executions/services/status_service.py +420 -0
- control_plane_api/app/routers/executions/services/test_worker_health.py +480 -0
- control_plane_api/app/routers/executions/services/worker_health.py +514 -0
- control_plane_api/app/routers/executions/streaming/__init__.py +22 -0
- control_plane_api/app/routers/executions/streaming/deduplication.py +352 -0
- control_plane_api/app/routers/executions/streaming/event_buffer.py +353 -0
- control_plane_api/app/routers/executions/streaming/event_formatter.py +964 -0
- control_plane_api/app/routers/executions/streaming/history_loader.py +588 -0
- control_plane_api/app/routers/executions/streaming/live_source.py +693 -0
- control_plane_api/app/routers/executions/streaming/streamer.py +849 -0
- control_plane_api/app/routers/executions.py +4888 -0
- control_plane_api/app/routers/health.py +165 -0
- control_plane_api/app/routers/health_v2.py +394 -0
- control_plane_api/app/routers/integration_templates.py +496 -0
- control_plane_api/app/routers/integrations.py +287 -0
- control_plane_api/app/routers/jobs.py +1809 -0
- control_plane_api/app/routers/metrics.py +517 -0
- control_plane_api/app/routers/models.py +82 -0
- control_plane_api/app/routers/models_v2.py +628 -0
- control_plane_api/app/routers/plan_executions.py +1481 -0
- control_plane_api/app/routers/plan_generation_async.py +304 -0
- control_plane_api/app/routers/policies.py +669 -0
- control_plane_api/app/routers/presence.py +234 -0
- control_plane_api/app/routers/projects.py +987 -0
- control_plane_api/app/routers/runners.py +379 -0
- control_plane_api/app/routers/runtimes.py +172 -0
- control_plane_api/app/routers/secrets.py +171 -0
- control_plane_api/app/routers/skills.py +1010 -0
- control_plane_api/app/routers/skills_definitions.py +140 -0
- control_plane_api/app/routers/storage.py +456 -0
- control_plane_api/app/routers/task_planning.py +611 -0
- control_plane_api/app/routers/task_queues.py +650 -0
- control_plane_api/app/routers/team_context.py +274 -0
- control_plane_api/app/routers/teams.py +1747 -0
- control_plane_api/app/routers/templates.py +248 -0
- control_plane_api/app/routers/traces.py +571 -0
- control_plane_api/app/routers/websocket_client.py +479 -0
- control_plane_api/app/routers/websocket_executions_status.py +437 -0
- control_plane_api/app/routers/websocket_gateway.py +323 -0
- control_plane_api/app/routers/websocket_traces.py +576 -0
- control_plane_api/app/routers/worker_queues.py +2555 -0
- control_plane_api/app/routers/worker_websocket.py +419 -0
- control_plane_api/app/routers/workers.py +1004 -0
- control_plane_api/app/routers/workflows.py +204 -0
- control_plane_api/app/runtimes/__init__.py +6 -0
- control_plane_api/app/runtimes/validation.py +344 -0
- control_plane_api/app/schemas/__init__.py +1 -0
- control_plane_api/app/schemas/job_schemas.py +302 -0
- control_plane_api/app/schemas/mcp_schemas.py +311 -0
- control_plane_api/app/schemas/template_schemas.py +133 -0
- control_plane_api/app/schemas/trace_schemas.py +168 -0
- control_plane_api/app/schemas/worker_queue_observability_schemas.py +165 -0
- control_plane_api/app/services/__init__.py +1 -0
- control_plane_api/app/services/agno_planning_strategy.py +233 -0
- control_plane_api/app/services/agno_service.py +838 -0
- control_plane_api/app/services/claude_code_planning_service.py +203 -0
- control_plane_api/app/services/context_graph_client.py +224 -0
- control_plane_api/app/services/custom_integration_service.py +415 -0
- control_plane_api/app/services/integration_resolution_service.py +345 -0
- control_plane_api/app/services/litellm_service.py +394 -0
- control_plane_api/app/services/plan_generator.py +79 -0
- control_plane_api/app/services/planning_strategy.py +66 -0
- control_plane_api/app/services/planning_strategy_factory.py +118 -0
- control_plane_api/app/services/policy_service.py +615 -0
- control_plane_api/app/services/state_transition_service.py +755 -0
- control_plane_api/app/services/storage_service.py +593 -0
- control_plane_api/app/services/temporal_cloud_provisioning.py +150 -0
- control_plane_api/app/services/toolsets/context_graph_skill.py +432 -0
- control_plane_api/app/services/trace_retention.py +354 -0
- control_plane_api/app/services/worker_queue_metrics_service.py +190 -0
- control_plane_api/app/services/workflow_cancellation_manager.py +135 -0
- control_plane_api/app/services/workflow_operations_service.py +611 -0
- control_plane_api/app/skills/__init__.py +100 -0
- control_plane_api/app/skills/base.py +239 -0
- control_plane_api/app/skills/builtin/__init__.py +37 -0
- control_plane_api/app/skills/builtin/agent_communication/__init__.py +8 -0
- control_plane_api/app/skills/builtin/agent_communication/skill.py +246 -0
- control_plane_api/app/skills/builtin/code_ingestion/__init__.py +4 -0
- control_plane_api/app/skills/builtin/code_ingestion/skill.py +267 -0
- control_plane_api/app/skills/builtin/cognitive_memory/__init__.py +4 -0
- control_plane_api/app/skills/builtin/cognitive_memory/skill.py +174 -0
- control_plane_api/app/skills/builtin/contextual_awareness/__init__.py +4 -0
- control_plane_api/app/skills/builtin/contextual_awareness/skill.py +387 -0
- control_plane_api/app/skills/builtin/data_visualization/__init__.py +4 -0
- control_plane_api/app/skills/builtin/data_visualization/skill.py +154 -0
- control_plane_api/app/skills/builtin/docker/__init__.py +4 -0
- control_plane_api/app/skills/builtin/docker/skill.py +104 -0
- control_plane_api/app/skills/builtin/file_generation/__init__.py +4 -0
- control_plane_api/app/skills/builtin/file_generation/skill.py +94 -0
- control_plane_api/app/skills/builtin/file_system/__init__.py +4 -0
- control_plane_api/app/skills/builtin/file_system/skill.py +110 -0
- control_plane_api/app/skills/builtin/knowledge_api/__init__.py +5 -0
- control_plane_api/app/skills/builtin/knowledge_api/skill.py +124 -0
- control_plane_api/app/skills/builtin/python/__init__.py +4 -0
- control_plane_api/app/skills/builtin/python/skill.py +92 -0
- control_plane_api/app/skills/builtin/remote_filesystem/__init__.py +5 -0
- control_plane_api/app/skills/builtin/remote_filesystem/skill.py +170 -0
- control_plane_api/app/skills/builtin/shell/__init__.py +4 -0
- control_plane_api/app/skills/builtin/shell/skill.py +161 -0
- control_plane_api/app/skills/builtin/slack/__init__.py +3 -0
- control_plane_api/app/skills/builtin/slack/skill.py +302 -0
- control_plane_api/app/skills/builtin/workflow_executor/__init__.py +4 -0
- control_plane_api/app/skills/builtin/workflow_executor/skill.py +469 -0
- control_plane_api/app/skills/business_intelligence.py +189 -0
- control_plane_api/app/skills/config.py +63 -0
- control_plane_api/app/skills/loaders/__init__.py +14 -0
- control_plane_api/app/skills/loaders/base.py +73 -0
- control_plane_api/app/skills/loaders/filesystem_loader.py +199 -0
- control_plane_api/app/skills/registry.py +125 -0
- control_plane_api/app/utils/helpers.py +12 -0
- control_plane_api/app/utils/workflow_executor.py +354 -0
- control_plane_api/app/workflows/__init__.py +11 -0
- control_plane_api/app/workflows/agent_execution.py +520 -0
- control_plane_api/app/workflows/agent_execution_with_skills.py +223 -0
- control_plane_api/app/workflows/namespace_provisioning.py +326 -0
- control_plane_api/app/workflows/plan_generation.py +254 -0
- control_plane_api/app/workflows/team_execution.py +442 -0
- control_plane_api/scripts/seed_models.py +240 -0
- control_plane_api/scripts/validate_existing_tool_names.py +492 -0
- control_plane_api/shared/__init__.py +8 -0
- control_plane_api/shared/version.py +17 -0
- control_plane_api/test_deduplication.py +274 -0
- control_plane_api/test_executor_deduplication_e2e.py +309 -0
- control_plane_api/test_job_execution_e2e.py +283 -0
- control_plane_api/test_real_integration.py +193 -0
- control_plane_api/version.py +38 -0
- control_plane_api/worker/__init__.py +0 -0
- control_plane_api/worker/activities/__init__.py +0 -0
- control_plane_api/worker/activities/agent_activities.py +1585 -0
- control_plane_api/worker/activities/approval_activities.py +234 -0
- control_plane_api/worker/activities/job_activities.py +199 -0
- control_plane_api/worker/activities/runtime_activities.py +1167 -0
- control_plane_api/worker/activities/skill_activities.py +282 -0
- control_plane_api/worker/activities/team_activities.py +479 -0
- control_plane_api/worker/agent_runtime_server.py +370 -0
- control_plane_api/worker/binary_manager.py +333 -0
- control_plane_api/worker/config/__init__.py +31 -0
- control_plane_api/worker/config/worker_config.py +273 -0
- control_plane_api/worker/control_plane_client.py +1491 -0
- control_plane_api/worker/examples/analytics_integration_example.py +362 -0
- control_plane_api/worker/health_monitor.py +159 -0
- control_plane_api/worker/metrics.py +237 -0
- control_plane_api/worker/models/__init__.py +1 -0
- control_plane_api/worker/models/error_events.py +105 -0
- control_plane_api/worker/models/inputs.py +89 -0
- control_plane_api/worker/runtimes/__init__.py +35 -0
- control_plane_api/worker/runtimes/agent_runtime/runtime.py +485 -0
- control_plane_api/worker/runtimes/agno/__init__.py +34 -0
- control_plane_api/worker/runtimes/agno/config.py +248 -0
- control_plane_api/worker/runtimes/agno/hooks.py +385 -0
- control_plane_api/worker/runtimes/agno/mcp_builder.py +195 -0
- control_plane_api/worker/runtimes/agno/runtime.py +1063 -0
- control_plane_api/worker/runtimes/agno/utils.py +163 -0
- control_plane_api/worker/runtimes/base.py +979 -0
- control_plane_api/worker/runtimes/claude_code/__init__.py +38 -0
- control_plane_api/worker/runtimes/claude_code/cleanup.py +184 -0
- control_plane_api/worker/runtimes/claude_code/client_pool.py +529 -0
- control_plane_api/worker/runtimes/claude_code/config.py +829 -0
- control_plane_api/worker/runtimes/claude_code/hooks.py +482 -0
- control_plane_api/worker/runtimes/claude_code/litellm_proxy.py +1702 -0
- control_plane_api/worker/runtimes/claude_code/mcp_builder.py +467 -0
- control_plane_api/worker/runtimes/claude_code/mcp_discovery.py +558 -0
- control_plane_api/worker/runtimes/claude_code/runtime.py +1546 -0
- control_plane_api/worker/runtimes/claude_code/tool_mapper.py +403 -0
- control_plane_api/worker/runtimes/claude_code/utils.py +149 -0
- control_plane_api/worker/runtimes/factory.py +173 -0
- control_plane_api/worker/runtimes/model_utils.py +107 -0
- control_plane_api/worker/runtimes/validation.py +93 -0
- control_plane_api/worker/services/__init__.py +1 -0
- control_plane_api/worker/services/agent_communication_tools.py +908 -0
- control_plane_api/worker/services/agent_executor.py +485 -0
- control_plane_api/worker/services/agent_executor_v2.py +793 -0
- control_plane_api/worker/services/analytics_collector.py +457 -0
- control_plane_api/worker/services/analytics_service.py +464 -0
- control_plane_api/worker/services/approval_tools.py +310 -0
- control_plane_api/worker/services/approval_tools_agno.py +207 -0
- control_plane_api/worker/services/cancellation_manager.py +177 -0
- control_plane_api/worker/services/code_ingestion_tools.py +465 -0
- control_plane_api/worker/services/contextual_awareness_tools.py +405 -0
- control_plane_api/worker/services/data_visualization.py +834 -0
- control_plane_api/worker/services/event_publisher.py +531 -0
- control_plane_api/worker/services/jira_tools.py +257 -0
- control_plane_api/worker/services/remote_filesystem_tools.py +498 -0
- control_plane_api/worker/services/runtime_analytics.py +328 -0
- control_plane_api/worker/services/session_service.py +365 -0
- control_plane_api/worker/services/skill_context_enhancement.py +181 -0
- control_plane_api/worker/services/skill_factory.py +471 -0
- control_plane_api/worker/services/system_prompt_enhancement.py +410 -0
- control_plane_api/worker/services/team_executor.py +715 -0
- control_plane_api/worker/services/team_executor_v2.py +1866 -0
- control_plane_api/worker/services/tool_enforcement.py +254 -0
- control_plane_api/worker/services/workflow_executor/__init__.py +52 -0
- control_plane_api/worker/services/workflow_executor/event_processor.py +287 -0
- control_plane_api/worker/services/workflow_executor/event_publisher.py +210 -0
- control_plane_api/worker/services/workflow_executor/executors/__init__.py +15 -0
- control_plane_api/worker/services/workflow_executor/executors/base.py +270 -0
- control_plane_api/worker/services/workflow_executor/executors/json_executor.py +50 -0
- control_plane_api/worker/services/workflow_executor/executors/python_executor.py +50 -0
- control_plane_api/worker/services/workflow_executor/models.py +142 -0
- control_plane_api/worker/services/workflow_executor_tools.py +1748 -0
- control_plane_api/worker/skills/__init__.py +12 -0
- control_plane_api/worker/skills/builtin/context_graph_search/README.md +213 -0
- control_plane_api/worker/skills/builtin/context_graph_search/__init__.py +5 -0
- control_plane_api/worker/skills/builtin/context_graph_search/agno_impl.py +808 -0
- control_plane_api/worker/skills/builtin/context_graph_search/skill.yaml +67 -0
- control_plane_api/worker/skills/builtin/contextual_awareness/__init__.py +4 -0
- control_plane_api/worker/skills/builtin/contextual_awareness/agno_impl.py +62 -0
- control_plane_api/worker/skills/builtin/data_visualization/agno_impl.py +18 -0
- control_plane_api/worker/skills/builtin/data_visualization/skill.yaml +84 -0
- control_plane_api/worker/skills/builtin/docker/agno_impl.py +65 -0
- control_plane_api/worker/skills/builtin/docker/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/file_generation/agno_impl.py +47 -0
- control_plane_api/worker/skills/builtin/file_generation/skill.yaml +64 -0
- control_plane_api/worker/skills/builtin/file_system/agno_impl.py +32 -0
- control_plane_api/worker/skills/builtin/file_system/skill.yaml +54 -0
- control_plane_api/worker/skills/builtin/knowledge_api/__init__.py +4 -0
- control_plane_api/worker/skills/builtin/knowledge_api/agno_impl.py +50 -0
- control_plane_api/worker/skills/builtin/knowledge_api/skill.yaml +66 -0
- control_plane_api/worker/skills/builtin/python/agno_impl.py +25 -0
- control_plane_api/worker/skills/builtin/python/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/schema_fix_mixin.py +260 -0
- control_plane_api/worker/skills/builtin/shell/agno_impl.py +31 -0
- control_plane_api/worker/skills/builtin/shell/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/slack/__init__.py +3 -0
- control_plane_api/worker/skills/builtin/slack/agno_impl.py +1282 -0
- control_plane_api/worker/skills/builtin/slack/skill.yaml +276 -0
- control_plane_api/worker/skills/builtin/workflow_executor/agno_impl.py +62 -0
- control_plane_api/worker/skills/builtin/workflow_executor/skill.yaml +79 -0
- control_plane_api/worker/skills/loaders/__init__.py +5 -0
- control_plane_api/worker/skills/loaders/base.py +23 -0
- control_plane_api/worker/skills/loaders/filesystem_loader.py +357 -0
- control_plane_api/worker/skills/registry.py +208 -0
- control_plane_api/worker/tests/__init__.py +1 -0
- control_plane_api/worker/tests/conftest.py +12 -0
- control_plane_api/worker/tests/e2e/__init__.py +0 -0
- control_plane_api/worker/tests/e2e/test_context_graph_real_api.py +338 -0
- control_plane_api/worker/tests/e2e/test_context_graph_templates_e2e.py +523 -0
- control_plane_api/worker/tests/e2e/test_enforcement_e2e.py +344 -0
- control_plane_api/worker/tests/e2e/test_execution_flow.py +571 -0
- control_plane_api/worker/tests/e2e/test_single_execution_mode.py +656 -0
- control_plane_api/worker/tests/integration/__init__.py +0 -0
- control_plane_api/worker/tests/integration/test_builtin_skills_fixes.py +245 -0
- control_plane_api/worker/tests/integration/test_context_graph_search_integration.py +365 -0
- control_plane_api/worker/tests/integration/test_control_plane_integration.py +308 -0
- control_plane_api/worker/tests/integration/test_hook_enforcement_integration.py +579 -0
- control_plane_api/worker/tests/integration/test_scheduled_job_workflow.py +237 -0
- control_plane_api/worker/tests/integration/test_system_prompt_enhancement_integration.py +343 -0
- control_plane_api/worker/tests/unit/__init__.py +0 -0
- control_plane_api/worker/tests/unit/test_builtin_skill_autoload.py +396 -0
- control_plane_api/worker/tests/unit/test_context_graph_search.py +450 -0
- control_plane_api/worker/tests/unit/test_context_graph_templates.py +403 -0
- control_plane_api/worker/tests/unit/test_control_plane_client.py +401 -0
- control_plane_api/worker/tests/unit/test_control_plane_client_jobs.py +345 -0
- control_plane_api/worker/tests/unit/test_job_activities.py +353 -0
- control_plane_api/worker/tests/unit/test_skill_context_enhancement.py +321 -0
- control_plane_api/worker/tests/unit/test_system_prompt_enhancement.py +415 -0
- control_plane_api/worker/tests/unit/test_tool_enforcement.py +324 -0
- control_plane_api/worker/utils/__init__.py +1 -0
- control_plane_api/worker/utils/chunk_batcher.py +330 -0
- control_plane_api/worker/utils/environment.py +65 -0
- control_plane_api/worker/utils/error_publisher.py +260 -0
- control_plane_api/worker/utils/event_batcher.py +256 -0
- control_plane_api/worker/utils/logging_config.py +335 -0
- control_plane_api/worker/utils/logging_helper.py +326 -0
- control_plane_api/worker/utils/parameter_validator.py +120 -0
- control_plane_api/worker/utils/retry_utils.py +60 -0
- control_plane_api/worker/utils/streaming_utils.py +665 -0
- control_plane_api/worker/utils/tool_validation.py +332 -0
- control_plane_api/worker/utils/workspace_manager.py +163 -0
- control_plane_api/worker/websocket_client.py +393 -0
- control_plane_api/worker/worker.py +1297 -0
- control_plane_api/worker/workflows/__init__.py +0 -0
- control_plane_api/worker/workflows/agent_execution.py +909 -0
- control_plane_api/worker/workflows/scheduled_job_wrapper.py +332 -0
- control_plane_api/worker/workflows/team_execution.py +611 -0
- kubiya_control_plane_api-0.9.15.dist-info/METADATA +354 -0
- kubiya_control_plane_api-0.9.15.dist-info/RECORD +479 -0
- kubiya_control_plane_api-0.9.15.dist-info/WHEEL +5 -0
- kubiya_control_plane_api-0.9.15.dist-info/entry_points.txt +5 -0
- kubiya_control_plane_api-0.9.15.dist-info/licenses/LICENSE +676 -0
- kubiya_control_plane_api-0.9.15.dist-info/top_level.txt +3 -0
- scripts/__init__.py +1 -0
- scripts/migrations.py +39 -0
- scripts/seed_worker_queues.py +128 -0
- scripts/setup_agent_runtime.py +142 -0
- worker_internal/__init__.py +1 -0
- worker_internal/planner/__init__.py +1 -0
- worker_internal/planner/activities.py +1499 -0
- worker_internal/planner/agent_tools.py +197 -0
- worker_internal/planner/event_models.py +148 -0
- worker_internal/planner/event_publisher.py +67 -0
- worker_internal/planner/models.py +199 -0
- worker_internal/planner/retry_logic.py +134 -0
- worker_internal/planner/worker.py +300 -0
- 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
|
+
}
|