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
nexus/reputation.py
ADDED
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Reputation Engine
|
|
5
|
+
|
|
6
|
+
Calculates and manages trust scores for agents on the Nexus network.
|
|
7
|
+
Implements the viral trust mechanism that drives network adoption.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from datetime import datetime, timedelta, timezone
|
|
11
|
+
from typing import Optional, Literal
|
|
12
|
+
from dataclasses import dataclass, field
|
|
13
|
+
from enum import Enum
|
|
14
|
+
import asyncio
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TrustTier(str, Enum):
|
|
18
|
+
"""Trust tier classification based on score."""
|
|
19
|
+
VERIFIED_PARTNER = "verified_partner" # 900-1000
|
|
20
|
+
TRUSTED = "trusted" # 700-899
|
|
21
|
+
STANDARD = "standard" # 500-699
|
|
22
|
+
PROBATIONARY = "probationary" # 300-499
|
|
23
|
+
UNTRUSTED = "untrusted" # 0-299
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class TrustScore:
|
|
28
|
+
"""Represents an agent's trust score with breakdown."""
|
|
29
|
+
|
|
30
|
+
agent_did: str
|
|
31
|
+
total_score: int
|
|
32
|
+
tier: TrustTier
|
|
33
|
+
|
|
34
|
+
# Score components
|
|
35
|
+
base_score: int
|
|
36
|
+
behavioral_modifier: int
|
|
37
|
+
capability_modifier: int
|
|
38
|
+
|
|
39
|
+
# History
|
|
40
|
+
successful_tasks: int = 0
|
|
41
|
+
failed_tasks: int = 0
|
|
42
|
+
disputes_won: int = 0
|
|
43
|
+
disputes_lost: int = 0
|
|
44
|
+
uptime_days: int = 0
|
|
45
|
+
|
|
46
|
+
# Timestamps
|
|
47
|
+
calculated_at: datetime = field(default_factory=datetime.utcnow)
|
|
48
|
+
last_activity: Optional[datetime] = None
|
|
49
|
+
|
|
50
|
+
@classmethod
|
|
51
|
+
def get_tier(cls, score: int) -> TrustTier:
|
|
52
|
+
"""Get tier from score."""
|
|
53
|
+
if score >= 900:
|
|
54
|
+
return TrustTier.VERIFIED_PARTNER
|
|
55
|
+
elif score >= 700:
|
|
56
|
+
return TrustTier.TRUSTED
|
|
57
|
+
elif score >= 500:
|
|
58
|
+
return TrustTier.STANDARD
|
|
59
|
+
elif score >= 300:
|
|
60
|
+
return TrustTier.PROBATIONARY
|
|
61
|
+
else:
|
|
62
|
+
return TrustTier.UNTRUSTED
|
|
63
|
+
|
|
64
|
+
def meets_threshold(self, required_score: int) -> bool:
|
|
65
|
+
"""Check if score meets a required threshold."""
|
|
66
|
+
return self.total_score >= required_score
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass
|
|
70
|
+
class ReputationHistory:
|
|
71
|
+
"""Historical reputation data for an agent."""
|
|
72
|
+
|
|
73
|
+
agent_did: str
|
|
74
|
+
|
|
75
|
+
# Task history
|
|
76
|
+
successful_tasks: int = 0
|
|
77
|
+
failed_tasks: int = 0
|
|
78
|
+
total_tasks: int = 0
|
|
79
|
+
|
|
80
|
+
# Dispute history
|
|
81
|
+
disputes_raised: int = 0
|
|
82
|
+
disputes_won: int = 0
|
|
83
|
+
disputes_lost: int = 0
|
|
84
|
+
|
|
85
|
+
# Activity
|
|
86
|
+
uptime_days: int = 0
|
|
87
|
+
last_activity: Optional[datetime] = None
|
|
88
|
+
registered_at: Optional[datetime] = None
|
|
89
|
+
|
|
90
|
+
# Slashing history
|
|
91
|
+
times_slashed: int = 0
|
|
92
|
+
total_slash_amount: int = 0
|
|
93
|
+
last_slashed: Optional[datetime] = None
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def success_rate(self) -> float:
|
|
97
|
+
"""Calculate task success rate."""
|
|
98
|
+
if self.total_tasks == 0:
|
|
99
|
+
return 0.0
|
|
100
|
+
return self.successful_tasks / self.total_tasks
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def dispute_win_rate(self) -> float:
|
|
104
|
+
"""Calculate dispute win rate."""
|
|
105
|
+
total_disputes = self.disputes_won + self.disputes_lost
|
|
106
|
+
if total_disputes == 0:
|
|
107
|
+
return 0.5 # Neutral
|
|
108
|
+
return self.disputes_won / total_disputes
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@dataclass
|
|
112
|
+
class SlashEvent:
|
|
113
|
+
"""Record of a reputation slash event."""
|
|
114
|
+
|
|
115
|
+
agent_did: str
|
|
116
|
+
slash_id: str
|
|
117
|
+
|
|
118
|
+
reason: Literal["hallucination", "policy_violation", "mute_triggered", "dispute_lost", "timeout", "fraud"]
|
|
119
|
+
severity: Literal["critical", "high", "medium", "low"]
|
|
120
|
+
|
|
121
|
+
score_before: int
|
|
122
|
+
score_reduction: int
|
|
123
|
+
score_after: int
|
|
124
|
+
|
|
125
|
+
# Evidence
|
|
126
|
+
evidence_hash: Optional[str] = None
|
|
127
|
+
trace_id: Optional[str] = None
|
|
128
|
+
|
|
129
|
+
# Timestamps
|
|
130
|
+
occurred_at: datetime = field(default_factory=datetime.utcnow)
|
|
131
|
+
|
|
132
|
+
# Broadcasting
|
|
133
|
+
broadcast_to_network: bool = True
|
|
134
|
+
broadcast_at: Optional[datetime] = None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class ReputationEngine:
|
|
138
|
+
"""
|
|
139
|
+
Calculates and manages trust scores for the Nexus network.
|
|
140
|
+
|
|
141
|
+
The core engine that determines which agents can communicate
|
|
142
|
+
and drives the viral adoption loop.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
# Base scores by verification level
|
|
146
|
+
BASE_SCORES = {
|
|
147
|
+
"verified_partner": 800,
|
|
148
|
+
"verified": 650,
|
|
149
|
+
"registered": 400,
|
|
150
|
+
"unknown": 100,
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
# Severity penalties for slashing
|
|
154
|
+
SLASH_PENALTIES = {
|
|
155
|
+
"critical": 200,
|
|
156
|
+
"high": 100,
|
|
157
|
+
"medium": 50,
|
|
158
|
+
"low": 25,
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# Default threshold for communication
|
|
162
|
+
DEFAULT_TRUST_THRESHOLD = 700
|
|
163
|
+
|
|
164
|
+
def __init__(self, trust_threshold: int = DEFAULT_TRUST_THRESHOLD):
|
|
165
|
+
self.trust_threshold = trust_threshold
|
|
166
|
+
self._score_cache: dict[str, TrustScore] = {}
|
|
167
|
+
self._history_cache: dict[str, ReputationHistory] = {}
|
|
168
|
+
self._slash_events: list[SlashEvent] = []
|
|
169
|
+
|
|
170
|
+
def calculate_trust_score(
|
|
171
|
+
self,
|
|
172
|
+
verification_level: str,
|
|
173
|
+
history: ReputationHistory,
|
|
174
|
+
capabilities: Optional[dict] = None,
|
|
175
|
+
privacy: Optional[dict] = None,
|
|
176
|
+
) -> TrustScore:
|
|
177
|
+
"""
|
|
178
|
+
Calculate trust score from 0-1000.
|
|
179
|
+
|
|
180
|
+
Base score from verification level + modifiers from behavior and capabilities.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
verification_level: Agent's verification tier
|
|
184
|
+
history: Agent's reputation history
|
|
185
|
+
capabilities: Agent's capability manifest
|
|
186
|
+
privacy: Agent's privacy settings
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
TrustScore with full breakdown
|
|
190
|
+
"""
|
|
191
|
+
# Base score from verification tier
|
|
192
|
+
base_score = self.BASE_SCORES.get(verification_level, 100)
|
|
193
|
+
|
|
194
|
+
# Behavioral modifiers
|
|
195
|
+
behavioral_modifier = 0
|
|
196
|
+
behavioral_modifier += history.successful_tasks * 2 # +2 per success
|
|
197
|
+
behavioral_modifier -= history.failed_tasks * 10 # -10 per failure
|
|
198
|
+
behavioral_modifier -= history.disputes_lost * 50 # -50 per lost dispute
|
|
199
|
+
behavioral_modifier += history.disputes_won * 10 # +10 per won dispute
|
|
200
|
+
behavioral_modifier += int(history.uptime_days * 0.5) # +0.5 per day online
|
|
201
|
+
behavioral_modifier -= history.times_slashed * 75 # -75 per slash
|
|
202
|
+
|
|
203
|
+
# Cap behavioral modifier
|
|
204
|
+
behavioral_modifier = max(-300, min(300, behavioral_modifier))
|
|
205
|
+
|
|
206
|
+
# Capability modifiers
|
|
207
|
+
capability_modifier = 0
|
|
208
|
+
if capabilities:
|
|
209
|
+
if capabilities.get("reversibility") == "full":
|
|
210
|
+
capability_modifier += 50
|
|
211
|
+
elif capabilities.get("reversibility") == "partial":
|
|
212
|
+
capability_modifier += 25
|
|
213
|
+
|
|
214
|
+
if capabilities.get("idempotency"):
|
|
215
|
+
capability_modifier += 20
|
|
216
|
+
|
|
217
|
+
if privacy:
|
|
218
|
+
if privacy.get("retention_policy") == "ephemeral":
|
|
219
|
+
capability_modifier += 30
|
|
220
|
+
elif privacy.get("retention_policy") == "permanent":
|
|
221
|
+
capability_modifier -= 20
|
|
222
|
+
|
|
223
|
+
if privacy.get("training_consent"):
|
|
224
|
+
capability_modifier -= 20
|
|
225
|
+
|
|
226
|
+
if privacy.get("pii_handling") == "reject":
|
|
227
|
+
capability_modifier += 20
|
|
228
|
+
|
|
229
|
+
# Calculate total
|
|
230
|
+
total_score = base_score + behavioral_modifier + capability_modifier
|
|
231
|
+
total_score = max(0, min(1000, total_score)) # Clamp to 0-1000
|
|
232
|
+
|
|
233
|
+
return TrustScore(
|
|
234
|
+
agent_did=history.agent_did,
|
|
235
|
+
total_score=total_score,
|
|
236
|
+
tier=TrustScore.get_tier(total_score),
|
|
237
|
+
base_score=base_score,
|
|
238
|
+
behavioral_modifier=behavioral_modifier,
|
|
239
|
+
capability_modifier=capability_modifier,
|
|
240
|
+
successful_tasks=history.successful_tasks,
|
|
241
|
+
failed_tasks=history.failed_tasks,
|
|
242
|
+
disputes_won=history.disputes_won,
|
|
243
|
+
disputes_lost=history.disputes_lost,
|
|
244
|
+
uptime_days=history.uptime_days,
|
|
245
|
+
last_activity=history.last_activity,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
def record_task_outcome(
|
|
249
|
+
self,
|
|
250
|
+
agent_did: str,
|
|
251
|
+
outcome: Literal["success", "failure", "partial"],
|
|
252
|
+
) -> ReputationHistory:
|
|
253
|
+
"""Record a task outcome and update history."""
|
|
254
|
+
history = self._get_or_create_history(agent_did)
|
|
255
|
+
|
|
256
|
+
history.total_tasks += 1
|
|
257
|
+
history.last_activity = datetime.now(timezone.utc)
|
|
258
|
+
|
|
259
|
+
if outcome == "success":
|
|
260
|
+
history.successful_tasks += 1
|
|
261
|
+
elif outcome == "failure":
|
|
262
|
+
history.failed_tasks += 1
|
|
263
|
+
else: # partial
|
|
264
|
+
history.successful_tasks += 0.5
|
|
265
|
+
history.failed_tasks += 0.5
|
|
266
|
+
|
|
267
|
+
return history
|
|
268
|
+
|
|
269
|
+
def record_dispute_outcome(
|
|
270
|
+
self,
|
|
271
|
+
agent_did: str,
|
|
272
|
+
outcome: Literal["won", "lost"],
|
|
273
|
+
) -> ReputationHistory:
|
|
274
|
+
"""Record a dispute outcome and update history."""
|
|
275
|
+
history = self._get_or_create_history(agent_did)
|
|
276
|
+
|
|
277
|
+
history.disputes_raised += 1
|
|
278
|
+
history.last_activity = datetime.now(timezone.utc)
|
|
279
|
+
|
|
280
|
+
if outcome == "won":
|
|
281
|
+
history.disputes_won += 1
|
|
282
|
+
else:
|
|
283
|
+
history.disputes_lost += 1
|
|
284
|
+
|
|
285
|
+
return history
|
|
286
|
+
|
|
287
|
+
def slash_reputation(
|
|
288
|
+
self,
|
|
289
|
+
agent_did: str,
|
|
290
|
+
reason: Literal["hallucination", "policy_violation", "mute_triggered", "dispute_lost", "timeout", "fraud"],
|
|
291
|
+
severity: Literal["critical", "high", "medium", "low"],
|
|
292
|
+
evidence_hash: Optional[str] = None,
|
|
293
|
+
trace_id: Optional[str] = None,
|
|
294
|
+
broadcast: bool = True,
|
|
295
|
+
) -> SlashEvent:
|
|
296
|
+
"""
|
|
297
|
+
Slash an agent's reputation for misbehavior.
|
|
298
|
+
|
|
299
|
+
When triggered, broadcasts to the network so all agents
|
|
300
|
+
immediately block the offending agent.
|
|
301
|
+
"""
|
|
302
|
+
history = self._get_or_create_history(agent_did)
|
|
303
|
+
|
|
304
|
+
# Get current score
|
|
305
|
+
current_score = self._score_cache.get(agent_did)
|
|
306
|
+
score_before = current_score.total_score if current_score else 400
|
|
307
|
+
|
|
308
|
+
# Calculate reduction
|
|
309
|
+
score_reduction = self.SLASH_PENALTIES[severity]
|
|
310
|
+
score_after = max(0, score_before - score_reduction)
|
|
311
|
+
|
|
312
|
+
# Update history
|
|
313
|
+
history.times_slashed += 1
|
|
314
|
+
history.total_slash_amount += score_reduction
|
|
315
|
+
history.last_slashed = datetime.now(timezone.utc)
|
|
316
|
+
|
|
317
|
+
# Create slash event
|
|
318
|
+
slash_event = SlashEvent(
|
|
319
|
+
agent_did=agent_did,
|
|
320
|
+
slash_id=f"slash_{agent_did}_{datetime.now(timezone.utc).timestamp()}",
|
|
321
|
+
reason=reason,
|
|
322
|
+
severity=severity,
|
|
323
|
+
score_before=score_before,
|
|
324
|
+
score_reduction=score_reduction,
|
|
325
|
+
score_after=score_after,
|
|
326
|
+
evidence_hash=evidence_hash,
|
|
327
|
+
trace_id=trace_id,
|
|
328
|
+
broadcast_to_network=broadcast,
|
|
329
|
+
broadcast_at=datetime.now(timezone.utc) if broadcast else None,
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
self._slash_events.append(slash_event)
|
|
333
|
+
|
|
334
|
+
# Invalidate score cache
|
|
335
|
+
if agent_did in self._score_cache:
|
|
336
|
+
del self._score_cache[agent_did]
|
|
337
|
+
|
|
338
|
+
return slash_event
|
|
339
|
+
|
|
340
|
+
def check_trust_threshold(
|
|
341
|
+
self,
|
|
342
|
+
agent_did: str,
|
|
343
|
+
required_score: Optional[int] = None,
|
|
344
|
+
) -> tuple[bool, TrustScore]:
|
|
345
|
+
"""
|
|
346
|
+
Check if an agent meets the trust threshold.
|
|
347
|
+
|
|
348
|
+
Returns:
|
|
349
|
+
Tuple of (meets_threshold, trust_score)
|
|
350
|
+
"""
|
|
351
|
+
threshold = required_score or self.trust_threshold
|
|
352
|
+
|
|
353
|
+
# Get or calculate score
|
|
354
|
+
score = self._score_cache.get(agent_did)
|
|
355
|
+
if not score:
|
|
356
|
+
history = self._get_or_create_history(agent_did)
|
|
357
|
+
score = self.calculate_trust_score("registered", history)
|
|
358
|
+
self._score_cache[agent_did] = score
|
|
359
|
+
|
|
360
|
+
return score.meets_threshold(threshold), score
|
|
361
|
+
|
|
362
|
+
def get_network_reputation(
|
|
363
|
+
self,
|
|
364
|
+
agent_dids: Optional[list[str]] = None,
|
|
365
|
+
) -> dict[str, int]:
|
|
366
|
+
"""
|
|
367
|
+
Get reputation scores for multiple agents.
|
|
368
|
+
|
|
369
|
+
Used for syncing local known_peers cache.
|
|
370
|
+
"""
|
|
371
|
+
if agent_dids is None:
|
|
372
|
+
return {did: score.total_score for did, score in self._score_cache.items()}
|
|
373
|
+
|
|
374
|
+
result = {}
|
|
375
|
+
for did in agent_dids:
|
|
376
|
+
if did in self._score_cache:
|
|
377
|
+
result[did] = self._score_cache[did].total_score
|
|
378
|
+
else:
|
|
379
|
+
history = self._get_or_create_history(did)
|
|
380
|
+
score = self.calculate_trust_score("registered", history)
|
|
381
|
+
result[did] = score.total_score
|
|
382
|
+
|
|
383
|
+
return result
|
|
384
|
+
|
|
385
|
+
async def broadcast_slash_event(self, slash_event: SlashEvent) -> int:
|
|
386
|
+
"""
|
|
387
|
+
Broadcast a slash event to all connected agents.
|
|
388
|
+
|
|
389
|
+
Returns number of agents notified.
|
|
390
|
+
"""
|
|
391
|
+
# In production, this would use pub/sub or webhooks
|
|
392
|
+
# For now, just mark as broadcast
|
|
393
|
+
slash_event.broadcast_at = datetime.now(timezone.utc)
|
|
394
|
+
return len(self._score_cache)
|
|
395
|
+
|
|
396
|
+
def _get_or_create_history(self, agent_did: str) -> ReputationHistory:
|
|
397
|
+
"""Get or create reputation history for an agent."""
|
|
398
|
+
if agent_did not in self._history_cache:
|
|
399
|
+
self._history_cache[agent_did] = ReputationHistory(
|
|
400
|
+
agent_did=agent_did,
|
|
401
|
+
registered_at=datetime.now(timezone.utc),
|
|
402
|
+
)
|
|
403
|
+
return self._history_cache[agent_did]
|
|
404
|
+
|
|
405
|
+
def get_leaderboard(self, limit: int = 100) -> list[TrustScore]:
|
|
406
|
+
"""Get top agents by trust score."""
|
|
407
|
+
scores = list(self._score_cache.values())
|
|
408
|
+
scores.sort(key=lambda s: s.total_score, reverse=True)
|
|
409
|
+
return scores[:limit]
|
|
410
|
+
|
|
411
|
+
def get_slash_history(
|
|
412
|
+
self,
|
|
413
|
+
agent_did: Optional[str] = None,
|
|
414
|
+
since: Optional[datetime] = None,
|
|
415
|
+
) -> list[SlashEvent]:
|
|
416
|
+
"""Get slash event history."""
|
|
417
|
+
events = self._slash_events
|
|
418
|
+
|
|
419
|
+
if agent_did:
|
|
420
|
+
events = [e for e in events if e.agent_did == agent_did]
|
|
421
|
+
|
|
422
|
+
if since:
|
|
423
|
+
events = [e for e in events if e.occurred_at >= since]
|
|
424
|
+
|
|
425
|
+
return events
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Nexus Schema Definitions
|
|
5
|
+
|
|
6
|
+
Pydantic models for all Nexus data structures.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .manifest import (
|
|
10
|
+
AgentIdentity,
|
|
11
|
+
AgentCapabilities,
|
|
12
|
+
AgentPrivacy,
|
|
13
|
+
MuteRules,
|
|
14
|
+
AgentManifest,
|
|
15
|
+
)
|
|
16
|
+
from .receipt import (
|
|
17
|
+
JobReceipt,
|
|
18
|
+
JobCompletionReceipt,
|
|
19
|
+
SignedReceipt,
|
|
20
|
+
)
|
|
21
|
+
from .escrow import (
|
|
22
|
+
EscrowRequest,
|
|
23
|
+
EscrowReceipt,
|
|
24
|
+
EscrowStatus,
|
|
25
|
+
EscrowRelease,
|
|
26
|
+
)
|
|
27
|
+
from .compliance import (
|
|
28
|
+
ComplianceRecord,
|
|
29
|
+
ComplianceAuditReport,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
# Manifest
|
|
34
|
+
"AgentIdentity",
|
|
35
|
+
"AgentCapabilities",
|
|
36
|
+
"AgentPrivacy",
|
|
37
|
+
"MuteRules",
|
|
38
|
+
"AgentManifest",
|
|
39
|
+
# Receipt
|
|
40
|
+
"JobReceipt",
|
|
41
|
+
"JobCompletionReceipt",
|
|
42
|
+
"SignedReceipt",
|
|
43
|
+
# Escrow
|
|
44
|
+
"EscrowRequest",
|
|
45
|
+
"EscrowReceipt",
|
|
46
|
+
"EscrowStatus",
|
|
47
|
+
"EscrowRelease",
|
|
48
|
+
# Compliance
|
|
49
|
+
"ComplianceRecord",
|
|
50
|
+
"ComplianceAuditReport",
|
|
51
|
+
]
|