2929_AGENT_NAME_RE = re .compile (r"^[a-zA-Z][a-zA-Z0-9._-]*$" )
3030_AGENT_VERSION_RE = re .compile (r"^[a-zA-Z0-9][a-zA-Z0-9._-]*$" )
3131
32+
3233def parse_agent_ref (ref : str ) -> tuple [str , str | None ]:
3334 """Parse `name` or `name@version`; raise `ValueError` on malformed input."""
3435 if "@" in ref :
@@ -40,12 +41,15 @@ def parse_agent_ref(ref: str) -> tuple[str, str | None]:
4041 raise ValueError (f"invalid agent name: { ref !r} " )
4142 return ref , None
4243
44+
4345def format_agent_ref (name : str , version : str | None ) -> str :
4446 """Inverse of `parse_agent_ref`."""
4547 return f"{ name } @{ version } " if version else name
4648
49+
4750_BUDGET_AMOUNT_RE = re .compile (r"^([A-Za-z][A-Za-z0-9]{0,9}):([0-9]+(?:\.[0-9]+)?)$" )
4851
52+
4953def parse_budget_amount (amount : str ) -> tuple [str , Decimal ]:
5054 """Parse `currency:decimal`; raise `ValueError` on malformed input."""
5155 m = _BUDGET_AMOUNT_RE .match (amount )
@@ -60,12 +64,15 @@ def parse_budget_amount(amount: str) -> tuple[str, Decimal]:
6064 raise ValueError ("budget amount must be non-negative" )
6165 return currency , value
6266
67+
6368def format_budget_amount (currency : str , value : Decimal ) -> str :
6469 return f"{ currency } :{ value } "
6570
71+
6672Lease = dict [str , list [str ]]
6773"""A lease maps capability namespace to a list of glob patterns."""
6874
75+
6976def _ensure_utc_iso8601 (value : str ) -> datetime :
7077 """Parse a strict UTC ISO 8601 timestamp (`Z` or `+00:00` only)."""
7178 if not isinstance (value , str ):
@@ -79,6 +86,7 @@ def _ensure_utc_iso8601(value: str) -> datetime:
7986 raise ValueError (f"expires_at must be UTC: { value !r} " )
8087 return dt
8188
89+
8290class LeaseConstraints (BaseModel ):
8391 """Optional lease constraints (v1.1 §9.5)."""
8492
@@ -93,6 +101,7 @@ def _check_expires_at(cls, v: str | None) -> str | None:
93101 _ensure_utc_iso8601 (v )
94102 return v
95103
104+
96105class JobSubmitPayload (BaseModel ):
97106 model_config = ConfigDict (extra = "allow" )
98107 agent : str
@@ -110,6 +119,7 @@ def _check_agent(cls, v: str) -> str:
110119 parse_agent_ref (v )
111120 return v
112121
122+
113123class CredentialConstraintsPayload (BaseModel ):
114124 model_config = ConfigDict (extra = "allow" , populate_by_name = True )
115125 cost_budget : tuple [str , ...] = Field (default = (), alias = "cost.budget" )
@@ -140,11 +150,13 @@ class JobAcceptedPayload(BaseModel):
140150 trace_id : str | None = None
141151 credentials : tuple [CredentialPayload , ...] | None = None
142152
153+
143154class JobCancelPayload (BaseModel ):
144155 model_config = ConfigDict (extra = "allow" )
145156 reason : str
146157 code : str | None = None
147158
159+
148160class JobEventPayload (BaseModel ):
149161 model_config = ConfigDict (extra = "allow" )
150162 kind : str
@@ -158,6 +170,7 @@ def _check_kind(cls, v: str) -> str:
158170 return v
159171 raise ValueError (f"unknown event kind: { v !r} " )
160172
173+
161174class JobResultPayload (BaseModel ):
162175 model_config = ConfigDict (extra = "allow" )
163176 final_status : Literal ["success" , "cancelled" , "timed_out" ]
@@ -167,6 +180,7 @@ class JobResultPayload(BaseModel):
167180 summary : str | None = None
168181 completed_at : str
169182
183+
170184class JobErrorPayload (BaseModel ):
171185 model_config = ConfigDict (extra = "allow" )
172186 final_status : Literal ["error" ] = "error"
@@ -176,12 +190,14 @@ class JobErrorPayload(BaseModel):
176190 completed_at : str
177191 details : dict [str , Any ] | None = None
178192
193+
179194class JobSubscribePayload (BaseModel ):
180195 model_config = ConfigDict (extra = "allow" )
181196 job_id : str
182197 history : bool = False
183198 from_event_seq : int | None = Field (default = None , ge = 0 )
184199
200+
185201class JobSubscribedPayload (BaseModel ):
186202 model_config = ConfigDict (extra = "allow" )
187203 request_id : str
@@ -194,10 +210,12 @@ class JobSubscribedPayload(BaseModel):
194210 subscribed_from : int = 0
195211 replayed : int = 0
196212
213+
197214class JobUnsubscribePayload (BaseModel ):
198215 model_config = ConfigDict (extra = "allow" )
199216 job_id : str
200217
218+
201219__all__ = (
202220 "EVENT_KINDS" ,
203221 "ArtifactRefBody" ,
0 commit comments