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
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Compliance Schemas
|
|
5
|
+
|
|
6
|
+
Defines data structures for compliance auditing and reporting.
|
|
7
|
+
Supports SOC2, HIPAA, and other regulatory frameworks.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
from typing import Literal, Optional, Any
|
|
12
|
+
from pydantic import BaseModel, Field
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ComplianceRecord(BaseModel):
|
|
18
|
+
"""A single compliance-auditable event."""
|
|
19
|
+
|
|
20
|
+
event_id: str = Field(
|
|
21
|
+
...,
|
|
22
|
+
description="Unique event identifier"
|
|
23
|
+
)
|
|
24
|
+
event_type: Literal[
|
|
25
|
+
"agent_registered",
|
|
26
|
+
"agent_updated",
|
|
27
|
+
"agent_deregistered",
|
|
28
|
+
"iatp_handshake",
|
|
29
|
+
"iatp_rejected",
|
|
30
|
+
"escrow_created",
|
|
31
|
+
"escrow_released",
|
|
32
|
+
"escrow_refunded",
|
|
33
|
+
"escrow_disputed",
|
|
34
|
+
"dispute_resolved",
|
|
35
|
+
"reputation_updated",
|
|
36
|
+
"reputation_slashed",
|
|
37
|
+
"mute_triggered",
|
|
38
|
+
"policy_signed",
|
|
39
|
+
"data_accessed",
|
|
40
|
+
] = Field(
|
|
41
|
+
...,
|
|
42
|
+
description="Type of compliance event"
|
|
43
|
+
)
|
|
44
|
+
timestamp: datetime = Field(
|
|
45
|
+
default_factory=datetime.utcnow,
|
|
46
|
+
description="When the event occurred"
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Participants
|
|
50
|
+
requester_did: Optional[str] = Field(
|
|
51
|
+
default=None,
|
|
52
|
+
description="DID of the requesting agent"
|
|
53
|
+
)
|
|
54
|
+
provider_did: Optional[str] = Field(
|
|
55
|
+
default=None,
|
|
56
|
+
description="DID of the providing agent"
|
|
57
|
+
)
|
|
58
|
+
organization_id: Optional[str] = Field(
|
|
59
|
+
default=None,
|
|
60
|
+
description="Organization that owns the agent(s)"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Event details (no PII - only metadata)
|
|
64
|
+
operation_type: Optional[str] = Field(
|
|
65
|
+
default=None,
|
|
66
|
+
description="Type of operation performed"
|
|
67
|
+
)
|
|
68
|
+
data_classification: Optional[Literal["public", "internal", "confidential", "pii"]] = Field(
|
|
69
|
+
default=None,
|
|
70
|
+
description="Classification of data involved"
|
|
71
|
+
)
|
|
72
|
+
duration_ms: Optional[int] = Field(
|
|
73
|
+
default=None,
|
|
74
|
+
ge=0,
|
|
75
|
+
description="Duration of operation"
|
|
76
|
+
)
|
|
77
|
+
outcome: Optional[str] = Field(
|
|
78
|
+
default=None,
|
|
79
|
+
description="Outcome of the operation"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Policy compliance
|
|
83
|
+
policy_signed: Optional[str] = Field(
|
|
84
|
+
default=None,
|
|
85
|
+
description="Hash of signed data handling policy"
|
|
86
|
+
)
|
|
87
|
+
retention_policy: Optional[str] = Field(
|
|
88
|
+
default=None,
|
|
89
|
+
description="Data retention policy applied"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Cryptographic attestation
|
|
93
|
+
signature: Optional[str] = Field(
|
|
94
|
+
default=None,
|
|
95
|
+
description="Ed25519 signature of the record"
|
|
96
|
+
)
|
|
97
|
+
previous_event_hash: Optional[str] = Field(
|
|
98
|
+
default=None,
|
|
99
|
+
description="Hash of previous event (blockchain-style chaining)"
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Tracing
|
|
103
|
+
trace_id: Optional[str] = Field(
|
|
104
|
+
default=None,
|
|
105
|
+
description="Distributed tracing ID"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
def compute_hash(self) -> str:
|
|
109
|
+
"""Compute deterministic hash of this record."""
|
|
110
|
+
data = self.model_dump(exclude={"signature"})
|
|
111
|
+
# Convert datetime to ISO format for deterministic hashing
|
|
112
|
+
if data.get("timestamp"):
|
|
113
|
+
data["timestamp"] = data["timestamp"].isoformat()
|
|
114
|
+
canonical = json.dumps(data, sort_keys=True, default=str)
|
|
115
|
+
return hashlib.sha256(canonical.encode()).hexdigest()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class ComplianceEventFilter(BaseModel):
|
|
119
|
+
"""Filter criteria for querying compliance events."""
|
|
120
|
+
|
|
121
|
+
organization_id: Optional[str] = None
|
|
122
|
+
agent_did: Optional[str] = None
|
|
123
|
+
event_types: Optional[list[str]] = None
|
|
124
|
+
start_date: Optional[datetime] = None
|
|
125
|
+
end_date: Optional[datetime] = None
|
|
126
|
+
data_classification: Optional[str] = None
|
|
127
|
+
outcome: Optional[str] = None
|
|
128
|
+
limit: int = Field(default=100, ge=1, le=10000)
|
|
129
|
+
offset: int = Field(default=0, ge=0)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class ComplianceStats(BaseModel):
|
|
133
|
+
"""Aggregated compliance statistics."""
|
|
134
|
+
|
|
135
|
+
total_events: int
|
|
136
|
+
events_by_type: dict[str, int]
|
|
137
|
+
events_by_outcome: dict[str, int]
|
|
138
|
+
events_by_classification: dict[str, int]
|
|
139
|
+
|
|
140
|
+
# Agent metrics
|
|
141
|
+
unique_agents: int
|
|
142
|
+
total_handshakes: int
|
|
143
|
+
rejected_handshakes: int
|
|
144
|
+
rejection_rate: float
|
|
145
|
+
|
|
146
|
+
# Escrow metrics
|
|
147
|
+
total_escrows: int
|
|
148
|
+
successful_escrows: int
|
|
149
|
+
disputed_escrows: int
|
|
150
|
+
dispute_rate: float
|
|
151
|
+
|
|
152
|
+
# Reputation metrics
|
|
153
|
+
reputation_slashes: int
|
|
154
|
+
mute_triggers: int
|
|
155
|
+
|
|
156
|
+
# Time range
|
|
157
|
+
start_date: datetime
|
|
158
|
+
end_date: datetime
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class ComplianceAuditReport(BaseModel):
|
|
162
|
+
"""
|
|
163
|
+
Complete compliance audit report for regulatory review.
|
|
164
|
+
|
|
165
|
+
Designed for SOC2, HIPAA, and similar frameworks.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
report_id: str = Field(
|
|
169
|
+
...,
|
|
170
|
+
description="Unique report identifier"
|
|
171
|
+
)
|
|
172
|
+
report_type: Literal["soc2", "hipaa", "gdpr", "custom"] = Field(
|
|
173
|
+
...,
|
|
174
|
+
description="Compliance framework"
|
|
175
|
+
)
|
|
176
|
+
generated_at: datetime = Field(
|
|
177
|
+
default_factory=datetime.utcnow
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# Scope
|
|
181
|
+
organization_id: str = Field(
|
|
182
|
+
...,
|
|
183
|
+
description="Organization being audited"
|
|
184
|
+
)
|
|
185
|
+
start_date: datetime = Field(
|
|
186
|
+
...,
|
|
187
|
+
description="Audit period start"
|
|
188
|
+
)
|
|
189
|
+
end_date: datetime = Field(
|
|
190
|
+
...,
|
|
191
|
+
description="Audit period end"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# Summary
|
|
195
|
+
executive_summary: str = Field(
|
|
196
|
+
...,
|
|
197
|
+
description="High-level summary of compliance status"
|
|
198
|
+
)
|
|
199
|
+
stats: ComplianceStats = Field(
|
|
200
|
+
...,
|
|
201
|
+
description="Aggregated statistics"
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
# Events
|
|
205
|
+
events: list[ComplianceRecord] = Field(
|
|
206
|
+
default_factory=list,
|
|
207
|
+
description="All compliance events in period"
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# Findings
|
|
211
|
+
violations: list[dict[str, Any]] = Field(
|
|
212
|
+
default_factory=list,
|
|
213
|
+
description="Compliance violations found"
|
|
214
|
+
)
|
|
215
|
+
warnings: list[dict[str, Any]] = Field(
|
|
216
|
+
default_factory=list,
|
|
217
|
+
description="Compliance warnings"
|
|
218
|
+
)
|
|
219
|
+
recommendations: list[str] = Field(
|
|
220
|
+
default_factory=list,
|
|
221
|
+
description="Recommendations for improvement"
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Attestation
|
|
225
|
+
report_hash: Optional[str] = Field(
|
|
226
|
+
default=None,
|
|
227
|
+
description="Hash of complete report"
|
|
228
|
+
)
|
|
229
|
+
nexus_signature: Optional[str] = Field(
|
|
230
|
+
default=None,
|
|
231
|
+
description="Nexus signature attesting to report"
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
def compute_hash(self) -> str:
|
|
235
|
+
"""Compute hash of the report for integrity verification."""
|
|
236
|
+
data = self.model_dump(exclude={"report_hash", "nexus_signature"})
|
|
237
|
+
canonical = json.dumps(data, sort_keys=True, default=str)
|
|
238
|
+
return hashlib.sha256(canonical.encode()).hexdigest()
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class DataHandlingAudit(BaseModel):
|
|
242
|
+
"""Audit record for data handling policy compliance."""
|
|
243
|
+
|
|
244
|
+
audit_id: str
|
|
245
|
+
escrow_id: str
|
|
246
|
+
|
|
247
|
+
# Policy details
|
|
248
|
+
policy_hash: str = Field(
|
|
249
|
+
...,
|
|
250
|
+
description="Hash of the signed data handling policy"
|
|
251
|
+
)
|
|
252
|
+
max_retention_seconds: int
|
|
253
|
+
allow_persistence: bool
|
|
254
|
+
allow_training: bool
|
|
255
|
+
allow_forwarding: bool
|
|
256
|
+
|
|
257
|
+
# Compliance checks
|
|
258
|
+
policy_signed: bool = Field(
|
|
259
|
+
...,
|
|
260
|
+
description="Whether policy was signed before data access"
|
|
261
|
+
)
|
|
262
|
+
policy_signed_at: Optional[datetime] = None
|
|
263
|
+
signer_did: str
|
|
264
|
+
|
|
265
|
+
# Verification
|
|
266
|
+
data_deleted_on_schedule: Optional[bool] = Field(
|
|
267
|
+
default=None,
|
|
268
|
+
description="Whether data was deleted per retention policy"
|
|
269
|
+
)
|
|
270
|
+
deletion_verified_at: Optional[datetime] = None
|
|
271
|
+
|
|
272
|
+
# Violations
|
|
273
|
+
violations_detected: list[str] = Field(
|
|
274
|
+
default_factory=list,
|
|
275
|
+
description="Any policy violations detected"
|
|
276
|
+
)
|
nexus/schemas/escrow.py
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Escrow Schemas
|
|
5
|
+
|
|
6
|
+
Defines data structures for the Proof-of-Outcome escrow system.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from datetime import datetime, timedelta, timezone
|
|
10
|
+
from typing import Literal, Optional
|
|
11
|
+
from pydantic import BaseModel, Field
|
|
12
|
+
from enum import Enum
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class EscrowStatus(str, Enum):
|
|
16
|
+
"""Status of an escrow."""
|
|
17
|
+
PENDING = "pending" # Created, awaiting task start
|
|
18
|
+
ACTIVE = "active" # Task in progress
|
|
19
|
+
AWAITING_VALIDATION = "awaiting_validation" # Task done, awaiting SCAK
|
|
20
|
+
RELEASED = "released" # Credits released to provider
|
|
21
|
+
REFUNDED = "refunded" # Credits returned to requester
|
|
22
|
+
DISPUTED = "disputed" # Under dispute resolution
|
|
23
|
+
EXPIRED = "expired" # Timed out without completion
|
|
24
|
+
CANCELLED = "cancelled" # Cancelled by requester before start
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class EscrowRequest(BaseModel):
|
|
28
|
+
"""Request to create an escrow for a task."""
|
|
29
|
+
|
|
30
|
+
requester_did: str = Field(
|
|
31
|
+
...,
|
|
32
|
+
description="DID of the requesting agent"
|
|
33
|
+
)
|
|
34
|
+
provider_did: str = Field(
|
|
35
|
+
...,
|
|
36
|
+
description="DID of the providing agent"
|
|
37
|
+
)
|
|
38
|
+
task_hash: str = Field(
|
|
39
|
+
...,
|
|
40
|
+
description="SHA-256 hash of the task specification"
|
|
41
|
+
)
|
|
42
|
+
task_description: Optional[str] = Field(
|
|
43
|
+
default=None,
|
|
44
|
+
max_length=500,
|
|
45
|
+
description="Brief description of the task (for logging only)"
|
|
46
|
+
)
|
|
47
|
+
credits: int = Field(
|
|
48
|
+
...,
|
|
49
|
+
gt=0,
|
|
50
|
+
le=10000,
|
|
51
|
+
description="Number of credits to escrow"
|
|
52
|
+
)
|
|
53
|
+
timeout_seconds: int = Field(
|
|
54
|
+
default=3600,
|
|
55
|
+
ge=60,
|
|
56
|
+
le=86400,
|
|
57
|
+
description="Timeout for task completion (1 min to 24 hours)"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# Validation requirements
|
|
61
|
+
require_scak_validation: bool = Field(
|
|
62
|
+
default=True,
|
|
63
|
+
description="Whether SCAK validation is required for release"
|
|
64
|
+
)
|
|
65
|
+
scak_drift_threshold: float = Field(
|
|
66
|
+
default=0.15,
|
|
67
|
+
ge=0.0,
|
|
68
|
+
le=1.0,
|
|
69
|
+
description="Maximum allowed SCAK drift score"
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# Data handling
|
|
73
|
+
data_classification: Literal["public", "internal", "confidential", "pii"] = Field(
|
|
74
|
+
default="internal",
|
|
75
|
+
description="Classification of data being shared"
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class EscrowReceipt(BaseModel):
|
|
80
|
+
"""Receipt confirming escrow creation."""
|
|
81
|
+
|
|
82
|
+
escrow_id: str = Field(
|
|
83
|
+
...,
|
|
84
|
+
description="Unique escrow identifier"
|
|
85
|
+
)
|
|
86
|
+
request: EscrowRequest
|
|
87
|
+
status: EscrowStatus = Field(
|
|
88
|
+
default=EscrowStatus.PENDING,
|
|
89
|
+
description="Current escrow status"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Timestamps
|
|
93
|
+
created_at: datetime = Field(
|
|
94
|
+
default_factory=datetime.utcnow,
|
|
95
|
+
description="When escrow was created"
|
|
96
|
+
)
|
|
97
|
+
expires_at: datetime = Field(
|
|
98
|
+
...,
|
|
99
|
+
description="When escrow expires if not completed"
|
|
100
|
+
)
|
|
101
|
+
activated_at: Optional[datetime] = Field(
|
|
102
|
+
default=None,
|
|
103
|
+
description="When task execution started"
|
|
104
|
+
)
|
|
105
|
+
completed_at: Optional[datetime] = Field(
|
|
106
|
+
default=None,
|
|
107
|
+
description="When task was marked complete"
|
|
108
|
+
)
|
|
109
|
+
resolved_at: Optional[datetime] = Field(
|
|
110
|
+
default=None,
|
|
111
|
+
description="When escrow was resolved (released/refunded)"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Signatures
|
|
115
|
+
requester_signature: str = Field(
|
|
116
|
+
...,
|
|
117
|
+
description="Requester's signature confirming escrow"
|
|
118
|
+
)
|
|
119
|
+
nexus_signature: Optional[str] = Field(
|
|
120
|
+
default=None,
|
|
121
|
+
description="Nexus signature confirming escrow hold"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
def is_expired(self) -> bool:
|
|
125
|
+
"""Check if escrow has expired."""
|
|
126
|
+
return datetime.now(timezone.utc) > self.expires_at
|
|
127
|
+
|
|
128
|
+
def is_active(self) -> bool:
|
|
129
|
+
"""Check if escrow is in an active state."""
|
|
130
|
+
return self.status in (EscrowStatus.PENDING, EscrowStatus.ACTIVE, EscrowStatus.AWAITING_VALIDATION)
|
|
131
|
+
|
|
132
|
+
@classmethod
|
|
133
|
+
def from_request(cls, escrow_id: str, request: EscrowRequest, requester_signature: str) -> "EscrowReceipt":
|
|
134
|
+
"""Create receipt from request."""
|
|
135
|
+
now = datetime.now(timezone.utc)
|
|
136
|
+
return cls(
|
|
137
|
+
escrow_id=escrow_id,
|
|
138
|
+
request=request,
|
|
139
|
+
created_at=now,
|
|
140
|
+
expires_at=now + timedelta(seconds=request.timeout_seconds),
|
|
141
|
+
requester_signature=requester_signature,
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class EscrowRelease(BaseModel):
|
|
146
|
+
"""Request to release an escrow."""
|
|
147
|
+
|
|
148
|
+
escrow_id: str = Field(
|
|
149
|
+
...,
|
|
150
|
+
description="ID of the escrow to release"
|
|
151
|
+
)
|
|
152
|
+
outcome: Literal["success", "failure", "dispute"] = Field(
|
|
153
|
+
...,
|
|
154
|
+
description="Outcome determining how to release"
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# Completion details
|
|
158
|
+
output_hash: Optional[str] = Field(
|
|
159
|
+
default=None,
|
|
160
|
+
description="SHA-256 hash of the task output"
|
|
161
|
+
)
|
|
162
|
+
duration_ms: Optional[int] = Field(
|
|
163
|
+
default=None,
|
|
164
|
+
ge=0,
|
|
165
|
+
description="Task duration in milliseconds"
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# SCAK validation results
|
|
169
|
+
scak_validated: bool = Field(
|
|
170
|
+
default=False,
|
|
171
|
+
description="Whether SCAK validation was performed"
|
|
172
|
+
)
|
|
173
|
+
scak_drift_score: Optional[float] = Field(
|
|
174
|
+
default=None,
|
|
175
|
+
ge=0.0,
|
|
176
|
+
le=1.0,
|
|
177
|
+
description="SCAK drift score"
|
|
178
|
+
)
|
|
179
|
+
scak_passed: Optional[bool] = Field(
|
|
180
|
+
default=None,
|
|
181
|
+
description="Whether SCAK validation passed"
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# Signatures
|
|
185
|
+
provider_signature: Optional[str] = Field(
|
|
186
|
+
default=None,
|
|
187
|
+
description="Provider's signature on completion"
|
|
188
|
+
)
|
|
189
|
+
requester_signature: Optional[str] = Field(
|
|
190
|
+
default=None,
|
|
191
|
+
description="Requester's signature accepting outcome"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# For disputes
|
|
195
|
+
dispute_reason: Optional[str] = Field(
|
|
196
|
+
default=None,
|
|
197
|
+
max_length=1000,
|
|
198
|
+
description="Reason for dispute (if outcome is dispute)"
|
|
199
|
+
)
|
|
200
|
+
flight_recorder_logs_hash: Optional[str] = Field(
|
|
201
|
+
default=None,
|
|
202
|
+
description="Hash of flight recorder logs for dispute"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class EscrowResolution(BaseModel):
|
|
207
|
+
"""Final resolution of an escrow."""
|
|
208
|
+
|
|
209
|
+
escrow_id: str
|
|
210
|
+
final_status: EscrowStatus
|
|
211
|
+
|
|
212
|
+
# Credit distribution
|
|
213
|
+
credits_to_provider: int = Field(
|
|
214
|
+
default=0,
|
|
215
|
+
ge=0,
|
|
216
|
+
description="Credits released to provider"
|
|
217
|
+
)
|
|
218
|
+
credits_to_requester: int = Field(
|
|
219
|
+
default=0,
|
|
220
|
+
ge=0,
|
|
221
|
+
description="Credits refunded to requester"
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Reputation impact
|
|
225
|
+
provider_reputation_change: int = Field(
|
|
226
|
+
default=0,
|
|
227
|
+
description="Change to provider's reputation score"
|
|
228
|
+
)
|
|
229
|
+
requester_reputation_change: int = Field(
|
|
230
|
+
default=0,
|
|
231
|
+
description="Change to requester's reputation score"
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# Resolution details
|
|
235
|
+
resolution_reason: str = Field(
|
|
236
|
+
...,
|
|
237
|
+
description="Reason for this resolution"
|
|
238
|
+
)
|
|
239
|
+
resolved_by: Literal["automatic", "requester", "provider", "arbiter", "timeout"] = Field(
|
|
240
|
+
...,
|
|
241
|
+
description="How resolution was triggered"
|
|
242
|
+
)
|
|
243
|
+
resolved_at: datetime = Field(
|
|
244
|
+
default_factory=datetime.utcnow
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
# Nexus attestation
|
|
248
|
+
nexus_signature: str = Field(
|
|
249
|
+
...,
|
|
250
|
+
description="Nexus signature on resolution"
|
|
251
|
+
)
|