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/exceptions.py
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Nexus Exceptions
|
|
5
|
+
|
|
6
|
+
Custom exceptions for the Nexus Trust Exchange.
|
|
7
|
+
These exceptions drive the viral loop by directing unverified agents to register.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class NexusError(Exception):
|
|
14
|
+
"""Base exception for all Nexus errors."""
|
|
15
|
+
|
|
16
|
+
def __init__(self, message: str, code: Optional[str] = None):
|
|
17
|
+
self.message = message
|
|
18
|
+
self.code = code or "NEXUS_ERROR"
|
|
19
|
+
super().__init__(f"[{self.code}] {message}")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class IATPUnverifiedPeerException(NexusError):
|
|
23
|
+
"""
|
|
24
|
+
Raised when a peer agent is not registered on Nexus.
|
|
25
|
+
|
|
26
|
+
This is THE viral mechanism - the error message includes a registration URL,
|
|
27
|
+
driving unverified agents to register on Nexus to communicate.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
REGISTRATION_BASE_URL = "https://nexus.agent-os.dev/register"
|
|
31
|
+
|
|
32
|
+
def __init__(self, peer_id: str, peer_address: Optional[str] = None):
|
|
33
|
+
self.peer_id = peer_id
|
|
34
|
+
self.peer_address = peer_address
|
|
35
|
+
self.registration_url = f"{self.REGISTRATION_BASE_URL}?agent={peer_id}"
|
|
36
|
+
|
|
37
|
+
message = (
|
|
38
|
+
f"Agent identity unknown: '{peer_id}' is not registered on Nexus. "
|
|
39
|
+
f"To establish an IATP handshake, the agent must register at: {self.registration_url}"
|
|
40
|
+
)
|
|
41
|
+
super().__init__(message, code="IATP_UNVERIFIED_PEER")
|
|
42
|
+
|
|
43
|
+
def to_iatp_error(self) -> dict:
|
|
44
|
+
"""Convert to IATP error response format."""
|
|
45
|
+
return {
|
|
46
|
+
"error": "IATP_UNVERIFIED_PEER",
|
|
47
|
+
"message": self.message,
|
|
48
|
+
"peer_id": self.peer_id,
|
|
49
|
+
"registration_url": self.registration_url,
|
|
50
|
+
"action_required": "Register the agent on Nexus to enable communication",
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class IATPInsufficientTrustException(NexusError):
|
|
55
|
+
"""
|
|
56
|
+
Raised when a peer's trust score is below the required threshold.
|
|
57
|
+
|
|
58
|
+
Drives agents to improve their reputation through successful task completion.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(
|
|
62
|
+
self,
|
|
63
|
+
peer_did: str,
|
|
64
|
+
current_score: int,
|
|
65
|
+
required_score: int,
|
|
66
|
+
improvement_url: Optional[str] = None
|
|
67
|
+
):
|
|
68
|
+
self.peer_did = peer_did
|
|
69
|
+
self.current_score = current_score
|
|
70
|
+
self.required_score = required_score
|
|
71
|
+
self.improvement_url = improvement_url or f"https://nexus.agent-os.dev/reputation/{peer_did}"
|
|
72
|
+
self.score_gap = required_score - current_score
|
|
73
|
+
|
|
74
|
+
message = (
|
|
75
|
+
f"Insufficient trust score for agent '{peer_did}': "
|
|
76
|
+
f"current={current_score}, required={required_score} (gap: {self.score_gap}). "
|
|
77
|
+
f"Improve reputation at: {self.improvement_url}"
|
|
78
|
+
)
|
|
79
|
+
super().__init__(message, code="IATP_INSUFFICIENT_TRUST")
|
|
80
|
+
|
|
81
|
+
def to_iatp_error(self) -> dict:
|
|
82
|
+
"""Convert to IATP error response format."""
|
|
83
|
+
return {
|
|
84
|
+
"error": "IATP_INSUFFICIENT_TRUST",
|
|
85
|
+
"message": self.message,
|
|
86
|
+
"peer_did": self.peer_did,
|
|
87
|
+
"current_score": self.current_score,
|
|
88
|
+
"required_score": self.required_score,
|
|
89
|
+
"score_gap": self.score_gap,
|
|
90
|
+
"improvement_url": self.improvement_url,
|
|
91
|
+
"action_required": "Complete tasks successfully to improve reputation",
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class IATPAttestationExpiredException(NexusError):
|
|
96
|
+
"""Raised when a peer's attestation has expired."""
|
|
97
|
+
|
|
98
|
+
def __init__(self, peer_did: str, expired_at: str):
|
|
99
|
+
self.peer_did = peer_did
|
|
100
|
+
self.expired_at = expired_at
|
|
101
|
+
|
|
102
|
+
message = (
|
|
103
|
+
f"Attestation expired for agent '{peer_did}' at {expired_at}. "
|
|
104
|
+
f"Agent must renew attestation with Control Plane."
|
|
105
|
+
)
|
|
106
|
+
super().__init__(message, code="IATP_ATTESTATION_EXPIRED")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class IATPPolicyViolationException(NexusError):
|
|
110
|
+
"""Raised when a peer's policies don't meet requirements."""
|
|
111
|
+
|
|
112
|
+
def __init__(self, peer_did: str, violation: str, required_policy: str):
|
|
113
|
+
self.peer_did = peer_did
|
|
114
|
+
self.violation = violation
|
|
115
|
+
self.required_policy = required_policy
|
|
116
|
+
|
|
117
|
+
message = (
|
|
118
|
+
f"Policy violation for agent '{peer_did}': {violation}. "
|
|
119
|
+
f"Required policy: {required_policy}"
|
|
120
|
+
)
|
|
121
|
+
super().__init__(message, code="IATP_POLICY_VIOLATION")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class EscrowError(NexusError):
|
|
125
|
+
"""Base exception for escrow-related errors."""
|
|
126
|
+
|
|
127
|
+
def __init__(self, message: str, escrow_id: Optional[str] = None):
|
|
128
|
+
self.escrow_id = escrow_id
|
|
129
|
+
super().__init__(message, code="ESCROW_ERROR")
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class EscrowNotFoundError(EscrowError):
|
|
133
|
+
"""Raised when an escrow cannot be found."""
|
|
134
|
+
|
|
135
|
+
def __init__(self, escrow_id: str):
|
|
136
|
+
super().__init__(f"Escrow not found: {escrow_id}", escrow_id=escrow_id)
|
|
137
|
+
self.code = "ESCROW_NOT_FOUND"
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class EscrowExpiredError(EscrowError):
|
|
141
|
+
"""Raised when attempting to operate on an expired escrow."""
|
|
142
|
+
|
|
143
|
+
def __init__(self, escrow_id: str, expired_at: str):
|
|
144
|
+
self.expired_at = expired_at
|
|
145
|
+
super().__init__(
|
|
146
|
+
f"Escrow {escrow_id} expired at {expired_at}",
|
|
147
|
+
escrow_id=escrow_id
|
|
148
|
+
)
|
|
149
|
+
self.code = "ESCROW_EXPIRED"
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class EscrowAlreadyResolvedError(EscrowError):
|
|
153
|
+
"""Raised when attempting to modify an already-resolved escrow."""
|
|
154
|
+
|
|
155
|
+
def __init__(self, escrow_id: str, resolution_status: str):
|
|
156
|
+
self.resolution_status = resolution_status
|
|
157
|
+
super().__init__(
|
|
158
|
+
f"Escrow {escrow_id} already resolved with status: {resolution_status}",
|
|
159
|
+
escrow_id=escrow_id
|
|
160
|
+
)
|
|
161
|
+
self.code = "ESCROW_ALREADY_RESOLVED"
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class InsufficientCreditsError(EscrowError):
|
|
165
|
+
"""Raised when an agent doesn't have enough credits for escrow."""
|
|
166
|
+
|
|
167
|
+
def __init__(self, agent_did: str, required: int, available: int):
|
|
168
|
+
self.agent_did = agent_did
|
|
169
|
+
self.required = required
|
|
170
|
+
self.available = available
|
|
171
|
+
super().__init__(
|
|
172
|
+
f"Agent {agent_did} has insufficient credits: required={required}, available={available}"
|
|
173
|
+
)
|
|
174
|
+
self.code = "INSUFFICIENT_CREDITS"
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
class DisputeError(NexusError):
|
|
178
|
+
"""Base exception for dispute-related errors."""
|
|
179
|
+
|
|
180
|
+
def __init__(self, message: str, dispute_id: Optional[str] = None):
|
|
181
|
+
self.dispute_id = dispute_id
|
|
182
|
+
super().__init__(message, code="DISPUTE_ERROR")
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class DisputeNotFoundError(DisputeError):
|
|
186
|
+
"""Raised when a dispute cannot be found."""
|
|
187
|
+
|
|
188
|
+
def __init__(self, dispute_id: str):
|
|
189
|
+
super().__init__(f"Dispute not found: {dispute_id}", dispute_id=dispute_id)
|
|
190
|
+
self.code = "DISPUTE_NOT_FOUND"
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
class DisputeAlreadyResolvedError(DisputeError):
|
|
194
|
+
"""Raised when attempting to modify a resolved dispute."""
|
|
195
|
+
|
|
196
|
+
def __init__(self, dispute_id: str):
|
|
197
|
+
super().__init__(
|
|
198
|
+
f"Dispute {dispute_id} has already been resolved",
|
|
199
|
+
dispute_id=dispute_id
|
|
200
|
+
)
|
|
201
|
+
self.code = "DISPUTE_ALREADY_RESOLVED"
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class DisputeEvidenceError(DisputeError):
|
|
205
|
+
"""Raised when there's an issue with dispute evidence."""
|
|
206
|
+
|
|
207
|
+
def __init__(self, dispute_id: str, issue: str):
|
|
208
|
+
self.issue = issue
|
|
209
|
+
super().__init__(
|
|
210
|
+
f"Evidence issue for dispute {dispute_id}: {issue}",
|
|
211
|
+
dispute_id=dispute_id
|
|
212
|
+
)
|
|
213
|
+
self.code = "DISPUTE_EVIDENCE_ERROR"
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class RegistryError(NexusError):
|
|
217
|
+
"""Base exception for registry-related errors."""
|
|
218
|
+
|
|
219
|
+
def __init__(self, message: str, agent_did: Optional[str] = None):
|
|
220
|
+
self.agent_did = agent_did
|
|
221
|
+
super().__init__(message, code="REGISTRY_ERROR")
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
class AgentAlreadyRegisteredError(RegistryError):
|
|
225
|
+
"""Raised when attempting to register an already-registered agent."""
|
|
226
|
+
|
|
227
|
+
def __init__(self, agent_did: str):
|
|
228
|
+
super().__init__(
|
|
229
|
+
f"Agent already registered: {agent_did}",
|
|
230
|
+
agent_did=agent_did
|
|
231
|
+
)
|
|
232
|
+
self.code = "AGENT_ALREADY_REGISTERED"
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class AgentNotFoundError(RegistryError):
|
|
236
|
+
"""Raised when an agent cannot be found in the registry."""
|
|
237
|
+
|
|
238
|
+
def __init__(self, agent_did: str):
|
|
239
|
+
super().__init__(
|
|
240
|
+
f"Agent not found in registry: {agent_did}",
|
|
241
|
+
agent_did=agent_did
|
|
242
|
+
)
|
|
243
|
+
self.code = "AGENT_NOT_FOUND"
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class InvalidManifestError(RegistryError):
|
|
247
|
+
"""Raised when an agent manifest is invalid."""
|
|
248
|
+
|
|
249
|
+
def __init__(self, agent_did: str, validation_errors: list[str]):
|
|
250
|
+
self.validation_errors = validation_errors
|
|
251
|
+
super().__init__(
|
|
252
|
+
f"Invalid manifest for {agent_did}: {', '.join(validation_errors)}",
|
|
253
|
+
agent_did=agent_did
|
|
254
|
+
)
|
|
255
|
+
self.code = "INVALID_MANIFEST"
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
class DMZError(NexusError):
|
|
259
|
+
"""Base exception for DMZ protocol errors."""
|
|
260
|
+
|
|
261
|
+
def __init__(self, message: str):
|
|
262
|
+
super().__init__(message, code="DMZ_ERROR")
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
class PolicyNotSignedError(DMZError):
|
|
266
|
+
"""Raised when data handling policy hasn't been signed."""
|
|
267
|
+
|
|
268
|
+
def __init__(self, agent_did: str, policy_hash: str):
|
|
269
|
+
self.agent_did = agent_did
|
|
270
|
+
self.policy_hash = policy_hash
|
|
271
|
+
super().__init__(
|
|
272
|
+
f"Agent {agent_did} has not signed policy {policy_hash}"
|
|
273
|
+
)
|
|
274
|
+
self.code = "POLICY_NOT_SIGNED"
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class DataClassificationError(DMZError):
|
|
278
|
+
"""Raised when data classification prevents operation."""
|
|
279
|
+
|
|
280
|
+
def __init__(self, classification: str, reason: str):
|
|
281
|
+
self.classification = classification
|
|
282
|
+
self.reason = reason
|
|
283
|
+
super().__init__(
|
|
284
|
+
f"Data classification '{classification}' blocked: {reason}"
|
|
285
|
+
)
|
|
286
|
+
self.code = "DATA_CLASSIFICATION_ERROR"
|
nexus/pyproject.toml
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "nexus_trust_exchange"
|
|
7
|
+
version = "3.1.0"
|
|
8
|
+
description = "Agent Trust Exchange - viral registry and communication board for AI agents (RESEARCH PROTOTYPE)"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = {text = "MIT"}
|
|
11
|
+
requires-python = ">=3.9"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Microsoft Corporation", email = "agentgovtoolkit@microsoft.com" },
|
|
14
|
+
]
|
|
15
|
+
keywords = ["ai", "agents", "trust", "exchange", "registry"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 2 - Pre-Alpha",
|
|
18
|
+
"Intended Audience :: Science/Research",
|
|
19
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
dependencies = [
|
|
24
|
+
"pydantic>=2.4.0,<3.0",
|
|
25
|
+
"pyyaml>=6.0.0,<7.0",
|
|
26
|
+
"structlog>=24.1.0,<25.0",
|
|
27
|
+
"aiohttp>=3.13.3,<4.0",
|
|
28
|
+
"inter-agent-trust-protocol>=0.4.0,<1.0",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[project.urls]
|
|
32
|
+
Homepage = "https://github.com/microsoft/agent-governance-toolkit"
|
|
33
|
+
Repository = "https://github.com/microsoft/agent-governance-toolkit/tree/main/modules/nexus"
|
|
34
|
+
|
|
35
|
+
[tool.hatch.build.targets.wheel]
|
|
36
|
+
packages = ["."]
|