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,415 @@
|
|
|
1
|
+
"""Unit tests for system prompt enhancement."""
|
|
2
|
+
import pytest
|
|
3
|
+
import os
|
|
4
|
+
from unittest.mock import patch
|
|
5
|
+
from control_plane_api.worker.services.system_prompt_enhancement import (
|
|
6
|
+
SystemPromptBuilder,
|
|
7
|
+
TodoListEnhancement,
|
|
8
|
+
MemoryToolsEnhancement,
|
|
9
|
+
RuntimeType,
|
|
10
|
+
create_default_prompt_builder,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TestTodoListEnhancement:
|
|
15
|
+
"""Test TodoListEnhancement."""
|
|
16
|
+
|
|
17
|
+
def test_applies_only_to_claude_code(self):
|
|
18
|
+
"""Test that enhancement only applies to claude_code runtime."""
|
|
19
|
+
enhancement = TodoListEnhancement()
|
|
20
|
+
|
|
21
|
+
assert enhancement.applies_to_runtime("claude_code")
|
|
22
|
+
assert not enhancement.applies_to_runtime("agno")
|
|
23
|
+
|
|
24
|
+
def test_name_property(self):
|
|
25
|
+
"""Test that enhancement has correct name."""
|
|
26
|
+
enhancement = TodoListEnhancement()
|
|
27
|
+
assert enhancement.name == "todo_list_instruction"
|
|
28
|
+
|
|
29
|
+
def test_enhance_empty_prompt(self):
|
|
30
|
+
"""Test enhancing an empty base prompt."""
|
|
31
|
+
enhancement = TodoListEnhancement()
|
|
32
|
+
result = enhancement.enhance(None)
|
|
33
|
+
|
|
34
|
+
assert "TODO list" in result
|
|
35
|
+
assert "multi step tasks" in result
|
|
36
|
+
assert "Task Management" in result
|
|
37
|
+
assert not result.startswith("\n") # Should strip leading newlines for empty prompt
|
|
38
|
+
|
|
39
|
+
def test_enhance_existing_prompt(self):
|
|
40
|
+
"""Test enhancing an existing prompt."""
|
|
41
|
+
enhancement = TodoListEnhancement()
|
|
42
|
+
base = "You are a helpful assistant."
|
|
43
|
+
result = enhancement.enhance(base)
|
|
44
|
+
|
|
45
|
+
assert base in result
|
|
46
|
+
assert "TODO list" in result
|
|
47
|
+
assert "multi step tasks" in result
|
|
48
|
+
assert len(result) > len(base)
|
|
49
|
+
|
|
50
|
+
def test_enhancement_preserves_base_prompt(self):
|
|
51
|
+
"""Test that enhancement doesn't modify the base prompt."""
|
|
52
|
+
enhancement = TodoListEnhancement()
|
|
53
|
+
base = "You are a coding expert. Follow best practices."
|
|
54
|
+
result = enhancement.enhance(base)
|
|
55
|
+
|
|
56
|
+
# Base prompt should be unchanged
|
|
57
|
+
assert result.startswith(base)
|
|
58
|
+
# Enhancement should be appended
|
|
59
|
+
assert "TODO list" in result[len(base):]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class TestMemoryToolsEnhancement:
|
|
63
|
+
"""Test MemoryToolsEnhancement."""
|
|
64
|
+
|
|
65
|
+
def test_applies_to_all_runtimes(self):
|
|
66
|
+
"""Test that enhancement applies to all runtimes."""
|
|
67
|
+
enhancement = MemoryToolsEnhancement()
|
|
68
|
+
|
|
69
|
+
assert enhancement.applies_to_runtime("claude_code")
|
|
70
|
+
assert enhancement.applies_to_runtime("agno")
|
|
71
|
+
assert enhancement.applies_to_runtime("custom_runtime")
|
|
72
|
+
|
|
73
|
+
def test_name_property(self):
|
|
74
|
+
"""Test that enhancement has correct name."""
|
|
75
|
+
enhancement = MemoryToolsEnhancement()
|
|
76
|
+
assert enhancement.name == "memory_tools_instruction"
|
|
77
|
+
|
|
78
|
+
def test_enhance_empty_prompt(self):
|
|
79
|
+
"""Test enhancing an empty base prompt."""
|
|
80
|
+
enhancement = MemoryToolsEnhancement()
|
|
81
|
+
result = enhancement.enhance(None)
|
|
82
|
+
|
|
83
|
+
assert "Memory & Knowledge Management" in result
|
|
84
|
+
assert "recall_memory" in result
|
|
85
|
+
assert "store_memory" in result
|
|
86
|
+
assert "ALWAYS use recall_memory" in result
|
|
87
|
+
assert "ALWAYS use store_memory" in result
|
|
88
|
+
assert not result.startswith("\n") # Should strip leading newlines
|
|
89
|
+
|
|
90
|
+
def test_enhance_existing_prompt(self):
|
|
91
|
+
"""Test enhancing an existing prompt."""
|
|
92
|
+
enhancement = MemoryToolsEnhancement()
|
|
93
|
+
base = "You are a helpful assistant."
|
|
94
|
+
result = enhancement.enhance(base)
|
|
95
|
+
|
|
96
|
+
assert base in result
|
|
97
|
+
assert "recall_memory" in result
|
|
98
|
+
assert "store_memory" in result
|
|
99
|
+
assert "ingest_knowledge" in result
|
|
100
|
+
assert "process_dataset" in result
|
|
101
|
+
assert len(result) > len(base)
|
|
102
|
+
|
|
103
|
+
def test_enhancement_includes_best_practices(self):
|
|
104
|
+
"""Test that enhancement includes best practices."""
|
|
105
|
+
enhancement = MemoryToolsEnhancement()
|
|
106
|
+
result = enhancement.enhance("Base")
|
|
107
|
+
|
|
108
|
+
assert "Best Practices" in result
|
|
109
|
+
assert "Recall First" in result
|
|
110
|
+
assert "Store Proactively" in result
|
|
111
|
+
assert "Use Natural Language" in result
|
|
112
|
+
assert "Categorize" in result
|
|
113
|
+
assert "Be Specific" in result
|
|
114
|
+
|
|
115
|
+
def test_enhancement_includes_example_workflow(self):
|
|
116
|
+
"""Test that enhancement includes example workflow."""
|
|
117
|
+
enhancement = MemoryToolsEnhancement()
|
|
118
|
+
result = enhancement.enhance("Base")
|
|
119
|
+
|
|
120
|
+
assert "Example Workflow" in result
|
|
121
|
+
assert 'recall_memory("user preferences' in result
|
|
122
|
+
assert 'store_memory(' in result
|
|
123
|
+
assert 'metadata=' in result
|
|
124
|
+
|
|
125
|
+
def test_enhancement_emphasizes_proactive_usage(self):
|
|
126
|
+
"""Test that enhancement emphasizes proactive usage."""
|
|
127
|
+
enhancement = MemoryToolsEnhancement()
|
|
128
|
+
result = enhancement.enhance("Base")
|
|
129
|
+
|
|
130
|
+
assert "IMPORTANT" in result
|
|
131
|
+
assert "proactively" in result
|
|
132
|
+
assert "not just when explicitly asked" in result
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class TestSystemPromptBuilder:
|
|
136
|
+
"""Test SystemPromptBuilder."""
|
|
137
|
+
|
|
138
|
+
def test_add_enhancement(self):
|
|
139
|
+
"""Test adding enhancements."""
|
|
140
|
+
builder = SystemPromptBuilder()
|
|
141
|
+
enhancement = TodoListEnhancement()
|
|
142
|
+
|
|
143
|
+
builder.add_enhancement(enhancement)
|
|
144
|
+
assert len(builder._enhancements) == 1
|
|
145
|
+
assert builder._enhancements[0] == enhancement
|
|
146
|
+
|
|
147
|
+
def test_add_multiple_enhancements(self):
|
|
148
|
+
"""Test adding multiple enhancements."""
|
|
149
|
+
builder = SystemPromptBuilder()
|
|
150
|
+
enhancement1 = TodoListEnhancement()
|
|
151
|
+
enhancement2 = TodoListEnhancement() # Would be different in practice
|
|
152
|
+
|
|
153
|
+
builder.add_enhancement(enhancement1)
|
|
154
|
+
builder.add_enhancement(enhancement2)
|
|
155
|
+
assert len(builder._enhancements) == 2
|
|
156
|
+
|
|
157
|
+
def test_remove_enhancement(self):
|
|
158
|
+
"""Test removing enhancements."""
|
|
159
|
+
builder = SystemPromptBuilder()
|
|
160
|
+
enhancement = TodoListEnhancement()
|
|
161
|
+
|
|
162
|
+
builder.add_enhancement(enhancement)
|
|
163
|
+
builder.remove_enhancement("todo_list_instruction")
|
|
164
|
+
assert len(builder._enhancements) == 0
|
|
165
|
+
|
|
166
|
+
def test_remove_nonexistent_enhancement(self):
|
|
167
|
+
"""Test removing an enhancement that doesn't exist."""
|
|
168
|
+
builder = SystemPromptBuilder()
|
|
169
|
+
enhancement = TodoListEnhancement()
|
|
170
|
+
|
|
171
|
+
builder.add_enhancement(enhancement)
|
|
172
|
+
builder.remove_enhancement("nonexistent")
|
|
173
|
+
assert len(builder._enhancements) == 1 # Should still have the original
|
|
174
|
+
|
|
175
|
+
def test_build_with_no_enhancements(self):
|
|
176
|
+
"""Test building with no enhancements."""
|
|
177
|
+
builder = SystemPromptBuilder()
|
|
178
|
+
base = "You are helpful."
|
|
179
|
+
|
|
180
|
+
result = builder.build(base, "claude_code")
|
|
181
|
+
assert result == base
|
|
182
|
+
|
|
183
|
+
def test_build_applies_runtime_specific_enhancement(self):
|
|
184
|
+
"""Test that runtime-specific enhancements are applied correctly."""
|
|
185
|
+
builder = SystemPromptBuilder()
|
|
186
|
+
builder.add_enhancement(TodoListEnhancement())
|
|
187
|
+
|
|
188
|
+
# Should apply to claude_code
|
|
189
|
+
result_claude = builder.build("Base prompt", "claude_code")
|
|
190
|
+
assert "TODO list" in result_claude
|
|
191
|
+
assert "Base prompt" in result_claude
|
|
192
|
+
|
|
193
|
+
# Should NOT apply to agno
|
|
194
|
+
result_agno = builder.build("Base prompt", "agno")
|
|
195
|
+
assert "TODO list" not in result_agno
|
|
196
|
+
assert result_agno == "Base prompt"
|
|
197
|
+
|
|
198
|
+
def test_build_with_empty_base_prompt(self):
|
|
199
|
+
"""Test building with empty base prompt."""
|
|
200
|
+
builder = SystemPromptBuilder()
|
|
201
|
+
builder.add_enhancement(TodoListEnhancement())
|
|
202
|
+
|
|
203
|
+
result = builder.build(None, "claude_code")
|
|
204
|
+
assert "TODO list" in result
|
|
205
|
+
assert len(result) > 0
|
|
206
|
+
|
|
207
|
+
def test_disable_enhancements(self):
|
|
208
|
+
"""Test disabling all enhancements."""
|
|
209
|
+
builder = SystemPromptBuilder()
|
|
210
|
+
builder.add_enhancement(TodoListEnhancement())
|
|
211
|
+
builder.disable()
|
|
212
|
+
|
|
213
|
+
result = builder.build("Base prompt", "claude_code")
|
|
214
|
+
assert result == "Base prompt"
|
|
215
|
+
assert "TODO list" not in result
|
|
216
|
+
|
|
217
|
+
def test_enable_enhancements(self):
|
|
218
|
+
"""Test enabling enhancements after disabling."""
|
|
219
|
+
builder = SystemPromptBuilder()
|
|
220
|
+
builder.add_enhancement(TodoListEnhancement())
|
|
221
|
+
builder.disable()
|
|
222
|
+
builder.enable()
|
|
223
|
+
|
|
224
|
+
result = builder.build("Base prompt", "claude_code")
|
|
225
|
+
assert "TODO list" in result
|
|
226
|
+
|
|
227
|
+
def test_method_chaining(self):
|
|
228
|
+
"""Test that builder methods support chaining."""
|
|
229
|
+
builder = SystemPromptBuilder()
|
|
230
|
+
|
|
231
|
+
result = (
|
|
232
|
+
builder
|
|
233
|
+
.add_enhancement(TodoListEnhancement())
|
|
234
|
+
.enable()
|
|
235
|
+
.build("Test", "claude_code")
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
assert "TODO list" in result
|
|
239
|
+
assert "Test" in result
|
|
240
|
+
|
|
241
|
+
def test_build_handles_enhancement_errors(self):
|
|
242
|
+
"""Test that build() continues if an enhancement fails."""
|
|
243
|
+
class FailingEnhancement(TodoListEnhancement):
|
|
244
|
+
def enhance(self, base_prompt):
|
|
245
|
+
raise ValueError("Test error")
|
|
246
|
+
|
|
247
|
+
builder = SystemPromptBuilder()
|
|
248
|
+
builder.add_enhancement(FailingEnhancement())
|
|
249
|
+
|
|
250
|
+
# Should not raise, should return base prompt
|
|
251
|
+
result = builder.build("Base", "claude_code")
|
|
252
|
+
assert result == "Base"
|
|
253
|
+
|
|
254
|
+
def test_build_with_empty_runtime_type(self):
|
|
255
|
+
"""Test building with empty runtime type."""
|
|
256
|
+
builder = SystemPromptBuilder()
|
|
257
|
+
builder.add_enhancement(TodoListEnhancement())
|
|
258
|
+
|
|
259
|
+
result = builder.build("Base", "")
|
|
260
|
+
# Should not match any runtime
|
|
261
|
+
assert result == "Base"
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class TestDefaultBuilder:
|
|
265
|
+
"""Test create_default_prompt_builder factory."""
|
|
266
|
+
|
|
267
|
+
def test_creates_builder_with_todo_enhancement(self):
|
|
268
|
+
"""Test that default builder includes TODO enhancement."""
|
|
269
|
+
builder = create_default_prompt_builder()
|
|
270
|
+
|
|
271
|
+
result = builder.build("Test prompt", "claude_code")
|
|
272
|
+
assert "TODO list" in result
|
|
273
|
+
|
|
274
|
+
def test_creates_builder_with_memory_enhancement(self):
|
|
275
|
+
"""Test that default builder includes memory tools enhancement."""
|
|
276
|
+
builder = create_default_prompt_builder()
|
|
277
|
+
|
|
278
|
+
# Memory enhancement should apply to all runtimes
|
|
279
|
+
claude_result = builder.build("Test prompt", "claude_code")
|
|
280
|
+
assert "recall_memory" in claude_result
|
|
281
|
+
assert "store_memory" in claude_result
|
|
282
|
+
|
|
283
|
+
agno_result = builder.build("Test prompt", "agno")
|
|
284
|
+
assert "recall_memory" in agno_result
|
|
285
|
+
assert "store_memory" in agno_result
|
|
286
|
+
|
|
287
|
+
def test_default_builder_respects_runtime(self):
|
|
288
|
+
"""Test that default builder respects runtime filtering."""
|
|
289
|
+
builder = create_default_prompt_builder()
|
|
290
|
+
|
|
291
|
+
# Claude code should get both TODO and memory enhancements
|
|
292
|
+
claude_result = builder.build("Test", "claude_code")
|
|
293
|
+
assert "TODO list" in claude_result
|
|
294
|
+
assert "recall_memory" in claude_result
|
|
295
|
+
|
|
296
|
+
# Agno should only get memory enhancement (not TODO)
|
|
297
|
+
agno_result = builder.build("Test", "agno")
|
|
298
|
+
assert "TODO list" not in agno_result
|
|
299
|
+
assert "recall_memory" in agno_result
|
|
300
|
+
|
|
301
|
+
@patch.dict(os.environ, {"DISABLE_SYSTEM_PROMPT_ENHANCEMENTS": "true"})
|
|
302
|
+
def test_disable_via_env_var(self):
|
|
303
|
+
"""Test disabling all enhancements via environment variable."""
|
|
304
|
+
builder = create_default_prompt_builder()
|
|
305
|
+
|
|
306
|
+
result = builder.build("Test", "claude_code")
|
|
307
|
+
assert "TODO list" not in result
|
|
308
|
+
assert result == "Test"
|
|
309
|
+
|
|
310
|
+
@patch.dict(os.environ, {"ENABLE_TODO_LIST_ENHANCEMENT": "false"})
|
|
311
|
+
def test_disable_todo_enhancement_via_env_var(self):
|
|
312
|
+
"""Test disabling TODO list enhancement via environment variable."""
|
|
313
|
+
builder = create_default_prompt_builder()
|
|
314
|
+
|
|
315
|
+
result = builder.build("Test", "claude_code")
|
|
316
|
+
assert "TODO list" not in result
|
|
317
|
+
# Should still have memory enhancement
|
|
318
|
+
assert "recall_memory" in result
|
|
319
|
+
|
|
320
|
+
@patch.dict(os.environ, {"ENABLE_MEMORY_TOOLS_ENHANCEMENT": "false"})
|
|
321
|
+
def test_disable_memory_enhancement_via_env_var(self):
|
|
322
|
+
"""Test disabling memory tools enhancement via environment variable."""
|
|
323
|
+
builder = create_default_prompt_builder()
|
|
324
|
+
|
|
325
|
+
claude_result = builder.build("Test", "claude_code")
|
|
326
|
+
assert "recall_memory" not in claude_result
|
|
327
|
+
# Should still have TODO enhancement for claude_code
|
|
328
|
+
assert "TODO list" in claude_result
|
|
329
|
+
|
|
330
|
+
agno_result = builder.build("Test", "agno")
|
|
331
|
+
assert "recall_memory" not in agno_result
|
|
332
|
+
# Should not have TODO enhancement for agno
|
|
333
|
+
assert "TODO list" not in agno_result
|
|
334
|
+
|
|
335
|
+
@patch.dict(os.environ, {"ENABLE_TODO_LIST_ENHANCEMENT": "true"})
|
|
336
|
+
def test_enable_todo_enhancement_explicitly(self):
|
|
337
|
+
"""Test that TODO enhancement is enabled when env var is true."""
|
|
338
|
+
builder = create_default_prompt_builder()
|
|
339
|
+
|
|
340
|
+
result = builder.build("Test", "claude_code")
|
|
341
|
+
assert "TODO list" in result
|
|
342
|
+
|
|
343
|
+
def test_default_builder_is_enabled_by_default(self):
|
|
344
|
+
"""Test that builder is enabled by default without env vars."""
|
|
345
|
+
# Clear relevant env vars
|
|
346
|
+
with patch.dict(os.environ, {}, clear=True):
|
|
347
|
+
# Explicitly set only the vars we need (not the enhancement ones)
|
|
348
|
+
with patch.dict(os.environ, {
|
|
349
|
+
"LITELLM_API_KEY": "test", # May be needed by other code
|
|
350
|
+
}, clear=False):
|
|
351
|
+
builder = create_default_prompt_builder()
|
|
352
|
+
|
|
353
|
+
result = builder.build("Test", "claude_code")
|
|
354
|
+
assert "TODO list" in result
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class TestRuntimeType:
|
|
358
|
+
"""Test RuntimeType enum."""
|
|
359
|
+
|
|
360
|
+
def test_enum_values(self):
|
|
361
|
+
"""Test that enum has expected values."""
|
|
362
|
+
assert RuntimeType.CLAUDE_CODE.value == "claude_code"
|
|
363
|
+
assert RuntimeType.AGNO.value == "agno"
|
|
364
|
+
assert RuntimeType.ALL.value == "all"
|
|
365
|
+
|
|
366
|
+
def test_enum_can_be_compared(self):
|
|
367
|
+
"""Test that enum values can be compared."""
|
|
368
|
+
assert RuntimeType.CLAUDE_CODE == RuntimeType.CLAUDE_CODE
|
|
369
|
+
assert RuntimeType.CLAUDE_CODE != RuntimeType.AGNO
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
class TestIntegrationWithRuntimes:
|
|
373
|
+
"""Test integration with actual runtime configs."""
|
|
374
|
+
|
|
375
|
+
def test_claude_code_config_integration(self):
|
|
376
|
+
"""Test that enhancement works with claude_code config builder."""
|
|
377
|
+
builder = create_default_prompt_builder()
|
|
378
|
+
enhanced = builder.build("You are a coding assistant.", "claude_code")
|
|
379
|
+
|
|
380
|
+
assert "You are a coding assistant." in enhanced
|
|
381
|
+
assert "TODO list" in enhanced
|
|
382
|
+
assert "Task Management" in enhanced
|
|
383
|
+
|
|
384
|
+
def test_agno_config_integration(self):
|
|
385
|
+
"""Test that agno runtime doesn't get claude_code enhancements but does get memory."""
|
|
386
|
+
builder = create_default_prompt_builder()
|
|
387
|
+
enhanced = builder.build("You are helpful.", "agno")
|
|
388
|
+
|
|
389
|
+
# Should NOT have TODO enhancement (claude_code only)
|
|
390
|
+
assert "TODO list" not in enhanced
|
|
391
|
+
# Should have memory enhancement (applies to all runtimes)
|
|
392
|
+
assert "recall_memory" in enhanced
|
|
393
|
+
assert "You are helpful." in enhanced
|
|
394
|
+
|
|
395
|
+
def test_none_prompt_becomes_empty_string_for_agno(self):
|
|
396
|
+
"""Test that None prompt gets memory enhancement for agno."""
|
|
397
|
+
builder = create_default_prompt_builder()
|
|
398
|
+
enhanced = builder.build(None, "agno")
|
|
399
|
+
|
|
400
|
+
# Should have memory enhancement even with None base prompt
|
|
401
|
+
assert "recall_memory" in enhanced
|
|
402
|
+
assert len(enhanced) > 0
|
|
403
|
+
|
|
404
|
+
def test_none_prompt_gets_enhancement_for_claude_code(self):
|
|
405
|
+
"""Test that None prompt still gets enhanced for claude_code."""
|
|
406
|
+
builder = create_default_prompt_builder()
|
|
407
|
+
enhanced = builder.build(None, "claude_code")
|
|
408
|
+
|
|
409
|
+
assert "TODO list" in enhanced
|
|
410
|
+
assert len(enhanced) > 0
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
if __name__ == "__main__":
|
|
414
|
+
# Run tests
|
|
415
|
+
pytest.main([__file__, "-v", "-s"])
|