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,197 @@
|
|
|
1
|
+
"""Agent tools for plan orchestration.
|
|
2
|
+
|
|
3
|
+
These tools are provided to the Claude Code agent to allow it to:
|
|
4
|
+
- Execute tasks (spawn child agent workflows)
|
|
5
|
+
- Check task status
|
|
6
|
+
- Validate task completion
|
|
7
|
+
- Update plan state
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Dict, Any, Optional
|
|
11
|
+
import structlog
|
|
12
|
+
from anthropic import BaseModel as AnthropicBaseModel
|
|
13
|
+
|
|
14
|
+
from worker_internal.planner.models import (
|
|
15
|
+
PlanTask,
|
|
16
|
+
TaskStatus,
|
|
17
|
+
TaskExecutionResult,
|
|
18
|
+
AgentToolContext,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
logger = structlog.get_logger()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ExecuteTaskTool(AnthropicBaseModel):
|
|
25
|
+
"""Tool for executing tasks from the plan."""
|
|
26
|
+
|
|
27
|
+
name: str = "execute_task"
|
|
28
|
+
description: str = """Execute one or more tasks from the plan.
|
|
29
|
+
|
|
30
|
+
For independent tasks (no dependencies), you can execute multiple tasks IN PARALLEL
|
|
31
|
+
by providing task_ids array instead of single task_id. This is much faster!
|
|
32
|
+
|
|
33
|
+
This will:
|
|
34
|
+
1. Create enriched prompts with task details
|
|
35
|
+
2. Spawn agent execution workflows (in parallel if multiple tasks)
|
|
36
|
+
3. Return execution results
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
task_id: Single task ID to execute (optional if task_ids provided)
|
|
40
|
+
task_ids: Array of task IDs to execute in parallel (optional if task_id provided)
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Dictionary with execution results
|
|
44
|
+
|
|
45
|
+
Examples:
|
|
46
|
+
execute_task(task_id=1) # Execute task 1
|
|
47
|
+
execute_task(task_ids=[1, 2, 3]) # Execute tasks 1, 2, 3 in parallel
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
input_schema: Dict[str, Any] = {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"properties": {
|
|
53
|
+
"task_id": {
|
|
54
|
+
"type": "integer",
|
|
55
|
+
"description": "Single task ID to execute"
|
|
56
|
+
},
|
|
57
|
+
"task_ids": {
|
|
58
|
+
"type": "array",
|
|
59
|
+
"items": {"type": "integer"},
|
|
60
|
+
"description": "Array of task IDs to execute in parallel (for independent tasks)"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class GetTaskStatusTool(AnthropicBaseModel):
|
|
67
|
+
"""Tool for checking task execution status."""
|
|
68
|
+
|
|
69
|
+
name: str = "get_task_status"
|
|
70
|
+
description: str = """Check the current status of a task execution.
|
|
71
|
+
|
|
72
|
+
Returns the execution status, output, and metadata for a task.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
task_id: The ID of the task to check
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
Dictionary with status, output, tokens, and other metadata
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
input_schema: Dict[str, Any] = {
|
|
82
|
+
"type": "object",
|
|
83
|
+
"properties": {
|
|
84
|
+
"task_id": {
|
|
85
|
+
"type": "integer",
|
|
86
|
+
"description": "The ID of the task to check status for"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"required": ["task_id"]
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class ValidateTaskTool(AnthropicBaseModel):
|
|
94
|
+
"""Tool for validating task completion."""
|
|
95
|
+
|
|
96
|
+
name: str = "validate_task"
|
|
97
|
+
description: str = """Validate that a task completed successfully using LLM analysis.
|
|
98
|
+
|
|
99
|
+
This analyzes the task output and conversation to determine if:
|
|
100
|
+
- The task completed as expected (success)
|
|
101
|
+
- The task failed or produced incorrect output (failed)
|
|
102
|
+
- The task needs more work (pending)
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
task_id: The ID of the task to validate
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
Dictionary with validation status, reason, and confidence score
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
input_schema: Dict[str, Any] = {
|
|
112
|
+
"type": "object",
|
|
113
|
+
"properties": {
|
|
114
|
+
"task_id": {
|
|
115
|
+
"type": "integer",
|
|
116
|
+
"description": "The ID of the task to validate"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"required": ["task_id"]
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class UpdatePlanStatusTool(AnthropicBaseModel):
|
|
124
|
+
"""Tool for updating overall plan status."""
|
|
125
|
+
|
|
126
|
+
name: str = "update_plan_status"
|
|
127
|
+
description: str = """Update the overall plan execution status and progress.
|
|
128
|
+
|
|
129
|
+
Use this to provide status updates as you progress through the plan.
|
|
130
|
+
This will publish events to the UI for real-time updates.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
status_message: Human-readable status message
|
|
134
|
+
completed_tasks: Number of tasks completed so far
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Success confirmation
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
input_schema: Dict[str, Any] = {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"properties": {
|
|
143
|
+
"status_message": {
|
|
144
|
+
"type": "string",
|
|
145
|
+
"description": "Human-readable status update message"
|
|
146
|
+
},
|
|
147
|
+
"completed_tasks": {
|
|
148
|
+
"type": "integer",
|
|
149
|
+
"description": "Number of tasks completed so far"
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"required": ["status_message"]
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class ListTasksTool(AnthropicBaseModel):
|
|
157
|
+
"""Tool for listing all tasks in the plan."""
|
|
158
|
+
|
|
159
|
+
name: str = "list_tasks"
|
|
160
|
+
description: str = """Get a list of all tasks in the plan with their dependencies.
|
|
161
|
+
|
|
162
|
+
Use this to understand the plan structure and task relationships.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
List of tasks with their IDs, titles, dependencies, and status
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
input_schema: Dict[str, Any] = {
|
|
169
|
+
"type": "object",
|
|
170
|
+
"properties": {},
|
|
171
|
+
"required": []
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def get_agent_tools() -> list:
|
|
176
|
+
"""Get all tools available to the orchestrator agent."""
|
|
177
|
+
return [
|
|
178
|
+
ExecuteTaskTool(),
|
|
179
|
+
GetTaskStatusTool(),
|
|
180
|
+
ValidateTaskTool(),
|
|
181
|
+
UpdatePlanStatusTool(),
|
|
182
|
+
ListTasksTool(),
|
|
183
|
+
]
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def format_tool_for_anthropic(tool: AnthropicBaseModel) -> Dict[str, Any]:
|
|
187
|
+
"""Format a tool definition for Anthropic API."""
|
|
188
|
+
return {
|
|
189
|
+
"name": tool.name,
|
|
190
|
+
"description": tool.description,
|
|
191
|
+
"input_schema": tool.input_schema,
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def get_agent_tools_formatted() -> list:
|
|
196
|
+
"""Get all tools formatted for Anthropic API."""
|
|
197
|
+
return [format_tool_for_anthropic(tool) for tool in get_agent_tools()]
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Pydantic models for plan execution streaming events."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional, List, Dict, Any
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PlanEventBase(BaseModel):
|
|
9
|
+
"""Base model for all plan events."""
|
|
10
|
+
execution_id: str
|
|
11
|
+
timestamp: Optional[datetime] = Field(default_factory=lambda: datetime.utcnow())
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class PlanStartedEvent(PlanEventBase):
|
|
15
|
+
"""Plan execution started."""
|
|
16
|
+
title: str
|
|
17
|
+
total_tasks: int
|
|
18
|
+
agent_id: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TaskStartedEvent(PlanEventBase):
|
|
22
|
+
"""Task execution started."""
|
|
23
|
+
task_id: int
|
|
24
|
+
title: str
|
|
25
|
+
description: str
|
|
26
|
+
agent_id: str
|
|
27
|
+
task_execution_id: str # Agent execution ID for this task
|
|
28
|
+
dependencies: List[int] = Field(default_factory=list)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class TaskRunningEvent(PlanEventBase):
|
|
32
|
+
"""Task execution progress update."""
|
|
33
|
+
task_id: int
|
|
34
|
+
status: str
|
|
35
|
+
message: Optional[str] = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TasksParallelEvent(PlanEventBase):
|
|
39
|
+
"""Multiple tasks running in parallel."""
|
|
40
|
+
task_ids: List[int]
|
|
41
|
+
message: str
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class TaskWaitingForInputEvent(PlanEventBase):
|
|
45
|
+
"""Task paused, waiting for user input."""
|
|
46
|
+
task_id: int
|
|
47
|
+
question: str
|
|
48
|
+
task_execution_id: str
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class TaskValidationStartedEvent(PlanEventBase):
|
|
52
|
+
"""Task validation started."""
|
|
53
|
+
task_id: int
|
|
54
|
+
title: str
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class TaskValidationCompleteEvent(PlanEventBase):
|
|
58
|
+
"""Task validation completed."""
|
|
59
|
+
task_id: int
|
|
60
|
+
is_valid: bool
|
|
61
|
+
reason: str
|
|
62
|
+
confidence: float
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class TaskRetryEvent(PlanEventBase):
|
|
66
|
+
"""Task is being retried after failure."""
|
|
67
|
+
task_id: int
|
|
68
|
+
title: str
|
|
69
|
+
attempt_number: int
|
|
70
|
+
max_attempts: int
|
|
71
|
+
previous_error: str
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class TaskCompletedEvent(PlanEventBase):
|
|
75
|
+
"""Task execution completed."""
|
|
76
|
+
task_id: int
|
|
77
|
+
title: str
|
|
78
|
+
status: str
|
|
79
|
+
output: str
|
|
80
|
+
error: Optional[str] = None
|
|
81
|
+
tokens: int = 0
|
|
82
|
+
cost: float = 0.0
|
|
83
|
+
retry_count: int = 0
|
|
84
|
+
had_retries: bool = False
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class PlanStatusUpdateEvent(PlanEventBase):
|
|
88
|
+
"""Overall plan progress update."""
|
|
89
|
+
completed_tasks: int
|
|
90
|
+
failed_tasks: int
|
|
91
|
+
total_tasks: int
|
|
92
|
+
current_task_id: Optional[int] = None
|
|
93
|
+
progress_percentage: float
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class PlanCompletedEvent(PlanEventBase):
|
|
97
|
+
"""Plan execution completed."""
|
|
98
|
+
status: str # "completed" or "failed"
|
|
99
|
+
completed_tasks: int
|
|
100
|
+
failed_tasks: int
|
|
101
|
+
total_tasks: int
|
|
102
|
+
total_tokens: int
|
|
103
|
+
total_cost: float
|
|
104
|
+
duration_seconds: float
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class TodoItem(BaseModel):
|
|
108
|
+
"""Single TODO item for UI checklist."""
|
|
109
|
+
task_id: int
|
|
110
|
+
title: str
|
|
111
|
+
description: str
|
|
112
|
+
status: str # "pending", "running", "completed", "failed", "waiting_for_input"
|
|
113
|
+
dependencies: List[int] = Field(default_factory=list)
|
|
114
|
+
agent_id: Optional[str] = None
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class TodoListInitializedEvent(PlanEventBase):
|
|
118
|
+
"""Initial TODO list with all tasks."""
|
|
119
|
+
title: str
|
|
120
|
+
total_tasks: int
|
|
121
|
+
items: List[TodoItem]
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class TodoItemUpdatedEvent(PlanEventBase):
|
|
125
|
+
"""Individual TODO item status update."""
|
|
126
|
+
task_id: int
|
|
127
|
+
title: str
|
|
128
|
+
old_status: str
|
|
129
|
+
new_status: str
|
|
130
|
+
message: Optional[str] = None
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
# Event type mapping for serialization
|
|
134
|
+
EVENT_TYPE_MAP = {
|
|
135
|
+
"plan_started": PlanStartedEvent,
|
|
136
|
+
"task_started": TaskStartedEvent,
|
|
137
|
+
"task_running": TaskRunningEvent,
|
|
138
|
+
"tasks_parallel": TasksParallelEvent,
|
|
139
|
+
"task_retry": TaskRetryEvent,
|
|
140
|
+
"task_waiting_for_input": TaskWaitingForInputEvent,
|
|
141
|
+
"task_validation_started": TaskValidationStartedEvent,
|
|
142
|
+
"task_validation_complete": TaskValidationCompleteEvent,
|
|
143
|
+
"task_completed": TaskCompletedEvent,
|
|
144
|
+
"plan_status_update": PlanStatusUpdateEvent,
|
|
145
|
+
"plan_completed": PlanCompletedEvent,
|
|
146
|
+
"todo_list_initialized": TodoListInitializedEvent,
|
|
147
|
+
"todo_item_updated": TodoItemUpdatedEvent,
|
|
148
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""Event publishing utilities for plan orchestration."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional, Dict, Any
|
|
4
|
+
import structlog
|
|
5
|
+
import httpx
|
|
6
|
+
import json as json_lib
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
from worker_internal.planner.event_models import PlanEventBase
|
|
10
|
+
|
|
11
|
+
logger = structlog.get_logger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
async def publish_plan_event(
|
|
15
|
+
execution_id: str,
|
|
16
|
+
event_type: str,
|
|
17
|
+
event_data: PlanEventBase,
|
|
18
|
+
) -> bool:
|
|
19
|
+
"""
|
|
20
|
+
Publish plan event via HTTP to control plane (which handles Redis).
|
|
21
|
+
|
|
22
|
+
This approach is more reliable than direct Redis access from activities
|
|
23
|
+
because the control plane manages Redis connections and event storage.
|
|
24
|
+
"""
|
|
25
|
+
try:
|
|
26
|
+
control_plane_url = os.getenv("CONTROL_PLANE_URL", "http://localhost:8000")
|
|
27
|
+
|
|
28
|
+
# Build event message (serialize datetime objects to strings)
|
|
29
|
+
event_dict = json_lib.loads(json_lib.dumps(event_data.dict(), default=str))
|
|
30
|
+
|
|
31
|
+
message = {
|
|
32
|
+
"event_type": event_type,
|
|
33
|
+
"data": event_dict,
|
|
34
|
+
"timestamp": event_data.timestamp.isoformat() if event_data.timestamp else None,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Publish via HTTP to control plane
|
|
38
|
+
async with httpx.AsyncClient(timeout=5.0) as client:
|
|
39
|
+
response = await client.post(
|
|
40
|
+
f"{control_plane_url}/api/v1/tasks/plan/events/{execution_id}",
|
|
41
|
+
json=message,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
if response.status_code in (200, 201, 202):
|
|
45
|
+
logger.debug(
|
|
46
|
+
"plan_event_published",
|
|
47
|
+
execution_id=execution_id[:8],
|
|
48
|
+
event_type=event_type,
|
|
49
|
+
)
|
|
50
|
+
return True
|
|
51
|
+
else:
|
|
52
|
+
logger.warning(
|
|
53
|
+
"plan_event_publish_failed",
|
|
54
|
+
execution_id=execution_id[:8],
|
|
55
|
+
event_type=event_type,
|
|
56
|
+
status=response.status_code,
|
|
57
|
+
)
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.error(
|
|
62
|
+
"plan_event_publish_error",
|
|
63
|
+
execution_id=execution_id[:8],
|
|
64
|
+
event_type=event_type,
|
|
65
|
+
error=str(e),
|
|
66
|
+
)
|
|
67
|
+
return False
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""Pydantic models for plan orchestration."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional, List, Dict, Any
|
|
4
|
+
from pydantic import BaseModel, Field
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from enum import Enum
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class PlanStatus(str, Enum):
|
|
10
|
+
"""Plan execution status"""
|
|
11
|
+
PENDING = "pending"
|
|
12
|
+
RUNNING = "running"
|
|
13
|
+
PENDING_USER_INPUT = "pending_user_input" # Paused, waiting for user to provide input
|
|
14
|
+
COMPLETED = "completed"
|
|
15
|
+
FAILED = "failed"
|
|
16
|
+
CANCELLED = "cancelled"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TaskStatus(str, Enum):
|
|
20
|
+
"""Task execution status"""
|
|
21
|
+
PENDING = "pending"
|
|
22
|
+
RUNNING = "running"
|
|
23
|
+
SUCCESS = "success"
|
|
24
|
+
FAILED = "failed"
|
|
25
|
+
WAITING_FOR_INPUT = "waiting_for_input" # Task paused, needs user input to continue
|
|
26
|
+
VALIDATING = "validating"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class PlanTask(BaseModel):
|
|
30
|
+
"""Task definition from plan"""
|
|
31
|
+
id: int
|
|
32
|
+
title: str
|
|
33
|
+
description: str
|
|
34
|
+
details: str
|
|
35
|
+
test_strategy: Optional[str] = None
|
|
36
|
+
priority: str = "medium"
|
|
37
|
+
dependencies: List[int] = Field(default_factory=list)
|
|
38
|
+
status: TaskStatus = TaskStatus.PENDING
|
|
39
|
+
subtasks: List[Any] = Field(default_factory=list)
|
|
40
|
+
skills_to_use: List[str] = Field(default_factory=list)
|
|
41
|
+
env_vars_to_use: List[str] = Field(default_factory=list)
|
|
42
|
+
secrets_to_use: List[str] = Field(default_factory=list)
|
|
43
|
+
knowledge_references: List[str] = Field(default_factory=list)
|
|
44
|
+
agent_id: Optional[str] = None
|
|
45
|
+
worker_queue_id: Optional[str] = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class AgentInfo(BaseModel):
|
|
49
|
+
"""Agent metadata from plan"""
|
|
50
|
+
team_id: Optional[str] = None
|
|
51
|
+
team_name: str
|
|
52
|
+
agent_id: str
|
|
53
|
+
agent_name: str
|
|
54
|
+
responsibilities: List[str] = Field(default_factory=list)
|
|
55
|
+
estimated_time_hours: float = 0.0
|
|
56
|
+
model_info: Dict[str, Any] = Field(default_factory=dict)
|
|
57
|
+
expected_tools: List[Dict[str, Any]] = Field(default_factory=list)
|
|
58
|
+
agent_cost: float = 0.0
|
|
59
|
+
tasks: List[PlanTask] = Field(default_factory=list)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class Plan(BaseModel):
|
|
63
|
+
"""Plan definition"""
|
|
64
|
+
title: str
|
|
65
|
+
summary: str
|
|
66
|
+
complexity: Dict[str, Any] = Field(default_factory=dict)
|
|
67
|
+
team_breakdown: List[AgentInfo] = Field(default_factory=list)
|
|
68
|
+
recommended_execution: Dict[str, Any] = Field(default_factory=dict)
|
|
69
|
+
cost_estimate: Dict[str, Any] = Field(default_factory=dict)
|
|
70
|
+
realized_savings: Dict[str, Any] = Field(default_factory=dict)
|
|
71
|
+
risks: List[str] = Field(default_factory=list)
|
|
72
|
+
prerequisites: List[str] = Field(default_factory=list)
|
|
73
|
+
success_criteria: List[str] = Field(default_factory=list)
|
|
74
|
+
has_questions: bool = False
|
|
75
|
+
questions: Optional[Any] = None
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class PlanOrchestratorInput(BaseModel):
|
|
79
|
+
"""Input for plan orchestrator workflow"""
|
|
80
|
+
plan: Plan
|
|
81
|
+
organization_id: str
|
|
82
|
+
agent_id: str
|
|
83
|
+
worker_queue_id: str # Worker queue ID for routing task executions
|
|
84
|
+
user_id: Optional[str] = None
|
|
85
|
+
execution_id: Optional[str] = None
|
|
86
|
+
# Auth context
|
|
87
|
+
jwt_token: Optional[str] = None
|
|
88
|
+
# Continuation context
|
|
89
|
+
is_continuation: bool = False # True if this is resuming a paused plan
|
|
90
|
+
previous_task_results: Optional[Dict[int, Dict[str, Any]]] = None # Previous task results for continuation
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class TaskRetryAttempt(BaseModel):
|
|
94
|
+
"""Single retry attempt record"""
|
|
95
|
+
attempt_number: int
|
|
96
|
+
error: str
|
|
97
|
+
output: str
|
|
98
|
+
events: List[Dict[str, Any]] = Field(default_factory=list)
|
|
99
|
+
started_at: datetime
|
|
100
|
+
completed_at: datetime
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class TaskRetryContext(BaseModel):
|
|
104
|
+
"""Context for retrying a failed task"""
|
|
105
|
+
current_attempt: int
|
|
106
|
+
max_attempts: int
|
|
107
|
+
previous_failures: List[TaskRetryAttempt]
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class TaskExecutionResult(BaseModel):
|
|
111
|
+
"""Result of task execution"""
|
|
112
|
+
task_id: int
|
|
113
|
+
status: TaskStatus
|
|
114
|
+
execution_id: str
|
|
115
|
+
output: str
|
|
116
|
+
events: List[Dict[str, Any]] = Field(default_factory=list)
|
|
117
|
+
tokens: int = 0
|
|
118
|
+
cost: float = 0.0
|
|
119
|
+
started_at: Optional[datetime] = None
|
|
120
|
+
completed_at: Optional[datetime] = None
|
|
121
|
+
error: Optional[str] = None
|
|
122
|
+
needs_continuation: bool = False
|
|
123
|
+
user_question: Optional[str] = None
|
|
124
|
+
retry_count: int = 0
|
|
125
|
+
retry_history: List[TaskRetryAttempt] = Field(default_factory=list)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class TaskValidationResult(BaseModel):
|
|
129
|
+
"""Result of task validation"""
|
|
130
|
+
task_id: int
|
|
131
|
+
status: TaskStatus
|
|
132
|
+
reason: str
|
|
133
|
+
confidence: float
|
|
134
|
+
suggestions: Optional[str] = None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class PlanExecutionSummary(BaseModel):
|
|
138
|
+
"""Final plan execution summary"""
|
|
139
|
+
plan_execution_id: str
|
|
140
|
+
status: PlanStatus
|
|
141
|
+
total_tasks: int
|
|
142
|
+
completed_tasks: int
|
|
143
|
+
failed_tasks: int
|
|
144
|
+
total_tokens: int
|
|
145
|
+
total_cost: float
|
|
146
|
+
started_at: datetime
|
|
147
|
+
completed_at: Optional[datetime] = None
|
|
148
|
+
execution_time_seconds: float = 0.0
|
|
149
|
+
task_results: Dict[int, TaskExecutionResult] = Field(default_factory=dict)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# Activity inputs/outputs
|
|
153
|
+
|
|
154
|
+
class CreatePlanExecutionInput(BaseModel):
|
|
155
|
+
"""Input for create_plan_execution activity"""
|
|
156
|
+
execution_id: str
|
|
157
|
+
organization_id: str
|
|
158
|
+
agent_id: str
|
|
159
|
+
title: str
|
|
160
|
+
summary: Optional[str] = None
|
|
161
|
+
total_tasks: int
|
|
162
|
+
plan_json: Dict[str, Any]
|
|
163
|
+
estimated_cost_usd: Optional[float] = None
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class UpdatePlanStateInput(BaseModel):
|
|
167
|
+
"""Input for update_plan_state activity"""
|
|
168
|
+
plan_execution_id: str
|
|
169
|
+
status: Optional[PlanStatus] = None
|
|
170
|
+
completed_tasks: Optional[int] = None
|
|
171
|
+
failed_tasks: Optional[int] = None
|
|
172
|
+
current_task_id: Optional[int] = None
|
|
173
|
+
current_task_status: Optional[TaskStatus] = None
|
|
174
|
+
dag_state: Optional[Dict[int, Any]] = None
|
|
175
|
+
total_tokens: Optional[int] = None
|
|
176
|
+
actual_cost_usd: Optional[float] = None
|
|
177
|
+
waiting_tasks: Optional[List[Dict[str, Any]]] = None # List of tasks waiting for user input
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class ExecuteAgentInput(BaseModel):
|
|
181
|
+
"""Input for executing an agent (child workflow)"""
|
|
182
|
+
execution_id: str
|
|
183
|
+
agent_id: str
|
|
184
|
+
organization_id: str
|
|
185
|
+
prompt: str
|
|
186
|
+
system_prompt: Optional[str] = None
|
|
187
|
+
model_id: Optional[str] = None
|
|
188
|
+
task_metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
189
|
+
jwt_token: Optional[str] = None
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class AgentToolContext(BaseModel):
|
|
193
|
+
"""Context passed to agent tools"""
|
|
194
|
+
plan_execution_id: str
|
|
195
|
+
organization_id: str
|
|
196
|
+
agent_id: str
|
|
197
|
+
plan: Plan
|
|
198
|
+
task_results: Dict[int, TaskExecutionResult] = Field(default_factory=dict)
|
|
199
|
+
jwt_token: Optional[str] = None
|