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/registry.py ADDED
@@ -0,0 +1,393 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ Agent Registry
5
+
6
+ Manages agent registration, discovery, and manifest storage for the Nexus network.
7
+ """
8
+
9
+ from datetime import datetime, timezone
10
+ from typing import Optional, AsyncIterator
11
+ from dataclasses import dataclass, field
12
+ import hashlib
13
+ import json
14
+ import asyncio
15
+
16
+ from .schemas.manifest import AgentManifest, AgentIdentity
17
+ from .reputation import ReputationEngine, TrustScore, ReputationHistory
18
+ from .exceptions import (
19
+ AgentAlreadyRegisteredError,
20
+ AgentNotFoundError,
21
+ InvalidManifestError,
22
+ IATPUnverifiedPeerException,
23
+ IATPInsufficientTrustException,
24
+ )
25
+
26
+
27
+ @dataclass
28
+ class RegistrationResult:
29
+ """Result of agent registration."""
30
+
31
+ success: bool
32
+ agent_did: str
33
+ manifest_hash: str
34
+ trust_score: int
35
+ registered_at: datetime
36
+
37
+ # Nexus attestation
38
+ nexus_signature: Optional[str] = None
39
+
40
+ # Errors (if any)
41
+ errors: list[str] = field(default_factory=list)
42
+
43
+
44
+ @dataclass
45
+ class PeerVerification:
46
+ """Result of peer verification."""
47
+
48
+ verified: bool
49
+ peer_did: str
50
+ trust_score: int
51
+ trust_tier: str
52
+
53
+ # Manifest summary
54
+ capabilities: list[str] = field(default_factory=list)
55
+ privacy_policy: Optional[str] = None
56
+
57
+ # Attestation
58
+ attestation_valid: bool = False
59
+ attestation_expires: Optional[datetime] = None
60
+
61
+ # Rejection reason (if not verified)
62
+ rejection_reason: Optional[str] = None
63
+
64
+
65
+ class AgentRegistry:
66
+ """
67
+ Central registry for agent manifests on the Nexus network.
68
+
69
+ Handles:
70
+ - Agent registration and deregistration
71
+ - Manifest storage and retrieval
72
+ - Peer discovery and verification
73
+ - Integration with reputation engine
74
+ """
75
+
76
+ def __init__(self, reputation_engine: Optional[ReputationEngine] = None):
77
+ self.reputation_engine = reputation_engine or ReputationEngine()
78
+
79
+ # In-memory storage (would be database in production)
80
+ self._manifests: dict[str, AgentManifest] = {}
81
+ self._manifest_hashes: dict[str, str] = {}
82
+ self._did_to_owner: dict[str, str] = {}
83
+
84
+ async def register(
85
+ self,
86
+ manifest: AgentManifest,
87
+ signature: str,
88
+ ) -> RegistrationResult:
89
+ """
90
+ Register a new agent on Nexus.
91
+
92
+ Args:
93
+ manifest: Complete agent manifest
94
+ signature: Ed25519 signature from agent's verification key
95
+
96
+ Returns:
97
+ RegistrationResult with status and initial trust score
98
+ """
99
+ agent_did = manifest.identity.did
100
+
101
+ # Check if already registered
102
+ if agent_did in self._manifests:
103
+ raise AgentAlreadyRegisteredError(agent_did)
104
+
105
+ # Validate manifest
106
+ validation_errors = self._validate_manifest(manifest)
107
+ if validation_errors:
108
+ raise InvalidManifestError(agent_did, validation_errors)
109
+
110
+ # TODO: Verify signature against verification key
111
+ # For now, trust the signature
112
+
113
+ # Set registration timestamp
114
+ manifest.registered_at = datetime.now(timezone.utc)
115
+ manifest.last_seen = datetime.now(timezone.utc)
116
+
117
+ # Calculate manifest hash
118
+ manifest_hash = self._compute_manifest_hash(manifest)
119
+
120
+ # Initialize reputation
121
+ history = ReputationHistory(
122
+ agent_did=agent_did,
123
+ registered_at=manifest.registered_at,
124
+ )
125
+
126
+ trust_score = self.reputation_engine.calculate_trust_score(
127
+ verification_level=manifest.verification_level,
128
+ history=history,
129
+ capabilities=manifest.capabilities.model_dump(),
130
+ privacy=manifest.privacy.model_dump(),
131
+ )
132
+
133
+ manifest.trust_score = trust_score.total_score
134
+
135
+ # Store manifest
136
+ self._manifests[agent_did] = manifest
137
+ self._manifest_hashes[agent_did] = manifest_hash
138
+ self._did_to_owner[agent_did] = manifest.identity.owner_id
139
+
140
+ # Generate Nexus attestation
141
+ nexus_signature = self._sign_registration(agent_did, manifest_hash)
142
+
143
+ return RegistrationResult(
144
+ success=True,
145
+ agent_did=agent_did,
146
+ manifest_hash=manifest_hash,
147
+ trust_score=trust_score.total_score,
148
+ registered_at=manifest.registered_at,
149
+ nexus_signature=nexus_signature,
150
+ )
151
+
152
+ async def update(
153
+ self,
154
+ agent_did: str,
155
+ manifest: AgentManifest,
156
+ signature: str,
157
+ ) -> RegistrationResult:
158
+ """Update an existing agent's manifest."""
159
+ if agent_did not in self._manifests:
160
+ raise AgentNotFoundError(agent_did)
161
+
162
+ # Validate ownership (DID must match)
163
+ if manifest.identity.did != agent_did:
164
+ raise InvalidManifestError(agent_did, ["DID mismatch"])
165
+
166
+ # Preserve registration time
167
+ manifest.registered_at = self._manifests[agent_did].registered_at
168
+ manifest.last_seen = datetime.now(timezone.utc)
169
+
170
+ # Recalculate trust score
171
+ history = self.reputation_engine._get_or_create_history(agent_did)
172
+ trust_score = self.reputation_engine.calculate_trust_score(
173
+ verification_level=manifest.verification_level,
174
+ history=history,
175
+ capabilities=manifest.capabilities.model_dump(),
176
+ privacy=manifest.privacy.model_dump(),
177
+ )
178
+ manifest.trust_score = trust_score.total_score
179
+
180
+ # Update storage
181
+ manifest_hash = self._compute_manifest_hash(manifest)
182
+ self._manifests[agent_did] = manifest
183
+ self._manifest_hashes[agent_did] = manifest_hash
184
+
185
+ return RegistrationResult(
186
+ success=True,
187
+ agent_did=agent_did,
188
+ manifest_hash=manifest_hash,
189
+ trust_score=trust_score.total_score,
190
+ registered_at=manifest.registered_at,
191
+ nexus_signature=self._sign_registration(agent_did, manifest_hash),
192
+ )
193
+
194
+ async def deregister(self, agent_did: str, signature: str) -> bool:
195
+ """Remove an agent from the registry."""
196
+ if agent_did not in self._manifests:
197
+ raise AgentNotFoundError(agent_did)
198
+
199
+ # TODO: Verify signature
200
+
201
+ del self._manifests[agent_did]
202
+ del self._manifest_hashes[agent_did]
203
+ del self._did_to_owner[agent_did]
204
+
205
+ return True
206
+
207
+ async def get_manifest(self, agent_did: str) -> AgentManifest:
208
+ """Get an agent's manifest by DID."""
209
+ if agent_did not in self._manifests:
210
+ raise AgentNotFoundError(agent_did)
211
+
212
+ return self._manifests[agent_did]
213
+
214
+ async def verify_peer(
215
+ self,
216
+ peer_did: str,
217
+ min_score: int = 700,
218
+ required_capabilities: Optional[list[str]] = None,
219
+ ) -> PeerVerification:
220
+ """
221
+ Verify a peer agent before IATP handshake.
222
+
223
+ This is the core viral mechanism - unverified peers get directed
224
+ to register on Nexus.
225
+
226
+ Args:
227
+ peer_did: DID of the peer to verify
228
+ min_score: Minimum required trust score
229
+ required_capabilities: Capabilities the peer must have
230
+
231
+ Returns:
232
+ PeerVerification result
233
+
234
+ Raises:
235
+ IATPUnverifiedPeerException: If peer is not registered
236
+ IATPInsufficientTrustException: If peer's score is below threshold
237
+ """
238
+ # Check if registered
239
+ if peer_did not in self._manifests:
240
+ raise IATPUnverifiedPeerException(peer_did)
241
+
242
+ manifest = self._manifests[peer_did]
243
+
244
+ # Update last seen
245
+ manifest.last_seen = datetime.now(timezone.utc)
246
+
247
+ # Get trust score
248
+ meets_threshold, trust_score = self.reputation_engine.check_trust_threshold(
249
+ peer_did, min_score
250
+ )
251
+
252
+ if not meets_threshold:
253
+ raise IATPInsufficientTrustException(
254
+ peer_did,
255
+ current_score=trust_score.total_score,
256
+ required_score=min_score,
257
+ )
258
+
259
+ # Check capabilities if required
260
+ if required_capabilities:
261
+ missing = set(required_capabilities) - set(manifest.capabilities.domains)
262
+ if missing:
263
+ return PeerVerification(
264
+ verified=False,
265
+ peer_did=peer_did,
266
+ trust_score=trust_score.total_score,
267
+ trust_tier=trust_score.tier.value,
268
+ capabilities=manifest.capabilities.domains,
269
+ rejection_reason=f"Missing capabilities: {missing}",
270
+ )
271
+
272
+ return PeerVerification(
273
+ verified=True,
274
+ peer_did=peer_did,
275
+ trust_score=trust_score.total_score,
276
+ trust_tier=trust_score.tier.value,
277
+ capabilities=manifest.capabilities.domains,
278
+ privacy_policy=manifest.privacy.retention_policy,
279
+ attestation_valid=manifest.is_attestation_valid(),
280
+ attestation_expires=manifest.attestation_expires,
281
+ )
282
+
283
+ async def discover_agents(
284
+ self,
285
+ capabilities: Optional[list[str]] = None,
286
+ min_score: int = 500,
287
+ privacy_policy: Optional[str] = None,
288
+ limit: int = 100,
289
+ ) -> list[AgentManifest]:
290
+ """
291
+ Discover agents matching criteria.
292
+
293
+ Args:
294
+ capabilities: Required capability domains
295
+ min_score: Minimum trust score
296
+ privacy_policy: Required privacy policy (e.g., "ephemeral")
297
+ limit: Maximum results
298
+
299
+ Returns:
300
+ List of matching agent manifests
301
+ """
302
+ results = []
303
+
304
+ for agent_did, manifest in self._manifests.items():
305
+ # Filter by trust score
306
+ if manifest.trust_score < min_score:
307
+ continue
308
+
309
+ # Filter by capabilities
310
+ if capabilities:
311
+ if not all(c in manifest.capabilities.domains for c in capabilities):
312
+ continue
313
+
314
+ # Filter by privacy policy
315
+ if privacy_policy:
316
+ if manifest.privacy.retention_policy != privacy_policy:
317
+ continue
318
+
319
+ results.append(manifest)
320
+
321
+ if len(results) >= limit:
322
+ break
323
+
324
+ # Sort by trust score descending
325
+ results.sort(key=lambda m: m.trust_score, reverse=True)
326
+
327
+ return results
328
+
329
+ async def get_reputation_sync(
330
+ self,
331
+ agent_dids: Optional[list[str]] = None,
332
+ ) -> dict[str, int]:
333
+ """
334
+ Get reputation scores for syncing to local cache.
335
+
336
+ Used by NexusClient.sync_reputation()
337
+ """
338
+ if agent_dids is None:
339
+ return {did: m.trust_score for did, m in self._manifests.items()}
340
+
341
+ return {
342
+ did: self._manifests[did].trust_score
343
+ for did in agent_dids
344
+ if did in self._manifests
345
+ }
346
+
347
+ def is_registered(self, agent_did: str) -> bool:
348
+ """Check if an agent is registered."""
349
+ return agent_did in self._manifests
350
+
351
+ def get_agent_count(self) -> int:
352
+ """Get total number of registered agents."""
353
+ return len(self._manifests)
354
+
355
+ async def list_by_owner(self, owner_id: str) -> list[AgentManifest]:
356
+ """List all agents owned by an organization."""
357
+ return [
358
+ manifest
359
+ for did, manifest in self._manifests.items()
360
+ if self._did_to_owner.get(did) == owner_id
361
+ ]
362
+
363
+ def _validate_manifest(self, manifest: AgentManifest) -> list[str]:
364
+ """Validate a manifest and return list of errors."""
365
+ errors = []
366
+
367
+ # Validate DID format
368
+ if not manifest.identity.did.startswith("did:nexus:"):
369
+ errors.append("DID must start with 'did:nexus:'")
370
+
371
+ # Validate verification key
372
+ if not manifest.identity.verification_key.startswith("ed25519:"):
373
+ errors.append("Verification key must be Ed25519 format")
374
+
375
+ # Validate owner ID
376
+ if not manifest.identity.owner_id:
377
+ errors.append("Owner ID is required")
378
+
379
+ return errors
380
+
381
+ def _compute_manifest_hash(self, manifest: AgentManifest) -> str:
382
+ """Compute deterministic hash of manifest."""
383
+ # Exclude timestamps for deterministic hashing
384
+ data = manifest.model_dump(exclude={"registered_at", "last_seen", "trust_score"})
385
+ canonical = json.dumps(data, sort_keys=True, default=str)
386
+ return hashlib.sha256(canonical.encode()).hexdigest()
387
+
388
+ def _sign_registration(self, agent_did: str, manifest_hash: str) -> str:
389
+ """Generate Nexus signature for registration."""
390
+ # In production, this would use Nexus's private key
391
+ # For now, generate a placeholder
392
+ data = f"{agent_did}:{manifest_hash}:{datetime.now(timezone.utc).isoformat()}"
393
+ return f"nexus_sig_{hashlib.sha256(data.encode()).hexdigest()[:32]}"