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
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
+ ]