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/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]}"
|