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,344 @@
|
|
|
1
|
+
"""End-to-end tests for tool enforcement in worker execution."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
from unittest.mock import Mock, AsyncMock, patch, MagicMock
|
|
5
|
+
from control_plane_api.worker.runtimes.base import RuntimeExecutionContext
|
|
6
|
+
from control_plane_api.worker.activities.runtime_activities import ActivityRuntimeExecuteInput
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.fixture
|
|
10
|
+
def mock_control_plane_client():
|
|
11
|
+
"""Mock control plane client."""
|
|
12
|
+
client = Mock()
|
|
13
|
+
client.publish_event = Mock()
|
|
14
|
+
client._api_key = "test-api-key"
|
|
15
|
+
client.cache_metadata = Mock()
|
|
16
|
+
return client
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@pytest.fixture
|
|
20
|
+
def mock_cancellation_manager():
|
|
21
|
+
"""Mock cancellation manager."""
|
|
22
|
+
manager = Mock()
|
|
23
|
+
manager.register = Mock()
|
|
24
|
+
manager.unregister = Mock()
|
|
25
|
+
return manager
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def enforcement_context_data():
|
|
30
|
+
"""Sample enforcement context data."""
|
|
31
|
+
return {
|
|
32
|
+
"user_email": "test@example.com",
|
|
33
|
+
"user_id": "user-123",
|
|
34
|
+
"user_roles": ["developer"],
|
|
35
|
+
"team_id": "team-456",
|
|
36
|
+
"team_name": "Test Team",
|
|
37
|
+
"environment": "test",
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@pytest.fixture
|
|
42
|
+
def runtime_context(enforcement_context_data):
|
|
43
|
+
"""Create RuntimeExecutionContext with enforcement fields."""
|
|
44
|
+
return RuntimeExecutionContext(
|
|
45
|
+
execution_id="exec-test-123",
|
|
46
|
+
agent_id="agent-test-456",
|
|
47
|
+
organization_id="org-test-789",
|
|
48
|
+
prompt="Test prompt",
|
|
49
|
+
system_prompt="You are a test assistant",
|
|
50
|
+
model_id="claude-3-sonnet-20240229",
|
|
51
|
+
# Enforcement fields
|
|
52
|
+
user_email=enforcement_context_data["user_email"],
|
|
53
|
+
user_id=enforcement_context_data["user_id"],
|
|
54
|
+
user_roles=enforcement_context_data["user_roles"],
|
|
55
|
+
team_id=enforcement_context_data["team_id"],
|
|
56
|
+
team_name=enforcement_context_data["team_name"],
|
|
57
|
+
environment=enforcement_context_data["environment"],
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@pytest.fixture
|
|
62
|
+
def activity_input(enforcement_context_data):
|
|
63
|
+
"""Create ActivityRuntimeExecuteInput with enforcement fields."""
|
|
64
|
+
return ActivityRuntimeExecuteInput(
|
|
65
|
+
execution_id="exec-test-123",
|
|
66
|
+
agent_id="agent-test-456",
|
|
67
|
+
organization_id="org-test-789",
|
|
68
|
+
prompt="Test prompt",
|
|
69
|
+
system_prompt="You are a test assistant",
|
|
70
|
+
model_id="claude-3-sonnet-20240229",
|
|
71
|
+
runtime_type="default",
|
|
72
|
+
# Enforcement fields
|
|
73
|
+
user_email=enforcement_context_data["user_email"],
|
|
74
|
+
user_id=enforcement_context_data["user_id"],
|
|
75
|
+
user_roles=enforcement_context_data["user_roles"],
|
|
76
|
+
team_id=enforcement_context_data["team_id"],
|
|
77
|
+
team_name=enforcement_context_data["team_name"],
|
|
78
|
+
environment=enforcement_context_data["environment"],
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class TestRuntimeExecutionContextEnforcement:
|
|
83
|
+
"""Test that RuntimeExecutionContext properly includes enforcement fields."""
|
|
84
|
+
|
|
85
|
+
def test_context_has_enforcement_fields(self, runtime_context):
|
|
86
|
+
"""Verify RuntimeExecutionContext includes all enforcement fields."""
|
|
87
|
+
assert hasattr(runtime_context, "user_email")
|
|
88
|
+
assert hasattr(runtime_context, "user_id")
|
|
89
|
+
assert hasattr(runtime_context, "user_roles")
|
|
90
|
+
assert hasattr(runtime_context, "team_id")
|
|
91
|
+
assert hasattr(runtime_context, "team_name")
|
|
92
|
+
assert hasattr(runtime_context, "environment")
|
|
93
|
+
|
|
94
|
+
assert runtime_context.user_email == "test@example.com"
|
|
95
|
+
assert runtime_context.user_id == "user-123"
|
|
96
|
+
assert runtime_context.user_roles == ["developer"]
|
|
97
|
+
assert runtime_context.team_id == "team-456"
|
|
98
|
+
assert runtime_context.team_name == "Test Team"
|
|
99
|
+
assert runtime_context.environment == "test"
|
|
100
|
+
|
|
101
|
+
def test_context_enforcement_fields_optional(self):
|
|
102
|
+
"""Verify enforcement fields are optional and have defaults."""
|
|
103
|
+
context = RuntimeExecutionContext(
|
|
104
|
+
execution_id="exec-123",
|
|
105
|
+
agent_id="agent-456",
|
|
106
|
+
organization_id="org-789",
|
|
107
|
+
prompt="Test",
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Should have default values
|
|
111
|
+
assert context.user_email is None
|
|
112
|
+
assert context.user_id is None
|
|
113
|
+
assert context.user_roles == []
|
|
114
|
+
assert context.team_id is None
|
|
115
|
+
assert context.team_name is None
|
|
116
|
+
assert context.environment == "production" # Default
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class TestActivityInputEnforcement:
|
|
120
|
+
"""Test that ActivityRuntimeExecuteInput properly includes enforcement fields."""
|
|
121
|
+
|
|
122
|
+
def test_activity_input_has_enforcement_fields(self, activity_input):
|
|
123
|
+
"""Verify ActivityRuntimeExecuteInput includes all enforcement fields."""
|
|
124
|
+
assert hasattr(activity_input, "user_email")
|
|
125
|
+
assert hasattr(activity_input, "user_id")
|
|
126
|
+
assert hasattr(activity_input, "user_roles")
|
|
127
|
+
assert hasattr(activity_input, "team_id")
|
|
128
|
+
assert hasattr(activity_input, "team_name")
|
|
129
|
+
assert hasattr(activity_input, "environment")
|
|
130
|
+
|
|
131
|
+
assert activity_input.user_email == "test@example.com"
|
|
132
|
+
assert activity_input.user_id == "user-123"
|
|
133
|
+
assert activity_input.user_roles == ["developer"]
|
|
134
|
+
assert activity_input.team_id == "team-456"
|
|
135
|
+
assert activity_input.team_name == "Test Team"
|
|
136
|
+
assert activity_input.environment == "test"
|
|
137
|
+
|
|
138
|
+
def test_activity_input_post_init_user_roles(self):
|
|
139
|
+
"""Verify __post_init__ initializes user_roles to empty list if None."""
|
|
140
|
+
input_data = ActivityRuntimeExecuteInput(
|
|
141
|
+
execution_id="exec-123",
|
|
142
|
+
agent_id="agent-456",
|
|
143
|
+
organization_id="org-789",
|
|
144
|
+
prompt="Test",
|
|
145
|
+
user_roles=None,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Should be initialized to empty list
|
|
149
|
+
assert input_data.user_roles == []
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class TestAgnoRuntimeEnforcementInitialization:
|
|
153
|
+
"""Test that Agno runtime properly initializes enforcement."""
|
|
154
|
+
|
|
155
|
+
def test_agno_runtime_initializes_enforcement_context(
|
|
156
|
+
self, runtime_context
|
|
157
|
+
):
|
|
158
|
+
"""Test that Agno runtime creates enforcement context from RuntimeExecutionContext."""
|
|
159
|
+
# Simulate what happens in the runtime - build enforcement context
|
|
160
|
+
enforcement_context = {
|
|
161
|
+
"organization_id": runtime_context.organization_id,
|
|
162
|
+
"user_email": runtime_context.user_email,
|
|
163
|
+
"user_id": runtime_context.user_id,
|
|
164
|
+
"user_roles": runtime_context.user_roles or [],
|
|
165
|
+
"team_id": runtime_context.team_id,
|
|
166
|
+
"team_name": runtime_context.team_name,
|
|
167
|
+
"agent_id": runtime_context.agent_id,
|
|
168
|
+
"environment": runtime_context.environment,
|
|
169
|
+
"model_id": runtime_context.model_id,
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
# Verify enforcement context has correct values
|
|
173
|
+
assert enforcement_context["user_email"] == "test@example.com"
|
|
174
|
+
assert enforcement_context["user_id"] == "user-123"
|
|
175
|
+
assert enforcement_context["user_roles"] == ["developer"]
|
|
176
|
+
assert enforcement_context["team_id"] == "team-456"
|
|
177
|
+
assert enforcement_context["environment"] == "test"
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class TestClaudeCodeRuntimeEnforcementInitialization:
|
|
181
|
+
"""Test that Claude Code runtime properly initializes enforcement."""
|
|
182
|
+
|
|
183
|
+
def test_claude_code_config_builds_enforcement_context(
|
|
184
|
+
self, runtime_context
|
|
185
|
+
):
|
|
186
|
+
"""Test that Claude Code config creates enforcement context."""
|
|
187
|
+
# Build enforcement context as it would be in config.py
|
|
188
|
+
enforcement_context = {
|
|
189
|
+
"organization_id": runtime_context.organization_id,
|
|
190
|
+
"user_email": runtime_context.user_email,
|
|
191
|
+
"user_id": runtime_context.user_id,
|
|
192
|
+
"user_roles": runtime_context.user_roles or [],
|
|
193
|
+
"team_id": runtime_context.team_id,
|
|
194
|
+
"team_name": runtime_context.team_name,
|
|
195
|
+
"agent_id": runtime_context.agent_id,
|
|
196
|
+
"environment": runtime_context.environment,
|
|
197
|
+
"model_id": runtime_context.model_id,
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
# Verify enforcement context has correct values
|
|
201
|
+
assert enforcement_context["user_email"] == "test@example.com"
|
|
202
|
+
assert enforcement_context["user_id"] == "user-123"
|
|
203
|
+
assert enforcement_context["user_roles"] == ["developer"]
|
|
204
|
+
assert enforcement_context["team_id"] == "team-456"
|
|
205
|
+
assert enforcement_context["environment"] == "test"
|
|
206
|
+
assert enforcement_context["agent_id"] == "agent-test-456"
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
class TestEnforcementDataFlow:
|
|
210
|
+
"""Test that enforcement data flows correctly through the system."""
|
|
211
|
+
|
|
212
|
+
def test_activity_to_runtime_context_mapping(self, activity_input):
|
|
213
|
+
"""Test that enforcement fields map from ActivityInput to RuntimeContext."""
|
|
214
|
+
# Simulate what happens in runtime_activities.py
|
|
215
|
+
context = RuntimeExecutionContext(
|
|
216
|
+
execution_id=activity_input.execution_id,
|
|
217
|
+
agent_id=activity_input.agent_id,
|
|
218
|
+
organization_id=activity_input.organization_id,
|
|
219
|
+
prompt=activity_input.prompt,
|
|
220
|
+
system_prompt=activity_input.system_prompt,
|
|
221
|
+
model_id=activity_input.model_id,
|
|
222
|
+
# Enforcement context
|
|
223
|
+
user_email=activity_input.user_email,
|
|
224
|
+
user_id=activity_input.user_id,
|
|
225
|
+
user_roles=activity_input.user_roles or [],
|
|
226
|
+
team_id=activity_input.team_id,
|
|
227
|
+
team_name=activity_input.team_name,
|
|
228
|
+
environment=activity_input.environment,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# Verify all enforcement fields transferred correctly
|
|
232
|
+
assert context.user_email == activity_input.user_email
|
|
233
|
+
assert context.user_id == activity_input.user_id
|
|
234
|
+
assert context.user_roles == activity_input.user_roles
|
|
235
|
+
assert context.team_id == activity_input.team_id
|
|
236
|
+
assert context.team_name == activity_input.team_name
|
|
237
|
+
assert context.environment == activity_input.environment
|
|
238
|
+
|
|
239
|
+
def test_runtime_context_to_enforcement_context(self, runtime_context):
|
|
240
|
+
"""Test building enforcement context from RuntimeExecutionContext."""
|
|
241
|
+
# Simulate what happens in runtime initialization
|
|
242
|
+
enforcement_context = {
|
|
243
|
+
"organization_id": runtime_context.organization_id,
|
|
244
|
+
"user_email": runtime_context.user_email,
|
|
245
|
+
"user_id": runtime_context.user_id,
|
|
246
|
+
"user_roles": runtime_context.user_roles or [],
|
|
247
|
+
"team_id": runtime_context.team_id,
|
|
248
|
+
"team_name": runtime_context.team_name,
|
|
249
|
+
"agent_id": runtime_context.agent_id,
|
|
250
|
+
"environment": runtime_context.environment,
|
|
251
|
+
"model_id": runtime_context.model_id,
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
# Verify enforcement context is complete
|
|
255
|
+
assert all(key in enforcement_context for key in [
|
|
256
|
+
"organization_id", "user_email", "user_id", "user_roles",
|
|
257
|
+
"team_id", "team_name", "agent_id", "environment"
|
|
258
|
+
])
|
|
259
|
+
|
|
260
|
+
# Verify values
|
|
261
|
+
assert enforcement_context["user_email"] == "test@example.com"
|
|
262
|
+
assert enforcement_context["user_roles"] == ["developer"]
|
|
263
|
+
assert enforcement_context["environment"] == "test"
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
class TestEnforcementEndToEnd:
|
|
267
|
+
"""End-to-end tests simulating full enforcement flow."""
|
|
268
|
+
|
|
269
|
+
def test_e2e_enforcement_service_creation(self, runtime_context):
|
|
270
|
+
"""Test that enforcement service can be created from runtime context."""
|
|
271
|
+
from control_plane_api.worker.services.tool_enforcement import ToolEnforcementService
|
|
272
|
+
|
|
273
|
+
# Simulate creating enforcement service
|
|
274
|
+
mock_enforcer = Mock()
|
|
275
|
+
enforcement_service = ToolEnforcementService(mock_enforcer)
|
|
276
|
+
|
|
277
|
+
# Verify service is created
|
|
278
|
+
assert enforcement_service is not None
|
|
279
|
+
assert enforcement_service.enabled is True
|
|
280
|
+
assert enforcement_service.enforcer == mock_enforcer
|
|
281
|
+
|
|
282
|
+
# Build enforcement context from runtime context
|
|
283
|
+
enforcement_context = {
|
|
284
|
+
"organization_id": runtime_context.organization_id,
|
|
285
|
+
"user_email": runtime_context.user_email,
|
|
286
|
+
"user_id": runtime_context.user_id,
|
|
287
|
+
"user_roles": runtime_context.user_roles or [],
|
|
288
|
+
"team_id": runtime_context.team_id,
|
|
289
|
+
"team_name": runtime_context.team_name,
|
|
290
|
+
"agent_id": runtime_context.agent_id,
|
|
291
|
+
"environment": runtime_context.environment,
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
# Build enforcement payload
|
|
295
|
+
payload = enforcement_service._build_enforcement_payload(
|
|
296
|
+
tool_name="Read",
|
|
297
|
+
tool_args={"file_path": "/tmp/test"},
|
|
298
|
+
context=enforcement_context
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
# Verify payload structure
|
|
302
|
+
assert payload["action"] == "tool_execution"
|
|
303
|
+
assert payload["tool"]["name"] == "Read"
|
|
304
|
+
assert payload["user"]["email"] == "test@example.com"
|
|
305
|
+
assert payload["organization"]["id"] == "org-test-789"
|
|
306
|
+
assert payload["execution"]["environment"] == "test"
|
|
307
|
+
|
|
308
|
+
def test_e2e_enforcement_flow_components(self):
|
|
309
|
+
"""Test that all enforcement components work together."""
|
|
310
|
+
from control_plane_api.worker.services.tool_enforcement import ToolEnforcementService
|
|
311
|
+
|
|
312
|
+
# Component 1: Enforcement service
|
|
313
|
+
mock_enforcer = AsyncMock()
|
|
314
|
+
service = ToolEnforcementService(mock_enforcer)
|
|
315
|
+
assert service.enabled
|
|
316
|
+
|
|
317
|
+
# Component 2: Enforcement context
|
|
318
|
+
context = {
|
|
319
|
+
"organization_id": "org-123",
|
|
320
|
+
"user_email": "test@example.com",
|
|
321
|
+
"user_roles": ["developer"],
|
|
322
|
+
"agent_id": "agent-456",
|
|
323
|
+
"environment": "production"
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
# Component 3: Tool information
|
|
327
|
+
tool_name = "Bash"
|
|
328
|
+
tool_args = {"command": "ls /tmp"}
|
|
329
|
+
|
|
330
|
+
# Component 4: Build payload
|
|
331
|
+
payload = service._build_enforcement_payload(tool_name, tool_args, context)
|
|
332
|
+
|
|
333
|
+
# Verify all components integrated correctly
|
|
334
|
+
assert payload["tool"]["name"] == tool_name
|
|
335
|
+
assert payload["tool"]["arguments"] == tool_args
|
|
336
|
+
assert payload["tool"]["source"] == "builtin"
|
|
337
|
+
assert payload["tool"]["category"] == "command_execution"
|
|
338
|
+
assert payload["tool"]["risk_level"] == "high"
|
|
339
|
+
assert payload["user"]["email"] == context["user_email"]
|
|
340
|
+
assert payload["organization"]["id"] == context["organization_id"]
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
if __name__ == "__main__":
|
|
344
|
+
pytest.main([__file__, "-v", "--tb=short"])
|