| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- """Server-derived invocation contract for the hardened WP09 runtime path."""
- from __future__ import annotations
- import hashlib
- from dataclasses import dataclass
- from decimal import Decimal, InvalidOperation
- from typing import Any
- class RuntimeServerError(ValueError):
- pass
- @dataclass(frozen=True)
- class RuntimeServerContext:
- agent_uid: str
- actor_uid: str
- roles: frozenset[str]
- _PAYLOAD_FIELDS = frozenset(
- {
- "grant_uid", "idempotency_key", "input_text", "evidence_refs",
- "estimated_tokens", "estimated_cost_micros", "requested_time_ms",
- }
- )
- _OPTIONAL_APPROVAL_FIELD = "approval_task_uid"
- _SCOPE_FIELDS = frozenset(
- {
- "tenant_id", "principal_id", "business_domain_uid", "environment", "provider",
- "model", "prompt_version", "generation", "interface_type", "tool_name", "action",
- "risk_level", "agent_uid",
- }
- )
- def _positive_integer(value: Any) -> int:
- if isinstance(value, bool) or not isinstance(value, int) or not 0 < value <= 1_000_000:
- raise RuntimeServerError("budget_value_invalid")
- return value
- def _cost_micros(value: Any) -> int:
- if isinstance(value, bool) or not isinstance(value, str) or len(value) > 32:
- raise RuntimeServerError("budget_value_invalid")
- try:
- decimal = Decimal(value)
- except (InvalidOperation, ValueError) as error:
- raise RuntimeServerError("budget_value_invalid") from error
- if not decimal.is_finite() or decimal <= 0 or decimal != decimal.to_integral_value():
- raise RuntimeServerError("budget_value_invalid")
- result = int(decimal)
- if result > 1_000_000_000:
- raise RuntimeServerError("budget_value_invalid")
- return result
- class ServerGovernedInvocationService:
- """Reject client-supplied scope, deriving every authority field server-side."""
- def __init__(self, repository):
- self.repository = repository
- def authorize(self, context: RuntimeServerContext, payload: Any) -> dict[str, Any]:
- if not isinstance(payload, dict):
- raise RuntimeServerError("payload_invalid")
- if set(payload) & _SCOPE_FIELDS:
- raise RuntimeServerError("payload_scope_forbidden")
- if set(payload) not in {_PAYLOAD_FIELDS, _PAYLOAD_FIELDS | {_OPTIONAL_APPROVAL_FIELD}}:
- raise RuntimeServerError("payload_schema_invalid")
- if not context.agent_uid or not context.actor_uid or not context.roles:
- raise RuntimeServerError("server_identity_invalid")
- grant_uid = payload["grant_uid"]
- if not isinstance(grant_uid, str) or not grant_uid:
- raise RuntimeServerError("payload_invalid")
- idempotency_key = payload["idempotency_key"]
- if not isinstance(idempotency_key, str) or not idempotency_key or len(idempotency_key) > 160:
- raise RuntimeServerError("payload_invalid")
- input_text = payload["input_text"]
- if not isinstance(input_text, str) or not input_text.strip() or len(input_text) > 8000:
- raise RuntimeServerError("payload_invalid")
- evidence_refs = payload["evidence_refs"]
- if not isinstance(evidence_refs, list) or len(evidence_refs) > 20:
- raise RuntimeServerError("payload_invalid")
- derived = self.repository.grant_context(
- agent_uid=context.agent_uid, grant_uid=grant_uid, actor_uid=context.actor_uid
- )
- requires_approval = derived.get("risk_level") != "low" or derived.get("action") == "execute"
- approval_task_uid = payload.get(_OPTIONAL_APPROVAL_FIELD)
- if requires_approval and (not isinstance(approval_task_uid, str) or len(approval_task_uid) != 36):
- raise RuntimeServerError("human_approval_required")
- if not requires_approval and approval_task_uid is not None:
- raise RuntimeServerError("approval_not_applicable")
- request = {
- **derived,
- "agent_uid": context.agent_uid,
- "grant_uid": grant_uid,
- "idempotency_key": idempotency_key,
- "request_digest": hashlib.sha256(
- (input_text.strip() + "|" + repr(evidence_refs)).encode("utf-8")
- ).hexdigest(),
- "input_hash": hashlib.sha256(input_text.strip().encode("utf-8")).hexdigest(),
- "evidence_digests": [],
- "estimated_tokens": _positive_integer(payload["estimated_tokens"]),
- "estimated_cost_micros": _cost_micros(payload["estimated_cost_micros"]),
- "requested_time_ms": _positive_integer(payload["requested_time_ms"]),
- }
- if requires_approval:
- request["approval_task_uid"] = approval_task_uid
- return self.repository.authorize_claim(request)
|