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,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 []
|