sov-kernel-monster / seb /contracts /python.template
SNAPKITTYWEST's picture
chore: push full sov-kernel-monster content from local build
9425aed verified
Raw
History Blame Contribute Delete
12.3 kB
"""
SEB Python Contract Template
Generated from: SEB_SOVEREIGN_EVENT_BUS_MASTER_SPECIFICATION.xml
Version: 1.0.0
Target: Python Client Library
"""
from dataclasses import dataclass, field
from typing import Optional, List, Dict, Any, Union, Literal
from datetime import datetime
from enum import Enum
import json
import hashlib
from ulid import ULID
from pydantic import BaseModel, Field, validator
class NetworkPolicy(str, Enum):
"""Network access policy"""
ALLOW = "allow"
DENY = "deny"
RESTRICTED = "restricted"
class FilesystemPolicy(str, Enum):
"""Filesystem access policy"""
READONLY = "readonly"
READWRITE = "readwrite"
DENY = "deny"
class ExecutionStatus(str, Enum):
"""Execution result status"""
SUCCESS = "success"
FAILURE = "failure"
TIMEOUT = "timeout"
DENIED = "denied"
class Constraints(BaseModel):
"""Execution constraints"""
network: NetworkPolicy
max_runtime_ms: int = Field(gt=0)
max_memory_bytes: int = Field(gt=0)
filesystem: FilesystemPolicy
class Config:
use_enum_values = True
class Intent(BaseModel):
"""Structured intent describing the requested action"""
action: str = Field(min_length=1)
subject: str = Field(min_length=1)
parameters: Dict[str, Any] = Field(default_factory=dict)
class Context(BaseModel):
"""Execution context including environment and constraints"""
environment: str = Field(min_length=1)
constraints: Constraints
metadata: Dict[str, Any] = Field(default_factory=dict)
class Credentials(BaseModel):
"""Authority credentials"""
credential_type: str = Field(min_length=1)
value: str = Field(min_length=1)
signature: Optional[str] = None
class Authority(BaseModel):
"""Authority scope and credentials for the requesting principal"""
principal: str = Field(min_length=1)
credentials: Credentials
scope: List[str] = Field(default_factory=list)
class Continuation(BaseModel):
"""Continuation data for multi-step workflows"""
step: int = Field(gt=0)
total_steps: int = Field(gt=0)
state: Dict[str, Any] = Field(default_factory=dict)
@validator('step')
def step_must_not_exceed_total(cls, v, values):
if 'total_steps' in values and v > values['total_steps']:
raise ValueError('step cannot exceed total_steps')
return v
class Evidence(BaseModel):
"""Cryptographic evidence from prior steps"""
evidence_type: str = Field(min_length=1)
hash: str = Field(min_length=1)
signature: str = Field(min_length=1)
timestamp: datetime
class Seal(BaseModel):
"""Cryptographic seal (added by WORM sealer after execution)"""
hash: str = Field(min_length=1)
signature: str = Field(min_length=1)
public_key: str = Field(min_length=1)
timestamp: datetime
algorithm: str = Field(min_length=1)
class EventEnvelope(BaseModel):
"""Event envelope structure following the SEB specification"""
type: str = Field(min_length=1, alias="type")
version: str = Field(default="1.0.0")
id: str = Field(default_factory=lambda: str(ULID()))
timestamp: datetime = Field(default_factory=datetime.utcnow)
intent: Intent
context: Context
authority: Authority
continuation: Optional[Continuation] = None
evidence: List[Evidence] = Field(default_factory=list)
seal: Optional[Seal] = None
class Config:
allow_population_by_field_name = True
json_encoders = {
datetime: lambda v: v.isoformat()
}
def compute_hash(self) -> str:
"""
Compute Blake3 hash of the envelope (excluding seal)
Note: In production, use actual Blake3 implementation.
This is a placeholder using SHA-256.
"""
envelope_dict = self.dict(exclude={'seal'}, by_alias=True)
json_str = json.dumps(envelope_dict, sort_keys=True, default=str)
return hashlib.sha256(json_str.encode()).hexdigest()
def to_json(self) -> str:
"""Serialize envelope to JSON"""
return self.json(by_alias=True, exclude_none=True)
@classmethod
def from_json(cls, json_str: str) -> 'EventEnvelope':
"""Deserialize envelope from JSON"""
return cls.parse_raw(json_str)
class PolicyDecision:
"""Base class for policy decisions"""
pass
class AllowDecision(PolicyDecision):
"""Policy allows the action"""
def __init__(self):
self.type = "allow"
class DenyDecision(PolicyDecision):
"""Policy denies the action"""
def __init__(self, reason: str):
self.type = "deny"
self.reason = reason
class RequireEvidenceDecision(PolicyDecision):
"""Policy requires additional evidence"""
def __init__(self, required: List[str]):
self.type = "require_evidence"
self.required = required
class PolicyError(Exception):
"""Policy evaluation error"""
def __init__(self, message: str, code: str):
super().__init__(message)
self.code = code
class PolicyGate:
"""Policy gate for pre-execution verification"""
async def evaluate(self, envelope: EventEnvelope) -> PolicyDecision:
"""
Evaluate policy for the given envelope
Args:
envelope: The event envelope to evaluate
Returns:
PolicyDecision indicating allow, deny, or require evidence
Raises:
PolicyError: If policy evaluation fails
"""
raise NotImplementedError("Subclasses must implement evaluate()")
class RouteDestination:
"""Base class for route destinations"""
pass
class AdapterDestination(RouteDestination):
"""Route to an execution adapter"""
def __init__(self, adapter_id: str):
self.type = "adapter"
self.adapter_id = adapter_id
class QueueDestination(RouteDestination):
"""Route to a queue"""
def __init__(self, queue_name: str):
self.type = "queue"
self.queue_name = queue_name
class RejectDestination(RouteDestination):
"""Reject the event"""
def __init__(self, reason: str):
self.type = "reject"
self.reason = reason
class RoutingError(Exception):
"""Routing error"""
def __init__(self, message: str, code: str):
super().__init__(message)
self.code = code
class RoutingEngine:
"""Routing engine for event dispatch"""
async def route(self, envelope: EventEnvelope) -> RouteDestination:
"""
Route the envelope to appropriate destination
Args:
envelope: The event envelope to route
Returns:
RouteDestination indicating where to send the event
Raises:
RoutingError: If routing fails
"""
raise NotImplementedError("Subclasses must implement route()")
class ExecutionMetrics(BaseModel):
"""Execution metrics"""
duration_ms: int = Field(ge=0)
memory_used_bytes: int = Field(ge=0)
network_calls: int = Field(ge=0)
filesystem_operations: int = Field(ge=0)
class ExecutionResult(BaseModel):
"""Execution result"""
status: ExecutionStatus
output: Any
evidence: List[Evidence] = Field(default_factory=list)
metrics: ExecutionMetrics
class Config:
use_enum_values = True
class ExecutionError(Exception):
"""Execution error"""
def __init__(self, message: str, code: str, recoverable: bool = False):
super().__init__(message)
self.code = code
self.recoverable = recoverable
class ExecutionAdapter:
"""Execution adapter interface"""
async def execute(self, envelope: EventEnvelope) -> ExecutionResult:
"""
Execute the envelope
Args:
envelope: The event envelope to execute
Returns:
ExecutionResult with status, output, evidence, and metrics
Raises:
ExecutionError: If execution fails
"""
raise NotImplementedError("Subclasses must implement execute()")
def capabilities(self) -> List[str]:
"""Return list of capabilities this adapter provides"""
raise NotImplementedError("Subclasses must implement capabilities()")
def constraints(self) -> Constraints:
"""Return execution constraints for this adapter"""
raise NotImplementedError("Subclasses must implement constraints()")
class SEBClient:
"""SEB Client for interacting with the Sovereign Event Bus"""
def __init__(self, endpoint: str, api_key: str):
"""
Initialize SEB client
Args:
endpoint: SEB API endpoint URL
api_key: API key for authentication
"""
self.endpoint = endpoint.rstrip('/')
self.api_key = api_key
async def submit(self, envelope: EventEnvelope) -> str:
"""
Submit an event envelope to the bus
Args:
envelope: The event envelope to submit
Returns:
Event ID
Raises:
Exception: If submission fails
"""
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.post(
f"{self.endpoint}/events",
json=envelope.dict(by_alias=True, exclude_none=True),
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {self.api_key}",
}
) as response:
if response.status != 200:
error = await response.text()
raise Exception(f"Failed to submit event: {error}")
result = await response.json()
return result["id"]
async def get_status(self, event_id: str) -> ExecutionResult:
"""
Query event status
Args:
event_id: The event ID to query
Returns:
ExecutionResult with current status
Raises:
Exception: If query fails
"""
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.get(
f"{self.endpoint}/events/{event_id}",
headers={
"Authorization": f"Bearer {self.api_key}",
}
) as response:
if response.status != 200:
error = await response.text()
raise Exception(f"Failed to get status: {error}")
result = await response.json()
return ExecutionResult(**result)
def create_example_envelope() -> EventEnvelope:
"""Create an example event envelope"""
return EventEnvelope(
type="snapkitty.intent.verify_proof",
intent=Intent(
action="verify_proof",
subject="bundle:01J...",
parameters={}
),
context=Context(
environment="production",
constraints=Constraints(
network=NetworkPolicy.DENY,
max_runtime_ms=5000,
max_memory_bytes=1024 * 1024,
filesystem=FilesystemPolicy.READONLY
),
metadata={}
),
authority=Authority(
principal="user:alice",
credentials=Credentials(
credential_type="api_key",
value="sk_..."
),
scope=["read", "verify"]
)
)
if __name__ == "__main__":
# Example usage
envelope = create_example_envelope()
print(envelope.to_json())
print(f"Hash: {envelope.compute_hash()}")