From 339a9bab9e11cac1bbe494c9546de2814c441e1c Mon Sep 17 00:00:00 2001 From: agent-a6e6ec231c5f7801 Date: Sun, 19 Apr 2026 21:39:40 +0200 Subject: [PATCH] build(agent): new-agents#a6e6ec iteration --- catopt_query/contracts.py | 135 ++++++++++++++++++++++++++++++++++++++ test.sh | 0 2 files changed, 135 insertions(+) create mode 100644 catopt_query/contracts.py mode change 100644 => 100755 test.sh diff --git a/catopt_query/contracts.py b/catopt_query/contracts.py new file mode 100644 index 0000000..9d643ff --- /dev/null +++ b/catopt_query/contracts.py @@ -0,0 +1,135 @@ +from __future__ import annotations + +from dataclasses import dataclass, asdict +from typing import Dict, Any, List, Optional + +from .protocol import LocalProblem, CanonicalPlan + + +@dataclass(frozen=True) +class LocalProblemDSL: + # Minimal domain-specific language for a per-shard problem + id: str + domain: str = "default" + assets: List[str] = None + objective: str = "" + constraints: Dict[str, Any] = None + + def to_dict(self) -> Dict[str, Any]: + return asdict(self) + + @staticmethod + def from_dict(d: Dict[str, Any]) -> "LocalProblemDSL": + if d is None: + d = {} + return LocalProblemDSL( + id=d.get("id", ""), + domain=d.get("domain", "default"), + assets=d.get("assets", []), + objective=d.get("objective", ""), + constraints=d.get("constraints", {}), + ) + + +@dataclass(frozen=True) +class SharedVariablesDSL: + version: int + signals: Dict[str, float] + priors: Dict[str, float] + + def to_dict(self) -> Dict[str, Any]: + return asdict(self) + + @staticmethod + def from_dict(d: Dict[str, Any]) -> "SharedVariablesDSL": + return SharedVariablesDSL( + version=int(d.get("version", 0)), + signals=dict(d.get("signals", {})), + priors=dict(d.get("priors", {})), + ) + + +@dataclass(frozen=True) +class PlanDeltaDSL: + delta_id: str + timestamp: float + changes: Dict[str, Any] + contract_id: str = "" + + def to_dict(self) -> Dict[str, Any]: + return asdict(self) + + @staticmethod + def from_dict(d: Dict[str, Any]) -> "PlanDeltaDSL": + return PlanDeltaDSL( + delta_id=d.get("delta_id", ""), + timestamp=float(d.get("timestamp", 0.0)), + changes=dict(d.get("changes", {})), + contract_id=d.get("contract_id", ""), + ) + + +@dataclass(frozen=True) +class DualVariables: + multipliers: Dict[str, float] = None + + def to_dict(self) -> Dict[str, Any]: + return {"multipliers": self.multipliers or {}} + + @staticmethod + def from_dict(d: Dict[str, Any]) -> "DualVariables": + return DualVariables(multipliers=dict(d.get("multipliers", {}))) + + +class GraphOfContractsRegistry: + """Lightweight in-memory registry for Graph-of-Contracts metadata. + + This is intentionally small and dependency-free to bootstrap adapters + and schemas across domains. It is not a persistent store; tests can + extend it if needed. + """ + + _registry: Dict[str, Dict[str, Any]] = {} + + @classmethod + def register_contract(cls, adapter_name: str, version: str, schema: Dict[str, Any]) -> None: + cls._registry[adapter_name] = { + "version": version, + "schema": schema, + } + + @classmethod + def get_contract(cls, adapter_name: str) -> Optional[Dict[str, Any]]: + return cls._registry.get(adapter_name) + + @classmethod + def all_contracts(cls) -> Dict[str, Dict[str, Any]]: + return dict(cls._registry) + + +def to_canonical_from_dsl(local_dsl: LocalProblemDSL) -> CanonicalPlan: + """Translate a minimal LocalProblemDSL into the canonical CanonicalPlan. + + This is a pragmatic bridge that preserves existing canonical representations + while enabling a DSL-driven composition workflow. + """ + # Translate DSL into a LocalProblem object using only lightweight fields + lp = LocalProblem( + shard_id=local_dsl.id, + projection=local_dsl.assets or [], + predicates=[local_dsl.objective] if local_dsl.objective else [], + costs=0.0, + constraints=local_dsl.constraints or {}, + ) + + return CanonicalPlan(projection=lp.projection, predicates=lp.predicates, estimated_cost=0.0) + + +__all__ = [ + "LocalProblemDSL", + "SharedVariablesDSL", + "PlanDeltaDSL", + "DualVariables", + "GraphOfContractsRegistry", + "to_canonical_from_dsl", +] diff --git a/test.sh b/test.sh old mode 100644 new mode 100755