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
@@ -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
+ )
@@ -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
+ )