Ë
    áß²jB ã            	      óN  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZ ddlmZ  ej6                  e«      Zd	d	d	dd
œ	 	 	 	 	 	 	 	 	 dŒd„Zd�d„Zd	a dŽd„Z! ejD                  dejF                  «      Z$ ejD                  d«      Z%dZ& ejD                  de&› d�ejF                  «      Z'd�d„Z( ejD                  d«      Z)dZ*h d£Z+ddhZ,h d£Z-ddhZ.dZ/h d£Z0h d £Z1d!Z2h d"£Z3h d#£Z4d�d$„Z5d�d%„Z6d‘d&„Z7d’d'„Z8d“d(„Z9d”d•d)„Z:d–d*„Z;d—d+„Z<d˜d,„Z=d™d-„Z>dšd.„Z?d›d/„Z@dœd�d1„ZAd0d2œdžd3„ZBd4d5œdŸd6„ZCd d7„ZDd¡d8„ZEd¢d9„ZF	 	 	 	 	 	 	 	 	 	 	 	 	 	 d£d:„ZGd”d¤d;„ZHd”d¥d=„ZId>d?œd¦d@„ZJdddAœ	 	 	 	 	 	 	 	 	 d§dB„ZKddCœ	 	 	 	 	 	 	 	 	 d¨dD„ZLddEœ	 	 	 	 	 	 	 	 	 	 	 d©dF„ZMddCœ	 	 	 	 	 	 	 dªdG„ZN G dH„ dI«      ZOddJœ	 	 	 	 	 	 	 d«dK„ZPddJœd¬dL„ZQd	d	dMddd	dNœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d­dO„ZR G dP„ dQe«      ZSd®dR„ZT	 	 	 	 	 	 d¯dS„ZU	 	 	 	 	 	 d°dT„ZVdUddVœ	 	 	 	 	 	 	 	 	 d±dW„ZW edXdYeeXgeXf   fdZeYfdeYfd[eZfg«      Z[d²d\„Z\d²d]„Z]d³d^„Z^d²d_„Z_d²d`„Z`e\e]e^e^e_daœZadbebdc<   d	d	ddœ	 	 	 	 	 	 	 d´de„Zcdµdf„Zddgdh„ dfdidj„ dfdke5eXjÊ                  fddl„ dfdmdn„ effdodp„ egfdqdr„ egfgds„ dtD «       ¢dudv„ df‘­Zhdwebdx<   ddydzd<d{d|d}hd~„ ehD «       £Zid¶d„Zjd	d	d	d€œ	 	 	 	 	 	 	 	 	 d·d�„Zkd”d¸d‚„Zld¹dƒ„Zmd¹d„„Zndºd…„Zod»d†„Zp	 d”	 	 	 	 	 	 	 	 	 d¼d‡„Zq G dˆ„ d‰«      ZrdddŠœ	 	 	 	 	 	 	 d½d‹„Zsy)¾zªCodex Responses API adapter: stateless format conversion and normalization for the
OpenAI Responses API (OpenAI Codex, xAI, GitHub Models and other compatible endpoints).é    )ÚannotationsN)ÚSimpleNamespace)ÚAnyÚCallableÚDictÚIteratorÚListÚ
NamedTupleÚOptionalÚ	TypeGuard)Úcoerce_tool_nameÚdeterministic_call_id)ÚDEFAULT_AGENT_IDENTITY)Únormalize_route_base_urlF)Úis_xai_responsesÚis_github_responsesÚis_codex_backendÚbase_urlr   c                ó„   — | df|df|dffD ]  \  }}|sŒ	|c S  |sydt        t        |«      j                  «       «      › �S )zÞStable identifier for the endpoint that mints ``reasoning.encrypted_content``. Blobs are sealed to their
    issuer (HTTP 400 ``invalid_encrypted_content``), so stamping lets replay drop foreign blobs after a model switch.Úxai_responsesÚgithub_responsesÚcodex_backendÚotherúother:)r   ÚstrÚstrip)r   r   r   r   ÚflagÚkinds         úB/home/ubuntu/.hermes/hermes-agent/agent/codex_responses_adapter.pyÚ_classify_responses_issuerr       so   € ð )¨/Ð:Ð=PÐRdÐ<eÐhxð  {Jð  hKð  Lò ‰
ˆˆdÚØŠKðñ Øð Ô,¬S°«]×-@Ñ-@Ó-BÓCÐDÐEÐEó    c                óx   — t        | t        «      r)| j                  d«      rt        | t	        d«      d ¬«      S | S )zÊCanonicalise a persisted ``other:<url>`` issuer stamp. Items stamped before canonicalisation carry the raw
    ``agent.base_url`` (trailing slash / host case) and must still replay on the same endpoint.r   N)r   )Ú
isinstancer   Ú
startswithr    Úlen)r   s    r   Ú_canonical_issuer_kindr&   '   s4   € ô �$œÔ §¡°Ô!:Ü)°4¼¸H»¸Ð3GÔHÐHØ€Kr!   Úmodelc                ó\   — ddl m} t         || xs d«      «      j                  «       xs dS )z®Canonical Responses wire model stamped on encrypted reasoning: blobs are sealed to the issuing
    model too, so a same-endpoint model switch must not replay them (HTTP 400).r   )Ú"strip_codex_context_variant_suffixÚ N)Úagent.model_metadatar)   r   r   )r'   r)   s     r   Ú_wire_model_identityr,   3   s+   € õ HäÑ1°%²+¸2Ó>Ó?×EÑEÓGÒOÈ4ÐOr!   z)(?:^|[\s>|])to=functions\.[A-Za-z_][\w.]*z�(?:^|\n)\s*\{\s*"cmd"\s*:\s*"(?:\\.|[^"\\])*"(?:\s*,\s*"[A-Za-z_][\w-]*"\s*:\s*(?:"(?:\\.|[^"\\])*"|true|false|null|-?\d+(?:\.\d+)?))*\s*\}\s*$z‘creat(?:e|ing)|writ(?:e|ing)|runn?(?:ing)?|execut(?:e|ing)|check(?:ing)?|verif(?:y|ying)|updat(?:e|ing)|install(?:ing)?|edit(?:ing)?|mak(?:e|ing)uš   ^(?:(?:next|first|then|okay|ok|alright)\b[\s,â€”â€“-]*)?(?:sure,\s*)?(?:now\s+)?(?:let\s+me\s+|i(?:'|â€™)?ll\s+|i\s+will\s+|i(?:'|â€™)?m\s+|i\s+am\s+)?(?:z)\bÚtextc                ó4  — t         j                  | «      ryt        j                  | «      }|sy| d|j                  «        j	                  «       j                  «       }t        |«      xr/ t        t        j                  |d   j	                  «       «      «      S )zhTrue when assistant text carries a tool call the model failed to emit as a structured ``function_call``.TFNéÿÿÿÿ)Ú_TOOL_CALL_LEAK_PATTERNÚsearchÚ_SHELL_JSON_LEAK_PATTERNÚstartr   Ú
splitlinesÚboolÚ_SHELL_JSON_LEAK_LEADIN_PATTERN)r-   ÚmatchÚlead_ins      r   Ú_leaked_tool_call_textr9   L   s{   € ä×%Ñ% dÔ+ØÜ$×+Ñ+¨DÓ1€EÙØØ�>�E—K‘K“MÐ"×(Ñ(Ó*×5Ñ5Ó7€GÜ�‹=Ò^œTÔ"A×"HÑ"HÈÐQSÉ×IZÑIZÓI\Ó"]Ó^Ð^r!   z7<\|(start|end|channel|message|constrain|return|call)\|>u   ï½œ>   r-   Ú
input_textÚoutput_textÚ	image_urlÚinput_image>   ÚvideoÚ	video_urlÚinput_videor;   z'[Assistant image omitted during replay]>   ÚqueuedÚ
incompleteÚin_progress>   Ú	completedrB   rC   é@   >   Ú
web_searchÚfile_searchÚlocal_shellÚcode_interpreterÚimage_generationÚweb_search_previewÚcomputer_use_preview>   Úmcp_callÚcomputer_callÚweb_search_callÚfile_search_callÚlocal_shell_callÚcode_interpreter_callÚimage_generation_callc                óX   — t        | t        «      xr t        | j                  «       «      S ©N)r#   r   r5   r   ©Úvalues    r   Ú	_nonblankrX   z   s   € Ü�eœSÓ!Ò9¤d¨5¯;©;«=Ó&9Ð9r!   c                ó<   — t        | t        «      xr t        | «      S rU   )r#   r   r5   rV   s    r   Ú_nonempty_strrZ   ~   s   € Ü�eœSÓ!Ò1¤d¨5£kÐ1r!   c                ó    — | €dS t        | «      S ©Nr*   ©r   rV   s    r   Ú_str_or_emptyr^   ‚   s   € Ø�ˆ2Ð.¤C¨£JÐ.r!   c                ób   — t        | t        «      r| j                  «       j                  «       S d S rU   )r#   r   r   ÚlowerrV   s    r   Ú_lower_or_nonera   †   s%   € Ü$.¨u´cÔ$:ˆ5�;‰;‹=×ÑÓ ÐDÀÐDr!   c                ó*   — t        | t        «      r| S g S rU   ©r#   ÚlistrV   s    r   Ú_as_listre   Š   s   € Ü˜u¤dÔ+ˆ5Ð3°Ð3r!   c                ó^   — t        | t        «      r| j                  |«      S t        | ||«      S )zMRead ``name`` from a dict or an attribute-style (SDK/SimpleNamespace) object.)r#   ÚdictÚgetÚgetattr)ÚobjÚnameÚdefaults      r   Ú_fieldrm   Ž   s'   € ä& s¬DÔ1ˆ3�7‰7�4‹=ÐR´w¸sÀDÈ'Ó7RÐRr!   c                óv   — t        | j                  d«      xs d«      j                  «       j                  «       S )NÚtyper*   )r   rh   r   r`   )Úparts    r   Ú
_part_typerq   “   s-   € Üˆt�x‰x˜ÓÒ% 2Ó&×,Ñ,Ó.×4Ñ4Ó6Ð6r!   c                ó   — | dk(  rdS dS )NÚ	assistantr;   r:   © ©Úroles    r   Ú_text_type_forrw   —   s   € Ø  KÒ/ˆ=ÐA°\ÐAr!   c                ó°   — t        | t        «      rt        j                  | d¬«      } nt        | t        «      st	        | «      } | j                  «       xs dS )zBNormalize replayed tool-call arguments to a non-empty JSON string.F©Úensure_asciiú{})r#   rg   ÚjsonÚdumpsr   r   )Ú	argumentss    r   Ú_coerce_argumentsr   ›   sA   € ä�)œTÔ"Ü—J‘J˜y°uÔ=‰	Ü˜	¤3Ô'Ü˜	“Nˆ	Ø�?‰?ÓÒ$ Ð$r!   c                óN  ‡ — ‰ rd‰ vsd‰ vr‰ S t        d„ ‰ D «       «      s%t        j                  dt        › dt        › d�‰ «      S t	        ‰ «      D ��cg c]   \  }}t        j                  |«      dk7  sŒ|‘Œ" }}}dj                  ˆ fd„|D «       «      }g d	}}t        j                  |«      D ]Y  }||j                  «          ||j                  «       d
z
     d
z   }	}|‰ || dt        › |j                  d
«      › t        › d�gz  }|	}Œ[ dj                  |«      ‰ |d z   S c c}}w )zCKeep Harmony source readable without emitting reserved wire tokens.Ú<Ú|c              3  óL   K  — | ]  }t        j                  |«      d k(  –— Œ y­w)ÚCfN)ÚunicodedataÚcategory)Ú.0Úchars     r   ú	<genexpr>z-_neutralize_harmony_tokens.<locals>.<genexpr>¨   s    è ø€ ÒC°dŒ{×#Ñ# DÓ)¨TÕ1ÑCùs   ‚"$z\1Ú>r„   r*   c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wrU   rt   )r‡   Úir-   s     €r   r‰   z-_neutralize_harmony_tokens.<locals>.<genexpr>­   s   øè ø€ Ò? q˜4 �7Ñ?ùs   ƒr   é   N)ÚanyÚ_HARMONY_CONTROL_TOKEN_REÚsubÚ_FULLWIDTH_PIPEÚ	enumerater…   r†   ÚjoinÚfinditerr3   ÚendÚgroup)
r-   rŒ   rˆ   Úoriginal_positionsÚvisible_textÚresultÚcursorr7   r3   r•   s
   `         r   Ú_neutralize_harmony_tokensr›   ¤   s9  ø€ á�3˜d‘? c°¡oØˆÜÑC¸dÔCÔCÜ(×,Ñ,°´/Ð1BÀ"Ä_ÐDUÐUVÐ-WÐY]Ó^Ð^ô ,5°T«?×a¡  4¼k×>RÑ>RÐSWÓ>XÐ\`Ó>`š!ÐaÐÑaØ—7‘7Ó?Ð,>Ô?Ó?€LØ˜ˆF€FÜ*×3Ñ3°LÓAò ˆØ'¨¯©«Ñ6Ð8JÈ5Ï9É9Ë;ÐYZÉ?Ñ8[Ð^_Ñ8_ˆsˆØ�4˜˜uÐ%¨¬?Ð*;¸E¿K¹KÈ»NÐ;KÌOÐK\Ð\]Ð'^Ð_Ñ_ˆØ‰ðð �7‰7�6‹?˜T & '˜]Ñ*Ð*ùó bs   Á D!Á4D!c                ód  — t        | t        «      rt        | «      S t        | t        t        f«      r| D �cg c]  }t        |«      ‘Œ c}S t        | t        «      rJt        d„ | D «       «      rt        d«      ‚| j                  «       D ��ci c]  \  }}|t        |«      “Œ c}}S | S c c}w c c}}w )u¶   Neutralize JSON-like values (tuples â†’ lists). A reserved token in an object *key* is
    rejected, not rewritten â€” renaming could desync a tool schema from the executor contract.c              3  ó\   K  — | ]$  }t        |t        «      xr t        |«      |k7  –— Œ& y ­wrU   )r#   r   r›   ©r‡   Úkeys     r   r‰   z0_neutralize_harmony_structure.<locals>.<genexpr>¾   s+   è ø€ Ò`ÐSVŒz˜#œsÓ#ÒNÔ(BÀ3Ó(GÈ3Ñ(NÓNÑ`ùs   ‚*,zaReserved Harmony tokens in a JSON object key cannot be neutralized without changing its contract.)
r#   r   r›   rd   ÚtupleÚ_neutralize_harmony_structurerg   rŽ   Ú
ValueErrorÚitems)rW   ÚitemrŸ   s      r   r¡   r¡   ¶   s¤   € ô �%œÔÜ)¨%Ó0Ð0Ü�%œ$¤˜Ô'Ø@EÖF¸Ô-¨dÕ3ÒFÐFÜ�%œÔÜÑ`ÐZ_Ô`Ô`Üð=óð ð KPÏ+É+Ë-×X¹Y¸SÀ$�Ô2°4Ó8Ñ8ÓXÐXØ€Lùò Gùó Ys   ¶B'ÂB,c              #  óú   K  — | D ]r  }t        |t        «      r	|rd|f–— Œt        |t        «      sŒ-t        |«      }|t        v r$t        |j                  d«      «      r
d|d   f–— Œd|t        v sŒmd|f–— Œt y­w)zHYield ``("text", str)`` / ``("image", part)`` for recognized chat parts.r-   ÚimageN)r#   r   rg   rq   Ú_TEXT_PART_TYPESrZ   rh   Ú_IMAGE_PART_TYPES)Úcontentrp   Úptypes      r   Ú_iter_content_partsr«   É   sz   è ø€ àò $ˆÜ�dœCÔ ¡TØ˜$�,ÓÜ˜œdÕ#Ü˜tÓ$ˆEØÔ(Ñ(¬]¸4¿8¹8ÀFÓ;KÔ-LØ˜d 6™lÐ*Ó*ØÔ+Ò+Ø˜t�mÓ#ñ$ùs   ‚/A;²?A;Á2	A;Úuserc               ó¨  — |dk(  r	dt         dœS | j                  d«      | j                  d«      }}t        |t        «      r#|j                  d«      |j                  d|«      }}t	        |«      s|syt        |xs d«      }d	d
lm}m}  ||«      }|dk(  r ||«      }|�|d}}|�	dd|› d�dœS d|dœ}	t        |«      r|j                  «       |	d<   |	S )u±  Responses image part from a chat/Responses image part (``image_url`` may be a str or
    ``{url, detail}``). Assistant â†’ text placeholder (an assistant ``input_image`` 400s every
    replay); user â†’ ``input_image``, None for an empty url unless ``keep_empty_url``; an inline
    SVG is rasterized to PNG when a rasterizer is installed, any other unsupported inline
    subtype (or an SVG with no rasterizer) â†’ text placeholder.rs   r;   ©ro   r-   r<   ÚdetailÚurlNr*   r   )Úrasterize_svg_data_urlÚ#unsupported_inline_image_media_typezimage/svg+xmlr:   z[image omitted: z! is not a supported image format]r=   )ro   r<   )Ú_ASSISTANT_IMAGE_PLACEHOLDERrh   r#   rg   rZ   r   Útools.vision_tools_image_prepr±   r²   rX   r   )
rp   rv   Úkeep_empty_urlr°   r¯   r±   r²   ÚmimeÚpng_urlÚ
image_parts
             r   Ú_input_image_partr¹   Ö   sç   € ð ˆ{ÒØ%Ô/KÑLÐLØ—(‘(˜;Ó'¨¯©°(Ó);ˆ€CÜ�#”tÔØ—g‘g˜e“n c§g¡g¨h¸Ó&?ˆVˆÜ˜Ô¡nØÜ
ˆcŠi�R‹.€CçiÙ.¨sÓ3€DØˆÒñ )¨Ó-ˆØÐØ �ˆCØÐØ$Ð0@ÀÀÐFgÐ.hÑiÐiØ*7ÀcÑ!J€JÜ�ÔØ%Ÿ|™|›~ˆ
�8ÑØÐr!   ru   c               óV  — t        | «      D ]5  }t        |t        «      sŒt        |«      x}t        v sŒ(t        d|› d�«      ‚ t        |«      }g }t        t        | «      «      D ]A  \  }}|dk(  r|j                  ||dœ«       Œ t        ||d¬«      x}€Œ1|j                  |«       ŒC |S )u~  Chat-style multimodal content â†’ Responses API input parts ([] if not a list). Text is
    ``input_text`` (user) / ``output_text`` (assistant) â€” the API rejects the wrong type per role;
    ``input_image`` is only legal on user messages (see :func:`_input_image_part`). Unsupported
    video parts fail closed instead of silently turning a video request into a text-only request.z!Codex Responses does not support z% input; use a video-capable provider.r-   r®   F©rµ   )
re   r#   rg   rq   Ú_VIDEO_PART_TYPESr¢   rw   r«   Úappendr¹   )r©   rv   rp   rª   Ú	text_typeÚ	convertedr   Úpayloads           r   Ú _chat_content_to_responses_partsrÁ   õ   sÀ   € ô
 ˜Ó!ò ˆÜ�dœDÕ!´
¸4Ó0@Ð'@ uÔEVÒ&VÜØ3°E°7Ð:_Ð`óð ðô
 ˜tÓ$€IØ&(€IÜ,¬X°gÓ->Ó?ò #‰ˆˆgØ�6Š>Ø×Ñ i¸ÑAÕBÜ'¨°ÀeÔLÐLˆdÑYØ×Ñ˜TÕ"ð	#ð
 Ðr!   Ú )Úsepc               ó„  — t        | t        «      s	 t        | «      S t        t	        | «      «      }|D ��cg c]  \  }}|dk(  sŒ|‘Œ }}}t        |«      t        |«      z
  }|rd|› d|dk7  rdnd› d�nd}dj                  d	„ ||j                  |«      j                  «       fD «       «      S # t        $ r Y yw xY wc c}}w )
uå   Flatten message content to plain text: text parts joined with ``sep`` (``" "`` for logs; ``"\n"`` for memory
    providers feeding regexes), images â†’ ``[N image(s)]`` marker, ``""`` for None, ``str(content)`` for other scalars.r*   r-   ú[z imager�   Úsú]rÂ   c              3  ó&   K  — | ]	  }|sŒ|–— Œ y ­wrU   rt   )r‡   Úbits     r   r‰   z2_summarize_user_message_for_log.<locals>.<genexpr>  s   è ø€ ÒN˜CÊ#”CÑNùs   ‚Š)r#   rd   r^   Ú	Exceptionr«   r%   r“   r   )r©   rÃ   Úpartsr   rÀ   Ú	text_bitsÚimage_countÚnotes           r   Ú_summarize_user_message_for_logrÏ   	  sÇ   € ô �gœtÔ$ð	Ü  Ó)Ð)ô Ô$ WÓ-Ó.€EØ.3×F™]˜T 7°t¸v³~’ÐF€IÑFÜ�e“*œs 9›~Ñ-€KÙHSˆQˆ{ˆm˜6¨¸Ò)9¡#¸rÐ!BÀ!ÑDÐY[€DØ�8‰8ÑN D¨#¯(©(°9Ó*=×*CÑ*CÓ*EÐ#FÔNÓNÐNøô ò 	Ùð	üó Gs   ’
B- ¶B<ÁB<Â-	B9Â8B9c                óž   — t        | «      t        k  r| S dt        j                  | j	                  dd¬«      «      j                  «       dd › �S )zÙKeep ``call_id`` within the API's 64-char cap (the codex app-server namespaces MCP call ids past it). The
    surrogate is a pure function of the original so a ``function_call`` and its ``function_call_output`` agree.Úcall_úutf-8Úreplace)ÚerrorsNé    )r%   Ú_MAX_RESPONSES_ITEM_ID_LENGTHÚhashlibÚsha256ÚencodeÚ	hexdigest)Úcall_ids    r   Ú_clamp_responses_call_idrÜ     sL   € ô ˆ7ƒ|Ô4Ò4ØˆØ”7—>‘> '§.¡.°À .Ó"KÓL×VÑVÓXÐY\ÐZ\Ð]Ð^Ð_Ð_r!   c                ór   — t        | t        «      r'| j                  d«      rt        | «      dkD  rd| dd › �S y)u¬   Map an ``fc_â€¦`` item id to its canonical ``call_<suffix>``. Both sides of a replayed
    pair must derive the SAME call_id, or an oversized pair clamps to two surrogates.Úfc_é   rÑ   N)r#   r   r$   r%   )Úresponse_item_ids    r   Ú_canonical_call_id_from_fcrá   "  sE   € ô Ð"¤CÔ(Ð-=×-HÑ-HÈÔ-OÔTWÐXhÓTiÐlmÒTmØÐ'¨¨Ð+Ð,Ð-Ð-Ør!   c                ó   — t        | t        «      r| j                  «       nd}d|v r=|j                  dd«      \  }}|j                  «       xs d|j                  «       xs dfS |sy|j	                  d«      rd|fS |dfS )z8Split a stored tool id into (call_id, response_item_id).r*   r‚   r�   N)NNrÞ   )r#   r   r   Úsplitr$   )Úraw_idrW   rÛ   rà   s       r   Ú_split_responses_tool_idrå   *  s€   € ä(¨´Ô5ˆF�L‰LŒN¸2€EØ
ˆe�|Ø$)§K¡K°°QÓ$7Ñ!ˆÐ!Ø�}‰}‹Ò& $Ð(8×(>Ñ(>Ó(@Ò(HÀDÐHÐHÙØØ!×,Ñ,¨UÔ3ˆD�%ˆ=ÐF¸%À¸ÐFr!   c               ó¼   — t        |«      \  }}t        | «      r| n|}t        |«      s|rt        |«      }t        |«      st        |||«      }|j	                  «       S )z£Pick a non-blank call_id: explicit -> embedded in ``call|fc`` id -> (replay only)
    canonical ``call_<fc suffix>`` -> deterministic hash of name/arguments/index.)rå   rX   rá   r   r   )	Úraw_call_idÚraw_item_idÚfn_namer~   ÚindexÚcanonicalize_fcÚembedded_call_idÚembedded_response_item_idrÛ   s	            r   Ú_resolve_call_idrî   5  s\   € ô
 3KÈ;Ó2WÑ/ÐÐ/Ü& {Ô3‰kÐ9I€GÜ�WÔ¡/Ü,Ð-FÓGˆÜ�WÔÜ'¨°¸EÓBˆØ�=‰=‹?Ðr!   c                ó–  — t        |t        «      r/|j                  «       j                  d«      r|j                  «       S | xs dj                  «       }t	        j
                  dd|«      }||fD ]d  }|j                  d«      s*|j                  d«      sŒ&t        |«      t        d«      kD  sŒ>|j                  d«      r|c S d|t        d«      d › �c S  |rd|dd › �S |xs/ t        |xs d«      xs t        j                  «       j                  }dt        j                  |j                  d«      «      j                  «       dd › �S )	zCBuild a valid Responses `function_call.id` (must start with `fc_`).rÞ   r*   z[^A-Za-z0-9_-]rÑ   Né0   rÒ   é   )r#   r   r   r$   Úrer�   r%   ÚuuidÚuuid4Úhexr×   Úsha1rÙ   rÚ   )rÛ   rà   ÚsourceÚ	sanitizedÚ	candidateÚseeds         r   Ú"_derive_responses_function_call_idrû   C  s;  € äÐ"¤CÔ(Ð-=×-CÑ-CÓ-E×-PÑ-PÐQVÔ-WØ×%Ñ%Ó'Ð'ØŠm˜×"Ñ"Ó$€FÜ—‘Ð(¨"¨fÓ5€IØ˜iÐ(ò bˆ	Ø×Ñ Ô&¨9×+?Ñ+?ÀÕ+HÌSÐQZË^Ô^aÐbiÓ^jÓMjØ )× 4Ñ 4°UÔ ;�9ÒaÀ3ÀyÔQTÐU\ÓQ]ÐQ^ÐG_ÐF`ÐAaÒaðbñ Ø�Y˜s �^Ð$Ð%Ð%ØÒD”SÐ)Ò/¨RÓ0ÒD´D·J±J³L×4DÑ4D€DØ”—‘˜dŸk™k¨'Ó2Ó3×=Ñ=Ó?ÀÀÐDÐEÐFÐFr!   Útoolsc                ó–  — | xs g D �cg c]&  }t        |t        «      r|j                  di «      ni ‘Œ( }}|D �cg c]z  }t        |j                  d«      «      r^d|d   |j                  dd«      t        |j                  d«      t        «      r|j                  d«      nd|j                  ddi d	œ«      d
œ‘Œ| }}|xs dS c c}w c c}w )zIConvert chat-completions tool schemas to Responses function-tool schemas.Úfunctionrk   Údescriptionr*   ÚstrictFÚ
parametersÚobject)ro   Ú
properties©ro   rk   rÿ   r   r  N)r#   rg   rh   rX   r5   )rü   r¤   ÚfnsÚfnr¿   s        r   Ú_responses_toolsr  T  sÊ   € àRWÒR]Ð[]Ö
^È$¤z°$¼Ô'=ˆ4�8‰8�J Ô#À2ÑEÐ
^€CÐ
^ð öð œ 2§6¡6¨&£>Ô2ð	 ¨¨6©
À2Ç6Á6È-ÐY[ÓC\Ü*4°R·V±V¸HÓ5EÄtÔ*L�b—f‘f˜XÔ&ÐRWØŸ&™& ¸ÐPRÑ/SÓTó	
ð€Ið ð Ò˜Ðùò _ùòs   ‰+CºA?CrD   )rl   c               óº   — t        | t        «      r>| j                  «       j                  «       j	                  dd«      j	                  dd«      nd}|t
        v r|S |S )z˜Normalize a replayed assistant message status, modulo case/hyphen spelling, so incomplete Codex
    continuation turns are not falsely marked completed.Ú-Ú_rÂ   N)r#   r   r   r`   rÓ   Ú_RESPONSE_MESSAGE_STATUSES)rW   rl   Ústatuss      r   Ú#_normalize_responses_message_statusr  d  sU   € ô KUÐUZÔ\_ÔJ`ˆU�[‰[‹]× Ñ Ó"×*Ñ*¨3°Ó4×<Ñ<¸SÀ#ÔFÐfj€FØÔ9Ñ9ˆ6ÐF¸wÐFr!   )Úitem_idÚphasec               ó|   — dd|| dœ}|j                  d|fd|ffD ��ci c]  \  }}|sŒ	||“Œ c}}«       |S c c}}w )zKAssistant ``message`` item; ``id``/``phase`` are added only when non-empty.Úmessagers   ©ro   rv   r  r©   Úidr  )Úupdate)r©   r  r  r  r¤   ÚkÚvs          r   Ú_message_itemr  k  sM   € ð %.°{ÈfÐahÑi€DØ‡K�K D¨' ?°W¸eÐ4DÐ"E×K™$˜!˜QÊ��A‘ÓKÔLØ€Kùó Ls   ž
8
©8
)Úcurrent_issuer_kindc               ó¬  — | j                  d«      | j                  d«      }}| xr- t        |«      xr  t        |j                  «       «      t        k  }|r&|dk(  r!|j                  «       j                  d«      sd}t        |t        | j                  d«      «      |r|j                  «       ndt        |«      r|j                  «       ¬«      S d¬«      S )	u¶  Replayable assistant ``message`` item from a stored one. ``id`` is kept only when short enough and never for
    GitHub Copilot (ids bind to a backend connection; stale â†’ 401); ``phase`` is preserved per OpenAI's cache guidance.
    The ChatGPT Codex backend additionally rejects ids that do not begin with ``msg`` (foreign Responses issuers
    mint short UUIDs), so those are dropped there while other issuers' policies are unchanged.r  r  r   ÚmsgFr  N©r  r  r  )rh   rX   r%   r   rÖ   r$   r  r  )Úrawr©   r   r  r  r  Úkeep_ids          r   Ú_assistant_message_itemr  t  sµ   € ð —W‘W˜T“] C§G¡G¨GÓ$4ˆU€GØ%Ð%Òv¬)°GÓ*<ÒvÄÀWÇ]Á]Ã_ÓAUÔYvÑAv€GÙÐ&¨/Ò9À'Ç-Á-Ã/×B\ÑB\Ð]bÔBcØˆÜØÔ;¸C¿G¹GÀHÓ<MÓNÙ#*�—‘”°ÌYÐW\ÔM]¸E¿K¹K»Môð àcgôð r!   )Úcurrent_issuer_modelc          	     óx  — g }t        | j                  d«      «      D �]  }t        |t        «      r|j                  d«      sŒ&|j                  d«      }|r||v s|j                  d«      dk(  r|sŒTt	        |j                  d«      «      }|j                  d«      }	|duxr |duxr ||k7  }
|duxr |	duxr |	|k7  }|
s|r"t
        st        j                  d	||	||«       d
aŒÇ|j                  |j                  «       D ��ci c]  \  }}|dvsŒ||“Œ c}}«       |s�Œ|j                  |«       �Œ |S c c}}w )a÷  Replay persisted encrypted reasoning/compaction items for one assistant turn. Skips duplicate
    ids, ``compaction`` checkpoints unless THIS request carries ``context_management`` (else a persisted
    checkpoint erases pre-checkpoint history on a model that cannot decrypt it), and items stamped by
    another issuer or model (HTTP 400). Items without a model stamp (legacy or unstamped) replay on a
    matching issuer. ``id`` (store=False lookups 404) and the Hermes provenance fields are stripped.Úcodex_reasoning_itemsÚencrypted_contentr  ro   Ú
compactionÚ_issuer_kindÚ_issuer_modelNu±   Dropping reasoning item minted by %s/%s while calling %s/%s â€” encrypted_content is sealed to its issuer and model. This happens when a session switches model mid-conversation.T)r  r$  r%  )re   rh   r#   rg   r&   Ú_CROSS_ISSUER_WARN_EMITTEDÚloggerÚwarningr½   r£   Úadd)r  Úseen_item_idsr  r  Únative_compaction_eligibleÚreplayedÚrir  Úitem_issuerÚ
item_modelÚforeign_issuerÚforeign_modelr  r  s                 r   Ú_replay_reasoning_itemsr2  †  sO  € ð &(€HÜ�s—w‘wÐ6Ó7Ó8ó 'ˆÜ˜2œtÔ$¨¯©Ð0CÔ)DØØ—&‘&˜“,ˆÙ˜ =Ñ0°b·f±f¸V³nÈÒ6TÑ]wØÜ,¨R¯V©V°NÓ-CÓDˆØ—V‘V˜OÓ,ˆ
Ø,°DÐ8Ò{¸[ÐPTÐ=TÒ{ÐYdÐh{ÑY{ˆð
 !¨Ð,Òn°À4Ð1GÒnÈJÐZnÑLnð 	ñ ™]Ý-Ü—‘ðsà Ð-@ÐBVôð
 .2Ð*ØØ�‰¨"¯(©(«*×i¡$ ! Q¸ÐAhÒ8h˜˜A™ÓiÔjÛØ×Ñ˜gÖ&ð5'ð6 €Oùó js   ÄD6ÄD6c               ó$  — g }t        | j                  d«      «      xs* t        d„ t        | j                  d«      «      D «       «      }t        | j                  d«      «      D �]  }t	        |t
        «      r(|j                  d«      dk(  r|j                  d«      dk(  sŒ=t        |j                  d	«      «      D �cg c]b  }t	        |t
        «      rPt        |j                  d«      xs d
«      j                  «       t        v rdt        |j                  dd
«      «      dœ‘Œd }}|sŒÅ|r:|j                  d«      r)|j                  «       D ��	ci c]  \  }}	|dk7  sŒ||	“Œ }}}	|j                  t        ||||¬«      «       �Œ! |S c c}w c c}	}w )u–  Replay exact assistant message items (id/phase) for prefix-cache hits.

    A ``msg_*`` id minted in the same response as a ``reasoning`` item is bound to that item's ``rs_*`` id,
    which ``_replay_reasoning_items`` always strips (store=False). Replaying the message id alone is a
    deterministic HTTP 400 ("provided without its required 'reasoning' item", #97427/#97442), so the message
    id is dropped whenever its turn carried encrypted reasoning â€” replayed, suppressed, foreign-issuer or
    trimmed by the transport (``codex_reasoning_trimmed``) â€” and the message goes out as content/status/phase
    only. Reasoning-free turns keep their id.
    Úcodex_reasoning_trimmedc              3  ób   K  — | ]'  }t        |t        «      xr |j                  d «      –— Œ) y­w)r"  N)r#   rg   rh   )r‡   r-  s     r   r‰   z(_replay_message_items.<locals>.<genexpr>¼  s0   è ø€ ò JØACŒ
�2”tÓÒ< §¡Ð(;Ó!<Ó<ñJùs   ‚-/r!  Úcodex_message_itemsro   r  rv   rs   r©   r*   r;   r-   r®   r  ©r   r  )r5   rh   rŽ   re   r#   rg   r   r   Ú_OUTPUT_TEXT_TYPESr^   r£   r½   r  )
r  r   r  r,  Úlinked_to_reasoningÚraw_itemrp   r©   r  r  s
             r   Ú_replay_message_itemsr;  ¯  sz  € ð &(€HÜ˜sŸw™wÐ'@ÓAÓBò Äcñ JÜGOÐPS×PWÑPWÐXoÓPpÓGqôJó GÐô ˜SŸW™WÐ%:Ó;Ó<ó ˆÜ˜8¤TÔ*¨x¯|©|¸FÓ/CÀyÒ/PÐU]×UaÑUaÐbhÓUiÐmxÒUxØô ! §¡¨iÓ!8Ó9ö
àÜ˜$¤Ô%¬#¨d¯h©h°vÓ.>Ò.DÀ"Ó*E×*KÑ*KÓ*MÔQcÑ*cð #¬M¸$¿(¹(À6È2Ó:NÓ,OÓPð
ˆð 
ò
 Ù" x§|¡|°DÔ'9Ø-5¯^©^Ó-=×K¡T Q¨ÀÀdÃ˜A˜q™DÐK�ÑKØ�O‰OÔ3Ø˜'Ð7JÐ`sôö ðð €Oùò
ùó Ls   Â<A'FÅFÅFc                  ó(   — e Zd ZdZdd„Zdd„Zdd„Zy)Ú_WireCallIdsuT  Per-request wire ids for replayed tool pairs.

    Stored call ids are minted per turn (``terminal:0``, ``terminal:1``â€¦), so the same id recurs on
    later turns of one session. Replayed verbatim, strict Responses validators reject the whole
    request with 400 "Duplicate function_call_output for call_id" and every retry of the turn fails
    identically (#102629, #111231). Every occurrence past the first gets a ``_dup<n>`` wire id; the
    matching tool output pops the id its ``function_call`` was given, in call order, so pairs stay
    intact and the stored history is untouched.
    c                ó    — i | _         i | _        y rU   )Ú_seenÚ_queue)Úselfs    r   Ú__init__z_WireCallIds.__init__Û  s   € Ø%'ˆŒ
Ø,.ˆ�r!   c                óü   — t        |«      }| j                  j                  |d«      }|dz   | j                  |<   |dk(  r|nt        |› d|› �«      }| j                  j	                  |g «      j                  |«       |S )Nr   r�   Ú_dup)rÜ   r?  rh   r@  Ú
setdefaultr½   )rA  rÛ   ÚbaseÚnÚwires        r   Úfor_callz_WireCallIds.for_callß  st   € Ü'¨Ó0ˆØ�J‰J�N‰N˜4 Ó#ˆØ˜q™5ˆ�
‰
�4ÑØ˜A’v‰tÔ#;¸t¸fÀDÈÈÐ<LÓ#MˆØ�‰×Ñ˜t RÓ(×/Ñ/°Ô5Øˆr!   c                óx   — t        |«      }| j                  j                  |«      }|r|j                  d«      S |S ©Nr   )rÜ   r@  rh   Úpop)rA  rÛ   rF  Úqueues       r   Ú
for_outputz_WireCallIds.for_outputç  s3   € Ü'¨Ó0ˆØ—‘—‘ Ó%ˆÙ$ˆu�y‰y˜‹|Ð.¨$Ð.r!   N)ÚreturnÚNone©rÛ   r   rO  r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rB  rI  rN  rt   r!   r   r=  r=  Ð  s   „ ñó/óô/r!   r=  ©Úwire_idsc          	     ó  — g }t        | j                  d«      «      D ]à  }t        |t        «      sŒ|j                  di «      }|j                  d«      |j                  dd«      }}t	        |«      sŒU|t        |«      z   }t        |j                  d«      |j                  d«      |t        |«      |d¬	«      }	|j                  d
|r|j                  |	«      n
t        |	«      t        |d¬«      t        |«      dœ«       Œâ |S )zKConvert an assistant message's ``tool_calls`` into ``function_call`` items.Ú
tool_callsrþ   rk   r~   r{   rÛ   r  T©rë   Úfunction_callr  ©Úfallback©ro   rÛ   rk   r~   )re   rh   r#   rg   rX   r%   rî   r   r½   rI  rÜ   r   r   )
r  Ústart_indexrW  r,  Útcr  ré   r~   rê   rÛ   s
             r   Ú_replay_tool_call_itemsra  í  së   € ð &(€HÜ�s—w‘w˜|Ó,Ó-ò ˆÜ˜"œdÔ#ØØ�V‰V�J Ó#ˆØŸV™V F›^¨R¯V©V°KÀÓ-F�ˆÜ˜Ô!ØØœc (›mÑ+ˆÜ" 2§6¡6¨)Ó#4°b·f±f¸T³lÀGÌSÐQZË^Ð]bÐtxÔyˆØ�‰Ø#Ù5=�x×(Ñ(¨Ô1ÔC[Ð\cÓCdÜ$ W°tÔ<ÔK\Ð]fÓKgñ
õ 	ðð €Or!   c               óŒ  — | j                  d«      }t        |«      \  }}t        |«      s(t        |«      }|€t        |«      r|j	                  «       }t        |«      sg S | j                  d«      }t        |t        «      }|rt        |«      xs dnt        |xs d«      }|r|j                  |«      n
t        |«      }d||dœgS )zQConvert a tool-role message to ``[function_call_output]`` (``[]`` if unpairable).Útool_call_idr©   r*   Úfunction_call_output©ro   rÛ   Úoutput)rh   rå   rX   rá   r   r#   rd   rÁ   r   rN  rÜ   )	r  rW  Úraw_tool_call_idrÛ   Útool_response_item_idÚtool_contentÚis_partsÚoutput_valueÚwire_call_ids	            r   Ú_tool_output_itemsrm    sÆ   € à—w‘w˜~Ó.ÐÜ%=Ð>NÓ%OÑ"€GÐ"Ü�WÔô -Ð-BÓCˆØˆ?œyÐ)9Ô:Ø&×,Ñ,Ó.ˆGÜ�WÔØˆ	à—7‘7˜9Ó%€LÜ˜,¬Ó-€HÙRZÔ9¸,ÓGÒMÉ2Ô`cÐdpÒdvÐtvÓ`w€LÙ3;�8×&Ñ& wÔ/ÔAYÐZaÓAb€LØ+¸ÐP\Ñ]Ð^Ð^r!   T©r   r   Úreplay_encrypted_reasoningr  r  r+  c               óP  ‡‡‡‡— g Šg Št        «       }t        «       }|dk(  Šdˆˆfd„}	| D �]e  }
t        |
t        «      sŒ|
j	                  d«      }|dk(  r |	t        |
|¬«      |
«       Œ@|dvrŒE|
j	                  dd«      }t        ||¬	«      }t        |«      Št        |t        «      rdj                  ˆfd
„|D «       «      n
t        |«      }dˆˆfd„}|dk(  r |	| ||xs |«      dœg|
«       ŒÈ|sg nt        |
||||¬«      } |	||
«       t        |
||¬«      } |	||
«       d}|s|xs |j                  «       r|n|rdnd}t        |
t        ‰«      |duz   |¬«      }|�#|dk(  r|s|dk(  rdn|} |	d ||«      dœg|
«        |	||
«       �Œh |s‰S ddlm}  |‰‰¬«      S )u±  Convert internal chat-style messages to Responses input items.

    ``is_xai_responses``: signature compatibility only (xAI DOES replay encrypted reasoning).
    ``replay_encrypted_reasoning``: per-session kill switch, threaded False by
    ``AIAgent._disable_codex_reasoning_replay`` after an ``invalid_encrypted_content`` 400.
    ``is_github_responses``: drops ``id`` from replayed message items (Copilot 401s on stale ids).
    ``current_issuer_kind`` / ``current_issuer_model``: provenance guard; items stamped by another issuer or
    model drop. Legacy items carrying only an endpoint stamp replay on a matching issuer.
    ``native_compaction_eligible``: THIS request carries ``context_management``; gates both replaying ``compaction``
    checkpoints and ``prune_pre_checkpoint_items``. Checkpoints persist across model swaps / compression flips / resume,
    so without the gate one checkpoint would erase pre-checkpoint history on a model that cannot decrypt it (lossless:
    local history is never truncated).

    Earlier (PR #26644, May 2026) we believed xAI's OAuth/SuperGrok ``/v1/responses`` surface rejected
    replayed ``encrypted_content`` reasoning items minted by prior turns, and we stripped them. That
    decision was wrong â€” xAI explicitly relies on Hermes threading encrypted reasoning back across turns for
    cross-turn coherence (the whole point of their partnership integration). We now replay encrypted
    reasoning on every Responses transport (xAI, native Codex, custom relays) and let xAI tell us explicitly
    if a specific surface ever rejects a payload.
    The Copilot backend (api.githubcopilot.com/responses) binds these ids to a specific backend "connection"
    â€” credential-pool rotation, a gateway restart, or routine load-balancer churn between turns all
    invalidate it â€” and rejects a stale id with HTTP 401 "input item ID does not belong to this connection"
    even for short ids (see #32716). ``phase``/ ``status``/``content`` are still replayed; only ``id`` is
    unsafe to reuse across a Copilot connection.
    ``native_compaction_eligible`` mirrors, for THIS request, the decision made by
    ``native_compaction.native_compaction_context_management`` â€” it is True only when that gate returned a
    payload, i.e. when the request actually carries ``context_management``. It controls two things that must
    never outlive the gate: replaying ``type: "compaction"`` checkpoint items, and restructuring the wire
    around them (``prune_pre_checkpoint_items``). Checkpoints are persisted in the ``codex_reasoning_items``
    sidecar and survive a mid-session model swap, a ``compression.enabled: false`` flip, the rejection kill
    switch and a resumed session; without this flag a single captured checkpoint would keep deleting every
    pre-checkpoint item from every later request, on a model that cannot decrypt the blob (#85914). Default
    False = pre-feature wire, which is also correct for every caller that never sends ``context_management``
    (auxiliary/compression client, ad-hoc ``convert_messages``). Dropping the checkpoint costs nothing:
    Hermes' local history is never truncated by native compaction, so the full conversation is still on the
    wire.
    r   c                ód   •— ‰j                  | «       ‰j                  |gt        | «      z  «       y rU   )Úextendr%   )Ú	new_itemsr  Úitem_sourcesr£   s     €€r   Úemitz/_chat_messages_to_responses_input.<locals>.emitO  s(   ø€ Ø�‰�YÔØ×Ñ˜S˜E¤C¨	£NÑ2Õ3r!   rv   ÚtoolrV  >   r¬   rs   r©   r*   ru   c              3  ó:   •K  — | ]  }|d    ‰k(  sŒ|d   –— Œ y­w)ro   r-   Nrt   )r‡   Úpr¾   s     €r   r‰   z4_chat_messages_to_responses_input.<locals>.<genexpr>_  s    øè ø€ ÒO !¸¸&¹	ÀYÓ8N�A�f•IÑOùs   ƒ‘
c                ó8   •— ‰rt        | t        «      r‰| dœgS | S )Nr®   )r#   r   )rW   r¾   Útyped_text_onlys    €€r   Úwire_contentz7_chat_messages_to_responses_input.<locals>.wire_contentb  s$   ø€ Ù;JÌzÐZ_ÔadÔOe˜Y°Ñ6Ð7ÐpÐkpÐpr!   r¬   ©rv   r©   )r*  r  r  r+  r7  N)r_  rW  rÂ   rs   r   )Úprune_pre_checkpoint_items)rt  )rs  úList[Dict[str, Any]]r  úDict[str, Any]rO  rP  ©rW   r   rO  r   )Úsetr=  r#   rg   rh   rm  rÁ   rw   rd   r“   r^   r2  r;  r   ra  r%   Úagent.native_compactionr}  )Úmessagesr   r   ro  r  r  r+  r*  rW  ru  r  rv   r©   Úcontent_partsÚcontent_textr{  Úreasoning_itemsÚmessage_itemsr]  Ú
tool_itemsÚfollowerr}  rt  r£   r¾   rz  s                         @@@@r   Ú!_chat_messages_to_responses_inputrŠ    së  û€ ðT #%€Eð 46€LÜ›€MÜ‹~€Hð
 *¨_Ñ<€Oö4ð ó )ˆÜ˜#œtÔ$ØØ�w‰w�v‹ˆØ�6Š>ÙÔ# C°(Ô;¸SÔAØØÐ,Ñ,ØØ—'‘'˜) RÓ(ˆÜ8¸ÀtÔLˆÜ" 4Ó(ˆ	ô ˜'¤4Ô(ð �G‰GÓO }ÔOÔOÜ.;¸GÓ.Dð 	ö	qà�6Š>Ù˜4©L¸Ò9VÈ,Ó,WÑXÐYÐ[^Ô_ØÙ$>™"ÔD[Ø˜}ÐBUØ!5ÐRlôE
ˆñ 	ˆ_˜cÔ"Ü-ØÐ%8ÐNaô
ˆñ 	ˆ]˜CÔ ØˆÙØ$Òs¸×9KÑ9KÔ9M©ÑYhÑSUÐnrˆHÜ,¨S¼cÀ%»jÈHÐ\`ÐL`Ñ>aÐltÔuˆ
ð
 Ð¨°Rª¹JØ&¨"šn‘s°(ˆHÙ˜;±<ÀÓ3IÑJÐKÈSÔQÙˆZ˜ÖðS)ñp &ØˆÝBÙ% e¸,ÔGÐGr!   c                  ó0   — e Zd ZU dZded<   ded<   ded<   y)ÚResponsesRouteFlagsuÒ  Which special Responses-API route an agent is talking to. Single owner of the
    codex/xai/github predicates â€” every site must call :func:`classify_responses_route`.

    Every site that needs these flags (request kwargs build, preflight estimation, silent- reject hints)
    must call :func:`classify_responses_route` instead of re-implementing the string comparisons inline â€”
    inline copies drift (backend-identity class: #22548/#70893/#59561/#72468).
    r5   r   r   r   N)rR  rS  rT  rU  Ú__annotations__rt   r!   r   rŒ  rŒ  �  s   … ñð ÓØÓØÔr!   rŒ  c                ó’  ‡— ddl m} t        | dd«      }t        t        | dd«      xs d«      }t        t        | dd«      xs d«      j	                  «       xs  ||«      Št        t        | dd«      xs |«      j	                  «       }dˆfd	„}t        |d
k(  xs  |d«      xr d|v |dv xs ‰dk(   |d«      xs  |d«      ¬«      S )zªClassify the agent's Responses route from provider + base URL. Host checks are
    exact-host-or-subdomain, never substring (``evil.com/models.github.ai`` is not GitHub).r   )Úbase_url_hostnameÚproviderNr   r*   Ú_base_url_hostnameÚ_base_url_lowerc                ó:   •— ‰| k(  xs ‰j                  d| z   «      S )Nú.)Úendswith)ÚdomainÚhostnames    €r   Ú_host_isz*classify_responses_route.<locals>._host_is¥  s"   ø€ Ø˜6Ñ!ÒD X×%6Ñ%6°s¸V±|Ó%DÐDr!   zopenai-codexzchatgpt.comz/backend-api/codex>   ú	xai-oauthÚxaizapi.x.aizmodels.github.aizgithubcopilot.com)r   r   r   )r–  r   rO  r5   )Úutilsr�  ri   r   r`   rŒ  )Úagentr�  r�  r   r`   r˜  r—  s         @r   Úclassify_responses_router�  �  sÖ   ø€ õ (Ü�u˜j¨$Ó/€HÜ”7˜5 *¨bÓ1Ò7°RÓ8€HÜ”7˜5Ð"6¸Ó;ÒA¸rÓB×HÑHÓJÒiÑN_Ð`hÓNi€HÜ”˜Ð0°"Ó5ÒA¸ÓB×HÑHÓJ€EõEäØ! ^Ñ3Òr¹ÀÓ8OÒ8qÐThÐlqÐTqØ!Ð%9Ð9ÒS¸XÈÑ=SÙ$Ð%7Ó8ÒY¹HÐEXÓ<Yôð r!   c                óÐ  — t        | dd«      dk7  st        |t        «      syt        | «      j	                  «       }ddlm} ddlm}  || fi |¤Žsy || «      j                  dt        | dd«      «      }	 t        ||d   |d	   t        t        | d
d«      «      t        ddt        | dd«      i|¤Žt        |«      d¬«      }|S # t        $ r t        j!                  dd¬«       Y yw xY w)zMBuild the native-compaction-eligible wire items, or ``None`` when ineligible.Úapi_modeNÚcodex_responsesr   )Ú$native_compaction_context_management)Úeffective_request_overridesr'   r   r   Ú_codex_reasoning_replay_enabledTr   rn  zEnative Responses replay conversion failed; using the generic fallback)Úexc_infort   )ri   r#   rd   r�  Ú_asdictr‚  r¡  Úagent.fast_moder¢  rh   rŠ  r5   r    r,   rÊ   r'  Údebug)rœ  rƒ  Úrouter¡  r¢  Úeffective_modelr£   s          r   Ú_native_responses_replay_itemsrª  ®  sÿ   € ô ˆu�j $Ó'Ð+<Ò<ÄJÈxÔY]ÔD^ØÜ$ UÓ+×3Ñ3Ó5€EÝLÝ;Ù/°Ñ?¸Ò?Øá1°%Ó8×<Ñ<¸WÄgÈeÐU\Ð^bÓFcÓd€OðÜ1Ø uÐ-?Ñ'@ÐV[Ð\qÑVrÜ'+¬G°EÐ;\Ð^bÓ,cÓ'dÜ :Ñ nÄGÈEÐS]Ð_cÓDdÐ nÐhmÑ nÜ!5°oÓ!FØ'+ô
ˆð €Løô ò Ü�‰ØSØð 	ô 	
ñ ðús   Á5AC Ã C%Ã$C%c                ó<   — t        | |«      }|€yddlm}  ||«      S )zEWhether the current route would replay a persisted native checkpoint.Fr   )Úhas_compaction_checkpoint)rª  r‚  r¬  )rœ  rƒ  r£   r¬  s       r   Ú+has_replayable_native_compaction_checkpointr­  Ì  s&   € ô +¨5°(Ó;€EØ€}ØÝAÙ$ UÓ+Ð+r!   r*   ©Úsystem_promptrü   c               óJ   — t        | |«      }|€yddlm}  |||xs d|¬«      S )aê  Estimate tokens for the checkpoint-pruned Responses payload (the full transcript overstates a natively compacted
    session and fires local compression needlessly). None when native compaction is not proven eligible or conversion fails.

    Automatic preflight previously counted the full durable transcript. On a natively compacted Codex
    session that overstates the wire by several times and fires local compression against history the main
    request will never send (#96155).
    Nr   )Úestimate_request_tokens_roughr*   r®  )rª  r+   r±  )rœ  rƒ  r¯  rü   r£   r±  s         r   Ú*estimate_native_responses_preflight_tokensr²  ×  s0   € ô +¨5°(Ó;€EØ€}ØÝBÙ(¨¸mÒ>QÈrÐY^Ô_Ð_r!   Ú_PreflightCtxÚsanitize_textÚsanitize_harmony_tokensÚseen_idsc                ó>  — | j                  d«      | j                  d«      }}t        |«      st        d|› d�«      ‚t        |«      st        d|› d�«      ‚d|j                  «       t	        |d¬«      |j                  t        | j                  d	d
«      «      «      dœS )NrÛ   rk   úCodex Responses input[z#] function_call is missing call_id.z ] function_call is missing name.r[  r  r\  r~   r{   r^  )rh   rX   r¢   r   r   r´  r   )r¤   ÚidxÚctxrÛ   rk   s        r   Ú_preflight_function_callr»  ï  s˜   € Ø—H‘H˜YÓ'¨¯©°&Ó)9ˆT€GÜ�WÔÜÐ1°#°Ð6YÐZÓ[Ð[Ü�TŒ?ÜÐ1°#°Ð6VÐWÓXÐXà¨G¯M©M«OÔEUÐVZÐeiÔEjØ×&Ñ&Ô'8¸¿¹À+ÈtÓ9TÓ'UÓVñð r!   c                ód  — | j                  d«      }t        |«      st        d|› d�«      ‚| j                  dd«      }t        |t        «      r¶g }|D ]¨  }t        |t
        «      r|j                  d«      nd }|dk(  rAt        |j                  d«      «      r'|j                  d|j                  |d   «      d	œ«       Œl|d
k(  sŒrt        |j                  d«      «      sŒ�|j                  t        |d¬«      «       Œª |xs d}n|j                  t        |«      «      }d|j                  «       |dœS )NrÛ   r¸  z*] function_call_output is missing call_id.rf  r*   ro   r:   r-   r®   r=   r<   Fr»   rd  re  )rh   rX   r¢   r#   rd   rg   rZ   r½   r´  r¹   r^   r   )	r¤   r¹  rº  rÛ   rf  Úcleanedrp   rª   rk  s	            r   Ú_preflight_function_call_outputr¾  û  s  € Ø�h‰h�yÓ!€GÜ�WÔÜÐ1°#°Ð6`ÐaÓbÐbØ�X‰X�h Ó#€FÜ�&œ$Ôà(*ˆØò 	NˆDÜ(2°4¼Ô(>�D—H‘H˜VÔ$ÀDˆEØ˜Ò$¬°t·x±xÀÓ7GÔ)HØ—‘¨¸c×>OÑ>OÐPTÐU[ÑP\Ó>]Ñ^Õ_Ø˜-Ó'¬M¸$¿(¹(À;Ó:OÕ,PØ—‘Ô0°ÀeÔLÕMð	Nð $šM r‰à×(Ñ(¬°vÓ)>Ó?ˆØ*°w·}±}³ÐR^Ñ_Ð_r!   c                óT  — | j                  d«      }t        |«      sy| d   dk(  rd|dœS | j                  d«      }t        |«      r*||j                  v ry|j                  j                  |«       t	        | j                  d«      «      }d||j
                  rt        |«      d	œS |d	œS )
z]``reasoning`` / ``compaction`` items: opaque, issuer-sealed; forward only API-defined fields.r"  Nro   r#  ©ro   r"  r  ÚsummaryÚ	reasoning)ro   r"  rÁ  )rh   rZ   r¶  r)  re   rµ  r¡   )r¤   r¹  rº  Ú	encryptedr  rÁ  s         r   Ú_preflight_encryptedrÄ    s©   € à—‘Ð,Ó-€IÜ˜Ô#ØØˆF�|�|Ò#Ø$¸9ÑEÐEà�h‰h�t‹n€GÜ�WÔØ�c—l‘lÑ"ØØ�‰×Ñ˜Ô!Ü�t—x‘x 	Ó*Ó+€Gà°)Ø=@×=XÒ=XÔ0°Ó9ñð à^eñð r!   c                ó<  — | j                  d«      dk7  rt        d|› d�«      ‚| j                  d«      }t        |t        «      st        d|› d�«      ‚g }t	        |«      D ]‘  \  }}t        |t
        «      st        d|› d|› d�«      ‚|j                  d	«      }|t        vrt        d|› d|› d
|›d�«      ‚|j                  d|j                  t        |j                  dd«      «      «      dœ«       Œ“ |st        d|› d�«      ‚t        | ||j                  ¬«      S )Nrv   rs   r¸  z+] message items must have role='assistant'.r©   z&] message item must have content list.z] message content[ú] must be an object.ro   ú] has unsupported type r”  r;   r-   r*   r®   z3] message item must contain at least one text part.)r   )rh   r¢   r#   rd   r’   rg   r8  r½   r´  r^   r  r   )r¤   r¹  rº  r©   Únormalized_contentÚpart_idxrp   Ú	part_types           r   Ú_preflight_messagerË  #  sG  € Ø‡x�x�Ó˜;Ò&ÜÐ1°#°Ð6aÐbÓcÐcØ�h‰h�yÓ!€GÜ�gœtÔ$ÜÐ1°#°Ð6\Ð]Ó^Ð^ØÐÜ# GÓ,ò {‰ˆ�$Ü˜$¤Ô%ÜÐ5°c°UÐ:LÈXÈJÐVjÐkÓlÐlØ—H‘H˜VÓ$ˆ	ØÔ.Ñ.ÜØ(¨¨Ð-?À¸zÐI`ÐajÐ`mÐmnÐoóð ð 	×!Ñ!¨=À#×BSÑBSÔTaÐbf×bjÑbjÐkqÐsuÓbvÓTwÓBxÑ"yÕzð{ñ ÜÐ1°#°Ð6iÐjÓkÐkÜ" 4Ð);ÐQT×QhÑQhÔiÐir!   c                óV  — | j                  d«      }|dvr$t        d|› d| j                  d«      ›d|›d�«      ‚| j                  dd	«      }t        |t        «      s||j	                  t        |«      «      d
œS t        |«      }g }t        |«      D �]  \  }}t        |t        «      r'|sŒ|j                  ||j	                  |«      dœ«       Œ>t        |t        «      st        d|› d|› d�«      ‚t        |«      x}	t        v rW|j                  dd	«      }
t        |
t        «      r|
nt        |
xs d	«      }
|j                  ||j	                  |
«      dœ«       ŒÊ|	t        v r|j                  t        ||d¬«      «       Œðt        d|› d|› d|j                  d«      ›d�«      ‚ ||d
œS )uY   Untyped ``user``/``assistant`` role message â€” the only legal shape besides typed items.rv   >   r¬   rs   r¸  z#] has unsupported item shape (type=ro   z, role=z).r©   r*   r|  r®   z
].content[z] must be an object or string.r-   Tr»   rÇ  r”  )rh   r¢   r#   rd   r´  r^   rw   r’   r   r½   rg   rq   r§   r¨   r¹   )r¤   r¹  rº  rv   r©   r¾   Ú	validatedrÉ  rp   rª   r-   s              r   Ú_preflight_role_messagerÎ  8  s»  € à�8‰8�FÓ€DØÐ(Ñ(ÜØ$ S EÐ)LÈTÏXÉXÐV\ÓM]ÐL`Ð`gÐhlÐgoÐoqÐró
ð 	
ð �h‰h�y "Ó%€GÜ�gœtÔ$Ø¨×):Ñ):¼=ÈÓ;QÓ)RÑSÐSô ˜tÓ$€IØ&(€IÜ# GÓ,ó ‰ˆ�$Ü�dœCÔ ÚØ× Ñ ¨)¸S×=NÑ=NÈtÓ=TÑ!UÕVÜ˜D¤$Ô'ÜÐ5°c°U¸*ÀXÀJÐNlÐmÓnÐnÜ! $Ó'Ð'ˆeÔ,<Ñ<Ø—8‘8˜F BÓ'ˆDÜ% d¬CÔ0‘4´c¸$º*À"³oˆDØ×Ñ i¸×9JÑ9JÈ4Ó9PÑQÕRØÔ'Ñ'Ø×ÑÔ.¨t°TÈ$ÔOÕPäØ(¨¨¨Z¸°zÐAXÐY]×YaÑYaÐbhÓYiÐXlÐlmÐnóð ðð   YÑ/Ð/r!   )r[  rd  rÂ  r#  r  z2Dict[str, Callable[..., Optional[Dict[str, Any]]]]Ú_PREFLIGHT_ITEM_HANDLERS©r   rµ  c               ó¢  — t        | t        «      st        d«      ‚|rt        nd„ }t	        |||t        «       «      }g }t        | «      D ]‚  \  }}t        |t        «      st        d|› d�«      ‚|j                  d«      }t        |t        «      rt        j                  |«      nd }	 |	xs t        |||«      }
|
€Œr|j                  |
«       Œ„ |S )Nz4Codex Responses input must be a list of input items.c                ó   — | S rU   rt   )r-   s    r   ú<lambda>z._preflight_codex_input_items.<locals>.<lambda>d  s   € Ð]a€ r!   r¸  rÆ  ro   )r#   rd   r¢   r›   r³  r�  r’   rg   rh   r   rÏ  rÎ  r½   )Ú	raw_itemsr   rµ  r´  rº  Ú
normalizedr¹  r¤   Ú	item_typeÚhandlerÚnormalized_items              r   Ú_preflight_codex_input_itemsrÙ  _  sÖ   € ô �i¤Ô&ÜÐOÓPÐPÙ2IÕ.ÑPa€MÜ
˜Ð'>Ð@SÔUXÓUZÓ
[€CØ')€JÜ˜yÓ)ò /‰	ˆˆTÜ˜$¤Ô%ÜÐ5°c°UÐ:NÐOÓPÐPØ—H‘H˜VÓ$ˆ	Ü=GÈ	ÔSVÔ=WÔ*×.Ñ.¨yÔ9Ð]aˆØ=˜7Ò=Ô&=¸tÀSÈ#ÓNˆØÑ&Ø×Ñ˜oÕ.ð/ð Ðr!   c           	     ó  — t        | t        «      st        d|› d�«      ‚| j                  d«      }|t        v rt        | «      S |dk7  r!t        d|› d| j                  d«      ›d�«      ‚| j                  d«      | j                  d«      }}t        |«      d	ft        |t        «      d
ffD ]  \  }}|rŒ	t        d|› d|› d�«      ‚ d|j                  «       t        | j                  dd«      «      t        | j                  dd«      «      |dœS )NzCodex Responses tools[rÆ  ro   rþ   rÇ  r”  rk   r  za valid namezvalid parametersz] is missing rÿ   r*   r   Fr  )	r#   rg   r¢   rh   Ú_RESPONSES_BUILTIN_TOOL_TYPESrX   r   r^   r5   )rv  r¹  Ú	tool_typerk   r  ÚokÚwhats          r   Ú_preflight_toolrß  r  s  € Ü�dœDÔ!ÜÐ1°#°Ð6JÐKÓLÐLØ—‘˜Ó €IØÔ1Ñ1Ü�D‹zÐØ�JÒÜÐ1°#°Ð6MÈdÏhÉhÐW]ÓN^ÐMaÐabÐcÓdÐdØ—x‘x Ó'¨¯©°,Ó)?ˆ*€DÜ “o ~Ð6¼ÀJÔPTÓ9UÐWiÐ8jÐkò Q‰ˆˆDÚÜÐ5°c°U¸-ÈÀvÈQÐOÓPÐPðQð  D§J¡J£LÄÈtÏxÉxÐXeÐgiÓOjÓAkÜ�t—x‘x ¨%Ó0Ó1Àñð r!   rÂ  c                ó"   — t        | t        «      S rU   )r#   rg   ©r  s    r   rÓ  rÓ  ‡  s   € œJ q¬$Ó/€ r!   Úincludec                ó"   — t        | t        «      S rU   rc   rá  s    r   rÓ  rÓ  ˆ  s   € œ* Q¬Ó-€ r!   Úservice_tierc                ó<   — t        | t        «      xr t        | «      S rU   )r#   rg   r5   rá  s    r   rÓ  rÓ  ‹  s   € ”z !¤TÓ*Ò6¬t°A«w€ r!   Úmax_output_tokensc                ó<   — t        | t        t        f«      xr | dkD  S rK  ©r#   ÚintÚfloatrá  s    r   rÓ  rÓ  Œ  s   € ¤J¨q´3¼°,Ó$?Ò$IÀAÈÁE€ r!   Útimeoutc                óŠ   — t        | t        t        f«      xr, t        | t        «       xr d| cxk  xr t        d«      k  S c S )Nr   Úinf)r#   ré  rê  r5   rá  s    r   rÓ  rÓ  �  s=   € œ* Q¬¬e¨Ó5Òj¼jÈÌDÓ>QÐ:QÒjÐVWÐZ[ÖVjÔ^cÐdiÓ^jÑVj€ ÑVj€ r!   Útemperaturec                ó.   — t        | t        t        f«      S rU   rè  rá  s    r   rÓ  rÓ  Ž  s   € œj¨¬S´%¨LÓ9€ r!   c              #  ó(   K  — | ]
  }|d „ df–— Œ y­w)c                ó
   — | d uS rU   rt   rá  s    r   rÓ  z<genexpr>.<lambda>‘  s
   € ˜ ˜€ r!   Nrt   rž   s     r   r‰   r‰   �  s    è ø€ ò àð 
Ñ% tÔ,ñùó   ‚)Útool_choiceÚparallel_tool_callsÚprompt_cache_keyÚprompt_cache_retentionÚcontext_managementc                ó<   — t        | t        «      xr t        | «      S rU   )r#   rd   r5   rá  s    r   rÓ  rÓ  •  s   € ¤Z°´4Ó%8Ò%D¼TÀ!»W€ r!   zMtuple[tuple[str, Callable[[Any], bool], Optional[Callable[[Any], Any]]], ...]Ú_PREFLIGHT_OPTIONAL_FIELDSÚinstructionsÚinputÚstoreÚextra_headersÚ
extra_bodyc              #  ó(   K  — | ]
  \  }}}|–— Œ y ­wrU   rt   )r‡   rŸ   r
  s      r   r‰   r‰   š  s   è ø€ Ò6‰iˆc�1�a„cÑ6ùrò  c                ój   — | j                  |«      }|�t        |t        «      st        d|› d�«      ‚|S )NzCodex Responses request 'z' must be an object.)rh   r#   rg   r¢   )Ú
api_kwargsrŸ   rW   s      r   Ú_optional_dictr  ž  s:   € Ø�N‰N˜3Ó€EØÐ¤¨E´4Ô!8ÜÐ4°S°EÐ9MÐNÓOÐOØ€Lr!   )Úallow_streamr   rµ  c               ót  ‡ ‡— t        ‰ t        «      st        d«      ‚t        ˆ fd„dD «       «      x}rt        ddj	                  |«      › d�«      ‚‰ j                  d«      }t        |«      st        d«      ‚t        ‰ j                  d	«      «      j                  «       xs t        }|rt        |«      }t        ‰ j                  d
«      ||¬«      }|j                  «       ||ddœ}‰ j                  d«      }	|	�Tt        |	t        «      st        d«      ‚t        |	«      D �
�cg c]  \  }
}t        ||
«      ‘Œ }}
}|rt        |«      n||d<   ‰ j                  dd«      durt        d«      ‚t         D ]/  \  }}}‰ j                  |«      } ||«      sŒ!|r ||«      n|||<   Œ1 t#        ‰ d«      xs i }t%        d„ |D «       «      st        d«      ‚|j'                  «       D ��ci c]"  \  }}|€Œ	|j                  «       t)        |«      “Œ$ }}}|r||d<   t#        ‰ d«      }|rt        |«      |d<   ‰ j                  d«      }|sd‰ v rt        d«      ‚|r|�|durt        d«      ‚d|d<   t)        ‰ j                  d«      xs d«      j+                  «       j-                  d«      }|r)|j                  d«      r	 ddlm}  ||d   «      \  |d<   }t4        |rdhn	t7        «       z  Št        ˆfd„‰ D «       «      x}rt        ddj	                  |«      › d�«      ‚|S c c}}
w c c}}w # t2        $ r Y Œcw xY w) Nz'Codex Responses request must be a dict.c              3  ó,   •K  — | ]  }|‰vsŒ|–— Œ y ­wrU   rt   )r‡   rŸ   r  s     €r   r‰   z._preflight_codex_api_kwargs.<locals>.<genexpr>«  s   øè ø€ Òd ÈcÐYcÒNcœÑdùó   ƒ	�)r'   rú  rû  z3Codex Responses request missing required field(s): z, r”  r'   z;Codex Responses request 'model' must be a non-empty string.rú  rû  rÐ  F)r'   rú  rû  rü  rü   z=Codex Responses request 'tools' must be a list when provided.rü  z6Codex Responses contract requires 'store' to be false.rý  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrU   )rX   rž   s     r   r‰   z._preflight_codex_api_kwargs.<locals>.<genexpr>Æ  s   è ø€ Ò7 #Œy˜�~Ñ7ùs   ‚zGCodex Responses request 'extra_headers' keys must be non-empty strings.rþ  ÚstreamzKCodex Responses stream flag is only allowed in fallback streaming requests.Tz/Codex Responses 'stream' must be true when set.r*   )zgrok-z
x-ai/grok-r   )Ústrip_slash_enumc              3  ó,   •K  — | ]  }|‰vsŒ|–— Œ y ­wrU   rt   )r‡   rŸ   Úallowed_keyss     €r   r‰   z._preflight_codex_api_kwargs.<locals>.<genexpr>á  s   øè ø€ ÒQ C¸ÀLÒ9PœCÑQùr  z2Codex Responses request has unsupported field(s): )r#   rg   r¢   Úsortedr“   rh   rX   r^   r   r   r›   rÙ  rd   r’   rß  r¡   rù  r  Úallr£   r   r`   r$   Útools.schema_sanitizerr	  rÊ   Ú_PREFLIGHT_ALLOWED_KEYSr�  )r  r  r   rµ  Úmissingr'   rú  Úinput_itemsrÕ  rü   r¹  rv  Únormalized_toolsrŸ   ÚacceptÚcoercerW   rý  Únormalized_headersrþ  r  Úis_xai_modelr	  r
  Ú
unexpectedr  s   `                        @r   Ú_preflight_codex_api_kwargsr  ¥  sG  ù€ ô �j¤$Ô'ÜÐBÓCÐCÜÓdÐ(JÔdÓdÐd€wÐdÜÐNÈtÏyÉyÐY`ÓOaÐNbÐbcÐdÓeÐeØ�N‰N˜7Ó#€EÜ�UÔÜÐVÓWÐWÜ  §¡°Ó!?Ó@×FÑFÓHÒbÔLb€LÙÜ1°,Ó?ˆÜ.Ø�‰�wÓÐ5HÐbyô€Kð —‘“°À{Ð]bñ"€Jð �N‰N˜7Ó#€EØÐÜ˜%¤Ô&ÜÐ\Ó]Ð]ÜHQÐRWÓHX×Y¹9¸3ÀœO¨D°#Õ6ÐYÐÑYÙQhÔ;Ð<LÔMÐn~ˆ
�7ÑØ‡~�~�g˜uÓ%¨UÑ2ÜÐQÓRÐRÜ9ò AÑˆˆV�VØ—‘˜sÓ#ˆÙ�%�=Ù/5™f Uœm¸5ˆJ�sŠOðAô # :¨Ó?ÒEÀ2€MÜÑ7¨Ô7Ô7ÜÐbÓcÐcØDQ×DWÑDWÓDY×o±j°c¸5Ð]bÑ]n˜#Ÿ)™)›+¤s¨5£zÑ1ÐoÐÑoÙØ&8ˆ
�?Ñ#ô   
¨LÓ9€JÙÜ#'¨
Ó#3ˆ
�<Ñ Ø�^‰^˜HÓ%€FÙ˜H¨
Ñ2ÜÐfÓgÐgÙ˜Ð*Ø˜ÑÜÐNÓOÐOØ#ˆ
�8Ñô �z—~‘~ gÓ.Ò4°"Ó5×;Ñ;Ó=×HÑHÐI`Óa€LÙ˜
Ÿ™ wÔ/ð	Ý?Ù%5°jÀÑ6IÓ%JÑ"ˆJ�wÑ ô +¹L¨x©jÌcËeÑT€LÜÓQ¨:ÔQÓQÐQ€zÐQÜÐMÈdÏiÉiÐXbÓNcÐMdÐdeÐfÓgÐgØÐùóM Zùó pøô, ò 	Ùð	ús$   Ä$LÇ&
L%Ç1L%Ê<L+ Ì+	L7Ì6L7c                ó°   — t        | «      D �cg c]  }|�t        |dd«      |v sŒ|‘Œ }}d„ |D «       D �cg c]  }t        |«      sŒ|‘Œ c}S c c}w c c}w )zVNon-empty ``.text`` of each part (optionally filtered by ``.type``); [] if not a list.Nro   c              3  ó6   K  — | ]  }t        |d d«      –— Œ y­w©r-   N©ri   ©r‡   rp   s     r   r‰   z_text_chunks.<locals>.<genexpr>ë  s   è ø€ ÒO¸dœg d¨F°D×9ÑOùó   ‚)re   ri   rZ   )rË   Útypesrp   Úselectedr-   s        r   Ú_text_chunksr!  è  sX   € ä!)¨%£Öj˜°E°MÄWÈTÐSYÐ[_ÓE`ÐdiÒEi’Ðj€HÐjÙOÀhÔOÖg�TÔS`ÐaeÕSfŠDÒgÐgùò kùÚgs   ŽA¥A¶AÁAc                ó  — g }t        t        | d«      «      D ]R  }t        |d«      }|dk(  rt        |d«      n|t        v rt        |d«      nd}t        |«      sŒB|j	                  |«       ŒT dj                  |«      j                  «       S )a  Assistant text from a Responses message output item. A ``refusal`` part carries the
    model's explanation in ``refusal`` instead of ``text``; it is message text too, otherwise a
    refusal-only turn reads as an empty response (sibling of chat_completions ``message.refusal``).r©   ro   Úrefusalr-   Nr*   )re   rm   r8  rZ   r½   r“   r   )r¤   Úchunksrp   rª   r-   s        r   Ú_extract_responses_message_textr%  î  sŠ   € ð €FÜœ  iÓ0Ó1ò  ˆÜ�t˜VÓ$ˆØ*/°9Ò*<Œv�d˜IÔ&Ð[`ÔdvÑ[vÄ6È$ÐPVÔCWð  }AˆÜ˜ÕØ�M‰M˜$Õð	 ð
 �7‰7�6‹?× Ñ Ó"Ð"r!   c                óÎ   — t        t        | dd«      «      }t        | dd«      }|rdj                  |«      j                  «       S t	        |t
        «      r|j                  «       S dS )zPCompact reasoning text from a Responses reasoning item (summary, else ``text``).rÁ  Nr-   Ú
r*   )r!  ri   r“   r   r#   r   )r¤   r$  r-   s      r   Ú!_extract_responses_reasoning_textr(  û  sY   € äœ' $¨	°4Ó8Ó9€FÜ�4˜ Ó&€DÙ(.ˆ4�9‰9�VÓ×"Ñ"Ó$ÐcÄZÐPTÔVYÔEZ°T·Z±Z³\ÐcÐ`bÐcr!   c                ó|   ‡ — dˆ fd„} |d«       |d«      }}|r	|r|› d|› �S |xs |xs ‰ rt        ‰ «      S d|› d�S )zŸ``"<code>: <message>"`` for a ``response.error`` payload (dict or object), else whichever
    is present, else ``str(error_obj)``, else a status-based default.c                óv   •— t        ‰| «      }t        |t        «      s|rt        |«      j                  «       S dS r\   )rm   r#   r   r   )rk   rW   Ú	error_objs     €r   Úfieldz&_format_responses_error.<locals>.field  s2   ø€ Ü�y $Ó'ˆÜ%/°´sÔ%;¹uŒs�5‹z×ÑÓ!ÐLÈ"ÐLr!   Úcoder  z: zResponses API returned status 'ú')rk   r   rO  r   r]   )r+  Úresponse_statusr,  Úcode_strÚmessage_strs   `    r   Ú_format_responses_errorr2    s[   ø€ õMñ " &›M©5°Ó+;ˆk€HÙ‘KØ�˜2˜k˜]Ð+Ð+ØÒ}˜(Ò}¹¤s¨9£~Ð}ÐJiÐjyÐizÐz{ÐH|Ð}r!   c           
     ó^  — t        | dd«      xs d}t        | |dk(  rdndd«      }t        |t        «      st        j                  |d¬«      }t        | d	d
«      }t        t        | dd
«      ||||d¬«      }t        |t        |t        «      r|nd
«      }t        |||dt        ||¬«      ¬«      S )zPBuild a chat-style tool_call from a ``function_call``/``custom_tool_call`` item.rk   r*   r[  r~   rû  r{   Fry   r  NrÛ   rZ  rþ   )rk   r~   )r  rÛ   rà   ro   rþ   )ri   r#   r   r|   r}   rî   rû   r   )r¤   rÖ  rê   ré   r~   rè   rÛ   Úfc_ids           r   Ú_response_tool_callr5    s¯   € ä�d˜F BÓ'Ò-¨2€GÜ˜¨Y¸/Ò-I™kÈwÐX\Ó]€IÜ�i¤Ô%Ü—J‘J˜y°uÔ=ˆ	Ü˜$  dÓ+€KÜœw t¨Y¸Ó=¸{ÈGÐU^Ð`eÐw|Ô}€GÜ.¨wÄzÐR]Ô_bÔGc¹ÐimÓn€EÜØ˜G°eÀ*Ü  g¸ÔCôð r!   c                óº  — t        | dd«      }t        |«      sy||dœ}|r||d<   |r||d<   |dk7  r|S t        | dd«      }t        |t        «      r(|j	                  d«      rt
        j                  d	|«       yt        |«      r||d<   t        | d
d«      }t        |t        «      r0d„ |D «       }|D �	cg c]  }	t        |	t        «      sŒd|	dœ‘Œ c}	|d
<   |S c c}	w )zÑ``{type, encrypted_content[, _issuer_kind, _issuer_model]}`` for replay, or None without a blob. Reasoning
    items also carry ``id`` + ``summary`` (required by the API on replay); transient ``rs_tmp_`` skip.r"  NrÀ  r$  r%  rÂ  r  Úrs_tmp_z@Skipping transient Codex reasoning item during normalization: %srÁ  c              3  ó6   K  — | ]  }t        |d d«      –— Œ y­wr  r  r  s     r   r‰   z*_capture_encrypted_item.<locals>.<genexpr>6  s   è ø€ ÒA°”˜˜v t×,ÑAùr  Úsummary_textr®   )ri   rZ   r#   r   r$   r'  r§  rd   )
r¤   rÖ  Úissuer_kindÚissuer_modelrÃ  r:  r  rÁ  Útextsr-   s
             r   Ú_capture_encrypted_itemr=    së   € ô
 ˜Ð1°4Ó8€IÜ˜Ô#ØØ(1È	ÑR€HÙØ#.ˆ�Ñ ÙØ$0ˆ�Ñ!Ø�KÒØˆÜ�d˜D $Ó'€GÜ�'œ3Ô G×$6Ñ$6°yÔ$AÜ�‰ÐWÐY`ÔaØÜ�WÔØ ˆ�‰Ü�d˜I tÓ,€GÜ�'œ4Ô ÙA¸ÔAˆØRWÖqÈ$Ô[eÐfjÔloÕ[p¨ÀÓEÒqˆ�ÑØ€Oùò rs   Â3CÃ	Cc                  ó*   — e Zd ZdZdd„Zddd„Zd	d„Zy)
Ú_OutputScanzMAccumulated view of one Responses ``output`` list (phase 1 of normalization).c                ó¤   — g g g c| _         | _        | _        g g c| _        | _        |t
        v | _        |dv | _        dx| _        x| _	        | _
        y )N>   rA   rC   F)r„  Úreasoning_partsrY  Úreasoning_items_rawÚmessage_items_rawÚ_INCOMPLETE_STATUSESÚhas_incomplete_itemsÚ saw_streaming_or_item_incompleteÚsaw_commentary_phaseÚsaw_final_answer_phaseÚsaw_reasoning_item)rA  r/  s     r   rB  z_OutputScan.__init__>  s`   € ØDFÈÈBÐAˆÔ˜DÔ0°$´/Ø;=¸rÐ8ˆÔ  $Ô"8Ø$3Ô7KÐ$KˆÔ!Ø0?ÐC\Ð0\ˆÔ-Ø\aÐaˆÔ!Ða DÔ$?À$ÕBYr!   Nc           
     ó|  — |D �]6  }t        |dd «      }t        t        |dd «      «      }|t        v r|t        vrd| _        d| _        |dk(  r| j                  ||«       Œ]|dv r‰|dk(  r/d| _        t        |«      }|r| j                  j                  |«       t        ||||«      }|€Œ¦| j                  j                  |«       |dk(  sŒÇt        j                  dt        |d	   «      «       Œê|d
k(  s|dk(  sŒõ|t        vsŒþ| j                   j                  t#        ||t        | j                   «      «      «       �Œ9 y )Nro   r  Tr  >   rÂ  r#  rÂ  r#  z?Native Responses compaction item captured (%d chars encrypted).r"  Úcustom_tool_callr[  )ri   ra   rD  Ú_SERVER_SIDE_TOOL_CALL_TYPESrE  rF  Ú_messagerI  r(  rA  r½   r=  rB  r'  Úinfor%   rY  r5  )	rA  rf  r:  r;  r¤   rÖ  Úitem_statusÚreasoning_textr:  s	            r   Úscanz_OutputScan.scanE  sC  € Øó 	cˆDÜ  f¨dÓ3ˆIÜ(¬°°xÀÓ)FÓGˆKØÔ2Ñ2°yÔHdÑ7dØ,0�Ô)Ø8<�Ô5Ø˜IÒ%Ø—‘˜d KÕ0ØÐ9Ñ9Ø Ò+Ø.2�DÔ+Ü%FÀtÓ%L�NÙ%Ø×,Ñ,×3Ñ3°NÔCô 3°4¸ÀKÐQ]Ó^�ØÑ'Ø×,Ñ,×3Ñ3°HÔ=Ø  LÓ0ÜŸ™Ø]Ô_bÐckÐlñ  dAó  `Bõð Ð0Ò0°YÀ/Ó5QÐVaÔi}ÒV}Ø—‘×&Ñ&Ô':¸4ÀÌCÐPT×P_ÑP_ÓL`Ó'aÖbñ1	cr!   c           
     ó¦  — t        t        |dd «      «      }|dv }| j                  xs || _        | j                  xs |dv | _        t	        |«      }|sy |r| j
                  n| j                  j                  |«       t        |dd «      }| j                  j                  t        d|dœgt        |«      t        |t        «      r|nd |¬«      «       y )Nr  >   ÚanalysisÚ
commentary>   ÚfinalÚfinal_answerr  r;   r®   r  )ra   ri   rG  rH  r%  rA  r„  r½   rC  r  r  r#   r   )rA  r¤   rO  Únormalized_phaseÚis_commentary_phaseÚmessage_textr  s          r   rM  z_OutputScan._message`  sÏ   € Ü)¬'°$¸ÀÓ*FÓGÐØ.Ð2LÐLÐØ$(×$=Ñ$=Ò$TÐATˆÔ!Ø&*×&AÑ&AÒ&rÐEUÐYrÐErˆÔ#Ü6°tÓ<ˆÙØñ "5ˆ×	Ò	¸$×:LÑ:L×TÑTÐUaÔbÜ˜$  dÓ+ˆØ×Ñ×%Ñ%¤mØ#¨\Ñ:Ð;ÔDgÐhsÓDtÜ)¨'´3Ô7‘G¸TÐIYô'
õ 	r!   )r/  úOptional[str]rO  rP  rU   )rf  z	List[Any]r:  rZ  r;  rZ  rO  rP  )r¤   r   rO  rZ  rO  rP  )rR  rS  rT  rU  rB  rQ  rM  rt   r!   r   r?  r?  ;  s   „ ÙWóbôcô6r!   r?  )r:  r;  c          
     ó  — t        t        | dd«      «      }t        t        t        | dd«      dd«      xs d«      j	                  «       j                  «       }|dk(  xr |dk(  }t        | dd«      }t        |t        «      r|sˆt        | d	d«      }t        |t        «      r|j	                  «       nd}|r0d
}t        j                  |t        |«      «       t        d	|¬«      g}	n|rg }	nt        d«      ‚t        ddd|	¬«      gx| _        }|dv r t        t        t        | dd«      |«      «      ‚t        |«      }
|
j!                  |||«       |
j"                  |
j$                  }}dj'                  |
j(                  «      j	                  «       }|sG|
j*                  s|
j,                  s/t        | d	d«      }t        |t        «      r|j	                  «       n|}t/        |xr | xr t1        |«      «      }|rt        j3                  d|dd «       d}|dk(  rž|sœ|sš|r˜dj'                  |«      }|j5                  d«      }|dk7  r2||t        d«      z   d j7                  dd«      d   j	                  «       nd}|r;t        j3                  dt        |«      «       |}|d| j	                  «       }|r|gng }t        |||rdj'                  |«      j	                  «       nddd|
j8                  xs d|rdn|
j:                  xs d¬«      }|
j8                  xs |xs |
j<                  xr | }|dk(  xr |dv}|rd }||fS |rd}||fS |s4|
j>                  s(|
j@                  s|
j,                  r|
j*                  r|r|sd}||fS d!}||fS )"z¹Normalize a Responses API object to ``(assistant_message, finish_reason)``.
    ``issuer_kind`` / ``issuer_model`` are stamped onto captured reasoning items for provenance replay drops.r  NÚincomplete_detailsÚreasonr*   rB   Úcontent_filterrf  r;   z`Codex response has empty output but output_text is present (%d chars); synthesizing output item.r®   z&Responses API returned no output itemsr  rs   rD   r  >   ÚfailedÚ	cancelledÚerrorr'  zÌCodex response contains leaked tool-call text in assistant content (no structured function_call items). Treating as incomplete so the continuation path can re-elicit a proper tool call. Leaked snippet: %ri,  r   z

z
<response>r/   z</response>r�   r   z…xAI response delivered its final answer inside the reasoning channel (<response> delimiter); promoting %d chars to assistant content.)r©   rY  rÂ  Úreasoning_contentÚreasoning_detailsr!  r6  )r   r   r   rY  Ústop)!ra   ri   r   rm   r   r`   r#   rd   r'  r§  r%   r   ÚRuntimeErrorrf  r2  r?  rQ  rY  rA  r“   r„  rH  rG  r5   r9   r(  Úrfindrã   rB  rC  rI  rF  rE  )Úresponser:  r;  r/  Úincomplete_reasonÚ"response_incomplete_content_filterrf  Úout_textr  r©   rQ  rY  rA  Ú
final_textÚleaked_tool_call_textÚjoined_reasoningÚmarkerÚsalvagedÚreasoning_prefixÚassistant_messageÚreasoning_onlyÚtrusted_finalÚfinish_reasons                          r   Ú_normalize_codex_responseru  r  s³  € ô
 %¤W¨X°xÀÓ%FÓG€OÜœF¤7¨8Ð5IÈ4Ó#PÐRZÐ\^Ó_ÒeÐceÓf×lÑlÓn×tÑtÓvÐØ)8¸LÑ)HÒ)rÐM^ÐbrÑMrÐ&Ü�X˜x¨Ó.€FÜ�fœdÔ#©6ä˜8 ]°DÓ9ˆÜ'1°(¼CÔ'@�8—>‘>Ô#ÀbˆÙØtˆCÜ�L‰L˜œc (›mÔ,Ü"1°}È8Ô"TÐ!U‰GÙ/à‰GäÐGÓHÐHä °À[ÐZaÔbð$
ð 	
ˆŒ˜&ð Ð1Ñ1ÜÔ2´7¸8ÀWÈdÓ3SÐUdÓeÓfÐfÜ�Ó'€DØ‡I�Iˆf�k <Ô0Ø"&§/¡/°4×3GÑ3G�€JØ—‘˜4×-Ñ-Ó.×4Ñ4Ó6€JÙ˜4×6Ò6¸d×>WÒ>WÜ˜8 ]°BÓ7ˆÜ)3°H¼cÔ)B�X—^‘^Ô%È
ˆ
ô ! Ò!e°J°Ò!eÔCYÐZdÓCeÓfÐÙÜ�‰ð!à",¨T¨cÐ"2ô	
ð
 ˆ
ð �oÒ%©jÁÑP_Ø!Ÿ;™; Ó7ÐØ!×'Ñ'¨Ó5ˆØgmÐqsÒgsÐ# F¬S°Ó->Ñ$>Ð$?Ð@×FÑFÀ}ÐVWÓXÐYZÑ[×aÑaÔcÐy{ˆÙÜ�N‰NðSÜTWÐX`ÓTaôð "ˆJØ/°°Ð8×>Ñ>Ó@ÐÙ4DÐ/Ñ0È"ˆOÜ'Ø zÙ:I�&—+‘+˜oÓ.×4Ñ4Ô6ÈtØ°$Ø"×6Ñ6Ò>¸$á$9™DÀ×@VÑ@VÒ@^ÐZ^ôÐð ×.Ñ.Ò\°/Ò\ÀT×E\ÑE\ÒpÐfpÐbp€Nà˜;Ñ&Òt¨;Ð>tÐ+tð ñ Ø$ˆð ˜mÐ+Ð+ñ 
,Ø(ˆð ˜mÐ+Ð+ñ 	Ø×0Ò0Ø×&Ò&¨$×*CÒ*CÈT×MhÒMhÙ¡=à$ˆð ˜mÐ+Ð+ð ˆØ˜mÐ+Ð+r!   )
r   r5   r   r5   r   r5   r   rZ  rO  r   )r   r   rO  r   )r'   r   rO  rZ  )r-   r   rO  r5   )rW   r   rO  zTypeGuard[str])rW   r   rO  r   )rW   r   rO  rZ  )rW   r   rO  rd   rU   )rj   r   rk   r   rl   r   rO  r   )rp   r  rO  r   )rv   r   rO  r   )r~   r   rO  r   )r-   r   rO  r   r€  )r©   rd   rO  zIterator[tuple[str, Any]])r¬   )rp   r  rv   r   rµ   r5   rO  úOptional[Dict[str, Any]])r©   r   rv   r   rO  r~  )r©   r   rÃ   r   rO  r   rQ  )rà   r   rO  rZ  )rä   r   rO  z#tuple[Optional[str], Optional[str]])rç   r   rè   r   ré   r   r~   r   rê   ré  rë   r5   rO  r   )rÛ   r   rà   rZ  rO  r   )rü   úOptional[List[Dict[str, Any]]]rO  rw  )rW   r   rl   r   rO  r   )
r©   r~  r  r   r  rZ  r  rZ  rO  r  )
r  r  r©   r~  r   r5   r  rZ  rO  r  )r  r  r*  r�  r  rZ  r  rZ  r+  r5   rO  r~  )r  r  r   r5   r  rZ  rO  r~  )r  r  r_  ré  rW  úOptional[_WireCallIds]rO  r~  )r  r  rW  rx  rO  r~  )rƒ  r~  r   r5   r   r5   ro  r5   r  rZ  r  rZ  r+  r5   rO  r~  )rœ  r   rO  rŒ  )rœ  r   rƒ  r~  rO  rw  )rœ  r   rƒ  r~  rO  r5   )
rœ  r   rƒ  r~  r¯  r   rü   rw  rO  zOptional[int])r¤   r  r¹  ré  rº  r³  rO  r  )r¤   r  r¹  ré  rº  r³  rO  rv  )rÔ  r   r   r5   rµ  r5   rO  r~  )rv  r   r¹  ré  rO  r  )r  r  rŸ   r   rO  rv  )
r  r   r  r5   r   r5   rµ  r5   rO  r  )rË   r   r  zOptional[set]rO  z	List[str])r¤   r   rO  r   )r+  r   r/  r   rO  r   )r¤   r   rÖ  r   rê   ré  rO  r   )
r¤   r   rÖ  r   r:  rZ  r;  rZ  rO  rv  )rg  r   r:  rZ  r;  rZ  rO  ztuple[Any, str])trU  Ú
__future__r   r×   r|   Úloggingrò   r…   ró   r  r   Útypingr   r   r   r   r	   r
   r   r   Úagent.message_sanitizationr   r   Úagent.prompt_builderr   Úhermes_cli.route_identityr   Ú	getLoggerrR  r'  r    r&   r&  r,   ÚcompileÚ
IGNORECASEr0   r2   Ú_ACTION_VERBSr6   r9   r�   r‘   r§   r¨   r¼   r8  r³   rD  r  rÖ   rÛ  rL  rX   rZ   r^   ra   re   rm   rq   rw   r   r›   r¡   r«   r¹   rÁ   rÏ   rÜ   rá   rå   rî   rû   r  r  r  r  r2  r;  r=  ra  rm  rŠ  rŒ  r�  rª  r­  r²  r   r5   r�  r³  r»  r¾  rÄ  rË  rÎ  rÏ  r�  rÙ  rß  r   ré  rê  rù  r  r  r  r!  r%  r(  r2  r5  r=  r?  ru  rt   r!   r   ú<module>rƒ     s�  ðò[õ #ã Û Û Û 	Û Û Ý !ß W× WÓ Wç NÝ 7Ý >à	ˆ×	Ñ	˜8Ó	$€ð !&À5ÐchØ"ñFØðFØ<@ðFØ\`ðFàðFð 	óFó"ð #Ð óPð %˜"Ÿ*™*Ð%QÐSU×S`ÑS`ÓaÐ ð
 &˜2Ÿ:™:ðjóÐ ð e€Ø", "§*¡*ðRØR_ÐQ`Ð`cðeà‡M�Mó#Ð ó_ð '˜BŸJ™JÐ'aÓbÐ Ø€â8Ð Ø  -Ð0Ð Ú9Ð Ø# VÐ,Ð ØHÐ ò ?Ð ÚGÐ ð !#Ð ò!Ð ò Ð ó:ó2ó/óEó4ôSó
7óBó%ó+ó$ó&
$ôð> CIõ ð( ADõ Oó"`óóGðØðØ#&ðØ14ðØADðØMPðØfjðàóôGô"ð  GRõ Gð MQÐimñØ!ðØ.1ðØ<IðØYfðàóð *.ñØ	ðØ"6ðØPTðà&ðð óð( +/ñ&Ø	ð&Ø+.ð&ØERð&à'ð&àLPð&ð ó&ðT ]añØ	ðØ15ðØLYðàó÷B/ñ /ð< RVñØ	ðØ),ðØ8Nðàóð, SWõ _ð* AFÐchØ'+ÐRVØ*.ÐSXñvHØ"ðvHØ9=ðvHØ\`ðvHà $ðvHàBOðvHð (ðvHð MQðvHð ó	vHôr
˜*ô 
óð"ØðØ.ðà#óð<,Øð,Ø.ð,à	ó,ð IKÐtxñ`Øð`Ø.ð`ØBEð`ØSqð`àó`ñ& ˜?Ø�h ˜u c˜zÑ*Ð+Ð.GÈÐ-NÐQfÐhlÐPmÐpzÐ|ð  pAð-ó €ó
	ó`ó(ó(jó*0ðD .ÐGfØ%Ð5IÐVhñPÐ ÐLó ð 49ÐZ_ñØðØ,0ðØSWðàóó&ð* Ñ/°Ð6ØÑ-¨tÐ4Ø�Y §	¡	Ð*àÑ6¸Ð=ØÑIÈ3ÐOØÑjÐlqÐrØÑ9¸5ÐAðmñàgôðmð ÑDÀdÐKñmÐ Ðió ð& ˆ^˜W g¨w¸Èðá6Ð5Ô6ðÐ óð .3ÐPUØ$)ñ>Øð>Ø&*ð>ØIMð>à!ð>ð ó>ôFhó
#ódó	~óð  Z^ðØ
ðØðØ,9ðØIVðàó÷84ñ 4ðp 48ÐW[ñV,ØðV,Ø#0ðV,ØGTðV,àôV,r!   