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,372 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Task Planning Pydantic Models
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, Field, field_validator
|
|
7
|
+
from typing import List, Dict, Optional, Literal
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AgentInfo(BaseModel):
|
|
11
|
+
"""Lightweight agent info from CLI"""
|
|
12
|
+
id: str
|
|
13
|
+
name: str
|
|
14
|
+
model_id: str
|
|
15
|
+
description: Optional[str] = None
|
|
16
|
+
capabilities: List[str] = Field(default_factory=list, description="Agent capabilities")
|
|
17
|
+
status: str = Field(default="active", description="Agent status")
|
|
18
|
+
|
|
19
|
+
@field_validator('description', mode='before')
|
|
20
|
+
@classmethod
|
|
21
|
+
def empty_str_to_none(cls, v):
|
|
22
|
+
"""Convert empty string to None for optional fields"""
|
|
23
|
+
if v == '':
|
|
24
|
+
return None
|
|
25
|
+
return v
|
|
26
|
+
|
|
27
|
+
@field_validator('model_id', mode='before')
|
|
28
|
+
@classmethod
|
|
29
|
+
def default_model(cls, v):
|
|
30
|
+
"""Provide default model if empty"""
|
|
31
|
+
if not v or v == '':
|
|
32
|
+
return 'claude-sonnet-4'
|
|
33
|
+
return v
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class TeamInfo(BaseModel):
|
|
37
|
+
"""Lightweight team info from CLI"""
|
|
38
|
+
id: str
|
|
39
|
+
name: str
|
|
40
|
+
description: Optional[str] = None
|
|
41
|
+
agent_count: int = Field(default=0, description="Number of agents in team")
|
|
42
|
+
status: str = Field(default="active", description="Team status")
|
|
43
|
+
|
|
44
|
+
@field_validator('description', mode='before')
|
|
45
|
+
@classmethod
|
|
46
|
+
def empty_str_to_none(cls, v):
|
|
47
|
+
"""Convert empty string to None for optional fields"""
|
|
48
|
+
if v == '':
|
|
49
|
+
return None
|
|
50
|
+
return v
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class EnvironmentInfo(BaseModel):
|
|
54
|
+
"""Environment info from CLI"""
|
|
55
|
+
id: str
|
|
56
|
+
name: str
|
|
57
|
+
display_name: Optional[str] = Field(default=None, description="Display name for environment")
|
|
58
|
+
status: str = Field(default="active", description="Environment status")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class WorkerQueueInfo(BaseModel):
|
|
62
|
+
"""Worker queue info from CLI"""
|
|
63
|
+
id: str
|
|
64
|
+
name: str
|
|
65
|
+
environment_id: str = Field(..., description="Associated environment ID")
|
|
66
|
+
status: str = Field(default="active", description="Worker queue status")
|
|
67
|
+
active_workers: int = Field(default=0, description="Number of active workers (key for queue selection!)")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class TaskPlanRequest(BaseModel):
|
|
71
|
+
"""Request to plan a task"""
|
|
72
|
+
description: str = Field(..., description="Task description")
|
|
73
|
+
priority: Literal['low', 'medium', 'high', 'critical'] = Field('medium', description="Task priority")
|
|
74
|
+
project_id: Optional[str] = Field(None, description="Associated project ID")
|
|
75
|
+
agents: List[AgentInfo] = Field(default_factory=list, description="Available agents (outer context from CLI)")
|
|
76
|
+
teams: List[TeamInfo] = Field(default_factory=list, description="Available teams (outer context from CLI)")
|
|
77
|
+
environments: List[EnvironmentInfo] = Field(default_factory=list, description="Available execution environments")
|
|
78
|
+
worker_queues: List[WorkerQueueInfo] = Field(default_factory=list, description="Available worker queues")
|
|
79
|
+
refinement_feedback: Optional[str] = Field(None, description="User feedback for plan refinement")
|
|
80
|
+
conversation_context: Optional[str] = Field(None, description="Conversation history for context")
|
|
81
|
+
previous_plan: Optional[Dict] = Field(None, description="Previous plan for refinement")
|
|
82
|
+
iteration: int = Field(1, description="Planning iteration number")
|
|
83
|
+
planning_strategy: Optional[Literal['claude_code_sdk', 'agno']] = Field('claude_code_sdk', description="Planning strategy to use (claude_code_sdk or agno)")
|
|
84
|
+
quick_mode: bool = Field(default=False, description="Use fast planning for --local mode (Haiku vs Sonnet)")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class ComplexityInfo(BaseModel):
|
|
88
|
+
"""Task complexity assessment"""
|
|
89
|
+
story_points: int = Field(..., ge=1, le=21, description="Story points (1-21)")
|
|
90
|
+
confidence: Literal['low', 'medium', 'high'] = Field(..., description="Confidence level")
|
|
91
|
+
reasoning: str = Field(..., description="Reasoning for complexity assessment")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class AnalysisAndSelectionOutput(BaseModel):
|
|
95
|
+
"""Combined output from Step 1: Analysis + Resource Selection
|
|
96
|
+
|
|
97
|
+
This model combines the old Step 1 (Task Analysis) and Step 2 (Resource Discovery)
|
|
98
|
+
into a single output for the simplified 2-step workflow.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
# Task Analysis (from old Step 1)
|
|
102
|
+
task_summary: str = Field(..., description="Brief summary of the task")
|
|
103
|
+
required_capabilities: List[str] = Field(default_factory=list, description="Required capabilities (e.g., kubernetes, aws, python)")
|
|
104
|
+
task_type: str = Field(..., description="Type of task (e.g., deployment, investigation, automation)")
|
|
105
|
+
complexity_estimate: Literal["simple", "moderate", "complex"] = Field(..., description="Complexity assessment")
|
|
106
|
+
story_points_estimate: int = Field(..., ge=1, le=21, description="Story points (1-21)")
|
|
107
|
+
needs_multi_agent: bool = Field(..., description="Whether task requires multiple agents/team")
|
|
108
|
+
reasoning: str = Field(..., description="Reasoning for analysis and selection")
|
|
109
|
+
|
|
110
|
+
# Resource Selection (from old Step 2)
|
|
111
|
+
selected_entity_type: Literal["agent", "team"] = Field(..., description="Selected entity type")
|
|
112
|
+
selected_entity_id: str = Field(..., description="UUID of selected agent or team")
|
|
113
|
+
selected_entity_name: str = Field(..., description="Name of selected agent or team")
|
|
114
|
+
selection_reasoning: str = Field(..., description="Why this agent/team was selected")
|
|
115
|
+
|
|
116
|
+
# Selected agent runtime and model info (for preference-based selection)
|
|
117
|
+
selected_agent_runtime: Optional[str] = Field(None, description="Runtime of selected agent ('default' or 'claude_code')")
|
|
118
|
+
selected_agent_model_id: Optional[str] = Field(None, description="Model ID of selected agent (e.g., 'claude-sonnet-4')")
|
|
119
|
+
|
|
120
|
+
# Environment Selection
|
|
121
|
+
selected_environment_id: Optional[str] = Field(None, description="UUID of selected environment (if any)")
|
|
122
|
+
selected_environment_name: Optional[str] = Field(None, description="Name of selected environment")
|
|
123
|
+
selected_worker_queue_id: Optional[str] = Field(None, description="UUID of selected worker queue (if any)")
|
|
124
|
+
selected_worker_queue_name: Optional[str] = Field(None, description="Name of selected worker queue")
|
|
125
|
+
|
|
126
|
+
# Basic Cost Estimate
|
|
127
|
+
estimated_cost_usd: float = Field(..., description="Estimated cost in USD")
|
|
128
|
+
estimated_time_hours: float = Field(..., description="Estimated execution time in hours")
|
|
129
|
+
|
|
130
|
+
# Discovery Data (for Step 2 reference)
|
|
131
|
+
discovered_agents: List[Dict] = Field(default_factory=list, description="Agents discovered during selection")
|
|
132
|
+
discovered_teams: List[Dict] = Field(default_factory=list, description="Teams discovered during selection")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class AgentModelInfo(BaseModel):
|
|
136
|
+
"""Information about the model an agent will use"""
|
|
137
|
+
model_id: str # e.g., "claude-sonnet-4", "gpt-4o"
|
|
138
|
+
estimated_input_tokens: int
|
|
139
|
+
estimated_output_tokens: int
|
|
140
|
+
cost_per_1k_input_tokens: float
|
|
141
|
+
cost_per_1k_output_tokens: float
|
|
142
|
+
total_model_cost: float
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class ToolUsageInfo(BaseModel):
|
|
146
|
+
"""Expected tool usage for an agent"""
|
|
147
|
+
tool_name: str # e.g., "aws_s3", "kubectl", "bash"
|
|
148
|
+
estimated_calls: int
|
|
149
|
+
cost_per_call: float
|
|
150
|
+
total_tool_cost: float
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class TaskItem(BaseModel):
|
|
154
|
+
"""Detailed task breakdown item with dependencies and testing strategy"""
|
|
155
|
+
id: int = Field(..., description="Unique task ID for tracking dependencies")
|
|
156
|
+
title: str = Field(..., description="Short, clear task title")
|
|
157
|
+
description: str = Field(..., description="Brief overview of what needs to be done")
|
|
158
|
+
details: str = Field(..., description="Step-by-step implementation details, code snippets, and specific instructions")
|
|
159
|
+
test_strategy: str = Field(..., description="How to verify this task was completed correctly")
|
|
160
|
+
priority: Literal["high", "medium", "low"] = Field(default="medium", description="Task priority level")
|
|
161
|
+
dependencies: List[int] = Field(default_factory=list, description="List of task IDs that must be completed before this one")
|
|
162
|
+
status: Literal["pending", "in_progress", "done"] = Field(default="pending", description="Current task status")
|
|
163
|
+
subtasks: List["TaskItem"] = Field(default_factory=list, description="Optional nested subtasks")
|
|
164
|
+
# Execution routing - REQUIRED for plan execution
|
|
165
|
+
agent_id: str = Field(..., description="UUID of agent that will execute this task")
|
|
166
|
+
worker_queue_id: Optional[str] = Field(None, description="UUID of worker queue for execution routing (optional, can be assigned later)")
|
|
167
|
+
# Optional context-driven fields - planner decides what to use based on agent capabilities
|
|
168
|
+
skills_to_use: Optional[List[str]] = Field(default=None, description="Optional: Specific skills from agent's skillset to use (e.g., ['aws_s3', 'kubectl'])")
|
|
169
|
+
env_vars_to_use: Optional[List[str]] = Field(default=None, description="Optional: Environment variables from execution_environment to use (e.g., ['AWS_REGION', 'KUBECONFIG'])")
|
|
170
|
+
secrets_to_use: Optional[List[str]] = Field(default=None, description="Optional: Secrets/credentials from execution_environment to use (e.g., ['AWS_ACCESS_KEY_ID', 'GITHUB_TOKEN'])")
|
|
171
|
+
knowledge_references: Optional[List[str]] = Field(default=None, description="Optional: References to organizational knowledge used for this task")
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class TeamBreakdownItem(BaseModel):
|
|
175
|
+
"""Breakdown of work for a specific team/agent"""
|
|
176
|
+
team_id: Optional[str] = None
|
|
177
|
+
team_name: str
|
|
178
|
+
agent_id: Optional[str] = None
|
|
179
|
+
agent_name: Optional[str] = None
|
|
180
|
+
responsibilities: List[str]
|
|
181
|
+
estimated_time_hours: float
|
|
182
|
+
model_info: Optional[AgentModelInfo] = None
|
|
183
|
+
expected_tools: List[ToolUsageInfo] = []
|
|
184
|
+
agent_cost: float = 0.0 # Total cost for this agent (model + tools)
|
|
185
|
+
# REQUIRED: Detailed task breakdown with dependencies for execution
|
|
186
|
+
tasks: List[TaskItem] = Field(..., min_length=1, description="REQUIRED: Ordered list of tasks with dependencies. Must have at least one task for plan execution.")
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class RecommendedExecution(BaseModel):
|
|
190
|
+
"""AI recommendation for which entity should execute the task"""
|
|
191
|
+
entity_type: Literal['agent', 'team']
|
|
192
|
+
entity_id: str
|
|
193
|
+
entity_name: str
|
|
194
|
+
reasoning: str
|
|
195
|
+
recommended_environment_id: Optional[str] = None
|
|
196
|
+
recommended_environment_name: Optional[str] = None
|
|
197
|
+
recommended_worker_queue_id: Optional[str] = None
|
|
198
|
+
recommended_worker_queue_name: Optional[str] = None
|
|
199
|
+
execution_reasoning: Optional[str] = None
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class LLMCostBreakdown(BaseModel):
|
|
203
|
+
"""Detailed LLM cost breakdown by model"""
|
|
204
|
+
model_id: str
|
|
205
|
+
estimated_input_tokens: int
|
|
206
|
+
estimated_output_tokens: int
|
|
207
|
+
cost_per_1k_input_tokens: float
|
|
208
|
+
cost_per_1k_output_tokens: float
|
|
209
|
+
total_cost: float
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class ToolCostBreakdown(BaseModel):
|
|
213
|
+
"""Tool execution cost breakdown"""
|
|
214
|
+
category: str # e.g., "AWS APIs", "Database Queries", "External APIs"
|
|
215
|
+
tools: List[ToolUsageInfo]
|
|
216
|
+
category_total: float
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
class RuntimeCostBreakdown(BaseModel):
|
|
220
|
+
"""Runtime and compute costs"""
|
|
221
|
+
worker_execution_hours: float
|
|
222
|
+
cost_per_hour: float
|
|
223
|
+
total_cost: float
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class CostBreakdownItem(BaseModel):
|
|
227
|
+
"""Individual cost breakdown item (legacy, kept for backwards compatibility)"""
|
|
228
|
+
item: str
|
|
229
|
+
cost: float
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
class HumanResourceCost(BaseModel):
|
|
233
|
+
"""Human resource cost breakdown by role"""
|
|
234
|
+
role: str # e.g., "Senior DevOps Engineer", "Security Engineer"
|
|
235
|
+
hourly_rate: float # e.g., 150.00
|
|
236
|
+
estimated_hours: float # e.g., 8.0
|
|
237
|
+
total_cost: float # e.g., 1200.00
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
class CostEstimate(BaseModel):
|
|
241
|
+
"""Enhanced cost estimation for the task"""
|
|
242
|
+
estimated_cost_usd: float
|
|
243
|
+
# Legacy breakdown (keep for backwards compatibility)
|
|
244
|
+
breakdown: List[CostBreakdownItem] = []
|
|
245
|
+
# New detailed breakdowns
|
|
246
|
+
llm_costs: List[LLMCostBreakdown] = []
|
|
247
|
+
tool_costs: List[ToolCostBreakdown] = []
|
|
248
|
+
runtime_cost: Optional[RuntimeCostBreakdown] = None
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class RealizedSavings(BaseModel):
|
|
252
|
+
"""Realized savings by using Kubiya orchestration platform"""
|
|
253
|
+
# Without Kubiya (manual execution)
|
|
254
|
+
without_kubiya_cost: float # Total cost if done manually
|
|
255
|
+
without_kubiya_hours: float # Total time if done manually
|
|
256
|
+
without_kubiya_resources: List[HumanResourceCost] # Resource breakdown
|
|
257
|
+
|
|
258
|
+
# With Kubiya (AI orchestration)
|
|
259
|
+
with_kubiya_cost: float # AI execution cost
|
|
260
|
+
with_kubiya_hours: float # AI execution time
|
|
261
|
+
|
|
262
|
+
# Realized Savings
|
|
263
|
+
money_saved: float # Dollars saved
|
|
264
|
+
time_saved_hours: float # Hours saved
|
|
265
|
+
time_saved_percentage: int # Percentage of time saved
|
|
266
|
+
|
|
267
|
+
# Summary
|
|
268
|
+
savings_summary: str # Compelling savings narrative
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
class TaskPlanResponse(BaseModel):
|
|
272
|
+
"""AI-generated task plan"""
|
|
273
|
+
title: str
|
|
274
|
+
summary: str
|
|
275
|
+
complexity: ComplexityInfo
|
|
276
|
+
team_breakdown: List[TeamBreakdownItem]
|
|
277
|
+
recommended_execution: RecommendedExecution
|
|
278
|
+
cost_estimate: CostEstimate
|
|
279
|
+
realized_savings: RealizedSavings
|
|
280
|
+
risks: List[str] = []
|
|
281
|
+
prerequisites: List[str] = []
|
|
282
|
+
success_criteria: List[str] = []
|
|
283
|
+
# Optional fields for when AI needs clarification
|
|
284
|
+
has_questions: bool = False
|
|
285
|
+
questions: Optional[str] = None
|
|
286
|
+
# Engineered prompt for execution - includes full context from plan
|
|
287
|
+
execution_prompt: Optional[str] = Field(
|
|
288
|
+
None,
|
|
289
|
+
description="Detailed, engineered prompt for the executing agent that includes "
|
|
290
|
+
"original request, summary, responsibilities, prerequisites, "
|
|
291
|
+
"success criteria, risks, and execution context. Max 2000 words.",
|
|
292
|
+
max_length=10000 # ~2000 words
|
|
293
|
+
)
|
|
294
|
+
# Top-level environment selection fields for convenience (mirrors recommended_execution)
|
|
295
|
+
selected_environment_id: Optional[str] = Field(
|
|
296
|
+
None,
|
|
297
|
+
description="UUID of the selected environment for execution. "
|
|
298
|
+
"Convenience field - same value as recommended_execution.recommended_environment_id"
|
|
299
|
+
)
|
|
300
|
+
selected_environment_name: Optional[str] = Field(
|
|
301
|
+
None,
|
|
302
|
+
description="Name of the selected environment for execution. "
|
|
303
|
+
"Convenience field - same value as recommended_execution.recommended_environment_name"
|
|
304
|
+
)
|
|
305
|
+
# Selected agent/team runtime and model info
|
|
306
|
+
selected_agent_runtime: Optional[str] = Field(
|
|
307
|
+
None,
|
|
308
|
+
description="Runtime of the selected agent (e.g., 'default', 'claude_code')"
|
|
309
|
+
)
|
|
310
|
+
selected_agent_model_id: Optional[str] = Field(
|
|
311
|
+
None,
|
|
312
|
+
description="Model ID of the selected agent (e.g., 'claude-sonnet-4', 'gpt-4o')"
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
# ============================================================================
|
|
317
|
+
# Streaming Event Models
|
|
318
|
+
# ============================================================================
|
|
319
|
+
|
|
320
|
+
class StepStartedEvent(BaseModel):
|
|
321
|
+
"""Event emitted when a workflow step begins execution"""
|
|
322
|
+
event: Literal["step_started"] = "step_started"
|
|
323
|
+
step: int = Field(..., ge=1, le=4, description="Step number (1-4)")
|
|
324
|
+
step_name: str = Field(..., description="Human-readable step name")
|
|
325
|
+
step_description: str = Field(..., description="What this step does")
|
|
326
|
+
progress: int = Field(..., ge=0, le=100, description="Overall workflow progress percentage")
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class StepCompletedEvent(BaseModel):
|
|
330
|
+
"""Event emitted when a workflow step completes with its output"""
|
|
331
|
+
event: Literal["step_completed"] = "step_completed"
|
|
332
|
+
step: int = Field(..., ge=1, le=4, description="Step number (1-4)")
|
|
333
|
+
step_name: str = Field(..., description="Human-readable step name")
|
|
334
|
+
output: Dict = Field(..., description="Structured output from this step (TaskAnalysisOutput, etc.)")
|
|
335
|
+
progress: int = Field(..., ge=0, le=100, description="Overall workflow progress percentage")
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
class ToolCallEvent(BaseModel):
|
|
339
|
+
"""Event emitted when a tool begins execution"""
|
|
340
|
+
event: Literal["tool_call"] = "tool_call"
|
|
341
|
+
tool_id: str = Field(..., description="Unique ID for this tool execution")
|
|
342
|
+
tool_name: str = Field(..., description="Name of the tool being called")
|
|
343
|
+
tool_description: Optional[str] = Field(None, description="What the tool does")
|
|
344
|
+
arguments: Dict = Field(default_factory=dict, description="Arguments passed to the tool")
|
|
345
|
+
step: int = Field(..., ge=1, le=4, description="Which workflow step is executing this tool")
|
|
346
|
+
timestamp: str = Field(..., description="ISO 8601 timestamp of tool call")
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class ToolResultEvent(BaseModel):
|
|
350
|
+
"""Event emitted when a tool completes execution"""
|
|
351
|
+
event: Literal["tool_result"] = "tool_result"
|
|
352
|
+
tool_id: str = Field(..., description="Unique ID matching the tool_call event")
|
|
353
|
+
tool_name: str = Field(..., description="Name of the tool that executed")
|
|
354
|
+
status: Literal["success", "failed"] = Field(..., description="Tool execution status")
|
|
355
|
+
result: Optional[str] = Field(None, description="Tool output (truncated if large)")
|
|
356
|
+
error: Optional[str] = Field(None, description="Error message if status=failed")
|
|
357
|
+
duration: float = Field(..., description="Execution time in seconds")
|
|
358
|
+
step: int = Field(..., ge=1, le=4, description="Which workflow step executed this tool")
|
|
359
|
+
timestamp: str = Field(..., description="ISO 8601 timestamp of completion")
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
class ValidationErrorEvent(BaseModel):
|
|
363
|
+
"""Event emitted when step output validation fails"""
|
|
364
|
+
event: Literal["validation_error"] = "validation_error"
|
|
365
|
+
step: int = Field(..., ge=1, le=4, description="Which workflow step failed validation")
|
|
366
|
+
attempt: int = Field(..., ge=1, description="Retry attempt number (1-based)")
|
|
367
|
+
error: str = Field(..., description="Detailed validation error message explaining what went wrong")
|
|
368
|
+
retrying: bool = Field(..., description="Whether the step will be retried (true) or if this was the final attempt (false)")
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
# Rebuild models to support forward references (for TaskItem.subtasks)
|
|
372
|
+
TaskItem.model_rebuild()
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from sqlalchemy import Column, String, DateTime, Text, Enum as SQLEnum, ForeignKey, UniqueConstraint, ARRAY, Index, CheckConstraint, text
|
|
2
|
+
from sqlalchemy.dialects.postgresql import UUID as PG_UUID, JSONB
|
|
3
|
+
from sqlalchemy.orm import relationship
|
|
4
|
+
import enum
|
|
5
|
+
|
|
6
|
+
from control_plane_api.app.database import Base
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TeamStatus(str, enum.Enum):
|
|
10
|
+
"""Team status enumeration"""
|
|
11
|
+
|
|
12
|
+
ACTIVE = "active"
|
|
13
|
+
INACTIVE = "inactive"
|
|
14
|
+
ARCHIVED = "archived"
|
|
15
|
+
IDLE = "idle"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RuntimeType(str, enum.Enum):
|
|
19
|
+
"""Team runtime type enumeration"""
|
|
20
|
+
|
|
21
|
+
DEFAULT = "default"
|
|
22
|
+
CLAUDE_CODE = "claude_code"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class Team(Base):
|
|
26
|
+
"""Team model for storing team information"""
|
|
27
|
+
|
|
28
|
+
__tablename__ = "teams"
|
|
29
|
+
|
|
30
|
+
id = Column(PG_UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), nullable=False)
|
|
31
|
+
organization_id = Column(String(255), nullable=False)
|
|
32
|
+
name = Column(String(255), nullable=False)
|
|
33
|
+
description = Column(Text, nullable=True)
|
|
34
|
+
status = Column(String(50), server_default=text("'active'::character varying"), nullable=True)
|
|
35
|
+
coordination_type = Column(String(50), server_default=text("'sequential'::character varying"), nullable=True)
|
|
36
|
+
configuration = Column(JSONB, server_default=text("'{}'::jsonb"), nullable=True)
|
|
37
|
+
created_at = Column(DateTime(timezone=True), server_default=text("now()"), nullable=True)
|
|
38
|
+
updated_at = Column(DateTime(timezone=True), server_default=text("now()"), nullable=True)
|
|
39
|
+
last_active_at = Column(DateTime(timezone=True), nullable=True)
|
|
40
|
+
state = Column(JSONB, server_default=text("'{}'::jsonb"), nullable=True)
|
|
41
|
+
error_message = Column(Text, nullable=True)
|
|
42
|
+
visibility = Column(String(20), server_default=text("'private'::character varying"), nullable=True)
|
|
43
|
+
environment_id = Column(PG_UUID(as_uuid=True), ForeignKey("environments.id", ondelete="SET NULL"), nullable=True)
|
|
44
|
+
skill_ids = Column(ARRAY(PG_UUID(as_uuid=True)), server_default=text("'{}'::uuid[]"), nullable=True)
|
|
45
|
+
execution_environment = Column(JSONB, server_default=text("'{}'::jsonb"), nullable=False)
|
|
46
|
+
policy_ids = Column(ARRAY(String(255)), server_default=text("'{}'::character varying[]"), nullable=True)
|
|
47
|
+
runtime = Column(
|
|
48
|
+
SQLEnum(RuntimeType, name="runtimetype", values_callable=lambda x: [e.value for e in x]),
|
|
49
|
+
server_default=RuntimeType.DEFAULT.value,
|
|
50
|
+
nullable=False,
|
|
51
|
+
)
|
|
52
|
+
model_id = Column(String, nullable=True)
|
|
53
|
+
|
|
54
|
+
# Relationships
|
|
55
|
+
environment = relationship("Environment", foreign_keys=[environment_id])
|
|
56
|
+
agents = relationship("Agent", back_populates="team")
|
|
57
|
+
|
|
58
|
+
# Many-to-many relationship with environments
|
|
59
|
+
environment_associations = relationship(
|
|
60
|
+
"TeamEnvironment",
|
|
61
|
+
foreign_keys="TeamEnvironment.team_id",
|
|
62
|
+
cascade="all, delete-orphan",
|
|
63
|
+
lazy="select"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
__table_args__ = (
|
|
67
|
+
UniqueConstraint('organization_id', 'name', name='teams_organization_id_name_key'),
|
|
68
|
+
UniqueConstraint('organization_id', 'name', name='uq_team_org_name'),
|
|
69
|
+
CheckConstraint("visibility IN ('private', 'org')", name='teams_visibility_check'),
|
|
70
|
+
Index('idx_teams_status', 'status'),
|
|
71
|
+
Index('idx_teams_org', 'organization_id'),
|
|
72
|
+
Index('idx_teams_visibility', 'organization_id', 'visibility'),
|
|
73
|
+
Index('ix_teams_runtime', 'runtime'),
|
|
74
|
+
Index('idx_teams_environment_id', 'environment_id'),
|
|
75
|
+
Index('idx_teams_toolset_ids', 'skill_ids', postgresql_using='gin'),
|
|
76
|
+
Index('idx_teams_execution_environment', 'execution_environment', postgresql_using='gin'),
|
|
77
|
+
Index('idx_teams_policy_ids', 'policy_ids', postgresql_using='gin'),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
def __repr__(self):
|
|
81
|
+
return f"<Team(id={self.id}, name={self.name}, status={self.status})>"
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def environment_ids(self):
|
|
85
|
+
return [assoc.environment_id for assoc in self.environment_associations]
|
|
86
|
+
|