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,332 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ IATP Adapter - Security/Trust Layer Integration
5
+
6
+ This adapter provides integration with the IATP (Inter-Agent Trust
7
+ Protocol) layer for security and trust operations.
8
+
9
+ In the Listener context, this adapter is used to:
10
+ 1. Validate trust scores for actors
11
+ 2. Check permission escalation attempts
12
+ 3. Report security anomalies
13
+ 4. Trigger emergency security responses
14
+
15
+ The adapter delegates all security logic to IATP - no reimplementation.
16
+ """
17
+
18
+ from typing import Dict, Any, Optional, List
19
+ from dataclasses import dataclass
20
+ from datetime import datetime
21
+
22
+ from .base_adapter import BaseLayerAdapter
23
+
24
+
25
+ @dataclass
26
+ class TrustAssessment:
27
+ """Result of a trust assessment from IATP."""
28
+
29
+ actor_id: str
30
+ trust_score: float # 0.0 to 1.0
31
+ confidence: float # 0.0 to 1.0
32
+ factors: Dict[str, float]
33
+ timestamp: datetime
34
+ warnings: List[str]
35
+
36
+
37
+ @dataclass
38
+ class SecurityEvent:
39
+ """A security event detected or reported via IATP."""
40
+
41
+ event_id: str
42
+ event_type: str
43
+ severity: str # "low", "medium", "high", "critical"
44
+ actor_id: Optional[str]
45
+ description: str
46
+ timestamp: datetime
47
+ metadata: Dict[str, Any]
48
+
49
+
50
+ @dataclass
51
+ class PermissionCheck:
52
+ """Result of a permission check from IATP."""
53
+
54
+ allowed: bool
55
+ actor_id: str
56
+ permission: str
57
+ reason: str
58
+ escalation_detected: bool
59
+
60
+
61
+ class MockIATPClient:
62
+ """Mock IATP client for testing without the actual dependency."""
63
+
64
+ def __init__(self):
65
+ self._trust_scores: Dict[str, float] = {}
66
+ self._events: List[SecurityEvent] = []
67
+
68
+ def assess_trust(self, actor_id: str) -> TrustAssessment:
69
+ """Mock trust assessment."""
70
+ return TrustAssessment(
71
+ actor_id=actor_id,
72
+ trust_score=self._trust_scores.get(actor_id, 0.8),
73
+ confidence=0.9,
74
+ factors={"history": 0.8, "behavior": 0.9},
75
+ timestamp=datetime.now(),
76
+ warnings=[],
77
+ )
78
+
79
+ def check_permission(
80
+ self,
81
+ actor_id: str,
82
+ permission: str,
83
+ resource: Optional[str] = None
84
+ ) -> PermissionCheck:
85
+ """Mock permission check."""
86
+ return PermissionCheck(
87
+ allowed=True,
88
+ actor_id=actor_id,
89
+ permission=permission,
90
+ reason="Mock: all permissions allowed",
91
+ escalation_detected=False,
92
+ )
93
+
94
+ def report_event(self, event: SecurityEvent) -> str:
95
+ """Mock event reporting."""
96
+ self._events.append(event)
97
+ return event.event_id
98
+
99
+ def emergency_alert(
100
+ self,
101
+ reason: str,
102
+ triggered_rules: List[str]
103
+ ) -> str:
104
+ """Mock emergency alert."""
105
+ return f"emergency_alert_{datetime.now().timestamp()}"
106
+
107
+ def get_anomaly_score(self, context: Dict[str, Any]) -> float:
108
+ """Mock anomaly detection."""
109
+ return 0.1
110
+
111
+ def close(self) -> None:
112
+ """Close mock client."""
113
+ pass
114
+
115
+
116
+ class SecurityAdapter(BaseLayerAdapter):
117
+ """
118
+ Adapter for IATP (Security/Trust) layer.
119
+
120
+ Provides a clean interface for the Listener to access security
121
+ operations without reimplementing any IATP logic.
122
+
123
+ Usage:
124
+ ```python
125
+ adapter = SecurityAdapter(mock_mode=True)
126
+ adapter.connect()
127
+
128
+ # Assess trust for an actor
129
+ assessment = adapter.assess_trust("user_123")
130
+
131
+ # Check for anomalies
132
+ anomaly_score = adapter.get_anomaly_score({"action": "delete"})
133
+
134
+ # Report a security event
135
+ adapter.report_security_event(
136
+ event_type="permission_escalation_attempt",
137
+ severity="high",
138
+ description="User attempted admin action without permission"
139
+ )
140
+ ```
141
+ """
142
+
143
+ def get_layer_name(self) -> str:
144
+ return "iatp"
145
+
146
+ def _create_client(self) -> Any:
147
+ """
148
+ Create the IATP client.
149
+
150
+ In production, this would import and instantiate the actual
151
+ iatp library client. For now, returns mock.
152
+ """
153
+ try:
154
+ # Attempt to import real IATP client
155
+ # from iatp import Client as IATPClient
156
+ # return IATPClient(self.config)
157
+
158
+ # Fall back to mock if not available
159
+ return self._mock_client()
160
+ except ImportError:
161
+ return self._mock_client()
162
+
163
+ def _mock_client(self) -> Any:
164
+ """Create mock client for testing."""
165
+ return MockIATPClient()
166
+
167
+ def _health_ping(self) -> None:
168
+ """Verify IATP connection."""
169
+ if self._client:
170
+ # In production: self._client.ping()
171
+ pass
172
+
173
+ def _get_version(self) -> Optional[str]:
174
+ """Get IATP version."""
175
+ if self._client and hasattr(self._client, 'version'):
176
+ return self._client.version
177
+ return "mock-1.0.0" if self.mock_mode else None
178
+
179
+ # === IATP-specific operations ===
180
+
181
+ def assess_trust(self, actor_id: str) -> TrustAssessment:
182
+ """
183
+ Assess trust for an actor.
184
+
185
+ Delegates entirely to IATP trust assessment.
186
+
187
+ Args:
188
+ actor_id: Identifier of the actor to assess
189
+
190
+ Returns:
191
+ TrustAssessment with trust score and factors
192
+ """
193
+ self.ensure_connected()
194
+ return self._client.assess_trust(actor_id)
195
+
196
+ def check_permission(
197
+ self,
198
+ actor_id: str,
199
+ permission: str,
200
+ resource: Optional[str] = None
201
+ ) -> PermissionCheck:
202
+ """
203
+ Check if an actor has a permission.
204
+
205
+ Delegates to IATP permission verification.
206
+
207
+ Args:
208
+ actor_id: Actor requesting permission
209
+ permission: Permission being requested
210
+ resource: Optional resource the permission applies to
211
+
212
+ Returns:
213
+ PermissionCheck with result and escalation detection
214
+ """
215
+ self.ensure_connected()
216
+ return self._client.check_permission(actor_id, permission, resource)
217
+
218
+ def report_security_event(
219
+ self,
220
+ event_type: str,
221
+ severity: str,
222
+ description: str,
223
+ actor_id: Optional[str] = None,
224
+ metadata: Optional[Dict[str, Any]] = None
225
+ ) -> str:
226
+ """
227
+ Report a security event to IATP.
228
+
229
+ Args:
230
+ event_type: Type of security event
231
+ severity: Severity level ("low", "medium", "high", "critical")
232
+ description: Human-readable description
233
+ actor_id: Optional actor involved
234
+ metadata: Optional additional metadata
235
+
236
+ Returns:
237
+ Event ID from IATP
238
+ """
239
+ self.ensure_connected()
240
+
241
+ event = SecurityEvent(
242
+ event_id=f"event_{datetime.now().timestamp()}",
243
+ event_type=event_type,
244
+ severity=severity,
245
+ actor_id=actor_id,
246
+ description=description,
247
+ timestamp=datetime.now(),
248
+ metadata=metadata or {},
249
+ )
250
+
251
+ return self._client.report_event(event)
252
+
253
+ def emergency_alert(
254
+ self,
255
+ reason: str,
256
+ triggered_rules: List[str],
257
+ context: Optional[Dict[str, Any]] = None
258
+ ) -> str:
259
+ """
260
+ Trigger an emergency security alert.
261
+
262
+ This notifies IATP of a critical security situation requiring
263
+ immediate attention.
264
+
265
+ Args:
266
+ reason: Reason for the emergency
267
+ triggered_rules: List of rules that triggered the emergency
268
+ context: Optional additional context
269
+
270
+ Returns:
271
+ Alert ID from IATP
272
+ """
273
+ self.ensure_connected()
274
+ return self._client.emergency_alert(reason, triggered_rules)
275
+
276
+ def get_anomaly_score(self, context: Dict[str, Any]) -> float:
277
+ """
278
+ Get anomaly score for a context.
279
+
280
+ Delegates to IATP anomaly detection.
281
+
282
+ Args:
283
+ context: Context to analyze for anomalies
284
+
285
+ Returns:
286
+ Anomaly score (0.0 = normal, 1.0 = highly anomalous)
287
+ """
288
+ self.ensure_connected()
289
+ return self._client.get_anomaly_score(context)
290
+
291
+ def get_trust_score(self, actor_id: str) -> float:
292
+ """
293
+ Get the current trust score for an actor.
294
+
295
+ Convenience method that extracts just the score.
296
+
297
+ Args:
298
+ actor_id: Actor to get trust score for
299
+
300
+ Returns:
301
+ Trust score (0.0 to 1.0)
302
+ """
303
+ assessment = self.assess_trust(actor_id)
304
+ return assessment.trust_score
305
+
306
+ def detect_permission_escalation(
307
+ self,
308
+ actor_id: str,
309
+ requested_permissions: List[str],
310
+ current_permissions: List[str]
311
+ ) -> bool:
312
+ """
313
+ Detect if a permission escalation is being attempted.
314
+
315
+ Args:
316
+ actor_id: Actor making the request
317
+ requested_permissions: Permissions being requested
318
+ current_permissions: Actor's current permissions
319
+
320
+ Returns:
321
+ True if escalation detected
322
+ """
323
+ self.ensure_connected()
324
+
325
+ # Check each requested permission
326
+ for perm in requested_permissions:
327
+ if perm not in current_permissions:
328
+ check = self.check_permission(actor_id, perm)
329
+ if check.escalation_detected:
330
+ return True
331
+
332
+ return False
@@ -0,0 +1,251 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ SCAK Adapter - Intelligence/Knowledge Layer Integration
5
+
6
+ This adapter provides integration with the SCAK (Structured Contextual
7
+ Agent Knowledge) layer for knowledge graph operations.
8
+
9
+ In the Listener context, this adapter is used to:
10
+ 1. Query graph state for observation
11
+ 2. Delegate constraint validation
12
+ 3. Access dimensional routing logic
13
+
14
+ The adapter delegates all intelligence to SCAK - no logic is reimplemented.
15
+ """
16
+
17
+ from typing import Dict, Any, Optional, List
18
+ from dataclasses import dataclass
19
+
20
+ from .base_adapter import BaseLayerAdapter
21
+
22
+
23
+ @dataclass
24
+ class GraphQueryResult:
25
+ """Result from a SCAK graph query."""
26
+
27
+ nodes: List[Dict[str, Any]]
28
+ edges: List[Dict[str, Any]]
29
+ dimensions: List[str]
30
+ metadata: Dict[str, Any]
31
+
32
+
33
+ @dataclass
34
+ class ValidationResult:
35
+ """Result from SCAK constraint validation."""
36
+
37
+ valid: bool
38
+ constraints_checked: int
39
+ constraints_passed: int
40
+ violations: List[str]
41
+ suggestions: List[str]
42
+
43
+
44
+ class MockSCAKClient:
45
+ """Mock SCAK client for testing without the actual dependency."""
46
+
47
+ def __init__(self):
48
+ self._graphs: Dict[str, Dict] = {}
49
+
50
+ def query(self, graph_id: str, query: Dict[str, Any]) -> GraphQueryResult:
51
+ """Mock graph query."""
52
+ return GraphQueryResult(
53
+ nodes=[],
54
+ edges=[],
55
+ dimensions=["default"],
56
+ metadata={"mock": True},
57
+ )
58
+
59
+ def validate(
60
+ self,
61
+ graph_id: str,
62
+ action_id: str,
63
+ context: Dict[str, Any]
64
+ ) -> ValidationResult:
65
+ """Mock validation."""
66
+ return ValidationResult(
67
+ valid=True,
68
+ constraints_checked=0,
69
+ constraints_passed=0,
70
+ violations=[],
71
+ suggestions=[],
72
+ )
73
+
74
+ def get_action_space(
75
+ self,
76
+ graph_id: str,
77
+ dimensions: List[str]
78
+ ) -> List[str]:
79
+ """Mock action space retrieval."""
80
+ return []
81
+
82
+ def close(self) -> None:
83
+ """Close mock client."""
84
+ pass
85
+
86
+
87
+ class IntelligenceAdapter(BaseLayerAdapter):
88
+ """
89
+ Adapter for SCAK (Intelligence/Knowledge) layer.
90
+
91
+ Provides a clean interface for the Listener to access knowledge
92
+ graph operations without reimplementing any SCAK logic.
93
+
94
+ Usage:
95
+ ```python
96
+ adapter = IntelligenceAdapter(mock_mode=True)
97
+ adapter.connect()
98
+
99
+ # Query graph state
100
+ result = adapter.query_graph("my_graph", {"action": "restart"})
101
+
102
+ # Validate an action
103
+ validation = adapter.validate_action(
104
+ "my_graph",
105
+ "restart_service",
106
+ {"service_id": "api-gateway"}
107
+ )
108
+ ```
109
+ """
110
+
111
+ def get_layer_name(self) -> str:
112
+ return "scak"
113
+
114
+ def _create_client(self) -> Any:
115
+ """
116
+ Create the SCAK client.
117
+
118
+ In production, this would import and instantiate the actual
119
+ scak library client. For now, returns mock.
120
+ """
121
+ try:
122
+ # Attempt to import real SCAK client
123
+ # from scak import Client as SCAKClient
124
+ # return SCAKClient(self.config)
125
+
126
+ # Fall back to mock if not available
127
+ return self._mock_client()
128
+ except ImportError:
129
+ return self._mock_client()
130
+
131
+ def _mock_client(self) -> Any:
132
+ """Create mock client for testing."""
133
+ return MockSCAKClient()
134
+
135
+ def _health_ping(self) -> None:
136
+ """Verify SCAK connection."""
137
+ if self._client:
138
+ # In production: self._client.ping()
139
+ pass
140
+
141
+ def _get_version(self) -> Optional[str]:
142
+ """Get SCAK version."""
143
+ if self._client and hasattr(self._client, 'version'):
144
+ return self._client.version
145
+ return "mock-1.0.0" if self.mock_mode else None
146
+
147
+ # === SCAK-specific operations ===
148
+
149
+ def query_graph(
150
+ self,
151
+ graph_id: str,
152
+ query: Dict[str, Any]
153
+ ) -> GraphQueryResult:
154
+ """
155
+ Query a knowledge graph.
156
+
157
+ Delegates entirely to SCAK - no query logic here.
158
+
159
+ Args:
160
+ graph_id: Identifier of the graph to query
161
+ query: Query parameters (SCAK-specific format)
162
+
163
+ Returns:
164
+ GraphQueryResult with matching nodes and edges
165
+ """
166
+ self.ensure_connected()
167
+ return self._client.query(graph_id, query)
168
+
169
+ def validate_action(
170
+ self,
171
+ graph_id: str,
172
+ action_id: str,
173
+ context: Dict[str, Any]
174
+ ) -> ValidationResult:
175
+ """
176
+ Validate an action against graph constraints.
177
+
178
+ Delegates entirely to SCAK constraint validation.
179
+
180
+ Args:
181
+ graph_id: Graph to validate against
182
+ action_id: Action to validate
183
+ context: Context for validation
184
+
185
+ Returns:
186
+ ValidationResult with validation outcome
187
+ """
188
+ self.ensure_connected()
189
+ return self._client.validate(graph_id, action_id, context)
190
+
191
+ def get_pruned_action_space(
192
+ self,
193
+ graph_id: str,
194
+ dimensions: List[str],
195
+ context: Optional[Dict[str, Any]] = None
196
+ ) -> List[str]:
197
+ """
198
+ Get the pruned action space for given dimensions.
199
+
200
+ Delegates to SCAK's action space pruning logic.
201
+
202
+ Args:
203
+ graph_id: Graph to query
204
+ dimensions: Active dimensions
205
+ context: Optional context for further pruning
206
+
207
+ Returns:
208
+ List of valid action IDs
209
+ """
210
+ self.ensure_connected()
211
+ return self._client.get_action_space(graph_id, dimensions)
212
+
213
+ def get_dimension_metadata(
214
+ self,
215
+ graph_id: str,
216
+ dimension_name: str
217
+ ) -> Dict[str, Any]:
218
+ """
219
+ Get metadata for a dimension.
220
+
221
+ Args:
222
+ graph_id: Graph containing the dimension
223
+ dimension_name: Name of the dimension
224
+
225
+ Returns:
226
+ Dimension metadata dictionary
227
+ """
228
+ self.ensure_connected()
229
+ if hasattr(self._client, 'get_dimension_metadata'):
230
+ return self._client.get_dimension_metadata(graph_id, dimension_name)
231
+ return {}
232
+
233
+ def find_constraints(
234
+ self,
235
+ graph_id: str,
236
+ action_id: str
237
+ ) -> List[Dict[str, Any]]:
238
+ """
239
+ Find all constraints for an action.
240
+
241
+ Args:
242
+ graph_id: Graph to search
243
+ action_id: Action to find constraints for
244
+
245
+ Returns:
246
+ List of constraint definitions
247
+ """
248
+ self.ensure_connected()
249
+ if hasattr(self._client, 'find_constraints'):
250
+ return self._client.find_constraints(graph_id, action_id)
251
+ return []