kubiya-control-plane-api 0.1.0__py3-none-any.whl → 0.3.4__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.
Potentially problematic release.
This version of kubiya-control-plane-api might be problematic. Click here for more details.
- control_plane_api/README.md +266 -0
- control_plane_api/__init__.py +0 -0
- control_plane_api/__version__.py +1 -0
- control_plane_api/alembic/README +1 -0
- control_plane_api/alembic/env.py +98 -0
- control_plane_api/alembic/script.py.mako +28 -0
- control_plane_api/alembic/versions/1382bec74309_initial_migration_with_all_models.py +251 -0
- control_plane_api/alembic/versions/1f54bc2a37e3_add_analytics_tables.py +162 -0
- control_plane_api/alembic/versions/2e4cb136dc10_rename_toolset_ids_to_skill_ids_in_teams.py +30 -0
- control_plane_api/alembic/versions/31cd69a644ce_add_skill_templates_table.py +28 -0
- control_plane_api/alembic/versions/89e127caa47d_add_jobs_and_job_executions_tables.py +161 -0
- control_plane_api/alembic/versions/add_llm_models_table.py +51 -0
- control_plane_api/alembic/versions/b0e10697f212_add_runtime_column_to_teams_simple.py +42 -0
- control_plane_api/alembic/versions/ce43b24b63bf_add_execution_trigger_source_and_fix_.py +155 -0
- control_plane_api/alembic/versions/d4eaf16e3f8d_rename_toolsets_to_skills.py +84 -0
- control_plane_api/alembic/versions/efa2dc427da1_rename_metadata_to_custom_metadata.py +32 -0
- control_plane_api/alembic/versions/f973b431d1ce_add_workflow_executor_to_skill_types.py +44 -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 +379 -0
- control_plane_api/app/activities/team_activities.py +410 -0
- control_plane_api/app/activities/temporal_cloud_activities.py +577 -0
- control_plane_api/app/config/__init__.py +35 -0
- control_plane_api/app/config/api_config.py +354 -0
- control_plane_api/app/config/model_pricing.py +318 -0
- control_plane_api/app/config.py +95 -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/job_executor.py +312 -0
- control_plane_api/app/lib/kubiya_client.py +235 -0
- control_plane_api/app/lib/litellm_pricing.py +166 -0
- control_plane_api/app/lib/planning_tools/__init__.py +22 -0
- control_plane_api/app/lib/planning_tools/agents.py +155 -0
- control_plane_api/app/lib/planning_tools/base.py +189 -0
- control_plane_api/app/lib/planning_tools/environments.py +214 -0
- control_plane_api/app/lib/planning_tools/resources.py +240 -0
- control_plane_api/app/lib/planning_tools/teams.py +198 -0
- control_plane_api/app/lib/policy_enforcer_client.py +939 -0
- control_plane_api/app/lib/redis_client.py +436 -0
- control_plane_api/app/lib/supabase.py +71 -0
- control_plane_api/app/lib/temporal_client.py +138 -0
- control_plane_api/app/lib/validation/__init__.py +20 -0
- control_plane_api/app/lib/validation/runtime_validation.py +287 -0
- control_plane_api/app/main.py +128 -0
- control_plane_api/app/middleware/__init__.py +8 -0
- control_plane_api/app/middleware/auth.py +513 -0
- control_plane_api/app/middleware/exception_handler.py +267 -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 +27 -0
- control_plane_api/app/models/agent.py +79 -0
- control_plane_api/app/models/analytics.py +206 -0
- control_plane_api/app/models/associations.py +81 -0
- control_plane_api/app/models/environment.py +63 -0
- control_plane_api/app/models/execution.py +93 -0
- control_plane_api/app/models/job.py +179 -0
- control_plane_api/app/models/llm_model.py +75 -0
- control_plane_api/app/models/presence.py +49 -0
- control_plane_api/app/models/project.py +47 -0
- control_plane_api/app/models/session.py +38 -0
- control_plane_api/app/models/team.py +66 -0
- control_plane_api/app/models/workflow.py +55 -0
- control_plane_api/app/policies/README.md +121 -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_restrictions.rego +86 -0
- control_plane_api/app/routers/__init__.py +4 -0
- control_plane_api/app/routers/agents.py +364 -0
- control_plane_api/app/routers/agents_v2.py +1260 -0
- control_plane_api/app/routers/analytics.py +1014 -0
- control_plane_api/app/routers/context_manager.py +562 -0
- control_plane_api/app/routers/environment_context.py +270 -0
- control_plane_api/app/routers/environments.py +715 -0
- control_plane_api/app/routers/execution_environment.py +517 -0
- control_plane_api/app/routers/executions.py +1911 -0
- control_plane_api/app/routers/health.py +92 -0
- control_plane_api/app/routers/health_v2.py +326 -0
- control_plane_api/app/routers/integrations.py +274 -0
- control_plane_api/app/routers/jobs.py +1344 -0
- control_plane_api/app/routers/models.py +82 -0
- control_plane_api/app/routers/models_v2.py +361 -0
- control_plane_api/app/routers/policies.py +639 -0
- control_plane_api/app/routers/presence.py +234 -0
- control_plane_api/app/routers/projects.py +902 -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 +155 -0
- control_plane_api/app/routers/skills.py +1001 -0
- control_plane_api/app/routers/skills_definitions.py +140 -0
- control_plane_api/app/routers/task_planning.py +1256 -0
- control_plane_api/app/routers/task_queues.py +654 -0
- control_plane_api/app/routers/team_context.py +270 -0
- control_plane_api/app/routers/teams.py +1400 -0
- control_plane_api/app/routers/worker_queues.py +1545 -0
- control_plane_api/app/routers/workers.py +935 -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/job_schemas.py +295 -0
- control_plane_api/app/services/__init__.py +1 -0
- control_plane_api/app/services/agno_service.py +619 -0
- control_plane_api/app/services/litellm_service.py +190 -0
- control_plane_api/app/services/policy_service.py +525 -0
- control_plane_api/app/services/temporal_cloud_provisioning.py +150 -0
- control_plane_api/app/skills/__init__.py +44 -0
- control_plane_api/app/skills/base.py +229 -0
- control_plane_api/app/skills/business_intelligence.py +189 -0
- control_plane_api/app/skills/data_visualization.py +154 -0
- control_plane_api/app/skills/docker.py +104 -0
- control_plane_api/app/skills/file_generation.py +94 -0
- control_plane_api/app/skills/file_system.py +110 -0
- control_plane_api/app/skills/python.py +92 -0
- control_plane_api/app/skills/registry.py +65 -0
- control_plane_api/app/skills/shell.py +102 -0
- control_plane_api/app/skills/workflow_executor.py +469 -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 +507 -0
- control_plane_api/app/workflows/agent_execution_with_skills.py +222 -0
- control_plane_api/app/workflows/namespace_provisioning.py +326 -0
- control_plane_api/app/workflows/team_execution.py +399 -0
- control_plane_api/scripts/seed_models.py +239 -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 +1241 -0
- control_plane_api/worker/activities/approval_activities.py +234 -0
- control_plane_api/worker/activities/runtime_activities.py +388 -0
- control_plane_api/worker/activities/skill_activities.py +267 -0
- control_plane_api/worker/activities/team_activities.py +1217 -0
- control_plane_api/worker/config/__init__.py +31 -0
- control_plane_api/worker/config/worker_config.py +275 -0
- control_plane_api/worker/control_plane_client.py +529 -0
- control_plane_api/worker/examples/analytics_integration_example.py +362 -0
- control_plane_api/worker/models/__init__.py +1 -0
- control_plane_api/worker/models/inputs.py +89 -0
- control_plane_api/worker/runtimes/__init__.py +31 -0
- control_plane_api/worker/runtimes/base.py +789 -0
- control_plane_api/worker/runtimes/claude_code_runtime.py +1443 -0
- control_plane_api/worker/runtimes/default_runtime.py +617 -0
- control_plane_api/worker/runtimes/factory.py +173 -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_executor.py +422 -0
- control_plane_api/worker/services/agent_executor_v2.py +383 -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/data_visualization.py +827 -0
- control_plane_api/worker/services/jira_tools.py +257 -0
- control_plane_api/worker/services/runtime_analytics.py +328 -0
- control_plane_api/worker/services/session_service.py +194 -0
- control_plane_api/worker/services/skill_factory.py +175 -0
- control_plane_api/worker/services/team_executor.py +574 -0
- control_plane_api/worker/services/team_executor_v2.py +465 -0
- control_plane_api/worker/services/workflow_executor_tools.py +1418 -0
- control_plane_api/worker/tests/__init__.py +1 -0
- control_plane_api/worker/tests/e2e/__init__.py +0 -0
- control_plane_api/worker/tests/e2e/test_execution_flow.py +571 -0
- control_plane_api/worker/tests/integration/__init__.py +0 -0
- control_plane_api/worker/tests/integration/test_control_plane_integration.py +308 -0
- control_plane_api/worker/tests/unit/__init__.py +0 -0
- control_plane_api/worker/tests/unit/test_control_plane_client.py +401 -0
- control_plane_api/worker/utils/__init__.py +1 -0
- control_plane_api/worker/utils/chunk_batcher.py +305 -0
- control_plane_api/worker/utils/retry_utils.py +60 -0
- control_plane_api/worker/utils/streaming_utils.py +373 -0
- control_plane_api/worker/worker.py +753 -0
- control_plane_api/worker/workflows/__init__.py +0 -0
- control_plane_api/worker/workflows/agent_execution.py +589 -0
- control_plane_api/worker/workflows/team_execution.py +429 -0
- kubiya_control_plane_api-0.3.4.dist-info/METADATA +229 -0
- kubiya_control_plane_api-0.3.4.dist-info/RECORD +182 -0
- kubiya_control_plane_api-0.3.4.dist-info/entry_points.txt +2 -0
- kubiya_control_plane_api-0.3.4.dist-info/top_level.txt +1 -0
- kubiya_control_plane_api-0.1.0.dist-info/METADATA +0 -66
- kubiya_control_plane_api-0.1.0.dist-info/RECORD +0 -5
- kubiya_control_plane_api-0.1.0.dist-info/top_level.txt +0 -1
- {kubiya_control_plane_api-0.1.0.dist-info/licenses → control_plane_api}/LICENSE +0 -0
- {kubiya_control_plane_api-0.1.0.dist-info → kubiya_control_plane_api-0.3.4.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Secrets Router - Proxy to Kubiya Secrets API
|
|
3
|
+
|
|
4
|
+
This router provides access to organization secrets from Kubiya API.
|
|
5
|
+
Secrets are used in the execution environment for agents and teams.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import httpx
|
|
9
|
+
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
10
|
+
from typing import Optional, List, Dict, Any
|
|
11
|
+
import structlog
|
|
12
|
+
|
|
13
|
+
from control_plane_api.app.middleware.auth import get_current_organization
|
|
14
|
+
from control_plane_api.app.lib.kubiya_client import get_kubiya_client, KUBIYA_API_BASE
|
|
15
|
+
|
|
16
|
+
logger = structlog.get_logger()
|
|
17
|
+
|
|
18
|
+
router = APIRouter(prefix="/secrets", tags=["secrets"])
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@router.get("")
|
|
22
|
+
async def list_secrets(
|
|
23
|
+
request: Request,
|
|
24
|
+
organization: dict = Depends(get_current_organization),
|
|
25
|
+
) -> List[Dict[str, Any]]:
|
|
26
|
+
"""
|
|
27
|
+
List all secrets available in the organization.
|
|
28
|
+
|
|
29
|
+
This endpoint proxies to Kubiya Secrets API and returns a list of secret metadata
|
|
30
|
+
(names, IDs, descriptions) without exposing actual secret values.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
List of secrets with metadata (no values)
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
token = request.state.kubiya_token
|
|
37
|
+
auth_type = getattr(request.state, "kubiya_auth_type", "Bearer")
|
|
38
|
+
org_id = organization["id"]
|
|
39
|
+
|
|
40
|
+
# Prepare headers for Kubiya API
|
|
41
|
+
headers = {
|
|
42
|
+
"Authorization": f"{auth_type} {token}",
|
|
43
|
+
"Accept": "application/json",
|
|
44
|
+
"Content-Type": "application/json",
|
|
45
|
+
"X-Kubiya-Client": "agent-control-plane",
|
|
46
|
+
"X-Organization-ID": org_id,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# Call Kubiya Secrets API
|
|
50
|
+
async with httpx.AsyncClient(timeout=30.0) as client:
|
|
51
|
+
response = await client.get(
|
|
52
|
+
f"{KUBIYA_API_BASE}/api/v2/secrets",
|
|
53
|
+
headers=headers,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
if response.status_code == 200:
|
|
57
|
+
secrets = response.json()
|
|
58
|
+
logger.info(
|
|
59
|
+
"secrets_fetched",
|
|
60
|
+
org_id=org_id,
|
|
61
|
+
count=len(secrets),
|
|
62
|
+
)
|
|
63
|
+
return secrets
|
|
64
|
+
else:
|
|
65
|
+
logger.error(
|
|
66
|
+
"kubiya_api_error",
|
|
67
|
+
status=response.status_code,
|
|
68
|
+
response=response.text[:500],
|
|
69
|
+
)
|
|
70
|
+
raise HTTPException(
|
|
71
|
+
status_code=response.status_code,
|
|
72
|
+
detail=f"Failed to fetch secrets from Kubiya API: {response.text[:200]}",
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
except httpx.TimeoutException:
|
|
76
|
+
logger.error("kubiya_api_timeout", endpoint="secrets")
|
|
77
|
+
raise HTTPException(status_code=504, detail="Kubiya API request timed out")
|
|
78
|
+
except httpx.RequestError as e:
|
|
79
|
+
logger.error("kubiya_api_request_error", error=str(e))
|
|
80
|
+
raise HTTPException(status_code=502, detail=f"Failed to connect to Kubiya API: {str(e)}")
|
|
81
|
+
except Exception as e:
|
|
82
|
+
logger.error("unexpected_error", error=str(e), error_type=type(e).__name__)
|
|
83
|
+
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@router.get("/value/{name}")
|
|
87
|
+
async def get_secret_value(
|
|
88
|
+
name: str,
|
|
89
|
+
request: Request,
|
|
90
|
+
organization: dict = Depends(get_current_organization),
|
|
91
|
+
) -> Dict[str, Any]:
|
|
92
|
+
"""
|
|
93
|
+
Get the value of a specific secret.
|
|
94
|
+
|
|
95
|
+
This endpoint is used by workers at runtime to resolve secret values.
|
|
96
|
+
Should be called securely from backend only, not exposed to frontend.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
name: Secret name to retrieve
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
{"value": "secret_value"}
|
|
103
|
+
"""
|
|
104
|
+
try:
|
|
105
|
+
token = request.state.kubiya_token
|
|
106
|
+
auth_type = getattr(request.state, "kubiya_auth_type", "Bearer")
|
|
107
|
+
org_id = organization["id"]
|
|
108
|
+
|
|
109
|
+
# Prepare headers for Kubiya API
|
|
110
|
+
headers = {
|
|
111
|
+
"Authorization": f"{auth_type} {token}",
|
|
112
|
+
"Accept": "application/json",
|
|
113
|
+
"Content-Type": "application/json",
|
|
114
|
+
"X-Kubiya-Client": "agent-control-plane",
|
|
115
|
+
"X-Organization-ID": org_id,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
# Call Kubiya Secrets API
|
|
119
|
+
async with httpx.AsyncClient(timeout=30.0) as client:
|
|
120
|
+
response = await client.get(
|
|
121
|
+
f"{KUBIYA_API_BASE}/api/v2/secrets/get_value/{name}",
|
|
122
|
+
headers=headers,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if response.status_code == 200:
|
|
126
|
+
# Kubiya API returns plain text (the secret value), not JSON
|
|
127
|
+
secret_value = response.text
|
|
128
|
+
logger.info(
|
|
129
|
+
"secret_value_fetched",
|
|
130
|
+
org_id=org_id,
|
|
131
|
+
secret_name=name[:20],
|
|
132
|
+
)
|
|
133
|
+
# Return in a structured format for consistency
|
|
134
|
+
return {"value": secret_value}
|
|
135
|
+
else:
|
|
136
|
+
logger.error(
|
|
137
|
+
"kubiya_api_error",
|
|
138
|
+
status=response.status_code,
|
|
139
|
+
secret_name=name[:20],
|
|
140
|
+
response=response.text[:500],
|
|
141
|
+
)
|
|
142
|
+
raise HTTPException(
|
|
143
|
+
status_code=response.status_code,
|
|
144
|
+
detail=f"Failed to fetch secret value from Kubiya API: {response.text[:200]}",
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
except httpx.TimeoutException:
|
|
148
|
+
logger.error("kubiya_api_timeout", endpoint=f"secrets/value/{name[:20]}")
|
|
149
|
+
raise HTTPException(status_code=504, detail="Kubiya API request timed out")
|
|
150
|
+
except httpx.RequestError as e:
|
|
151
|
+
logger.error("kubiya_api_request_error", error=str(e))
|
|
152
|
+
raise HTTPException(status_code=502, detail=f"Failed to connect to Kubiya API: {str(e)}")
|
|
153
|
+
except Exception as e:
|
|
154
|
+
logger.error("unexpected_error", error=str(e), error_type=type(e).__name__)
|
|
155
|
+
raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
|