agent_os_kernel 3.1.0__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.
- agent_control_plane/__init__.py +662 -0
- agent_control_plane/a2a_adapter.py +543 -0
- agent_control_plane/adapter.py +417 -0
- agent_control_plane/agent_hibernation.py +394 -0
- agent_control_plane/agent_kernel.py +470 -0
- agent_control_plane/compliance.py +720 -0
- agent_control_plane/constraint_graphs.py +478 -0
- agent_control_plane/control_plane.py +854 -0
- agent_control_plane/example_executors.py +195 -0
- agent_control_plane/execution_engine.py +231 -0
- agent_control_plane/flight_recorder.py +846 -0
- agent_control_plane/governance_layer.py +435 -0
- agent_control_plane/hf_utils.py +563 -0
- agent_control_plane/interfaces/__init__.py +55 -0
- agent_control_plane/interfaces/kernel_interface.py +361 -0
- agent_control_plane/interfaces/plugin_interface.py +497 -0
- agent_control_plane/interfaces/protocol_interfaces.py +387 -0
- agent_control_plane/kernel_space.py +1009 -0
- agent_control_plane/langchain_adapter.py +424 -0
- agent_control_plane/lifecycle.py +3113 -0
- agent_control_plane/mcp_adapter.py +653 -0
- agent_control_plane/ml_safety.py +563 -0
- agent_control_plane/multimodal.py +727 -0
- agent_control_plane/mute_agent.py +422 -0
- agent_control_plane/observability.py +787 -0
- agent_control_plane/orchestrator.py +482 -0
- agent_control_plane/plugin_registry.py +750 -0
- agent_control_plane/policy_engine.py +954 -0
- agent_control_plane/process_isolation.py +777 -0
- agent_control_plane/shadow_mode.py +310 -0
- agent_control_plane/signals.py +493 -0
- agent_control_plane/supervisor_agents.py +430 -0
- agent_control_plane/time_travel_debugger.py +557 -0
- agent_control_plane/tool_registry.py +452 -0
- agent_control_plane/vfs.py +697 -0
- agent_kernel/__init__.py +69 -0
- agent_kernel/analyzer.py +435 -0
- agent_kernel/auditor.py +36 -0
- agent_kernel/completeness_auditor.py +237 -0
- agent_kernel/detector.py +203 -0
- agent_kernel/kernel.py +744 -0
- agent_kernel/memory_manager.py +85 -0
- agent_kernel/models.py +374 -0
- agent_kernel/nudge_mechanism.py +263 -0
- agent_kernel/outcome_analyzer.py +338 -0
- agent_kernel/patcher.py +582 -0
- agent_kernel/semantic_analyzer.py +316 -0
- agent_kernel/semantic_purge.py +349 -0
- agent_kernel/simulator.py +449 -0
- agent_kernel/teacher.py +85 -0
- agent_kernel/triage.py +152 -0
- agent_os/__init__.py +409 -0
- agent_os/_adversarial_impl.py +200 -0
- agent_os/_circuit_breaker_impl.py +232 -0
- agent_os/_mcp_metrics.py +193 -0
- agent_os/adversarial.py +20 -0
- agent_os/agents_compat.py +490 -0
- agent_os/audit_logger.py +135 -0
- agent_os/base_agent.py +651 -0
- agent_os/circuit_breaker.py +34 -0
- agent_os/cli/__init__.py +659 -0
- agent_os/cli/cmd_audit.py +128 -0
- agent_os/cli/cmd_init.py +152 -0
- agent_os/cli/cmd_policy.py +41 -0
- agent_os/cli/cmd_policy_gen.py +180 -0
- agent_os/cli/cmd_validate.py +258 -0
- agent_os/cli/mcp_scan.py +265 -0
- agent_os/cli/output.py +192 -0
- agent_os/cli/policy_checker.py +330 -0
- agent_os/compat.py +74 -0
- agent_os/constraint_graph.py +234 -0
- agent_os/content_governance.py +140 -0
- agent_os/context_budget.py +305 -0
- agent_os/credential_redactor.py +224 -0
- agent_os/diff_policy.py +89 -0
- agent_os/egress_policy.py +159 -0
- agent_os/escalation.py +276 -0
- agent_os/event_bus.py +124 -0
- agent_os/exceptions.py +180 -0
- agent_os/execution_context_policy.py +141 -0
- agent_os/github_enterprise.py +96 -0
- agent_os/health.py +20 -0
- agent_os/integrations/__init__.py +279 -0
- agent_os/integrations/a2a_adapter.py +279 -0
- agent_os/integrations/agent_lightning/__init__.py +30 -0
- agent_os/integrations/anthropic_adapter.py +420 -0
- agent_os/integrations/autogen_adapter.py +620 -0
- agent_os/integrations/base.py +1137 -0
- agent_os/integrations/compat.py +229 -0
- agent_os/integrations/config.py +98 -0
- agent_os/integrations/conversation_guardian.py +957 -0
- agent_os/integrations/crewai_adapter.py +467 -0
- agent_os/integrations/drift_detector.py +425 -0
- agent_os/integrations/dry_run.py +124 -0
- agent_os/integrations/escalation.py +582 -0
- agent_os/integrations/gemini_adapter.py +364 -0
- agent_os/integrations/google_adk_adapter.py +633 -0
- agent_os/integrations/guardrails_adapter.py +394 -0
- agent_os/integrations/health.py +197 -0
- agent_os/integrations/langchain_adapter.py +654 -0
- agent_os/integrations/llamafirewall.py +343 -0
- agent_os/integrations/llamaindex_adapter.py +188 -0
- agent_os/integrations/logging.py +191 -0
- agent_os/integrations/maf_adapter.py +631 -0
- agent_os/integrations/mistral_adapter.py +365 -0
- agent_os/integrations/openai_adapter.py +816 -0
- agent_os/integrations/openai_agents_sdk.py +406 -0
- agent_os/integrations/policy_compose.py +171 -0
- agent_os/integrations/profiling.py +144 -0
- agent_os/integrations/pydantic_ai_adapter.py +420 -0
- agent_os/integrations/rate_limiter.py +130 -0
- agent_os/integrations/rbac.py +143 -0
- agent_os/integrations/registry.py +113 -0
- agent_os/integrations/scope_guard.py +303 -0
- agent_os/integrations/semantic_kernel_adapter.py +769 -0
- agent_os/integrations/smolagents_adapter.py +629 -0
- agent_os/integrations/templates.py +178 -0
- agent_os/integrations/token_budget.py +134 -0
- agent_os/integrations/tool_aliases.py +190 -0
- agent_os/integrations/webhooks.py +177 -0
- agent_os/lite.py +208 -0
- agent_os/mcp_gateway.py +385 -0
- agent_os/mcp_message_signer.py +273 -0
- agent_os/mcp_protocols.py +161 -0
- agent_os/mcp_response_scanner.py +232 -0
- agent_os/mcp_security.py +924 -0
- agent_os/mcp_session_auth.py +231 -0
- agent_os/mcp_sliding_rate_limiter.py +184 -0
- agent_os/memory_guard.py +409 -0
- agent_os/metrics.py +134 -0
- agent_os/mute.py +428 -0
- agent_os/mute_agent.py +209 -0
- agent_os/policies/__init__.py +77 -0
- agent_os/policies/async_evaluator.py +275 -0
- agent_os/policies/backends.py +670 -0
- agent_os/policies/bridge.py +169 -0
- agent_os/policies/budget.py +85 -0
- agent_os/policies/cli.py +294 -0
- agent_os/policies/conflict_resolution.py +270 -0
- agent_os/policies/data_classification.py +252 -0
- agent_os/policies/evaluator.py +239 -0
- agent_os/policies/policy_schema.json +228 -0
- agent_os/policies/rate_limiting.py +145 -0
- agent_os/policies/schema.py +115 -0
- agent_os/policies/shared.py +331 -0
- agent_os/prompt_injection.py +694 -0
- agent_os/providers.py +182 -0
- agent_os/py.typed +0 -0
- agent_os/retry.py +81 -0
- agent_os/reversibility.py +251 -0
- agent_os/sandbox.py +432 -0
- agent_os/sandbox_provider.py +140 -0
- agent_os/secure_codegen.py +525 -0
- agent_os/security_skills.py +538 -0
- agent_os/semantic_policy.py +422 -0
- agent_os/server/__init__.py +15 -0
- agent_os/server/__main__.py +25 -0
- agent_os/server/app.py +277 -0
- agent_os/server/models.py +104 -0
- agent_os/shift_left_metrics.py +130 -0
- agent_os/stateless.py +742 -0
- agent_os/supervisor.py +148 -0
- agent_os/task_outcome.py +148 -0
- agent_os/transparency.py +181 -0
- agent_os/trust_root.py +128 -0
- agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
- agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
- agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
- agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
- agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
- agent_os_observability/__init__.py +27 -0
- agent_os_observability/dashboards.py +898 -0
- agent_os_observability/metrics.py +398 -0
- agent_os_observability/server.py +223 -0
- agent_os_observability/tracer.py +232 -0
- agent_primitives/__init__.py +24 -0
- agent_primitives/failures.py +84 -0
- agent_primitives/py.typed +0 -0
- amb_core/__init__.py +177 -0
- amb_core/adapters/__init__.py +57 -0
- amb_core/adapters/aws_sqs_broker.py +376 -0
- amb_core/adapters/azure_servicebus_broker.py +340 -0
- amb_core/adapters/kafka_broker.py +260 -0
- amb_core/adapters/nats_broker.py +285 -0
- amb_core/adapters/rabbitmq_broker.py +235 -0
- amb_core/adapters/redis_broker.py +262 -0
- amb_core/broker.py +145 -0
- amb_core/bus.py +481 -0
- amb_core/cloudevents.py +509 -0
- amb_core/dlq.py +345 -0
- amb_core/hf_utils.py +536 -0
- amb_core/memory_broker.py +410 -0
- amb_core/models.py +141 -0
- amb_core/persistence.py +529 -0
- amb_core/schema.py +294 -0
- amb_core/tracing.py +358 -0
- atr/__init__.py +640 -0
- atr/access.py +348 -0
- atr/composition.py +645 -0
- atr/decorator.py +357 -0
- atr/executor.py +384 -0
- atr/health.py +557 -0
- atr/hf_utils.py +449 -0
- atr/injection.py +422 -0
- atr/metrics.py +440 -0
- atr/policies.py +403 -0
- atr/py.typed +2 -0
- atr/registry.py +452 -0
- atr/schema.py +480 -0
- atr/tools/safe/__init__.py +75 -0
- atr/tools/safe/calculator.py +467 -0
- atr/tools/safe/datetime_tool.py +443 -0
- atr/tools/safe/file_reader.py +402 -0
- atr/tools/safe/http_client.py +316 -0
- atr/tools/safe/json_parser.py +374 -0
- atr/tools/safe/text_tool.py +537 -0
- atr/tools/safe/toolkit.py +175 -0
- caas/__init__.py +162 -0
- caas/api/__init__.py +7 -0
- caas/api/server.py +1328 -0
- caas/caching.py +834 -0
- caas/cli.py +210 -0
- caas/conversation.py +223 -0
- caas/decay.py +72 -0
- caas/detection/__init__.py +9 -0
- caas/detection/detector.py +238 -0
- caas/enrichment.py +130 -0
- caas/gateway/__init__.py +27 -0
- caas/gateway/trust_gateway.py +474 -0
- caas/hf_utils.py +479 -0
- caas/ingestion/__init__.py +23 -0
- caas/ingestion/processors.py +253 -0
- caas/ingestion/structure_parser.py +188 -0
- caas/models.py +356 -0
- caas/pragmatic_truth.py +444 -0
- caas/routing/__init__.py +10 -0
- caas/routing/heuristic_router.py +58 -0
- caas/storage/__init__.py +9 -0
- caas/storage/store.py +389 -0
- caas/triad.py +213 -0
- caas/tuning/__init__.py +9 -0
- caas/tuning/tuner.py +329 -0
- caas/vfs/__init__.py +14 -0
- caas/vfs/filesystem.py +452 -0
- cmvk/__init__.py +218 -0
- cmvk/audit.py +402 -0
- cmvk/benchmarks.py +478 -0
- cmvk/constitutional.py +904 -0
- cmvk/hf_utils.py +301 -0
- cmvk/metrics.py +473 -0
- cmvk/profiles.py +300 -0
- cmvk/py.typed +0 -0
- cmvk/types.py +12 -0
- cmvk/verification.py +956 -0
- emk/__init__.py +89 -0
- emk/causal.py +352 -0
- emk/hf_utils.py +421 -0
- emk/indexer.py +83 -0
- emk/py.typed +0 -0
- emk/schema.py +204 -0
- emk/sleep_cycle.py +347 -0
- emk/store.py +281 -0
- iatp/__init__.py +166 -0
- iatp/attestation.py +461 -0
- iatp/cli.py +317 -0
- iatp/hf_utils.py +472 -0
- iatp/ipc_pipes.py +580 -0
- iatp/main.py +412 -0
- iatp/models/__init__.py +447 -0
- iatp/policy_engine.py +337 -0
- iatp/py.typed +2 -0
- iatp/recovery.py +321 -0
- iatp/security/__init__.py +270 -0
- iatp/sidecar/__init__.py +519 -0
- iatp/telemetry/__init__.py +164 -0
- iatp/tests/__init__.py +1 -0
- iatp/tests/test_attestation.py +370 -0
- iatp/tests/test_cli.py +131 -0
- iatp/tests/test_ed25519_attestation.py +211 -0
- iatp/tests/test_models.py +130 -0
- iatp/tests/test_policy_engine.py +347 -0
- iatp/tests/test_recovery.py +281 -0
- iatp/tests/test_security.py +222 -0
- iatp/tests/test_sidecar.py +167 -0
- iatp/tests/test_telemetry.py +175 -0
- mcp_kernel_server/__init__.py +28 -0
- mcp_kernel_server/cli.py +274 -0
- mcp_kernel_server/resources.py +217 -0
- mcp_kernel_server/server.py +564 -0
- mcp_kernel_server/tools.py +1174 -0
- mute_agent/__init__.py +68 -0
- mute_agent/core/__init__.py +1 -0
- mute_agent/core/execution_agent.py +166 -0
- mute_agent/core/handshake_protocol.py +201 -0
- mute_agent/core/reasoning_agent.py +238 -0
- mute_agent/knowledge_graph/__init__.py +1 -0
- mute_agent/knowledge_graph/graph_elements.py +65 -0
- mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
- mute_agent/knowledge_graph/subgraph.py +224 -0
- mute_agent/listener/__init__.py +43 -0
- mute_agent/listener/adapters/__init__.py +31 -0
- mute_agent/listener/adapters/base_adapter.py +189 -0
- mute_agent/listener/adapters/caas_adapter.py +344 -0
- mute_agent/listener/adapters/control_plane_adapter.py +436 -0
- mute_agent/listener/adapters/iatp_adapter.py +332 -0
- mute_agent/listener/adapters/scak_adapter.py +251 -0
- mute_agent/listener/listener.py +610 -0
- mute_agent/listener/state_observer.py +436 -0
- mute_agent/listener/threshold_config.py +313 -0
- mute_agent/super_system/__init__.py +1 -0
- mute_agent/super_system/router.py +204 -0
- mute_agent/visualization/__init__.py +10 -0
- mute_agent/visualization/graph_debugger.py +502 -0
- nexus/README.md +60 -0
- nexus/__init__.py +51 -0
- nexus/arbiter.py +359 -0
- nexus/client.py +466 -0
- nexus/dmz.py +444 -0
- nexus/escrow.py +430 -0
- nexus/exceptions.py +286 -0
- nexus/pyproject.toml +36 -0
- nexus/registry.py +393 -0
- nexus/reputation.py +425 -0
- nexus/schemas/__init__.py +51 -0
- nexus/schemas/compliance.py +276 -0
- nexus/schemas/escrow.py +251 -0
- nexus/schemas/manifest.py +225 -0
- nexus/schemas/receipt.py +208 -0
- nexus/tests/__init__.py +0 -0
- nexus/tests/conftest.py +146 -0
- nexus/tests/test_arbiter.py +192 -0
- nexus/tests/test_dmz.py +194 -0
- nexus/tests/test_escrow.py +276 -0
- nexus/tests/test_exceptions.py +225 -0
- nexus/tests/test_registry.py +232 -0
- nexus/tests/test_reputation.py +328 -0
- nexus/tests/test_schemas.py +295 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
Trust Gateway: The Middleware Gap Solution
|
|
6
|
+
|
|
7
|
+
The Naive Approach:
|
|
8
|
+
"Let's use a startup's API that auto-routes our traffic to the cheapest model."
|
|
9
|
+
|
|
10
|
+
The Engineering Reality:
|
|
11
|
+
No Enterprise CISO will send their proprietary data to a random middleware startup
|
|
12
|
+
just to save 30% on tokens. The risk of data leakage is too high.
|
|
13
|
+
|
|
14
|
+
This layer—the "Model Gateway"—is critical, but it requires massive trust.
|
|
15
|
+
|
|
16
|
+
The Opportunity:
|
|
17
|
+
There is a gap here, but it's not for a SaaS. It's for Infrastructure.
|
|
18
|
+
|
|
19
|
+
The Solution:
|
|
20
|
+
Build an On-Prem / Private Cloud Router that enterprises can deploy within their
|
|
21
|
+
own infrastructure. The winner won't be the one with the smartest routing algorithm;
|
|
22
|
+
it will be the one the Enterprise trusts with the keys to the kingdom.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from enum import Enum
|
|
26
|
+
from typing import Dict, List, Optional, Any
|
|
27
|
+
from datetime import datetime
|
|
28
|
+
from pydantic import BaseModel, Field
|
|
29
|
+
import uuid
|
|
30
|
+
import json
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class DeploymentMode(str, Enum):
|
|
34
|
+
"""Deployment modes for Trust Gateway."""
|
|
35
|
+
ON_PREM = "on_prem" # Deployed on customer's own infrastructure
|
|
36
|
+
PRIVATE_CLOUD = "private_cloud" # Deployed in customer's private cloud (AWS VPC, Azure VNet, GCP VPC)
|
|
37
|
+
HYBRID = "hybrid" # Hybrid deployment with local processing and cloud backup
|
|
38
|
+
AIR_GAPPED = "air_gapped" # Completely isolated from internet (maximum security)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class SecurityLevel(str, Enum):
|
|
42
|
+
"""Security levels for data handling."""
|
|
43
|
+
STANDARD = "standard" # Basic security controls
|
|
44
|
+
HIGH = "high" # Enhanced security (encryption at rest and in transit)
|
|
45
|
+
MAXIMUM = "maximum" # Maximum security (air-gapped, zero data retention)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class DataRetentionPolicy(BaseModel):
|
|
49
|
+
"""Data retention and deletion policies."""
|
|
50
|
+
retain_requests: bool = Field(default=False, description="Whether to retain request data")
|
|
51
|
+
retention_days: int = Field(default=0, ge=0, le=365, description="Days to retain data (0 = no retention)")
|
|
52
|
+
auto_delete: bool = Field(default=True, description="Automatically delete data after retention period")
|
|
53
|
+
encrypt_at_rest: bool = Field(default=True, description="Encrypt data at rest")
|
|
54
|
+
pii_scrubbing: bool = Field(default=True, description="Automatically scrub PII from logs")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class AuditLog(BaseModel):
|
|
58
|
+
"""Audit log entry for compliance and security monitoring."""
|
|
59
|
+
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
|
|
60
|
+
timestamp: str = Field(default_factory=lambda: datetime.utcnow().isoformat())
|
|
61
|
+
event_type: str # e.g., "request_routed", "data_accessed", "policy_changed"
|
|
62
|
+
user_id: Optional[str] = None
|
|
63
|
+
request_id: Optional[str] = None
|
|
64
|
+
action: str # Description of the action
|
|
65
|
+
model_tier: Optional[str] = None
|
|
66
|
+
data_classification: Optional[str] = None # e.g., "public", "confidential", "secret"
|
|
67
|
+
security_level: Optional[str] = None
|
|
68
|
+
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
69
|
+
|
|
70
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
71
|
+
"""Convert to dictionary for storage."""
|
|
72
|
+
return {
|
|
73
|
+
"id": self.id,
|
|
74
|
+
"timestamp": self.timestamp,
|
|
75
|
+
"event_type": self.event_type,
|
|
76
|
+
"user_id": self.user_id,
|
|
77
|
+
"request_id": self.request_id,
|
|
78
|
+
"action": self.action,
|
|
79
|
+
"model_tier": self.model_tier,
|
|
80
|
+
"data_classification": self.data_classification,
|
|
81
|
+
"security_level": self.security_level,
|
|
82
|
+
"metadata": self.metadata
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class SecurityPolicy(BaseModel):
|
|
87
|
+
"""Security policy configuration for Trust Gateway."""
|
|
88
|
+
deployment_mode: DeploymentMode = Field(default=DeploymentMode.ON_PREM)
|
|
89
|
+
security_level: SecurityLevel = Field(default=SecurityLevel.HIGH)
|
|
90
|
+
data_retention: DataRetentionPolicy = Field(default_factory=DataRetentionPolicy)
|
|
91
|
+
|
|
92
|
+
# Authentication & Authorization
|
|
93
|
+
require_authentication: bool = Field(default=True, description="Require authentication for all requests")
|
|
94
|
+
allowed_users: List[str] = Field(default_factory=list, description="List of allowed user IDs (empty = all)")
|
|
95
|
+
allowed_ip_ranges: List[str] = Field(default_factory=list, description="Allowed IP ranges (CIDR notation)")
|
|
96
|
+
|
|
97
|
+
# Data Classification
|
|
98
|
+
data_classification_required: bool = Field(default=False, description="Require data classification labels")
|
|
99
|
+
allowed_classifications: List[str] = Field(
|
|
100
|
+
default_factory=lambda: ["public", "internal", "confidential", "secret"],
|
|
101
|
+
description="Allowed data classification levels"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
# Encryption
|
|
105
|
+
encrypt_in_transit: bool = Field(default=True, description="Require TLS/HTTPS for all communication")
|
|
106
|
+
encrypt_at_rest: bool = Field(default=True, description="Encrypt stored data")
|
|
107
|
+
|
|
108
|
+
# Audit & Compliance
|
|
109
|
+
audit_all_requests: bool = Field(default=True, description="Audit all gateway requests")
|
|
110
|
+
audit_data_access: bool = Field(default=True, description="Audit all data access events")
|
|
111
|
+
compliance_mode: Optional[str] = Field(default=None, description="Compliance framework (e.g., 'GDPR', 'HIPAA', 'SOC2')")
|
|
112
|
+
|
|
113
|
+
# Network Isolation
|
|
114
|
+
allow_external_calls: bool = Field(default=False, description="Allow calls to external APIs")
|
|
115
|
+
external_model_endpoints: List[str] = Field(
|
|
116
|
+
default_factory=list,
|
|
117
|
+
description="Whitelisted external model endpoints (if allowed)"
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class TrustGateway:
|
|
122
|
+
"""
|
|
123
|
+
Trust Gateway: Enterprise-Grade Private Cloud Router
|
|
124
|
+
|
|
125
|
+
The Trust Gateway is designed to address enterprise security concerns by providing:
|
|
126
|
+
1. On-Prem / Private Cloud deployment options
|
|
127
|
+
2. Zero data leakage (data never leaves customer infrastructure)
|
|
128
|
+
3. Full audit trail for compliance
|
|
129
|
+
4. Configurable security policies
|
|
130
|
+
5. Data retention and deletion controls
|
|
131
|
+
|
|
132
|
+
Philosophy:
|
|
133
|
+
The winner isn't the one with the smartest routing algorithm;
|
|
134
|
+
it's the one the Enterprise trusts with the keys to the kingdom.
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
def __init__(
|
|
138
|
+
self,
|
|
139
|
+
security_policy: Optional[SecurityPolicy] = None,
|
|
140
|
+
audit_enabled: bool = True
|
|
141
|
+
):
|
|
142
|
+
"""
|
|
143
|
+
Initialize Trust Gateway.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
security_policy: Security policy configuration
|
|
147
|
+
audit_enabled: Whether to enable audit logging
|
|
148
|
+
"""
|
|
149
|
+
self.security_policy = security_policy or SecurityPolicy()
|
|
150
|
+
self.audit_enabled = audit_enabled
|
|
151
|
+
self.audit_logs: List[AuditLog] = []
|
|
152
|
+
self._deployment_info = self._get_deployment_info()
|
|
153
|
+
|
|
154
|
+
def _get_deployment_info(self) -> Dict[str, Any]:
|
|
155
|
+
"""Get deployment information."""
|
|
156
|
+
return {
|
|
157
|
+
"deployment_mode": self.security_policy.deployment_mode,
|
|
158
|
+
"security_level": self.security_policy.security_level,
|
|
159
|
+
"data_retention_days": self.security_policy.data_retention.retention_days,
|
|
160
|
+
"audit_enabled": self.audit_enabled,
|
|
161
|
+
"compliance_mode": self.security_policy.compliance_mode,
|
|
162
|
+
"timestamp": datetime.utcnow().isoformat()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
def validate_request(
|
|
166
|
+
self,
|
|
167
|
+
request_data: Dict[str, Any],
|
|
168
|
+
user_id: Optional[str] = None,
|
|
169
|
+
ip_address: Optional[str] = None,
|
|
170
|
+
data_classification: Optional[str] = None
|
|
171
|
+
) -> Dict[str, Any]:
|
|
172
|
+
"""
|
|
173
|
+
Validate request against security policy.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
request_data: The request data to validate
|
|
177
|
+
user_id: User ID making the request
|
|
178
|
+
ip_address: IP address of the requester
|
|
179
|
+
data_classification: Classification level of the data
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
Validation result with status and any security warnings
|
|
183
|
+
"""
|
|
184
|
+
validation_result = {
|
|
185
|
+
"valid": True,
|
|
186
|
+
"warnings": [],
|
|
187
|
+
"violations": []
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
# Check authentication requirement
|
|
191
|
+
if self.security_policy.require_authentication and not user_id:
|
|
192
|
+
validation_result["valid"] = False
|
|
193
|
+
validation_result["violations"].append("Authentication required but no user_id provided")
|
|
194
|
+
|
|
195
|
+
# Check allowed users
|
|
196
|
+
if user_id and self.security_policy.allowed_users:
|
|
197
|
+
if user_id not in self.security_policy.allowed_users:
|
|
198
|
+
validation_result["valid"] = False
|
|
199
|
+
validation_result["violations"].append(f"User {user_id} not in allowed users list")
|
|
200
|
+
|
|
201
|
+
# Check data classification
|
|
202
|
+
if self.security_policy.data_classification_required and not data_classification:
|
|
203
|
+
validation_result["valid"] = False
|
|
204
|
+
validation_result["violations"].append("Data classification required but not provided")
|
|
205
|
+
|
|
206
|
+
if data_classification and data_classification not in self.security_policy.allowed_classifications:
|
|
207
|
+
validation_result["valid"] = False
|
|
208
|
+
validation_result["violations"].append(
|
|
209
|
+
f"Data classification '{data_classification}' not in allowed classifications"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
# Check encryption requirements
|
|
213
|
+
if self.security_policy.encrypt_in_transit:
|
|
214
|
+
validation_result["warnings"].append("Ensure connection uses TLS/HTTPS")
|
|
215
|
+
|
|
216
|
+
# Audit the validation attempt
|
|
217
|
+
if self.audit_enabled:
|
|
218
|
+
self._log_audit(
|
|
219
|
+
event_type="request_validated",
|
|
220
|
+
user_id=user_id,
|
|
221
|
+
action=f"Request validation: {'passed' if validation_result['valid'] else 'failed'}",
|
|
222
|
+
data_classification=data_classification,
|
|
223
|
+
metadata={
|
|
224
|
+
"ip_address": ip_address,
|
|
225
|
+
"violations": validation_result["violations"],
|
|
226
|
+
"warnings": validation_result["warnings"]
|
|
227
|
+
}
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
return validation_result
|
|
231
|
+
|
|
232
|
+
def route_request(
|
|
233
|
+
self,
|
|
234
|
+
query: str,
|
|
235
|
+
user_id: Optional[str] = None,
|
|
236
|
+
data_classification: Optional[str] = None,
|
|
237
|
+
request_metadata: Optional[Dict[str, Any]] = None
|
|
238
|
+
) -> Dict[str, Any]:
|
|
239
|
+
"""
|
|
240
|
+
Route request through Trust Gateway with security controls.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
query: The user query to route
|
|
244
|
+
user_id: User ID making the request
|
|
245
|
+
data_classification: Classification level of the data
|
|
246
|
+
request_metadata: Additional request metadata
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
Routing decision with security context
|
|
250
|
+
"""
|
|
251
|
+
request_id = str(uuid.uuid4())
|
|
252
|
+
|
|
253
|
+
# Validate request first
|
|
254
|
+
validation = self.validate_request(
|
|
255
|
+
request_data={"query": query},
|
|
256
|
+
user_id=user_id,
|
|
257
|
+
data_classification=data_classification
|
|
258
|
+
)
|
|
259
|
+
|
|
260
|
+
if not validation["valid"]:
|
|
261
|
+
return {
|
|
262
|
+
"status": "rejected",
|
|
263
|
+
"request_id": request_id,
|
|
264
|
+
"reason": "Security policy violation",
|
|
265
|
+
"violations": validation["violations"],
|
|
266
|
+
"timestamp": datetime.utcnow().isoformat()
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
# Import here to avoid circular dependency
|
|
270
|
+
from caas.routing import HeuristicRouter
|
|
271
|
+
|
|
272
|
+
# Use heuristic router for actual routing decision
|
|
273
|
+
router = HeuristicRouter()
|
|
274
|
+
decision = router.route(query)
|
|
275
|
+
|
|
276
|
+
# Add security context to routing decision
|
|
277
|
+
result = {
|
|
278
|
+
"status": "approved",
|
|
279
|
+
"request_id": request_id,
|
|
280
|
+
"routing_decision": decision.model_dump(),
|
|
281
|
+
"security_context": {
|
|
282
|
+
"deployment_mode": self.security_policy.deployment_mode,
|
|
283
|
+
"security_level": self.security_policy.security_level,
|
|
284
|
+
"data_classification": data_classification,
|
|
285
|
+
"data_retention_days": self.security_policy.data_retention.retention_days,
|
|
286
|
+
"encrypted": self.security_policy.encrypt_at_rest,
|
|
287
|
+
"audited": self.audit_enabled
|
|
288
|
+
},
|
|
289
|
+
"warnings": validation["warnings"],
|
|
290
|
+
"timestamp": datetime.utcnow().isoformat()
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
# Audit the routing decision
|
|
294
|
+
if self.audit_enabled:
|
|
295
|
+
self._log_audit(
|
|
296
|
+
event_type="request_routed",
|
|
297
|
+
user_id=user_id,
|
|
298
|
+
request_id=request_id,
|
|
299
|
+
action=f"Query routed to {decision.model_tier} tier",
|
|
300
|
+
model_tier=decision.model_tier,
|
|
301
|
+
data_classification=data_classification,
|
|
302
|
+
metadata={
|
|
303
|
+
"query_length": len(query),
|
|
304
|
+
"suggested_model": decision.suggested_model,
|
|
305
|
+
"estimated_cost": decision.estimated_cost,
|
|
306
|
+
"request_metadata": request_metadata
|
|
307
|
+
}
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
return result
|
|
311
|
+
|
|
312
|
+
def _log_audit(
|
|
313
|
+
self,
|
|
314
|
+
event_type: str,
|
|
315
|
+
action: str,
|
|
316
|
+
user_id: Optional[str] = None,
|
|
317
|
+
request_id: Optional[str] = None,
|
|
318
|
+
model_tier: Optional[str] = None,
|
|
319
|
+
data_classification: Optional[str] = None,
|
|
320
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
321
|
+
):
|
|
322
|
+
"""Log an audit event."""
|
|
323
|
+
log_entry = AuditLog(
|
|
324
|
+
event_type=event_type,
|
|
325
|
+
user_id=user_id,
|
|
326
|
+
request_id=request_id,
|
|
327
|
+
action=action,
|
|
328
|
+
model_tier=model_tier,
|
|
329
|
+
data_classification=data_classification,
|
|
330
|
+
security_level=self.security_policy.security_level,
|
|
331
|
+
metadata=metadata or {}
|
|
332
|
+
)
|
|
333
|
+
self.audit_logs.append(log_entry)
|
|
334
|
+
|
|
335
|
+
def get_audit_logs(
|
|
336
|
+
self,
|
|
337
|
+
event_type: Optional[str] = None,
|
|
338
|
+
user_id: Optional[str] = None,
|
|
339
|
+
start_time: Optional[str] = None,
|
|
340
|
+
end_time: Optional[str] = None
|
|
341
|
+
) -> List[Dict[str, Any]]:
|
|
342
|
+
"""
|
|
343
|
+
Retrieve audit logs with optional filtering.
|
|
344
|
+
|
|
345
|
+
Args:
|
|
346
|
+
event_type: Filter by event type
|
|
347
|
+
user_id: Filter by user ID
|
|
348
|
+
start_time: Filter logs after this time (ISO format)
|
|
349
|
+
end_time: Filter logs before this time (ISO format)
|
|
350
|
+
|
|
351
|
+
Returns:
|
|
352
|
+
List of matching audit log entries
|
|
353
|
+
"""
|
|
354
|
+
filtered_logs = self.audit_logs
|
|
355
|
+
|
|
356
|
+
if event_type:
|
|
357
|
+
filtered_logs = [log for log in filtered_logs if log.event_type == event_type]
|
|
358
|
+
|
|
359
|
+
if user_id:
|
|
360
|
+
filtered_logs = [log for log in filtered_logs if log.user_id == user_id]
|
|
361
|
+
|
|
362
|
+
if start_time:
|
|
363
|
+
filtered_logs = [log for log in filtered_logs if log.timestamp >= start_time]
|
|
364
|
+
|
|
365
|
+
if end_time:
|
|
366
|
+
filtered_logs = [log for log in filtered_logs if log.timestamp <= end_time]
|
|
367
|
+
|
|
368
|
+
return [log.to_dict() for log in filtered_logs]
|
|
369
|
+
|
|
370
|
+
def get_deployment_info(self) -> Dict[str, Any]:
|
|
371
|
+
"""
|
|
372
|
+
Get Trust Gateway deployment information.
|
|
373
|
+
|
|
374
|
+
Returns:
|
|
375
|
+
Deployment configuration and status
|
|
376
|
+
"""
|
|
377
|
+
return {
|
|
378
|
+
**self._deployment_info,
|
|
379
|
+
"total_audit_logs": len(self.audit_logs),
|
|
380
|
+
"security_policy": {
|
|
381
|
+
"deployment_mode": self.security_policy.deployment_mode,
|
|
382
|
+
"security_level": self.security_policy.security_level,
|
|
383
|
+
"authentication_required": self.security_policy.require_authentication,
|
|
384
|
+
"audit_enabled": self.audit_enabled,
|
|
385
|
+
"data_retention_days": self.security_policy.data_retention.retention_days,
|
|
386
|
+
"encrypt_at_rest": self.security_policy.encrypt_at_rest,
|
|
387
|
+
"encrypt_in_transit": self.security_policy.encrypt_in_transit,
|
|
388
|
+
"compliance_mode": self.security_policy.compliance_mode,
|
|
389
|
+
"external_calls_allowed": self.security_policy.allow_external_calls
|
|
390
|
+
},
|
|
391
|
+
"trust_guarantees": [
|
|
392
|
+
"Data never leaves your infrastructure",
|
|
393
|
+
"Full audit trail for compliance",
|
|
394
|
+
"Configurable retention policies",
|
|
395
|
+
"Enterprise-grade security controls",
|
|
396
|
+
"Zero third-party data sharing"
|
|
397
|
+
]
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
def update_security_policy(
|
|
401
|
+
self,
|
|
402
|
+
new_policy: SecurityPolicy,
|
|
403
|
+
user_id: Optional[str] = None
|
|
404
|
+
) -> Dict[str, Any]:
|
|
405
|
+
"""
|
|
406
|
+
Update security policy (requires audit logging).
|
|
407
|
+
|
|
408
|
+
Args:
|
|
409
|
+
new_policy: New security policy
|
|
410
|
+
user_id: User ID making the change
|
|
411
|
+
|
|
412
|
+
Returns:
|
|
413
|
+
Update status
|
|
414
|
+
"""
|
|
415
|
+
old_policy = self.security_policy
|
|
416
|
+
|
|
417
|
+
# Log the policy change
|
|
418
|
+
if self.audit_enabled:
|
|
419
|
+
self._log_audit(
|
|
420
|
+
event_type="policy_changed",
|
|
421
|
+
user_id=user_id,
|
|
422
|
+
action="Security policy updated",
|
|
423
|
+
metadata={
|
|
424
|
+
"old_policy": {
|
|
425
|
+
"deployment_mode": old_policy.deployment_mode,
|
|
426
|
+
"security_level": old_policy.security_level
|
|
427
|
+
},
|
|
428
|
+
"new_policy": {
|
|
429
|
+
"deployment_mode": new_policy.deployment_mode,
|
|
430
|
+
"security_level": new_policy.security_level
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
self.security_policy = new_policy
|
|
436
|
+
self._deployment_info = self._get_deployment_info()
|
|
437
|
+
|
|
438
|
+
return {
|
|
439
|
+
"status": "success",
|
|
440
|
+
"message": "Security policy updated",
|
|
441
|
+
"timestamp": datetime.utcnow().isoformat()
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
def clear_audit_logs(self, user_id: Optional[str] = None) -> Dict[str, Any]:
|
|
445
|
+
"""
|
|
446
|
+
Clear audit logs (requires authorization).
|
|
447
|
+
|
|
448
|
+
Args:
|
|
449
|
+
user_id: User ID requesting the clear operation
|
|
450
|
+
|
|
451
|
+
Returns:
|
|
452
|
+
Clear operation status
|
|
453
|
+
"""
|
|
454
|
+
logs_count = len(self.audit_logs)
|
|
455
|
+
|
|
456
|
+
# Log the clear operation before clearing
|
|
457
|
+
if self.audit_enabled:
|
|
458
|
+
self._log_audit(
|
|
459
|
+
event_type="audit_logs_cleared",
|
|
460
|
+
user_id=user_id,
|
|
461
|
+
action=f"Cleared {logs_count} audit log entries",
|
|
462
|
+
metadata={"logs_cleared": logs_count}
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# Keep the last log entry (the clear operation itself)
|
|
466
|
+
last_log = self.audit_logs[-1] if self.audit_logs else None
|
|
467
|
+
self.audit_logs = [last_log] if last_log else []
|
|
468
|
+
|
|
469
|
+
return {
|
|
470
|
+
"status": "success",
|
|
471
|
+
"message": f"Cleared {logs_count} audit log entries",
|
|
472
|
+
"remaining_logs": len(self.audit_logs),
|
|
473
|
+
"timestamp": datetime.utcnow().isoformat()
|
|
474
|
+
}
|