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.
Files changed (337) hide show
  1. agent_control_plane/__init__.py +662 -0
  2. agent_control_plane/a2a_adapter.py +543 -0
  3. agent_control_plane/adapter.py +417 -0
  4. agent_control_plane/agent_hibernation.py +394 -0
  5. agent_control_plane/agent_kernel.py +470 -0
  6. agent_control_plane/compliance.py +720 -0
  7. agent_control_plane/constraint_graphs.py +478 -0
  8. agent_control_plane/control_plane.py +854 -0
  9. agent_control_plane/example_executors.py +195 -0
  10. agent_control_plane/execution_engine.py +231 -0
  11. agent_control_plane/flight_recorder.py +846 -0
  12. agent_control_plane/governance_layer.py +435 -0
  13. agent_control_plane/hf_utils.py +563 -0
  14. agent_control_plane/interfaces/__init__.py +55 -0
  15. agent_control_plane/interfaces/kernel_interface.py +361 -0
  16. agent_control_plane/interfaces/plugin_interface.py +497 -0
  17. agent_control_plane/interfaces/protocol_interfaces.py +387 -0
  18. agent_control_plane/kernel_space.py +1009 -0
  19. agent_control_plane/langchain_adapter.py +424 -0
  20. agent_control_plane/lifecycle.py +3113 -0
  21. agent_control_plane/mcp_adapter.py +653 -0
  22. agent_control_plane/ml_safety.py +563 -0
  23. agent_control_plane/multimodal.py +727 -0
  24. agent_control_plane/mute_agent.py +422 -0
  25. agent_control_plane/observability.py +787 -0
  26. agent_control_plane/orchestrator.py +482 -0
  27. agent_control_plane/plugin_registry.py +750 -0
  28. agent_control_plane/policy_engine.py +954 -0
  29. agent_control_plane/process_isolation.py +777 -0
  30. agent_control_plane/shadow_mode.py +310 -0
  31. agent_control_plane/signals.py +493 -0
  32. agent_control_plane/supervisor_agents.py +430 -0
  33. agent_control_plane/time_travel_debugger.py +557 -0
  34. agent_control_plane/tool_registry.py +452 -0
  35. agent_control_plane/vfs.py +697 -0
  36. agent_kernel/__init__.py +69 -0
  37. agent_kernel/analyzer.py +435 -0
  38. agent_kernel/auditor.py +36 -0
  39. agent_kernel/completeness_auditor.py +237 -0
  40. agent_kernel/detector.py +203 -0
  41. agent_kernel/kernel.py +744 -0
  42. agent_kernel/memory_manager.py +85 -0
  43. agent_kernel/models.py +374 -0
  44. agent_kernel/nudge_mechanism.py +263 -0
  45. agent_kernel/outcome_analyzer.py +338 -0
  46. agent_kernel/patcher.py +582 -0
  47. agent_kernel/semantic_analyzer.py +316 -0
  48. agent_kernel/semantic_purge.py +349 -0
  49. agent_kernel/simulator.py +449 -0
  50. agent_kernel/teacher.py +85 -0
  51. agent_kernel/triage.py +152 -0
  52. agent_os/__init__.py +409 -0
  53. agent_os/_adversarial_impl.py +200 -0
  54. agent_os/_circuit_breaker_impl.py +232 -0
  55. agent_os/_mcp_metrics.py +193 -0
  56. agent_os/adversarial.py +20 -0
  57. agent_os/agents_compat.py +490 -0
  58. agent_os/audit_logger.py +135 -0
  59. agent_os/base_agent.py +651 -0
  60. agent_os/circuit_breaker.py +34 -0
  61. agent_os/cli/__init__.py +659 -0
  62. agent_os/cli/cmd_audit.py +128 -0
  63. agent_os/cli/cmd_init.py +152 -0
  64. agent_os/cli/cmd_policy.py +41 -0
  65. agent_os/cli/cmd_policy_gen.py +180 -0
  66. agent_os/cli/cmd_validate.py +258 -0
  67. agent_os/cli/mcp_scan.py +265 -0
  68. agent_os/cli/output.py +192 -0
  69. agent_os/cli/policy_checker.py +330 -0
  70. agent_os/compat.py +74 -0
  71. agent_os/constraint_graph.py +234 -0
  72. agent_os/content_governance.py +140 -0
  73. agent_os/context_budget.py +305 -0
  74. agent_os/credential_redactor.py +224 -0
  75. agent_os/diff_policy.py +89 -0
  76. agent_os/egress_policy.py +159 -0
  77. agent_os/escalation.py +276 -0
  78. agent_os/event_bus.py +124 -0
  79. agent_os/exceptions.py +180 -0
  80. agent_os/execution_context_policy.py +141 -0
  81. agent_os/github_enterprise.py +96 -0
  82. agent_os/health.py +20 -0
  83. agent_os/integrations/__init__.py +279 -0
  84. agent_os/integrations/a2a_adapter.py +279 -0
  85. agent_os/integrations/agent_lightning/__init__.py +30 -0
  86. agent_os/integrations/anthropic_adapter.py +420 -0
  87. agent_os/integrations/autogen_adapter.py +620 -0
  88. agent_os/integrations/base.py +1137 -0
  89. agent_os/integrations/compat.py +229 -0
  90. agent_os/integrations/config.py +98 -0
  91. agent_os/integrations/conversation_guardian.py +957 -0
  92. agent_os/integrations/crewai_adapter.py +467 -0
  93. agent_os/integrations/drift_detector.py +425 -0
  94. agent_os/integrations/dry_run.py +124 -0
  95. agent_os/integrations/escalation.py +582 -0
  96. agent_os/integrations/gemini_adapter.py +364 -0
  97. agent_os/integrations/google_adk_adapter.py +633 -0
  98. agent_os/integrations/guardrails_adapter.py +394 -0
  99. agent_os/integrations/health.py +197 -0
  100. agent_os/integrations/langchain_adapter.py +654 -0
  101. agent_os/integrations/llamafirewall.py +343 -0
  102. agent_os/integrations/llamaindex_adapter.py +188 -0
  103. agent_os/integrations/logging.py +191 -0
  104. agent_os/integrations/maf_adapter.py +631 -0
  105. agent_os/integrations/mistral_adapter.py +365 -0
  106. agent_os/integrations/openai_adapter.py +816 -0
  107. agent_os/integrations/openai_agents_sdk.py +406 -0
  108. agent_os/integrations/policy_compose.py +171 -0
  109. agent_os/integrations/profiling.py +144 -0
  110. agent_os/integrations/pydantic_ai_adapter.py +420 -0
  111. agent_os/integrations/rate_limiter.py +130 -0
  112. agent_os/integrations/rbac.py +143 -0
  113. agent_os/integrations/registry.py +113 -0
  114. agent_os/integrations/scope_guard.py +303 -0
  115. agent_os/integrations/semantic_kernel_adapter.py +769 -0
  116. agent_os/integrations/smolagents_adapter.py +629 -0
  117. agent_os/integrations/templates.py +178 -0
  118. agent_os/integrations/token_budget.py +134 -0
  119. agent_os/integrations/tool_aliases.py +190 -0
  120. agent_os/integrations/webhooks.py +177 -0
  121. agent_os/lite.py +208 -0
  122. agent_os/mcp_gateway.py +385 -0
  123. agent_os/mcp_message_signer.py +273 -0
  124. agent_os/mcp_protocols.py +161 -0
  125. agent_os/mcp_response_scanner.py +232 -0
  126. agent_os/mcp_security.py +924 -0
  127. agent_os/mcp_session_auth.py +231 -0
  128. agent_os/mcp_sliding_rate_limiter.py +184 -0
  129. agent_os/memory_guard.py +409 -0
  130. agent_os/metrics.py +134 -0
  131. agent_os/mute.py +428 -0
  132. agent_os/mute_agent.py +209 -0
  133. agent_os/policies/__init__.py +77 -0
  134. agent_os/policies/async_evaluator.py +275 -0
  135. agent_os/policies/backends.py +670 -0
  136. agent_os/policies/bridge.py +169 -0
  137. agent_os/policies/budget.py +85 -0
  138. agent_os/policies/cli.py +294 -0
  139. agent_os/policies/conflict_resolution.py +270 -0
  140. agent_os/policies/data_classification.py +252 -0
  141. agent_os/policies/evaluator.py +239 -0
  142. agent_os/policies/policy_schema.json +228 -0
  143. agent_os/policies/rate_limiting.py +145 -0
  144. agent_os/policies/schema.py +115 -0
  145. agent_os/policies/shared.py +331 -0
  146. agent_os/prompt_injection.py +694 -0
  147. agent_os/providers.py +182 -0
  148. agent_os/py.typed +0 -0
  149. agent_os/retry.py +81 -0
  150. agent_os/reversibility.py +251 -0
  151. agent_os/sandbox.py +432 -0
  152. agent_os/sandbox_provider.py +140 -0
  153. agent_os/secure_codegen.py +525 -0
  154. agent_os/security_skills.py +538 -0
  155. agent_os/semantic_policy.py +422 -0
  156. agent_os/server/__init__.py +15 -0
  157. agent_os/server/__main__.py +25 -0
  158. agent_os/server/app.py +277 -0
  159. agent_os/server/models.py +104 -0
  160. agent_os/shift_left_metrics.py +130 -0
  161. agent_os/stateless.py +742 -0
  162. agent_os/supervisor.py +148 -0
  163. agent_os/task_outcome.py +148 -0
  164. agent_os/transparency.py +181 -0
  165. agent_os/trust_root.py +128 -0
  166. agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
  167. agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
  168. agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
  169. agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
  170. agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
  171. agent_os_observability/__init__.py +27 -0
  172. agent_os_observability/dashboards.py +898 -0
  173. agent_os_observability/metrics.py +398 -0
  174. agent_os_observability/server.py +223 -0
  175. agent_os_observability/tracer.py +232 -0
  176. agent_primitives/__init__.py +24 -0
  177. agent_primitives/failures.py +84 -0
  178. agent_primitives/py.typed +0 -0
  179. amb_core/__init__.py +177 -0
  180. amb_core/adapters/__init__.py +57 -0
  181. amb_core/adapters/aws_sqs_broker.py +376 -0
  182. amb_core/adapters/azure_servicebus_broker.py +340 -0
  183. amb_core/adapters/kafka_broker.py +260 -0
  184. amb_core/adapters/nats_broker.py +285 -0
  185. amb_core/adapters/rabbitmq_broker.py +235 -0
  186. amb_core/adapters/redis_broker.py +262 -0
  187. amb_core/broker.py +145 -0
  188. amb_core/bus.py +481 -0
  189. amb_core/cloudevents.py +509 -0
  190. amb_core/dlq.py +345 -0
  191. amb_core/hf_utils.py +536 -0
  192. amb_core/memory_broker.py +410 -0
  193. amb_core/models.py +141 -0
  194. amb_core/persistence.py +529 -0
  195. amb_core/schema.py +294 -0
  196. amb_core/tracing.py +358 -0
  197. atr/__init__.py +640 -0
  198. atr/access.py +348 -0
  199. atr/composition.py +645 -0
  200. atr/decorator.py +357 -0
  201. atr/executor.py +384 -0
  202. atr/health.py +557 -0
  203. atr/hf_utils.py +449 -0
  204. atr/injection.py +422 -0
  205. atr/metrics.py +440 -0
  206. atr/policies.py +403 -0
  207. atr/py.typed +2 -0
  208. atr/registry.py +452 -0
  209. atr/schema.py +480 -0
  210. atr/tools/safe/__init__.py +75 -0
  211. atr/tools/safe/calculator.py +467 -0
  212. atr/tools/safe/datetime_tool.py +443 -0
  213. atr/tools/safe/file_reader.py +402 -0
  214. atr/tools/safe/http_client.py +316 -0
  215. atr/tools/safe/json_parser.py +374 -0
  216. atr/tools/safe/text_tool.py +537 -0
  217. atr/tools/safe/toolkit.py +175 -0
  218. caas/__init__.py +162 -0
  219. caas/api/__init__.py +7 -0
  220. caas/api/server.py +1328 -0
  221. caas/caching.py +834 -0
  222. caas/cli.py +210 -0
  223. caas/conversation.py +223 -0
  224. caas/decay.py +72 -0
  225. caas/detection/__init__.py +9 -0
  226. caas/detection/detector.py +238 -0
  227. caas/enrichment.py +130 -0
  228. caas/gateway/__init__.py +27 -0
  229. caas/gateway/trust_gateway.py +474 -0
  230. caas/hf_utils.py +479 -0
  231. caas/ingestion/__init__.py +23 -0
  232. caas/ingestion/processors.py +253 -0
  233. caas/ingestion/structure_parser.py +188 -0
  234. caas/models.py +356 -0
  235. caas/pragmatic_truth.py +444 -0
  236. caas/routing/__init__.py +10 -0
  237. caas/routing/heuristic_router.py +58 -0
  238. caas/storage/__init__.py +9 -0
  239. caas/storage/store.py +389 -0
  240. caas/triad.py +213 -0
  241. caas/tuning/__init__.py +9 -0
  242. caas/tuning/tuner.py +329 -0
  243. caas/vfs/__init__.py +14 -0
  244. caas/vfs/filesystem.py +452 -0
  245. cmvk/__init__.py +218 -0
  246. cmvk/audit.py +402 -0
  247. cmvk/benchmarks.py +478 -0
  248. cmvk/constitutional.py +904 -0
  249. cmvk/hf_utils.py +301 -0
  250. cmvk/metrics.py +473 -0
  251. cmvk/profiles.py +300 -0
  252. cmvk/py.typed +0 -0
  253. cmvk/types.py +12 -0
  254. cmvk/verification.py +956 -0
  255. emk/__init__.py +89 -0
  256. emk/causal.py +352 -0
  257. emk/hf_utils.py +421 -0
  258. emk/indexer.py +83 -0
  259. emk/py.typed +0 -0
  260. emk/schema.py +204 -0
  261. emk/sleep_cycle.py +347 -0
  262. emk/store.py +281 -0
  263. iatp/__init__.py +166 -0
  264. iatp/attestation.py +461 -0
  265. iatp/cli.py +317 -0
  266. iatp/hf_utils.py +472 -0
  267. iatp/ipc_pipes.py +580 -0
  268. iatp/main.py +412 -0
  269. iatp/models/__init__.py +447 -0
  270. iatp/policy_engine.py +337 -0
  271. iatp/py.typed +2 -0
  272. iatp/recovery.py +321 -0
  273. iatp/security/__init__.py +270 -0
  274. iatp/sidecar/__init__.py +519 -0
  275. iatp/telemetry/__init__.py +164 -0
  276. iatp/tests/__init__.py +1 -0
  277. iatp/tests/test_attestation.py +370 -0
  278. iatp/tests/test_cli.py +131 -0
  279. iatp/tests/test_ed25519_attestation.py +211 -0
  280. iatp/tests/test_models.py +130 -0
  281. iatp/tests/test_policy_engine.py +347 -0
  282. iatp/tests/test_recovery.py +281 -0
  283. iatp/tests/test_security.py +222 -0
  284. iatp/tests/test_sidecar.py +167 -0
  285. iatp/tests/test_telemetry.py +175 -0
  286. mcp_kernel_server/__init__.py +28 -0
  287. mcp_kernel_server/cli.py +274 -0
  288. mcp_kernel_server/resources.py +217 -0
  289. mcp_kernel_server/server.py +564 -0
  290. mcp_kernel_server/tools.py +1174 -0
  291. mute_agent/__init__.py +68 -0
  292. mute_agent/core/__init__.py +1 -0
  293. mute_agent/core/execution_agent.py +166 -0
  294. mute_agent/core/handshake_protocol.py +201 -0
  295. mute_agent/core/reasoning_agent.py +238 -0
  296. mute_agent/knowledge_graph/__init__.py +1 -0
  297. mute_agent/knowledge_graph/graph_elements.py +65 -0
  298. mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
  299. mute_agent/knowledge_graph/subgraph.py +224 -0
  300. mute_agent/listener/__init__.py +43 -0
  301. mute_agent/listener/adapters/__init__.py +31 -0
  302. mute_agent/listener/adapters/base_adapter.py +189 -0
  303. mute_agent/listener/adapters/caas_adapter.py +344 -0
  304. mute_agent/listener/adapters/control_plane_adapter.py +436 -0
  305. mute_agent/listener/adapters/iatp_adapter.py +332 -0
  306. mute_agent/listener/adapters/scak_adapter.py +251 -0
  307. mute_agent/listener/listener.py +610 -0
  308. mute_agent/listener/state_observer.py +436 -0
  309. mute_agent/listener/threshold_config.py +313 -0
  310. mute_agent/super_system/__init__.py +1 -0
  311. mute_agent/super_system/router.py +204 -0
  312. mute_agent/visualization/__init__.py +10 -0
  313. mute_agent/visualization/graph_debugger.py +502 -0
  314. nexus/README.md +60 -0
  315. nexus/__init__.py +51 -0
  316. nexus/arbiter.py +359 -0
  317. nexus/client.py +466 -0
  318. nexus/dmz.py +444 -0
  319. nexus/escrow.py +430 -0
  320. nexus/exceptions.py +286 -0
  321. nexus/pyproject.toml +36 -0
  322. nexus/registry.py +393 -0
  323. nexus/reputation.py +425 -0
  324. nexus/schemas/__init__.py +51 -0
  325. nexus/schemas/compliance.py +276 -0
  326. nexus/schemas/escrow.py +251 -0
  327. nexus/schemas/manifest.py +225 -0
  328. nexus/schemas/receipt.py +208 -0
  329. nexus/tests/__init__.py +0 -0
  330. nexus/tests/conftest.py +146 -0
  331. nexus/tests/test_arbiter.py +192 -0
  332. nexus/tests/test_dmz.py +194 -0
  333. nexus/tests/test_escrow.py +276 -0
  334. nexus/tests/test_exceptions.py +225 -0
  335. nexus/tests/test_registry.py +232 -0
  336. nexus/tests/test_reputation.py +328 -0
  337. 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
+ }