Ë
    áß²j™$ ã                  óú  — 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 ddl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 dd
lmZ ddlmZ  ej:                  e«      Z ej@                  dd¬«      Z!de"d<   dZ#dLd„Z$dddœdMd„Z%dNd„Z&dOd„Z'dPd„Z(dQd„Z)dRdSd„Z*dddœdTd„Z+ e,h d£«      Z-ddd d!œZ.d"dd#œZ/d$d%hZ0d&d'd(œZ1dUd)„Z2dVd*„Z3dWd+„Z4dXd,„Z5dYd-„Z6dZd.„Z7d[d/„Z8d\d0„Z9d]d^d1„Z:d_d2„Z;d3Z<d4Z=d`d5„Z>dad6„Z?d_d7„Z@dRdbd8„ZAdcd9„ZB	 	 	 	 ddd:„ZCdd;œ	 	 	 	 	 ded<„ZD	 	 	 	 	 	 	 	 dfd=„ZEdRdgd>„ZF e,h d?£«      ZGdhd@„ZHdidA„ZIdjdB„ZJdkdC„ZK G dD„ dE«      ZLdddddddFœ	 	 	 	 	 dldG„ZMdmdH„ZNdndodI„ZOg dJ¢ZPdRdodK„ZQy)pu  Codex API runtime â€” App Server and Responses-API streaming paths. Every entry point takes the parent
AIAgent first: ``run_codex_app_server_turn`` drives one ``codex app-server`` subprocess turn;
``run_codex_stream`` runs one streaming Codex Responses call.é    )ÚannotationsN)Úsuppress)ÚSimpleNamespace)ÚAnyÚCallableÚDictÚList)Úclaim_stream_writerÚstream_writer_is_current)ÚHERMES_TOOLS_MCP_SERVER_NAME)Úbypass_sdk_request_transform)Úbuffer_connect_exhausted_notice)Úset_usage_anchorÚcodex_watchdog_state©Údefaultz"contextvars.ContextVar[Any | None]Ú_codex_watchdog_state_varg       @c                 ó,  — 	 ddl m}   | «       j                  d«      }t        |t        «      r|j                  d«      nd}t        |t
        t        f«      r%t        |t        «      st        dt        |«      «      S t        S # t        $ r Y t        S w xY w)u¹  ``agent.stream_drain_timeout`` (seconds) â€” how long the post-terminal SSE drain may block.

    The drain is a courtesy to Relay's finalizer, never a correctness requirement: ``final`` is fully
    assembled before it starts. A relay that never closes the socket after ``response.completed`` would
    otherwise wedge the turn until the idle watchdog discards the already-billed response (#103864).
    ``0`` skips the drain entirely.
    r   )Úload_config_readonlyÚagentÚstream_drain_timeoutNg        )Úhermes_cli.configr   ÚgetÚ
isinstanceÚdictÚintÚfloatÚboolÚmaxÚ	ExceptionÚ_DEFAULT_STREAM_DRAIN_TIMEOUT)r   Ú	agent_cfgÚvalues      ú8/home/ubuntu/.hermes/hermes-agent/agent/codex_runtime.pyÚ_stream_drain_timeoutr%      s‚   € ðÝ:Ù(Ó*×.Ñ.¨wÓ7ˆ	Ü9CÀIÌtÔ9T�	—‘Ð4Ô5ÐZ^ˆÜ�eœc¤5˜\Ô*´:¸eÄTÔ3JÜ�sœE %›LÓ)Ð)ô )Ð(øô ò ØÜ(Ð(ðús   ‚A9B Â	BÂB© ©ÚargsÚkwargsc               ót   — | €y	  | |i |xs i ¤Ž y# t         $ r t        j                  |g|¢­ddiŽ Y yw xY w)zVInvoke an optional display/debug callback; a buggy hook must never tear down the turn.NÚexc_infoT)r    ÚloggerÚdebug)ÚfnÚfail_msgr(   r)   Ú	fail_argss        r$   Ú_call_guardedr1   2   sE   € à	€zØð:Ù
ˆDÐ#�V’\˜rÓ#øÜò :Ü�‰�XÐ9 	Ò9°DÔ9ð:ús   … ’"7¶7c                óÒ  — d}g }| }t        «       }|��6t        |«      |v�r(t        |«      dk  �r|j                  t        |«      «       |j	                  t        |«      j                  «       |€ƒd}t        t        «      5  t        t        |dd«      dd«      }ddd«       t        |t        «      rt        |j                  d«      «      }n&t        |t        t        t        f«      rt        |«      }|j                   du xr |j"                   }|r|j$                  n|j                   }|�t        |«      |vrt        |«      dk  r�Œ|dj'                  |«      fS # 1 sw Y   ŒÃxY w)z¶(serialized request bytes, exception class chain); the buffered ``httpx.Request`` content
    on OpenAI connection errors gives the exact byte count without logging payloads or URLs.Né   ÚrequestÚcontentúutf-8z <- )ÚsetÚidÚlenÚaddÚappendÚtypeÚ__name__r   r    Úgetattrr   ÚstrÚencodeÚbytesÚ	bytearrayÚ
memoryviewÚ	__cause__Ú__suppress_context__Ú__context__Újoin)ÚerrorÚrequest_body_bytesÚexception_classesÚcurrentÚseenr5   Úimplicit_chains          r$   Ú_codex_request_failure_detailsrN   <   sC  € ð &*ÐØ#%ÐØ$)€GÜ“U€DØ
Ñ
¤" W£+°TÒ"9¼cÀ$»iÈ!»mØ�‰”�G“ÔØ× Ñ ¤ g£×!7Ñ!7Ô8ØÐ%ØˆGÜœ)Ó$ñ VÜ!¤'¨'°9¸dÓ"CÀYÐPTÓU�÷Vä˜'¤3Ô'Ü%(¨¯©¸Ó)@Ó%AÑ"Ü˜G¤e¬Y¼
Ð%CÔDÜ%(¨£\Ð"Ø ×*Ñ*¨dÐ2ÒW¸7×;WÑ;WÐ7WˆÙ)7�'×%Ò%¸W×=NÑ=Nˆð Ð
¤" W£+°TÑ"9¼cÀ$»iÈ!¼mð ˜vŸ{™{Ð+<Ó=Ð=Ð=÷Vð Vús   ÂEÅE&c                óZ  — ddl m} ddlm} | j	                  d«      }t        |t        «      s| S t        t        j                  |t        ¬«      j                  d«      «      }||j                  k  r| S g d}}|D ]Ÿ  }	t        |	t        «      r%|	j	                  d«      dk(  r|	j	                  d	«      nd
}
t        |
t        «      rE ||
dt        |	j	                  d«      xs d«      ||j                  ¬«      }||
k7  ri |	¥d	|i¥|dz   }}	|j                  |	«       Œ¡ |s*t         j#                  d|||| j	                  d«      «       | S t        t        j                  |t        ¬«      j                  d«      «      }t         j#                  d|||||| j	                  d«      «       i | ¥d|i¥S )a)  #95429 criterion 3: a reconnect after an attempt that produced no stream event must not resend
    a pathological payload unchanged. Inline ``function_call_output`` strings over the per-result
    threshold (results that escaped commit-time persistence) are spilled through the standard
    policy -- bounded preview + recoverable ``<persisted-output>`` reference -- and ONE log line
    records the size delta. When nothing is prunable the resend is logged as unchanged. The
    caller's kwargs are never mutated; only the retried wire payload changes.r   )ÚDEFAULT_BUDGET)Úmaybe_persist_tool_resultÚinputr   r6   r<   Úfunction_call_outputÚoutputNÚcodex_zero_event_retryÚcall_idÚcall)r5   Ú	tool_nameÚtool_use_idÚconfigÚ	thresholdé   z‚Codex zero-event retry (attempt %s/%s): no prunable tool output; resending payload unchanged (serialized_input_bytes=%s, model=%s)ÚmodelzˆCodex zero-event retry (attempt %s/%s): spilled %d oversized tool output(s) before reconnect, serialized_input_bytes=%s -> %s (model=%s))Útools.budget_configrP   Útools.tool_result_storagerQ   r   r   Úlistr9   ÚjsonÚdumpsr?   r@   Úturn_budgetr   Údefault_result_sizer;   r,   Úwarning)Ú
api_kwargsÚattemptÚattemptsrP   rQ   ÚitemsÚbeforeÚpruned_itemsÚprunedÚitemrT   ÚreplacedÚafters                r$   Ú_prune_zero_event_retry_payloadrp   S   s£  € õ 3ÝCà�N‰N˜7Ó#€EÜ�eœTÔ"ØÐÜ”—‘˜E¬3Ô/×6Ñ6°wÓ?Ó@€FØ�×+Ñ+Ò+ØÐØ˜q�&€LØò "ˆÜ'1°$¼Ô'=À$Ç(Á(È6ÓBRÐVlÒBl�—‘˜(Ô#ÐrvˆÜ�fœcÔ"Ù0¸ÐKcÜ=@ÀÇÁÈ)ÓATÒA^ÐX^Ó=_Ø8FÐR`×RtÑRtôvˆHð ˜6Ò!Ø; $Ð;¨°(Ñ;¸VÀa¹Z�f�Ø×Ñ˜DÕ!ð"ñ Ü�‰ð IØJQÐS[Ð]cÐeo×esÑesÐt{Óe|ô	~àÐÜ”—
‘
˜<´Ô5×<Ñ<¸WÓEÓF€EÜ
‡N�Nð @ØAHÈ(ÐTZÐ\bÐdiØ—>‘> 'Ó*ô,ð 1ˆjÐ0˜' <Ñ0Ð0ó    c                ó<  — t        | t        «      ryt        | t        «      rt        | d«      S t        | t        «      rt        t        | «      d«      S t        | t
        «      r.t        t        «      5  t        t        | «      d«      cd d d «       S y# 1 sw Y   yxY w©Nr   )r   r   r   r   r   r?   r   Ú
ValueError)r#   s    r$   Ú_coerce_usage_intru   x   s{   € Ü�%œÔØÜ�%œÔÜ�5˜!‹}ÐÜ�%œÔÜ”3�u“:˜qÓ!Ð!Ü�%œÔä”jÓ!ñ 	&Ü”s˜5“z 1Ó%÷	&ñ 	&à÷	&àús   Á2BÂBc               óV  — | j                   r| j                  sy	 | j                  s| j                  «        ddlm}  | j                   j                  | j                  fd || «      i |«       ¤Ž y# t        $ r-}t        j                  || j                  g|¢|‘­Ž  Y d}~yd}~ww xY w)z­Enqueue per-call accounting for the SessionDB background writer. ``counts`` is built
    lazily inside the guarded try so a stub agent without a session DB is never touched.Nr   )Ú_agent_session_sourceÚsource)
Ú_session_dbÚ
session_idÚ_session_db_createdÚ_ensure_db_sessionÚagent.turn_usagerw   Úqueue_token_countsr    r,   r-   )r   r/   ÚcountsÚ
fail_extrarw   Úexcs         r$   Ú_queue_token_countsr‚   †   sš   € ð ×Ò %×"2Ò"2ØðCØ×(Ò(Ø×$Ñ$Ô&Ý:Ø,ˆ×Ñ×,Ñ,¨U×-=Ñ-=ÑoÑF[Ð\aÓFbÐoÑflÓfnÓoøÜò CÜ�‰�X˜u×/Ñ/ÐB°*ÐB¸c×BÐBûðCús   ›AA2 Á2	B(Á;#B#Â#B(c                ób  ‡ ‡‡‡‡— ‰ xj                   dz  c_         t        |dd«      }t        ‰ dd«      }ˆ fd„Št        |t        «      r|s[|�t        |dd«      r|j	                  i «       |�&t        t        |dd«      «      r|j                  «        t        ‰ d	ˆfd
„¬«       i S ddlm	}m
} t        |j                  d«      «      } |t        dt        |j                  d«      «      |z
  «      t        |j                  d«      «      |dt        |j                  d«      «      |¬«      }|j                  }	t        |j                  d«      «      xs |j                  }
dD �ci c]  }|t        ||«      “Œ c}Š|	|j                   |
dœ‰¥}|�;	 |j	                  |«       t        |dd«      }t        |t"        «      r|dkD  r||_        t        |t,        «      r'ddlm}m}  ||	|j                   |«      }|�	 |‰ |«       |j5                  «       D ]%  \  }}t7        ‰ d|› �t        ‰ d|› �«      |z   «       Œ'  |‰ j8                  |‰ j:                  ‰ j<                  t        ‰ dd«      ¬«      Š‰j>                  �tA        ‰j>                  «      nd}|�‰ xjB                  |z  c_!        ‰jD                  ‰jF                  c‰ _$        ‰ _%        |‰jD                  ‰jF                  dœŠt        ‰ d |
ˆˆˆˆfd!„¬«       i |¥d"|	i¥‰¥S c c}w # t&        $ r t(        j+                  dd¬«       Y �Œcw xY w)#a  Translate Codex app-server token usage into Hermes accounting. Prompt bucket = uncached + cached
    input (the protocol exposes no cache-write tokens); a turn with no usage still counts as one API call.
    ``messages`` (the transcript mirror) lets real usage anchor the next preflight: this runtime bypasses
    the main loop's capture, and the mirror is never compacted natively, so without an anchor the rough
    estimate grows monotonically and hermes-mode fires thread compaction on tiny threads (#100381).r\   Útoken_usage_lastNÚcontext_compressorc                 ó`   •— t        d‰j                  ‰j                  ‰j                  ddœ| ¤ŽS )Nr\   )r]   Úbilling_providerÚbilling_base_urlÚapi_call_countr&   )r   r]   ÚproviderÚbase_url)Úextrar   s    €r$   Úbillingz/_record_codex_app_server_usage.<locals>.billingž   s=   ø€ Üð  D˜%Ÿ+™+¸¿¹ÐY^×YgÑYgÐxyñ  Dð  ~Cñ  Dð  	Drq   Ú%awaiting_real_usage_after_compressionFÚnote_usage_less_responsez=Codex app-server api-call persistence failed (session=%s): %sc                 ó   •—  ‰ d¬«      S )NÚsubscription_included)Úbilling_moder&   )r�   s   €r$   ú<lambda>z0_record_codex_app_server_usage.<locals>.<lambda>§   s   ø€ ©7Ð@WÔ+X€ rq   )r   r   )ÚCanonicalUsageÚestimate_usage_costÚcachedInputTokensÚinputTokensÚoutputTokensÚreasoningOutputTokens)Úinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokensÚreasoning_tokensÚ	raw_usageÚtotalTokens)rš   r›   rœ   r�   rž   )Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚmodel_context_windowz$codex app-server usage update failedT©r+   )Úcapture_usage_anchorr   Úsession_Úapi_keyÚ )rŠ   r‹   r¨   )Úestimated_cost_usdÚcost_statusÚcost_sourcezECodex app-server token persistence failed (session=%s, tokens=%d): %sc                 óH   •—  ‰ di ‰¤‰¤d‰j                   dk(  rdi¤ŽS d i¤ŽS )Nr’   Úincludedr‘   r&   )Ústatus)r�   Úcost_fieldsÚcost_resultÚtoken_countss   €€€€r$   r“   z0_record_codex_app_server_usage.<locals>.<lambda>Ô   s@   ø€ ‘wñ s ð s°ñ sØGR×GYÑGYÐ]gÒGgÐ,Còs€ Ømqòs€ rq   Úlast_prompt_tokens)&Úsession_api_callsr>   r   r   Úupdate_from_responseÚcallabler�   r‚   Úagent.usage_pricingr”   r•   ru   r   r   r¡   r£   r›   r   Úcontext_lengthr    r,   r-   r`   Úagent.usage_anchorr¦   r   ri   Úsetattrr]   rŠ   r‹   Ú
amount_usdr   Úsession_estimated_cost_usdr¯   rx   Úsession_cost_statusÚsession_cost_source)r   ÚturnÚmessagesÚusageÚ
compressorr”   r•   rœ   Úcanonical_usager¡   r£   ÚfÚ
usage_dictÚcontext_windowr¦   r   ÚanchorÚkeyr#   Úcost_usdr�   r°   r±   r²   s   `                   @@@@r$   Ú_record_codex_app_server_usagerÊ   ”   s.  ü€ ð 
×Ò˜qÑ ÕÜ�DÐ,¨dÓ3€EÜ˜Ð 4°dÓ;€JôDä�eœTÔ"©%ØÐ!¤g¨jÐ:aÐchÔ&ià×+Ñ+¨BÔ/ØÐ!¤h¬w°zÐC]Ð_cÓ/dÔ&eØ×/Ñ/Ô1Ü˜EÐ#bÛ#Xõ	Zàˆ	ßGô *¨%¯)©)Ð4GÓ*HÓIÐÙ$Ü˜Ô-¨e¯i©i¸Ó.FÓGÐJ[Ñ[Ó\Ü'¨¯	©	°.Ó(AÓBØ+ÀÜ*¨5¯9©9Ð5LÓ+MÓNÐZ_ô	€Oð $×1Ñ1€MÜ$ U§Y¡Y¨}Ó%=Ó>Ò^À/×B^ÑB^€Làtöv°q�A”w˜°Ó2Ñ2ò v€Là#0À×GdÑGdØ".ñ@Ø2>ð@€JàÐð	PØ×+Ñ+¨JÔ7Ü$ TÐ+AÀ4ÓHˆNÜ˜.¬#Ô.°>ÀAÒ3EØ,:�
Ô)ô �(œDÔ!ßMá% m°_×5RÑ5RÐT\Ó]ˆØÐÙ˜U FÔ+Ø ×&Ñ&Ó(ò S‰
ˆˆUÜ�˜ # Ð'¬°¸(À3À%Ð8HÓ)IÈEÑ)QÕRðSá%Ø�‰�_¨u¯~©~ÈÏÉÔ`gÐhmÐoxÐz|Ó`}ô€Kð 1<×0FÑ0FÐ0RŒu�[×+Ñ+Ô,ÐX\€HØÐØ×(Ò(¨HÑ4Õ(Ø;F×;MÑ;MÈ{×OaÑOaÐ8€EÔ˜uÔ8Ø)1À+×BTÑBTÐep×ewÑewÑx€KÜØÐVÐXdösõð
 NˆjÐMÐ.°ÑMÀÐMÐMùòCvøô ò 	PÜ�L‰LÐ?È$ˆL×Oð	Pús   Å$LÆ:L
 Ì
 L.Ì-L.F)Úapprox_tokensÚforcec               ó&  — |st        |dd«      syt        |dd«      xs dt        |dd«      xs d}}t        j                  dt        | dd«      xs d	|||«       |s/t        t        «      5  d
dlm} | j                  |«       ddd«       t        | dd«      }|�‚t        |dd
«      dz   |_        |xs d
|_	        t        t        |«      dd«      }t        |«      r ||d¬«       nt        |d«      rd|_        t        |dd«      sd\  |_        |_        d|_        t#        | d«       d| _        t'        t        | dd«      xs dddt        | dd«      xs dt        | dd«      xs ddd|�t        |dd
«      nd
d||dœf¬«       y# 1 sw Y   �ŒxY w)uª   Record a Codex-native compaction boundary: the app-server owns the compacted thread,
    so local transcript rows are NOT rewritten â€” only session event/usage counters.Ú	compactedFÚ	thread_idNr©   Úturn_idzKcodex app-server compaction observed: session=%s thread=%s turn=%s force=%srz   Únoner   )ÚCOMPACTION_STATUSr…   Úcompression_countr\   Úrecord_completed_compaction)Úused_fallbackÚ$_verify_compaction_cleared_thresholdTr„   )éÿÿÿÿr   Úevent_callbackz.event_callback error on codex session:compresszsession:compressÚplatformÚcodex_app_server)rÙ   rz   Úold_session_idÚin_placerÓ   ÚruntimerÏ   rÐ   ©r(   )r>   r,   Úinfor   r    Úagent.conversation_compressionrÒ   Ú_emit_statusrÓ   Úlast_compression_rough_tokensr<   r¶   ÚhasattrrÖ   r³   Úlast_completion_tokensrŽ   r   Ú_last_compaction_in_placer1   )	r   r¿   rË   rÌ   rÏ   rÐ   rÒ   rÂ   Úrecord_boundarys	            r$   Ú#_record_codex_app_server_compactionrç   Ú   sÃ  € ñ œ  {°EÔ:ØÜ   {°DÓ9Ò?¸RÄÈÈyÐZ^ÓA_ÒAeÐceˆw€IÜ
‡K�KÐ]Ü˜˜|¨TÓ2Ò<°f¸iÈÐRWôYáÜ”iÓ ñ 	2ÝHØ×ÑÐ0Ô1÷	2ô ˜Ð 4°dÓ;€JØÐÜ'.¨zÐ;NÐPQÓ'RÐUVÑ'Vˆ
Ô$Ø3@Ò3EÀAˆ
Ô0ä!¤$ zÓ"2Ð4QÐSWÓXˆÜ�OÔ$Ù˜J°eÖ<Ü�ZÐ!GÔHØ>BˆJÔ;Ü�tÐ/°Ô6ØOTÑLˆJÔ)¨:Ô+LØ?CˆJÔ<ä�U˜DÔ!Ø&+€EÔ#Ü”'˜%Ð!1°4Ó8Ò@¸DÐBrØ*Ü")¨%°¸TÓ"BÒ"HÀbÔX_Ð`eÐgsÐuyÓXzò  YAð  AØ(*¸ØZdÐZp¬7°:Ð?RÐTUÔ+VÐvwØ!3À)ÐX_ñ	-ð õð ÷5	2ñ 	2ús   Á,FÆF>   Ú	webSearchÚ
fileChangeÚmcpToolCallÚdynamicToolCallÚcommandExecutionÚexec_commandÚapply_patchÚ
web_search)rì   ré   rè   Úexec)rì   ré   rê   rë   ÚcommandÚquery)rì   rè   c                ót   — | j                  d«      xs g D �cg c]  }t        |t        «      sŒ|‘Œ c}S c c}w )NÚchanges)r   r   r   )rm   Úcs     r$   Ú_item_changesrö     s-   € ØŸ™ Ó+Ò1¨rÖJ�!´jÀÄDÕ6IŠAÒJÐJùÒJs   ˜5®5c                ó  — | j                  d«      xs d}|dk(  r=| j                  d«      xs d| j                  d«      xs d}}|t        k(  r|S d|› d	|› �S |d
k(  r| j                  d«      xs dS t        j                  |«      xs |xs dS )zJSynthetic Hermes tool name for a codex item (mirrors CodexEventProjector).r<   r©   rê   ÚserverÚmcpÚtoolÚunknownzmcp.ú.rë   Údynamic)r   r   Ú_STATIC_TOOL_NAMES)rm   Ú	item_typerø   rú   s       r$   Ú_codex_item_to_tool_namer     s�   € à—‘˜Ó Ò& B€IØ�MÒ!Ø—x‘x Ó)Ò2¨U°D·H±H¸VÓ4DÒ4QÈ	�ˆØÔ!=Ò=ˆtÐYÀTÈ&ÈÐQRÐSWÐRXÐCYÐYØÐ%Ò%Ø�x‰x˜ÓÒ, 9Ð,Ü×!Ñ! )Ó,ÒF°	ÒF¸YÐFrq   c                óð  — | j                  d«      xs d}|dk(  r+| j                  d«      xs d| j                  d«      xs ddœS |dk(  rWdt        | «      D �cg c]@  }|j                  d	«      xs i j                  d«      xs d
|j                  d«      xs ddœ‘ŒB c}iS |t        v r+| j                  d«      xs i }t        |t        «      r|S d|iS |dk(  rd| j                  d«      xs diS i S c c}w )zSArgs dict for tool_progress_callback("tool.started"); mirrors the projector shapes.r<   r©   rì   rñ   Úcwd)rñ   r  ré   rô   ÚkindÚupdateÚpath)r  r  Ú	argumentsrè   rò   )r   rö   Ú_MCP_LIKE_ITEM_TYPESr   r   )rm   rÿ   rõ   r(   s       r$   Ú_codex_item_to_argsr    s	  € à—‘˜Ó Ò& B€IØÐ&Ò&ØŸ8™8 IÓ.Ò4°"¸T¿X¹XÀe»_Ò=RÐPRÑSÐSØ�LÒ ØÜ%2°4Ó%8ö:Ø !ð '(§e¡e¨F£mÒ&9°r×%>Ñ%>¸vÓ%FÒ%RÈ(Ð\]×\aÑ\aÐbhÓ\iÒ\oÐmoÓpò :ð ;ð 	;àÔ(Ñ(Ø�x‰x˜Ó$Ò*¨ˆÜ! $¬Ô-ˆtÐF°KÀÐ3FÐFØ1:¸kÒ1IˆG�T—X‘X˜gÓ&Ò,¨"Ð-ÐQÈrÐQùò:s   ÁAC3c                ój  — | j                  d«      xs d}|t        v r#| j                  t        |   «      xs ddd xs dS |dk(  rvt        | «      D �cg c]%  }|j                  d«      sŒ|j                  d«      ‘Œ' }}|r9dj                  |dd «      t	        |«      dkD  rd	t	        |«      dz
  › d
�z   S dz   S dS |t
        v r_| j                  d«      xs i }t        |t        «      r:|r8t        t        t        «      5  t        j                  |d¬«      dd cddd«       S yc c}w # 1 sw Y   yxY w)zXShort preview for the tool.started bubble; None when nothing useful (UI tolerates None).r<   r©   Néx   ré   r  ú, é   z, +z morer  F©Úensure_ascii)r   Ú_PREVIEW_FIELDSrö   rG   r9   r  r   r   r   Ú	TypeErrorrt   ra   rb   )rm   rÿ   rõ   Úpathsr(   s        r$   Ú_codex_item_to_previewr  -  s(  € à—‘˜Ó Ò& B€IØ”OÑ#Ø—‘œ¨Ñ3Ó4Ò:¸¸D¸SÐAÒIÀTÐIØ�LÒ Ü(5°dÓ(;ÖM 1¸q¿u¹uÀV½}�—‘�v•ÐMˆÐMÙch�—	‘	˜%  ˜)Ó$ÄsÈ5ÃzÐTUÂ~¨#¬c°%«j¸1©nÐ-=¸UÐ(CÑ^ÐrÐ[]Ñ^ÐrÐnrÐrØÔ(Ñ(Ø�x‰x˜Ó$Ò*¨ˆÜ�dœDÔ!¡dÜœ)¤ZÓ0ñ BÜ—z‘z $°UÔ;¸D¸SÐA÷Bñ Bàùò N÷
Bàús   ÁD$Á*D$Ã?D)Ä)D2c                ó  — | j                  d«      xs d}|dk(  rJ| j                  d«      xs d| j                  d«      }}t        |duxr |dk7  «      }|r
d|› d	|› �|fS ||fS |d
k(  r@| j                  d«      xs d}t        | j                  d«      xs g «      }d|› d|› d�|dvfS |dk(  re| j                  d«      x}rdt        j                  |d¬«      dd › �dfS | j                  d«      }|�t        j                  |d¬«      dd dfS ddfS |dk(  rh| j                  d«      xs g | j                  dd«      }
}	t        |	t        «      xr |	}|rt        j                  |	d¬«      dd nd|
› �t        |
«       fS y) u¹   (result_text, is_error) for a completed tool item â€” display-facing text for live tool cards (the
    persisted history keeps the projector's ``{exit_code, output}`` envelope instead).r<   r©   rì   ÚaggregatedOutputÚexitCodeNr   z[exit z]
ré   r¯   rû   rô   zapply_patch status=r  z
 change(s)>   ÚappliedÚsuccessÚ	completedrê   rH   z[error] Fr  iè  TÚresulti   rë   ÚcontentItemsr  zsuccess=)r©   F)r   r   r9   ra   rb   r   r`   )rm   rÿ   ÚoutÚ	exit_codeÚis_errorr¯   ÚnrH   r  Úcontent_itemsr  Ú	has_itemss               r$   Ú_codex_item_completion_payloadr!  =  sÃ  € ð —‘˜Ó Ò& B€IØÐ&Ò&ØŸ™Ð"4Ó5Ò;¸¸T¿X¹XÀjÓ=QˆYˆÜ˜	¨Ð-Ò@°)¸q±.ÓAˆÙ08�&˜˜ 3 s eÐ,ÀHÐLÐL¸cÀHÐLÐLØ�LÒ Ø—‘˜(Ó#Ò0 yˆÜ�—‘˜Ó#Ò) rÓ*ˆØ$ V H¨B¨q¨c°Ð<¸fÐLoÐ>oÐoÐoØ�MÒ!Ø—H‘H˜WÓ%Ð%ˆ5Ð%ØœdŸj™j¨¸UÔCÀEÀTÐJÐKÐLÈdÐRÐRØ—‘˜(Ó#ˆØAGÐAS”—
‘
˜6°Ô6°u¸Ð=Ð^cÐcÐcÐY[Ð^cÐcÐcØÐ%Ò%Ø!%§¡¨.Ó!9Ò!?¸RÀÇÁÈ)ÐUYÓAZ�wˆÜ˜}¬dÓ3ÒE¸ˆ	ÙHQ”—
‘
˜=°uÔ=¸e¸tÑDÐYaÐbiÐajÐWkÔrvÐw~ÓrÐnÐÐØrq   c                ó*  — ddl m} | j                  d«      xs d}| j                  d«      xs d}d| j                  d«      xs d	› d
|› �d|› �dœj                  |«      } ||xs t        j                  ||«      | j                  d«      xs d«      S )zkDeterministic tool_call id mirroring CodexEventProjector (live TUI card correlates with projected history).r   )Ú_deterministic_call_idr<   r©   rú   rû   Úmcp__rø   rù   Ú__Údyn_)rê   rë   r8   )Ú&agent.transports.codex_event_projectorr#  r   Ú_STABLE_ID_PREFIXES)rm   Únamer#  rÿ   rú   Úprefixs         r$   Ú_stable_call_idr+  U  sš   € åMØ—‘˜Ó Ò& B€IØ�8‰8�FÓÒ(˜y€DØ$ T§X¡X¨hÓ%7Ò%@¸5Ð$AÀÀDÀ6ÐJÐaeÐfjÐekÐ_lÑm×qÑqÐr{Ó|€FÙ! &Ò"TÔ,?×,CÑ,CÀIÈtÓ,TÐVZ×V^ÑV^Ð_cÓVdÒVjÐhjÓkÐkrq   c                ó°   ‡ ‡‡‡‡‡‡‡‡	— i Š	dddœdˆ fd„Šdˆˆ	fd„Šdˆˆ	fd„Šdˆfd„Šdˆ ˆfd„Šdˆˆˆfd	„Šˆfd
„ˆfd„ˆfd„ˆfd„ˆfd„dœŠdˆfd„}|S )a  Build the ``on_event`` callback for ``CodexAppServerSession(on_event=...)``.

    Tool items fire ``tool_progress_callback`` plus the stable-ID ``tool_start_callback`` /
    ``tool_complete_callback`` card hooks; deltas go to ``_fire_stream_delta`` / ``_fire_reasoning_delta``;
    a completed agentMessage goes to ``_emit_interim_assistant_message`` (the gateway's ``already_streamed``
    check dedupes against streamed deltas). Every callback is guarded so a buggy display hook cannot
    tear down the turn loop.r&   Nr'   c               ó>   •— t        t        ‰| d «      |g|¢­||dœŽ y )Nr'   )r1   r>   )Úattrr/   r(   r)   r0   r   s        €r$   Úagent_cbz4make_codex_app_server_event_bridge.<locals>.agent_cbi  s#   ø€ Ü”g˜e T¨4Ó0°(Ða¸YÑaÈTÐZ`Ôarq   c           
     óø   •— | j                  d«      xs dt        | «      }}t        | «      }|r||t        j                  «       f‰|<    ‰dd|d|t        | «      |f¬«        ‰dd|t        | |«      ||f¬«       y )	Nr8   r©   Útool_progress_callbackz4tool_progress_callback raised on tool.started for %sztool.startedrÞ   Útool_start_callbackz!tool_start_callback raised for %s)r   r   r  ÚtimeÚ	monotonicr  r+  )rm   Úitem_idr)  r(   r/  Ústarteds       €€r$   Ú_fire_tool_startedz>make_codex_app_server_event_bridge.<locals>._fire_tool_startedl  sŒ   ø€ ØŸ™ ›Ò,¨"Ô.FÀtÓ.L�ˆÜ" 4Ó(ˆÙØ $ d¬D¯N©NÓ,<Ð=ˆG�GÑÙÐ)Ð+aÐcgØ% tÔ-CÀDÓ-IÈ4ÐPõ	Rñ 	Ð&Ð(KÈTÜ& t¨TÓ2°D¸$Ð?ö	Arq   c           
     ó¶  •— t        | «      }| j                  d«      xs dx}r‰j                  |d «      nd }| j                  d«      }t        |t        t
        f«      xr |dk\  }|r|dz  n|rt        j                  «       |d   z
  nd }t        | «      \  }} ‰
dd|d	|d d f|||d
œ¬«       |�|d   n
t        | «      }	 ‰
dd|t        | |«      ||	|f¬«       y )Nr8   r©   Ú
durationMsr   g     @�@é   r1  z6tool_progress_callback raised on tool.completed for %sztool.completed)Údurationr  r  r'   r\   Útool_complete_callbackz$tool_complete_callback raised for %srÞ   )r   r   Úpopr   r   r   r3  r4  r!  r  r+  )rm   r)  r5  ÚpriorÚcodex_msÚhas_codex_msr;  r  r  r(   r/  r6  s             €€r$   Ú_fire_tool_completedz@make_codex_app_server_event_bridge.<locals>._fire_tool_completedw  sû   ø€ Ü'¨Ó-ˆØ:>¿(¹(À4».Ò:NÈBÐ/N¨wÐ/N�—‘˜G TÔ*ÐUYˆð —8‘8˜LÓ)ˆÜ! (¬S´%¨LÓ9ÒK¸hÈ!¹mˆÙ-9˜ 6Ò)Ñ_dÄÇÁÓ@PÐSXÐYZÑS[Ò@[ÐjnˆÜ9¸$Ó?Ñˆ�ÙÐ)Ð+cÐeiØ'¨¨t°TÐ:Ø%-¸8ÈvÑVõ	Xð !Ð,ˆu�QŠxÔ2EÀdÓ2KˆÙÐ)Ð+QÐSWÜ& t¨TÓ2°D¸$ÀÐGö	Irq   c                óœ   •— | j                  d«      xs | j                  d«      xs d}t        |t        «      r|r ‰||› d�|f¬«       y y y )NÚdeltaÚtextr©   ú raisedrÞ   )r   r   r?   )Úparamsr.  rD  r/  s      €r$   Ú_fire_deltaz7make_codex_app_server_event_bridge.<locals>._fire_delta‡  sO   ø€ Ø�z‰z˜'Ó"Ò> f§j¡j°Ó&8Ò>¸Bˆô �dœCÔ ¡TÙ�T˜d˜V 7Ð+°4°'Ö:ð &*Ð rq   c                ó¶   •— | j                  d«      xs d}t        |t        «      r,|j                  «       rt	        ‰dd«      r ‰ddd|dœf¬	«       d‰_        y )
NrD  r©   Úshow_commentaryTÚ_emit_interim_assistant_messagez&_emit_interim_assistant_message raisedÚ	assistant)Úroler5   rÞ   )r   r   r?   Ústripr>   Ú _current_streamed_assistant_text)rm   rD  r   r/  s     €€r$   Ú_fire_agent_message_completedzImake_codex_app_server_event_bridge.<locals>._fire_agent_message_completed�  sY   ø€ Ø�x‰x˜ÓÒ% 2ˆä�dœCÔ  T§Z¡Z¤\´g¸eÐEVÐX\Ô6]ÙÐ6Ð8`Ø$/¸DÑAÐCõEð 24ˆÕ.rq   c                óÌ   •— | j                  d«      }t        |t        «      sy |j                  d«      xs d}|t        v r |r‰|«       y ‰|«       y |r|dk(  r	 ‰|«       y y y )Nrm   r<   r©   ÚagentMessage)r   r   r   Ú_CODEX_TOOL_ITEM_TYPES)rF  r  rm   rÿ   rO  rA  r7  s       €€€r$   Ú_on_itemz4make_codex_app_server_event_bridge.<locals>._on_item›  sh   ø€ Ø�z‰z˜&Ó!ˆÜ˜$¤Ô%ØØ—H‘H˜VÓ$Ò*¨ˆ	ØÔ.Ñ.ØF¡YÐ!ÈÕMÐ4FÈÕMÙ˜9¨Ò6Ù)¨$Õ/ð 7ˆYrq   c                ó   •—  ‰| d«      S )NÚ_fire_stream_deltar&   ©ÚprG  s    €r$   r“   z4make_codex_app_server_event_bridge.<locals>.<lambda>¥  s   ø€ ©[¸Ð<PÓ-Q€ rq   c                ó   •—  ‰| d«      S ©NÚ_fire_reasoning_deltar&   rV  s    €r$   r“   z4make_codex_app_server_event_bridge.<locals>.<lambda>¦  s   ø€ ©+°aÐ9PÓ*Q€ rq   c                ó   •—  ‰| d«      S rY  r&   rV  s    €r$   r“   z4make_codex_app_server_event_bridge.<locals>.<lambda>§  s   ø€ ±¸QÐ@WÓ1X€ rq   c                ó   •—  ‰| d¬«      S )NF©r  r&   ©rW  rS  s    €r$   r“   z4make_codex_app_server_event_bridge.<locals>.<lambda>¨  s   ø€ ¡(¨1¸Ô">€ rq   c                ó   •—  ‰| d¬«      S )NTr]  r&   r^  s    €r$   r“   z4make_codex_app_server_event_bridge.<locals>.<lambda>¨  s   ø€ Ñ\dÐefÐrvÔ\w€ rq   )zitem/agentMessage/deltazitem/reasoning/deltazitem/reasoning/summaryDeltazitem/startedzitem/completedc                óÎ   •— t        | t        «      r$‰j                  | j                  d«      xs d«      nd }|�,| j                  d«      } |t        |t        «      r|ni «       y y )NÚmethodr©   rF  )r   r   r   )ÚnoteÚhandlerrF  Úhandlerss      €r$   Úon_eventz4make_codex_app_server_event_bridge.<locals>.on_event«  sW   ø€ Ü<FÀtÌTÔ<R�(—,‘,˜tŸx™x¨Ó1Ò7°RÔ8ÐX\ˆØÐØ—X‘X˜hÓ'ˆFÙœj¨´Ô6‘F¸BÕ?ð rq   )r.  r?   r/   r?   r0   r   r(   Útupler)   údict | NoneÚreturnÚNone)rm   r   rh  ri  )rF  r   r.  r?   rh  ri  )rF  r   r  r   rh  ri  )rb  r   rh  ri  r&   )
r   re  rO  rG  rA  r7  rS  r/  rd  r6  s
   ` @@@@@@@@r$   Ú"make_codex_app_server_event_bridgerj  ^  sX   ÿø€ ð 35€GàJLÐdh÷ bö	AöIõ ;ö
4÷0ó $RÛ QÛ'XÛ>ÓRwñ	3€Hõ@ð
 €Orq   c                óœ   — t        t        «      5  | j                  j                  «        ddd«       d| _        y# 1 sw Y   d| _        yxY w)zRDrop the session so the next turn respawns codex instead of reusing a dead client.N)r   r    Ú_codex_sessionÚclose)r   s    r$   Ú_close_codex_sessionrn  ¶  s<   € ä	”)Ó	ñ %Ø×Ñ×"Ñ"Ô$÷%à€EÕ÷%à€EÕús	   �;»Ac                ó„   — t        |xr t        | dd«      «      }|rt        | dd«      nd}|r| j                  «        ||fS )z¡(user_interrupted, interrupt_message); clears the agent-level interrupt so a hard
    stop cannot poison the next turn (mirrors the conversation-loop finalizer).Ú_interrupt_requestedFÚ_interrupt_messageN)r   r>   Úclear_interrupt)r   ÚactiveÚinterruptedÚmessages       r$   Ú_consume_user_interruptrv  ½  sJ   € ô �vÒO¤'¨%Ð1GÈÓ"OÓP€KÙ<GŒg�eÐ1°4Ô8ÈT€GÙØ×ÑÔØ˜ÐÐrq   c                ó‚   — t        | dd«      xs d}t        | dd«      r |dz   | j                  z   j                  «       }|S )zZThe prompt composition the standard loop sends as its system message (turn_context order).Ú_cached_system_promptNr©   Úephemeral_system_promptú

)r>   ry  rM  )r   Údeveloper_instructionss     r$   Ú_codex_developer_instructionsr|  Ç  sI   € ä$ UÐ,CÀTÓJÒPÈbÐÜˆuÐ/°Ô6Ø"8¸6Ñ"AÀE×DaÑDaÑ"a×!hÑ!hÓ!jÐØ!Ð!rq   Úcodex_thread_idz6Codex thread could not be resumed; starting a new one.c                ó˜   — t        | dd «      t        | dd «      }}|�|sy |j                  |t        «      }t        |t        «      r|r|S d S )Nry   rz   )r>   Úget_session_model_config_valueÚ_CODEX_THREAD_ID_KEYr   r?   )r   Údbrz   rÏ   s       r$   Ú_stored_codex_thread_idr‚  ×  sQ   € Ü˜U M°4Ó8¼'À%ÈÐW[Ó:\ˆ
€BØ	€z™ØØ×1Ñ1°*Ô>RÓS€IÜ" 9¬cÔ2±yˆ9ÐJÀdÐJrq   c                ó‚   — t        | dd«      t        | dd«      }}|�|syt        |j                  d|t        |if¬«       y)uh   Merge (``None`` clears) the binding into the session row; a failed write only logs â€” the turn is done.ry   Nrz   z6codex thread id could not be stored on the session rowrÞ   )r>   r1   Úpatch_session_model_configr€  )r   rÏ   r�  rz   s       r$   Ú_store_codex_thread_idr…  ß  sJ   € ä˜U M°4Ó8¼'À%ÈÐW[Ó:\ˆ
€BØ	€z™ØÜ�"×/Ñ/Ð1iØ"Ô%9¸9Ð$EÐFöHrq   c           
     ó6  — ddl m} 	 | j                  j                  «       S # |$ rq}t        j                  d|j                  t        | dd«      «       t        | d«       | j                  t        «       | j                  j                  «       cY d}~S d}~ww xY w)a)  ``ensure_started`` with the fail-closed resume policy: a stored thread that codex cannot hand back
    (unknown id, rollout locked by a killed app-server, different thread) is dropped from the session row,
    the user is told once on the status rail, and a fresh thread starts on the same client.r   )ÚCodexThreadResumeErrorz,%s; starting a new codex thread (session=%s)rz   N)Ú)agent.transports.codex_app_server_sessionr‡  rl  Úensure_startedr,   re   ru  r>   r…  Ú_emit_diagnostic_statusÚ_CODEX_THREAD_RESUME_NOTICE)r   r‡  r�   s      r$   Ú_start_codex_threadrŒ  è  s‚   € õ Qð5Ø×#Ñ#×2Ñ2Ó4Ð4øØ!ò 5Ü�‰ÐEÀsÇ{Á{ÔT[Ð\aÐcoÐquÓTvÔwÜ˜u dÔ+Ø×%Ñ%Ô&AÔBØ×#Ñ#×2Ñ2Ó4Õ4ûð	5ús   ˆ" ¢B§A&BÂBÂBc                ój  — t        | «      }t        | dd«      � t        | dd«      }|�||k(  ryt        | «       t        | dd«      �dn
t        | «      }ddlm} ddlm}m} ddl	m
} ddlm}	 d}
t        t        «      5  dd	lm}  |«       }
ddd«       d
}	 ddlm}  |«       }|| _        ddlm}  ||«      xs d}d}t1        t        | dd«      xs d«      j3                  «       j5                  «       dk(  r&ddlm}  |t1        t        | dd«      xs d«      «      } |t        | dd«      xs t1         |«       «      |
 | |	«       «       |||¬«      t;        | «      |xs d|rt        | dd«      nd|||¬«
      | _        y# 1 sw Y   Œ÷xY w# t        $ r t&        j)                  dd¬«       Y �Œw xY w)a…  Lazily spawn one CodexAppServerSession per AIAgent (reused across turns, closed by the _cleanup hook).
    A live session whose thread was started with a different prompt composition (TUI/Desktop ``/personality``
    or a prompt mirror mutate the agent in place) is retired first so the new thread carries the current one.
    Only the FIRST session of an AIAgent resumes the stored codex thread: a retired/recreated one keeps
    today's fresh-thread behaviour and overwrites the binding once its turn is committed. ``messages`` is the
    turn's transcript (current user row last); a thread started from scratch is seeded with the prior turns.rl  NÚ_codex_session_promptr   )Úresolve_agent_cwd)ÚCodexAppServerSessionÚ_ServerRequestRouting)Úget_configured_codex_binary)Úload_config)Ú_get_approval_callbackF)Úis_approval_bypass_activezLcodex app-server: approval-bypass lookup failed; keeping fail-closed defaultTr¥   )Úrender_history_seedrŠ   r©   Úcustom)Úcodex_model_provider_idÚrequested_providerÚsession_cwd)Úauto_approve_execÚauto_approve_apply_patchr]   )
r  Úapproval_callbackÚ	codex_binÚrequest_routingre  r{  r]   Úmodel_providerÚresume_thread_idÚhistory_seed)r|  r>   rn  r‚  Úagent.runtime_cwdr�  rˆ  r�  r‘  Úhermes_cli.codex_runtime_switchr’  r   r“  r   r    Útools.terminal_toolr”  Útools.approvalr•  r,   r-   rŽ  Ú agent.codex_runtime_history_seedr–  r?   rM  ÚlowerÚ"hermes_cli.runtime_provider_customr˜  rj  rl  )r   rÀ   r{  Úrecordedr¡  r�  r�  r‘  r’  r“  r�  r”  Úauto_approve_requestsr•  r–  r¢  r   r˜  s                     r$   Ú_ensure_codex_sessionr¬  ö  sÁ  € ô ;¸5ÓAÐÜˆuÐ&¨Ó-Ð9ä˜5Ð"9¸4Ó@ˆØÐ˜xÐ+AÒAØÜ˜UÔ#Ü& uÐ.EÀtÓLÐX‘tÔ^uÐv{Ó^|ÐÝ3ßfÝKÝ-àÐÜ	”)Ó	ñ 5Ý>Ù2Ó4Ð÷5ð
 "ÐðtÝ<Ù 9Ó ;Ðð #9€EÔÝDÙ& xÓ0Ò8°D€Lð €NÜ
Œ7�5˜* bÓ)Ò/¨RÓ0×6Ñ6Ó8×>Ñ>Ó@ÀHÒLÝNÙ0´´W¸UÐDXÐZ\Ó5]Ò5cÐacÓ1dÓeˆÙ0Ü�E˜=¨$Ó/ÒK´3Ñ7HÓ7JÓ3KÐ_pÙ-©k«mÓ<Ù-Ð@Uð  qFô  GÜ3°EÓ:Ø5Ò=¸Ù/=Œg�e˜W dÔ+À4ÐXfØ)¸ô€EÕ÷A5ð 5ûô ò tÜ�‰ÐcÐnrˆ×sðtús   Á>FÂF ÆFÆ F2Æ1F2c                óÄ  — |j                   syddlm} |j                   }t        |dd«      }|d   }|�-|j	                  d«      dk(  r|j	                  d«      |k(  r|d	d }|D ]  } |||«       Œ t        | d
d«      €yd}	 | j                  |«      }|du r!t        j                  dt        | dd«      «       |du S # t        $ r t        j                  dd¬«       Y ŒKw xY w)a¾  Splice the projected messages into ``messages`` and flush them to the session DB; True when the
    rows are durable in the session DB (the codex thread binding may then be published).

    Bypasses conversation_loop's per-step _persist_session(); the flush dedups via _DB_PERSISTED_MARKER so
    only the new codex rows are written. The agent stays the sole persister (agent_persisted=True): a
    gateway re-write would re-INSERT the user turn.Fr   )Úappend_messageÚsubmitted_user_textNrL  Úuserr5   r\   ry   z/codex app-server projected-message flush failedTr¥   u�   codex app-server turn was delivered but could NOT be persisted to the session DB (session=%s) â€” this turn will be missing after restart/resumerz   )	Úprojected_messagesÚagent.message_metadatar®  r>   r   Ú_flush_messages_to_session_dbr    r,   re   )	r   r¿   rÀ   r®  r±  r¯  ÚfirstÚprojected_messageÚflush_oks	            r$   Ú_persist_projected_messagesr·  6  s  € ð ×"Ò"ØÝ5Ø×0Ñ0Ðô " $Ð(=¸tÓDÐØ˜qÑ!€EØÐ'¨E¯I©I°fÓ,=ÀÒ,GØ—	‘	˜)Ó$Ð(;Ò;Ø/°°Ð3ÐØ/ò 4ÐÙ�xÐ!2Õ3ð4äˆu�m TÓ*Ð2ØØ€HðYØ×6Ñ6°xÓ@ˆð �5Ñä�‰ð YÜZaÐbgÐiuÐw{ÓZ|ô	~à�tÐÐøô ò YÜ�‰ÐHÐSWˆÖXðYús   ÂB< Â< CÃCc          
     ó  — t        | dd«      |j                  z   | _        t        | |«       t	        | ||¬«      }d| j
                  cxk  xr | j                  k  nc xr d| j                  v }|rd| _        |j                  s<|j                  €0t        t        | dd«      dt        ||j                  d|¬	«      ¬
«       |j                  r>|j                  s2|s|r.t        t        | dd«      dt        t        |«      ||¬«      ¬
«       |S )zPPost-turn bookkeeping mirroring the chat_completions loop; returns usage fields.Ú_iters_since_skillr   )rÀ   Úskill_manageNÚ_sync_external_memory_for_turnzexternal memory sync raisedF)Úoriginal_user_messageÚfinal_responsert  rÀ   )r)   Ú_spawn_background_reviewzbackground review spawn raised)Úmessages_snapshotÚreview_memoryÚreview_skills)r>   Útool_iterationsr¹  rç   rÊ   Ú_skill_nudge_intervalÚvalid_tool_namesrt  rH   r1   r   Ú
final_textr`   )r   r¿   rÀ   r¼  Úshould_review_memoryÚusage_resultÚshould_review_skillss          r$   Ú_finish_codex_turnrÉ  X  s  € ô  ' uÐ.BÀAÓFÈ×I]ÑI]Ñ]€EÔÜ'¨¨tÔ4Ü1°%¸ÈÔQ€Là × ;Ñ ;ÖW¸u×?WÑ?WÔWò IØ .°%×2HÑ2HÐ Hð áØ#$ˆÔ à×Ò §
¡
Ð 2Ü”g˜eÐ%EÀtÓLÐNkÔtxØ"7ÈÏÉÐejÐu}ôu
õ 	ð ‡‚˜t×/Ò/Ñ5IÑMaÜ”g˜eÐ%?ÀÓFÐHhÔquÜ" 8›nÐ<PÐ`tôr
õ 	ð Ðrq   )rÆ  c               ó*  — t        | dd«      du rddlm}  |d«      ‚t        | |«       	 t	        | «       | j
                  j                  |¬«      }t        | |j                  «      }	t        |dd«      r+t        j                  d|j                   «       t        | «       t#        | ||«      r#t        |dd«      st%        | |j&                  «       t)        | ||||¬«      }
t        |	|fd|j                   xr |j                   du |j                   |j*                  d|j&                  |j,                  dœ|
¤ŽS # t        $ rQ}t        j                  d«       t        | «       t        t        | «      |ddt        |«      d	|› d
�¬«      cY d}~S d}~ww xY w)uÒ   Hand the turn to a ``codex app-server`` subprocess and project its events into ``messages``.
    Returns the chat_completions result shape. The user message is ALREADY in ``messages`` â€” never append it again.Úcompression_checkpoint_requiredFTr   )Ú_checkpoint_blockedztcodex_app_server owns the authoritative thread and compacts it without a truthful pre-compaction transcript boundary)Ú
user_inputzcodex app-server turn failedzCodex app-server turn failed: z:. Fall back to default runtime with `/codex-runtime auto`.)Ú	api_callsr  rH   r½  NÚshould_retirez1codex app-server session retired (turn error: %s))r¼  rÆ  r\   )rÎ  r  rH   r½  Úagent_persistedr}  Úcodex_turn_id)r>   rà   rÌ  r¬  rŒ  rl  Úrun_turnr    r,   Ú	exceptionrn  Ú_turn_resultrv  r?   rt  re   rH   r·  r…  rÏ   rÉ  rÅ  rÐ   )r   Úuser_messager¼  rÀ   Úeffective_task_idrÆ  rÌ  r¿   r�   Ú	interruptrÇ  s              r$   Úrun_codex_app_server_turnrØ  q  s–  € ô ˆuÐ7¸Ó?À4ÑGÝFÙ!ð #Zó [ð 	[ä˜% Ô*ð	
Ü˜EÔ"Ø×#Ñ#×,Ñ,¸Ð,ÓEˆô (¨¨t×/?Ñ/?Ó@€Iô ˆt�_ eÔ,Ü�‰ÐJÈDÏJÉJÔWÜ˜UÔ#ô # 5¨$°Ô9Ä'È$ÐP_ÐafÔBgÜ˜u d§n¡nÔ5Ü%Øˆt�XÐ5JÐauô€Lô Ø�8ðØ'(¸×8HÑ8HÐ4HÒ4_ÈTÏZÉZÐ[_ÐM_Ðgk×gqÑgqà—‘¸ÈdÏnÉnÐlp×lxÑlxñð ñ	ð øô) ò 
Ü×ÑÐ7Ô8Ü˜UÔ#ÜÜ# EÓ*¨HÀÈUÔZ]Ð^aÓZbØ;¸C¸5Ð@zÐ{ô
õ 	
ûð
ús   «'D8 Ä8	FÅAFÆFÆFc               ó<   — | \  }}||||| |dœ|rd|ini ¥d|i¥|¥S )zVResult shape shared with the chat_completions path (``partial`` == ``not completed``).)r½  rÀ   rÎ  r  Úpartialrt  Úinterrupt_messagerH   r&   )	r×  rÀ   rÎ  r  rH   r½  rŒ   Úuser_interruptedrÛ  s	            r$   rÔ  rÔ  ›  sW   € ð +4Ñ'ÐÐ'à(°hÈYØ¨y¨=ÐIYññ 8IÐÐ!2Ñ3Èbðð 	�ñ	ð  ð	ð rq   c                óp   — t        | |d«      }|€"t        | t        «      r| j                  ||«      }|�|S |S )zKField access for attr-style (SDK objects) and dict (raw JSON) events/items.N)r>   r   r   r   )Úeventr)  r   r#   s       r$   Ú_event_fieldrß  ­  s>   € ä�E˜4 Ó&€EØ€}œ E¬4Ô0Ø—	‘	˜$ Ó(ˆØÐ%ˆ5Ð2¨7Ð2rq   >   úresponse.text.deltaúresponse.audio.deltaúresponse.output_text.deltaúresponse.reasoning_text.deltaú%response.reasoning_summary_text.deltaú&response.function_call_arguments.deltaúresponse.refusal.deltac                óÜ   ‡— t        | d«      }|t        v rt        t        | d«      «      S |dk(  r=t        | d«      Šdt        t        ‰d«      xs d«      v xr t	        ˆfd„dD «       «      S y	)
zàWhether a Codex Responses event carries substantive forward progress.

    Lifecycle/keepalive frames and empty structural deltas prove transport
    liveness, but do not mean the model has begun producing its response.
    r<   rC  úresponse.output_item.addedrm   Úfunction_callr©   c              3  óH   •K  — | ]  }t        t        ‰|«      «      –— Œ y ­w©N)r   rß  )Ú.0Úfieldrm   s     €r$   ú	<genexpr>z+_codex_event_has_content.<locals>.<genexpr>Ç  s&   øè ø€ ò PaØ05ŒD”˜d EÓ*×+ñPaùs   ƒ")r8   rV   r)  r  F)rß  Ú_CODEX_PROGRESS_DELTA_TYPESr   r?   Úany)rÞ  Ú
event_typerm   s     @r$   Ú_codex_event_has_contentrò  ¼  sƒ   ø€ ô ˜e VÓ,€JØÔ0Ñ0Ü”L ¨Ó0Ó1Ð1ØÐ1Ò1Ü˜E 6Ó*ˆØ¤#¤l°4¸Ó&@Ò&FÀBÓ"GÐGò aÌCó PaØ9_ôPaó Mað 	aàrq   c                ó¸   ‡ ‡— ddl m} t        ‰ d«      Šd
ˆ ˆfd„} |d«      }|�t        |«      ndj	                  «       xs d} || |d«       |d«      ¬	«      ‚)z×Raise ``_StreamErrorEvent`` from a ``type=error`` SSE frame. The spec puts code/message/param at the
    top level, but the SDK and several proxies nest them under ``error``; read top-level first, then the envelope.r   )Ú_StreamErrorEventrH   c                ó@   •— t        ‰| «      }|€‰�t        ‰| «      S |S rë  )rß  )r)  r#   rÞ  Únesteds     €€r$   Ú_error_fieldz)_raise_stream_error.<locals>._error_fieldÒ  s+   ø€ Ü˜U DÓ)ˆØ-2¨]¸vÐ?QŒ|˜F DÓ)Ð\ÐW\Ð\rq   ru  zstream emitted error eventÚcodeÚparam)rø  rù  )r)  r?   rh  r   )Ú	run_agentrô  rß  r?   rM  )rÞ  rô  r÷  Úraw_messageru  rö  s   `    @r$   Ú_raise_stream_errorrü  Ì  sh   ù€ õ ,Ü˜% Ó)€Fö]ñ ˜yÓ)€KØ#.Ð#:Œs�;ÔÐ@\×cÑcÓeò  Fð  jF€GÙ
˜G©,°vÓ*>ÁlÐSZÓF[Ô
\Ð\rq   c                ó|   — t        | dd «      }t        |t        «      r|j                  «       j	                  «       S d S )NÚphase)rß  r   r?   rM  r¨  )rm   rþ  s     r$   Ú_message_phaserÿ  Ú  s3   € Ü˜˜w¨Ó-€EÜ$.¨u´cÔ$:ˆ5�;‰;‹=×ÑÓ ÐDÀÐDrq   c                ó�   — t        | dg «      }t        |t        «      r|ng }dj                  d„ |D «       «      j	                  «       S )zSConcatenated ``output_text`` parts of a message item ("" if content is not a list).r5   r©   c              3  ór   K  — | ]/  }t        |d d«      dk(  sŒt        t        |dd«      xs d«      –— Œ1 y­w)r<   r©   Úoutput_textrD  N)rß  r?   )rì  Úparts     r$   rî  z"_output_text_of.<locals>.<genexpr>ã  s<   è ø€ ò Ø6:Ä|ÐTXÐZ`ÐbdÓGeÐivÓGvŒŒL˜˜v rÓ*Ò0¨b×1ñùs   ‚7˜7)rß  r   r`   rG   rM  )rm   Úcontent_partsÚpartss      r$   Ú_output_text_ofr  ß  sE   € ä   y°"Ó5€MÜ'¨´tÔ<‰MÀ"€EØ�7‰7ñ Ø>Côó ç�eƒgðrq   c                  óð   — e Zd ZU dZdxZxZZdZdZde	d<   dZ
de	d<   d	Zd
e	d<   dxZxZxZZdZd„ Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd„ eeeeeedœZd„ efd„ efd„ effZd d„Zd!d„Zd"d„Zy)#Ú_CodexResponseAssembleruž  Assemble a Response-shaped ``SimpleNamespace`` from raw Responses SSE events.

    Only ``usage`` / ``status`` / ``id`` are read from the terminal frame â€” never ``response.output``. Output
    items come from ``output_item.done``, or are synthesized from text deltas, or settled from function calls
    announced via ``output_item.added`` but never confirmed (some backends omit per-item done events on success).Fr   Nú
str | NoneÚactive_message_phaser   Úactive_summary_indexr  r?   Úterminal_statusc               ó´   — |||c| _         | _        | _        ||c| _        | _        g | _        g g c| _        | _        g g c| _        | _	        i | _
        i | _        y rë  )r]   Úon_text_deltaÚon_reasoning_deltaÚon_commentary_messageÚon_first_deltaÚoutput_itemsÚoutput_indexesÚoutput_sequencesÚtext_deltasÚcommentary_text_deltasÚpending_function_callsÚannounced_output_order)Úselfr]   r  r  r  r  s         r$   Ú__init__z _CodexResponseAssembler.__init__ù  sp   € ØBGÈÐXjÐ?ˆŒ
�DÔ&¨Ô(?Ø:OÐQ_Ð7ˆÔ" DÔ$7Ø')ˆÔð 68¸Ð2ˆÔ˜TÔ2Ø8:¸BÐ5ˆÔ˜$Ô5ð BDˆÔ#Ø8:ˆÕ#rq   c                ó(   — t        |d|› d�|¬«       y )NzCodex stream rE  rÞ   )r1   )r  ÚcbÚlabelr(   s       r$   Ú_safez_CodexResponseAssembler._safe  s   € Ü�b˜M¨%¨°Ð8¸tÖDrq   c                óü  — t        |d«      }t        |dd«      }|dk(  rt        |«      nd | _        | j                  dk(  rg | _        t	        t        |dd«      «      }|rH|| j
                  vr:| j                  t        |d«      f| j
                  |<   | xj                  dz  c_        d	t	        |«      v rId
| _        |r?| j
                  |   \  }}|t	        t        |dd«      xs d«      ||dœ| j                  |<   y y y )Nrm   r<   r©   ru  Ú
commentaryr8   Úoutput_indexr\   ré  Tr  )rm   r  r!  Úsequence)	rß  rÿ  r
  r  r?   r  Únext_output_sequenceÚhas_tool_callsr  )r  rÞ  rñ  rm   rÿ   r5  Úannounced_sequenceÚannounced_indexs           r$   Ú_on_item_addedz&_CodexResponseAssembler._on_item_added	  s  € Ü˜E 6Ó*ˆÜ   v¨rÓ2ˆ	Ø<EÈÒ<R¤N°4Ô$8ÐX\ˆÔ!Ø×$Ñ$¨Ò4Ø*,ˆDÔ'ô ”l 4¨¨rÓ2Ó3ˆÙ�w d×&AÑ&AÑAØ48×4MÑ4MÌ|Ð\aÐcqÓOrÐ3sˆD×'Ñ'¨Ñ0Ø×%Ò%¨Ñ*Õ%Øœc )›nÑ,Ø"&ˆDÔÙØ6:×6QÑ6QÐRYÑ6ZÑ3Ð" Oà ¬s´<ÀÀkÐSUÓ3VÒ3\ÐZ\Ó/]Ø$3ÐASñ8�×+Ñ+¨GÒ4ð ð -rq   c                ó  — t        |dd«      }|sy | j                  dk(  rF| j                  j                  |«       | j                  €| j                  | j                  d|«       y y | j                  dk(  r| j                  | j                  d|«       y | j                  j                  |«       | j                  ry | j                  s#d| _	        | j                  | j                  d«       | j                  | j                  d|«       y )	NrC  r©   r   r  ÚanalysisTr  r  )rß  r
  r  r;   r  r  r  r  r$  Úfirst_delta_firedr  r  )r  rÞ  rñ  Ú
delta_texts       r$   Ú_on_text_deltaz&_CodexResponseAssembler._on_text_delta  sã   € Ü! %¨°"Ó5ˆ
ÙØð ×$Ñ$¨Ò4Ø×'Ñ'×.Ñ.¨zÔ:à×)Ñ)Ð1Ø—
‘
˜4×2Ñ2Ð4HÈ*ÕUð 2à×&Ñ&¨*Ò4Ø�J‰J�t×.Ñ.Ð0DÀjÕQà×Ñ×#Ñ# JÔ/Ø×"Ò"ØØ×)Ò)Ø)-�Ô&Ø—
‘
˜4×.Ñ.Ð0@ÔAØ�J‰J�t×)Ñ)¨?¸JÕGrq   c                ó|   — t        |dd«      }t        |t        «      r|r| j                  j	                  |«       y y y )NrC  r©   )rß  r   r?   r  r;   )r  rÞ  rñ  Úrefusal_texts       r$   Ú_on_refusal_deltaz)_CodexResponseAssembler._on_refusal_delta4  s:   € ô
 $ E¨7°BÓ7ˆÜ�l¤CÔ(©\Ø×Ñ×#Ñ# LÕ1ð .:Ð(rq   c           	     ó  — d| _         | j                  j                  t        t	        |dd«      «      «      }|€y d|v r|dxx   t	        |dd«      xs dz  cc<   y |j                  d«      rt	        |dd «      x}�t        |«      |d<   y y y )NTr5  r©   rC  r  zfunction_call_arguments.done)r$  r  r   r?   rß  Úendswith)r  rÞ  rñ  ÚpendingÚ	done_argss        r$   Ú_on_function_callz)_CodexResponseAssembler._on_function_call=  sœ   € Ø"ˆÔØ×-Ñ-×1Ñ1´#´lÀ5È)ÐUWÓ6XÓ2YÓZˆØˆ?ØØ�jÑ Ø�KÓ ¤L°¸ÀÓ$DÒ$JÈÑJÔ Ø× Ñ Ð!?Ô@ô *¨%°¸dÓCÐC�	ÐPÜ'*¨9£~�˜Ò$ð Qð Arq   c                óà   — t        |dd«      }|r| j                  €y t        |d«      }|�'| j                  �|| j                  k7  rd|› �}|| _        | j                  | j                  d|«       y )NrC  r©   Úsummary_indexrz  r  )rß  r  r  r  )r  rÞ  rñ  Úreasoning_textr6  s        r$   Ú_on_reasoning_deltaz+_CodexResponseAssembler._on_reasoning_deltaJ  sx   € Ü% e¨W°bÓ9ˆÙ ×!8Ñ!8Ð!@ØÜ$ U¨OÓ<ˆØÐ$Ø×(Ñ(Ð4¸È$×JcÑJcÒ9cØ#'¨Ð'7Ð!8�Ø(5ˆDÔ%Ø�
‰
�4×*Ñ*Ð,@À.ÕQrq   c                ó²  — t        |d«      }|€y | j                  j                  |«       t        t        |dd«      «      }| j                  j                  |d«      \  }}|€!| j                  | j                  dz   c}| _        | j                  j                  t        |d|«      «       | j                  j                  |«       | j                  j                  |d «       t        |«      dk(  rj| j                  �]dj                  | j                  «      j                  «       xs t!        |«      }|r| j#                  | j                  d|«       g | _        y y y )	Nrm   r8   r©   ©NNr\   r!  r   r  )rß  r  r;   r?   r  r   r#  r  r  r  r=  rÿ  r  rG   r  rM  r  r  )r  rÞ  rñ  Ú	done_itemÚdone_idr%  r&  Úcommentary_texts           r$   Ú_on_item_donez%_CodexResponseAssembler._on_item_doneU  s<  € Ü  ¨Ó/ˆ	ØÐØØ×Ñ× Ñ  Ô+ô ”l 9¨d°BÓ7Ó8ˆØ.2×.IÑ.I×.MÑ.MÈgÐWcÓ.dÑ+Ð˜OØÐ%Ø<@×<UÑ<UÐW[×WpÑWpÐstÑWtÐ9Ð Ô 9Ø×Ñ×"Ñ"¤<°°~ÀÓ#WÔXØ×Ñ×$Ñ$Ð%7Ô8à×#Ñ#×'Ñ'¨°Ô6Ü˜)Ó$¨Ò4¸×9SÑ9SÐ9_Ø Ÿg™g d×&AÑ&AÓB×HÑHÓJÒhÌoÐ^gÓNhˆOÙØ—
‘
˜4×5Ñ5Ð7NÐP_Ô`Ø*,ˆDÕ'ð	 :`Ð4rq   c                óŒ  — d| _         t        |d«      }|�st        |d«      t        |d«      c| _        | _        t        |d«      }t	        |t
        «      r|| _        |dk(  rt        |d«      | _        n|dk(  rt        |d	«      | _        | j                  xs |d
k(  | _	        | j                  xs |j                  d«      | _        y)NTÚresponserÁ   r8   r¯   úresponse.incompleteÚincomplete_detailsúresponse.failedrH   úresponse.completedz	response.)Úsaw_terminalrß  Úterminal_usageÚterminal_response_idr   r?   r  Úterminal_incomplete_detailsÚterminal_errorÚsaw_response_completedÚremoveprefix)r  rÞ  rñ  Úresp_objÚrstatuss        r$   Ú_on_terminalz$_CodexResponseAssembler._on_terminalj  sÉ   € Ø ˆÔÜ  zÓ2ˆØÐÜ=IÈ(ÐT[Ó=\Ô^jÐksÐuyÓ^zÐ:ˆDÔ Ô!:Ü" 8¨XÓ6ˆGÜ˜'¤3Ô'Ø'.�Ô$ØÐ2Ò2Ü3?ÀÐJ^Ó3_�Õ0ØÐ0Ò0Ü&2°8¸WÓ&E�Ô#Ø&*×&AÑ&AÒ&gÀZÐSgÑEgˆÔ#Ø#×3Ñ3Ò[°z×7NÑ7NÈ{Ó7[ˆÔØrq   c                ó   — t        |«      S rë  )rü  )r  rÞ  rñ  s      r$   r“   z _CodexResponseAssembler.<lambda>}  s   € Ô1DÀUÓ1K€ rq   )rH   rè  zresponse.output_item.donerD  rA  rC  ræ  c                ó
   — d| v S )Nzoutput_text.deltar&   ©Úts    r$   r“   z _CodexResponseAssembler.<lambda>ƒ  s   € Ð&¨!Ð+€ rq   c                ó
   — d| v S )Nré  r&   rQ  s    r$   r“   z _CodexResponseAssembler.<lambda>ƒ  s   € ÈÐ\]ÐI]€ rq   c                ó   — d| v xr d| v S )NÚ	reasoningrC  r&   rQ  s    r$   r“   z _CodexResponseAssembler.<lambda>„  s   € �; !Ð#Ò4¨°1¨€ rq   c                óì   ‡— t        |dd«      Št        ‰t        «      r‰ndŠ| j                  j	                  ‰«      xs t        ˆfd„| j                  D «       d«      }|�t         || |‰«      «      S dS )z=Process one event; True when the stream hit a terminal frame.r<   r©   c              3  ó:   •K  — | ]  \  }} |‰«      sŒ|–— Œ y ­wrë  r&   )rì  ÚmÚhrñ  s      €r$   rî  z/_CodexResponseAssembler.feed.<locals>.<genexpr>‹  s   øè ø€ Ò?tÁdÀaÈÑfgÐhrÕfsÄÑ?tùs   ƒ”NF)rß  r   r?   Ú_EXACT_HANDLERSr   ÚnextÚ_FUZZY_HANDLERSr   )r  rÞ  rc  rñ  s      @r$   Úfeedz_CodexResponseAssembler.feed‡  so   ø€ ä! %¨°Ó4ˆ
Ü#-¨j¼#Ô#>‘ZÀBˆ
Ø×&Ñ&×*Ñ*¨:Ó6Ò{¼$Ó?tÈd×NbÑNbÔ?tÐvzÓ:{ˆØ9@Ð9LŒt‘G˜D %¨Ó4Ó5ÐWÐRWÐWrq   c                óz  — t        t        | j                  | j                  | j                  «      «      }| j
                  j                  «       D ]v  }|d   }|j                  |j                  d«      |d   t        dt        |dd«      t        |dd«      t        |dd«      d	|d
   xs dj                  «       xs d¬«      f«       Œx t        d„ |D «       «      r,t        t        «      5  |j                  d„ ¬«       ddd«       n|j                  d„ ¬«       |D �cg c]  }|d   ‘Œ	 c}S # 1 sw Y   ŒxY wc c}w )zCMerge .done items with settled pending calls, keeping stream order.rm   r!  r"  ré  r8   NrV   r)  r  r  r©   z{})r<   r8   rV   r)  r¯   r  c              3  ó*   K  — | ]  }|d    du–— Œ y­w)r   Nr&   )rì  Úentrys     r$   rî  z:_CodexResponseAssembler._settled_output.<locals>.<genexpr>›  s   è ø€ Ò9¨ˆu�Q‰x˜tÔ#Ñ9ùs   ‚c                ó   — | d   S rs   r&   ©r`  s    r$   r“   z9_CodexResponseAssembler._settled_output.<locals>.<lambda>�  s
   € ¨u°Q©x€ rq   )rÈ   c                ó   — | d   S )Nr\   r&   rb  s    r$   r“   z9_CodexResponseAssembler._settled_output.<locals>.<lambda>Ÿ  s
   € ¨5°©8€ rq   r:  )r`   Úzipr  r  r  r  Úvaluesr;   r   r   rß  rM  Úallr   r  Úsort)r  Úindexedr2  rm   r`  s        r$   Ú_settled_outputz'_CodexResponseAssembler._settled_outputŽ  s,  € ä”s˜4×.Ñ.°×0EÑ0EÀt×GXÑGXÓYÓZˆØ×2Ñ2×9Ñ9Ó;ò 	ˆGØ˜6‘?ˆDØ�N‰N˜GŸK™K¨Ó7¸ÀÑ9LÌoØ$¬°d¸DÀ$Ó)GÔQ]Ð^bÐdmÐosÓQtÜ! $¨°Ó5¸kð # ;Ñ/Ò5°2×<Ñ<Ó>ÒFÀ$ôOð õ ð	ô Ñ9°Ô9Ô9Üœ)Ó$ñ 9Ø—‘Ñ!7�Ô8÷9ð 9ð �L‰LÑ3ˆLÔ4Ø&-Ö.˜U��a“Ò.Ð.÷	9ð 9üò /s   Ã)D,ÄD8Ä,D5c           
     ó   — t        | j                  «      }|sO| j                  rC| j                  s7t	        ddj                  | j                  «      ¬«      g}t	        ddd|¬«      g}| j                  r| j                  r| j                  «       }| j                  s|st        d«      ‚t	        |dj                  | j                  «      | j                  | j                  | j                  | j                  | j                  | j                   ¬	«      S )
Nr  r©   )r<   rD  ru  rK  r  )r<   rL  r¯   r5   z7Codex Responses stream did not emit a terminal response)rT   r  rÁ   r¯   r8   r]   rB  rH   )r`   r  r  r$  r   rG   r  rJ  ri  rE  ÚRuntimeErrorrF  r  rG  r]   rH  rI  )r  rT   r5   s      r$   r  z_CodexResponseAssembler.result¢  sá   € ä  ×!2Ñ!2Ó3ˆÙ˜$×*Ò*°4×3FÒ3FÜ&¨MÀÇÁÈ×HXÑHXÓ@YÔZÐ[ˆGÜ%¨9¸;È{ÐdkÔlÐmˆFð ×&Ò&¨4×+FÒ+FØ×)Ñ)Ó+ˆFà× Ò ©ÜÐXÓYÐYÜØ r§w¡w¨t×/?Ñ/?Ó'@È×H[ÑH[Ðdh×dxÑdxØ×(Ñ(°·
±
Èt×OoÑOoØ×%Ñ%ô'ð 	'rq   )r  úCallable | Noner  r?   r(   r   rh  ri  )rÞ  r   rñ  r?   rh  ri  )rÞ  r   rñ  r?   rh  r   ©rÞ  r   rh  r   )rh  z	List[Any])rh  r   )r=   Ú
__module__Ú__qualname__Ú__doc__r$  r*  rE  r#  r
  Ú__annotations__r  r  rF  rG  rH  rI  rJ  r  r  r'  r,  r/  r4  r8  r>  rN  rZ  r\  r]  ri  r  r&   rq   r$   r  r  è  sÝ   … ñuð 9>Ð=€NÐ=Ð&¨ØÐØ'+Ð˜*Ó+à $Ð˜#Ó$Ø&€O�SÓ&Ø[_Ð_€NÐ_Ð)Ð_Ð,GÈ.à"Ðò;óEóó*Hó,2ó6ó	Ró-ó*ñ& LØ&4ÐS`Ø*À<ÐdpØ"3ñ	€Oñ 
,¨^Ð<Ñ?]Ð_pÐ>qÙ	4Ð6IÐJð€Oó
Xó/ô('rq   r  )r  r  r  r  re  Úinterrupt_checkc               ó&  — t        |||||¬«      }| D ]8  }	|�		  ||	«       |� |«       s|j                  |	«      sŒ) |j                  «       S  |j                  «       S # t        t        f$ r ‚ t        $ r t        j                  dd¬«       Y Œnw xY w)a;  Consume a Codex Responses SSE stream into a Response-shaped ``SimpleNamespace`` (see
    :class:`_CodexResponseAssembler`; ``status`` is ``completed`` when the stream ended with content but no
    terminal frame; ``model`` comes from kwargs).

    Callbacks: ``on_text_delta`` per output_text delta, suppressed once a function_call is seen;
    ``on_reasoning_delta`` for reasoning and ``phase=analysis`` deltas (also commentary without a commentary
    callback); ``on_commentary_message`` once per completed ``phase=commentary`` message, before any following
    tool item; ``on_first_delta`` one-shot; ``on_event`` every event before any processing; ``interrupt_check()``
    True breaks the loop and may raise ``TimeoutError`` / ``InterruptedError`` for request retirement that
    must not become a partial final response.)r]   r  r  r  r  z!Codex stream on_event hook raisedTr¥   )r  ÚTimeoutErrorÚInterruptedErrorr    r,   r-   r]  r  )
Ú
event_iterr]   r  r  r  r  re  rr  Ú	assemblerrÞ  s
             r$   Ú_consume_codex_event_streamrx  µ  s¯   € ô (¨eÀ=ÐewØ>SÐdrôt€Iàò 	ˆØÐðQÙ˜”ð
 Ð'©OÔ,=À)Ç.Á.ÐQVÕBWØØ×ÑÓÐð	ð ×ÑÓÐøô !Ô"2Ð3ò ØÜò QÜ—‘Ð@È4�ÖPðQús   ™AÁ/BÂBc                ó*  — t        |«      }t        | dd«      }t        |«      rt         |«       «      s|S d|v rdgng }|j	                  dd«       |j                  d«      }t        |t         «      rXd|v rT|j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}|d<   |d   s|j	                  d«       |j                  d«       |rAt        j                  d|j                  dt        | dd«      «      d	j                  |«      «       |S c c}}w )
a  Drop fields the ChatGPT OAuth Codex endpoint rejects, at the final wire boundary (after Relay /
    middleware / ``request_overrides``): a late ``prompt_cache_retention``, top-level or nested in
    ``extra_body``, would otherwise HTTP 400 a valid follow-up.Ú_is_codex_backendNÚprompt_cache_retentionz	top-levelÚ
extra_bodyz^Dropped unsupported prompt_cache_retention at consumer Codex wire boundary (model=%s, via %s).r]   rû   r  )r   r>   r¶   r   r=  r   r   ri   r;   r,   re   rG   )r   r4   Ú	sanitizedÚbackend_predicateÚdropped_fromr|  ÚkÚvs           r$   Ú _sanitize_consumer_codex_requestr‚  Ò  s  € ô �W“€Iä Ð':¸DÓAÐÜÐ&Ô'¬DÑ1BÓ1DÔ,EØÐØ$<À	Ñ$I�K‘=Èr€LØ‡M�MÐ*¨DÔ1à—‘˜|Ó,€JÜ�*œdÔ#Ð(@ÀJÑ(NØ4>×4DÑ4DÓ4F×"h©D¨A¨qÈ!ÐOgÓJg 1 a¡4Ó"hˆ	�,ÑØ˜Ò&Ø�M‰M˜,Ô'Ø×Ñ˜LÔ)ÙÜ�‰ÐwØ —}‘} W¬g°e¸WÀiÓ.PÓQÐSW×S\ÑS\Ð]iÓSjô	làÐùó #is   Â	DÂDc                ó	  ‡ ‡‡‡‡‡‡‡‡‡‡‡‡‡‡ ‡!‡"— ddl }ddlmŠ ddlm} |j
                  |j                  |j                  |j                  t        fŠ ‰xs ‰ j                  d¬«      Šd‰j                  d«      cŠŠg ‰ _        t        j                  «       Š!‰!�‰!j                  nt        ‰ d	d«      Šddd
dœŠ"d7ˆ ˆfd„Šd7ˆ ˆˆ"fd„Šd8ˆfd„}d9ˆˆfd„}d:ˆˆ fd„}d;ˆ ˆ!fd„}	d7ˆˆ fd„}
d<ˆˆ fd„}d=ˆˆ ˆˆˆ"fd„Šd>ˆ ˆ"fd„}d?ˆˆˆˆ ˆ ˆ"fd„}d?ˆˆ ˆfd„Št        ‰ dd«      }t        ‰ dd«      duxr |}|r |‰ j                   «      nd}t        ‰ dd
«      rdn t#        t        ‰ dd«      xs d«      dkD  rdnd}t%        ‰dz   «      D �]Ê  Š ‰«       st'        d «      ‚‰ j(                  rt+        d!«      ‚‰dkD  r<‰!�:‰!j,                  r.‰!j.                  5  t1        j0                  «       ‰!_        ddd«       g Šdx‰"d"<   x‰"d#<   }d
‰"d$<   	 	 |j5                  t7        ‰«      |t9        t        ‰ d%d&«      xs d&«      t9        t        ‰ d'd&«      xs d(«      t9        ‰xs d&«      ˆˆfd)„|‰j:                  d*„ d+„ d,|‰t        ‰ d-d«      d.œd¬/«      }t=        |‰ ||«       |‰ j>                  «      ||� ||«      nd ||	«      |
¬0«      }‰ j(                  s ||«       |jR                  d4v r`t@        jU                  d5|jR                  |jV                  |jX                  t[        d6„ ‰ j                  D «       «      ‰ jE                  «       «       | ‰|«       c S  y# 1 sw Y   �ŒkxY w# ‰ $ rg}‰‰k\  r	 ‰|«       ‚ t@        jC                  |€d1nd2‰dz   ‰dz   ‰ jE                  «       |«       ‰stG        ‰‰dz   ‰dz   «      ŠY d}~ ‰|«       �ŒCd}~wtH        $ r( |�$|jJ                  �|jJ                  cY  ‰|«       c S ‚ ‰$ rs}‰‰k  r`‰"d"   €[tM        |jN                  |jP                  «      r;t@        jC                  d3‰dz   ‰dz   ‰ jE                  «       |«       Y d}~ ‰|«       �Œß ‰|«       ‚ d}~ww xY w#  ‰|«       w xY w)@zVOne streaming Responses API request over raw ``responses.create(stream=True)`` events.r   N)ÚAPIConnectionError)Ú	relay_llmÚcodex_stream_direct©Úreasonr\   r]   Ú"_active_codex_stream_request_tokenF)r#   Ú
raw_streamÚsuperseded_loggedc                 ó.   •— ‰d u xs t        ‰ dd «      ‰u S )Nr‰  )r>   )r   Úrequest_tokens   €€r$   Ú_request_is_currentz-run_codex_stream.<locals>._request_is_current  s$   ø€ Ø Ð$Òs¬°Ð7[Ð]aÓ(bÐfsÐ(sÐsrq   c                 óŽ   •— ‰d   } | �t        ‰| «      ry‰d   s+d‰d<   t        j                  d‰j                  dd«      «       y)Nr#   Tr‹  z¢Codex streaming attempt superseded by a newer stream; suppressing its live deltas while consuming to completion so the final response is not truncated (model=%s).r]   rû   F)r   r,   re   r   )Útokenr   rf   Úwriter_tokens    €€€r$   Ú_writer_is_currentz,run_codex_stream.<locals>._writer_is_current  sX   ø€ Ø˜WÑ%ˆØˆ=Ô4°U¸EÔBØØÐ/Ò0Ø04ˆLÐ,Ñ-Ü�N‰Nð hà%Ÿ>™>¨'°9Ó=ô?ð rq   c                ó   •‡ — ˆˆ fd„S )zIWrap a callback so a retired request's late frames never reach the agent.c                ó&   •—  ‰«       r ‰| «      S d S rë  r&   )r#   rŽ  r.   s    €€r$   r“   z3run_codex_stream.<locals>._fenced.<locals>.<lambda>  s   ø€ Ñ*=Ô*?™R ›Y€ ÀT€ rq   r&   )r.   rŽ  s   `€r$   Ú_fencedz!run_codex_stream.<locals>._fenced  s	   ù€ äIÐIrq   c                ó   •‡ — ˆˆˆ fd„S )ziWrap a live-display callback so a superseded writer's frames never reach the sink (retired ones neither).c                 ó.   •—  ‰«       r ‰«       r ‰| Ž S d S rë  r&   )r(   rŽ  r’  r.   s    €€€r$   r“   z1run_codex_stream.<locals>._live.<locals>.<lambda>  s   ø€ Ñ*=Ô*?ÑDVÔDX™R ˜Y€ Ð^b€ rq   r&   )r.   rŽ  r’  s   `€€r$   Ú_livezrun_codex_stream.<locals>._live  s	   ù€ åbÐbrq   c                ón   •— ‰j                   j                  | «        ‰«       r‰j                  | «       y y rë  )Ú_codex_streamed_text_partsr;   rU  )rD  r’  r   s    €€r$   r,  z(run_codex_stream.<locals>._on_text_delta  s0   ø€ Ø×(Ñ(×/Ñ/°Ô5ÙÔØ×$Ñ$ TÕ*ð  rq   c                ó(  •— t        j                   «       }t        ‰dd «      €|‰_        t        | «      }‰�?‰j                  5  ‰j
                  �d ‰_        d ‰_        |‰_        |r|‰_        d d d «       ‰j                  d«       y # 1 sw Y   ŒxY w)NÚ_last_api_first_chunk_atzreceiving stream response)	r3  r>   rœ  rò  ÚlockÚretry_started_tsÚlast_progress_tsÚlast_event_tsÚ_touch_activity)rÞ  ÚnowÚhas_progressr   Úwatchdog_states      €€r$   Ú	_on_eventz#run_codex_stream.<locals>._on_event  s–   ø€ Ü�i‰i‹kˆô �5Ð4°dÓ;ÐCØ-0ˆEÔ*Ü/°Ó6ˆØÐ%Ø×$Ñ$ñ :Ø!×2Ñ2Ð>Ø6:�NÔ3Ø6:�NÔ3Ø/2�Ô,ÙØ69�NÔ3÷:ð 	×ÑÐ9Õ:÷:ð :ús   Á+BÂBc                 óR   •—  ‰ «       st        d«      ‚t        ‰j                  «      S )Nz?Codex Responses stream request retired before terminal response)rt  r   rp  )rŽ  r   s   €€r$   Ú_interrupt_or_supersededz2run_codex_stream.<locals>._interrupt_or_superseded/  s(   ø€ ñ #Ô$ÜÐ`ÓaÐaÜ�E×.Ñ.Ó/Ð/rq   c           
     óê   •— ddl m}  |t        ‰dd«      t        t        ‰dd«      xs d«      «      rt	        d«      ‚t        ‰| «      }d|d<    ‰j                  j                  d	i t        |«      ¤ŽS )
Nr   )Úis_actual_routerŠ   r©   r‹   zFActual requests require Chat Completions; refusing to call /responses.TÚstreamr&   )	Úhermes_cli.providersr©  r>   r?   rt   r‚  Ú	responsesÚcreater   )Únext_api_kwargsr©  Ústream_kwargsÚactive_clientr   s      €€r$   Ú_open_codex_streamz,run_codex_stream.<locals>._open_codex_stream6  s|   ø€ Ý8áÜ�E˜: rÓ*Ü”˜ z°2Ó6Ò<¸"Ó=ô
ô ØXóð ô 9¸ÀÓPˆØ"&ˆ�hÑØ-ˆ}×&Ñ&×-Ñ-Ñ\Ô0LÈ]Ó0[Ñ\Ð\rq   c                ó&  •— t        | «      \  }}t        j                  d|€dn|t        ‰d   d u«      j	                  «       |t        ‰dd«      ‰dz   › d‰dz   › �«       ‰d   €-t        ‰| ‰dz   t        ‰dd «      xs t        ‰dd«      ¬	«       y y )
NzxCodex Responses request failed: serialized_request_body_bytes=%s stream_opened=%s exception_chain=%s model=%s attempt=%srû   r#   r]   r\   ú/r‹   r©   )rh   r‹   )rN   r,   re   r?   r¨  r>   r   )r�   rI   Úexception_chainr°  r   rg   Úmax_stream_retriesr‘  s      €€€€€r$   Ú_log_failurez&run_codex_stream.<locals>._log_failureD  s¼   ø€ Ü.LÈSÓ.QÑ+Ð˜OÜ�‰ð @ØN`ÐNhÁð  oAÜ˜<¨Ñ0¸Ð<Ó=×CÑCÓEÀÔX_Ð`eÐgnÐpyÓXzØ! A™+˜ aÐ(:¸QÑ(>Ð'?Ð@ô	Bð ˜Ñ Ð(ä+Ø�s W¨q¡[Ü  °
¸DÓAÒcÄWÈUÐT^Ð`bÓEcöeð )rq   c                ó,   •— t        ‰«      ‰d<   | ‰d<   y )Nr#   rŠ  )r
   )Ú_raw_streamr   r‘  s    €€r$   Ú_codex_stream_createdz/run_codex_stream.<locals>._codex_stream_createdP  s   ø€ ä 3°EÓ :ˆ�WÑØ%0ˆ�\Ò"rq   c                óp  •‡ ‡— t        «       }|dk  ry t        j                  «       Šdˆˆˆˆˆ ˆ	fd„}t        j                  |dd¬«      j	                  «        ‰j                  |«      ry t        j                  d|‰j                  «       «       ‰
j                  d«      }|�|‰ ur ‰|«        ‰‰ «       y )	Nr   c                 óD  •— 	 ‰D ]  } Œ 	 ‰j                  «        y # g ‰¢‰‘­$ rC}t        |‰«      s ‰|«       t        j                  d‰j                  «       |«       Y d }~ŒYd }~wt        $ r t        j                  dd¬«       Y Œ~w xY w# ‰j                  «        w xY w)Nz¦Codex Responses stream transport finalization failed after a terminal response was already received; returning the completed response instead of retrying. %s error=%szDCodex Responses stream finalization failed after a terminal responseTr¥   )r   r,   re   Ú_client_log_contextr    r-   r7   )Ú_ignoredr�   Ú_APIConnectionErrorr¶  r   ÚdrainedÚevent_streamÚtransport_errorss     €€€€€€r$   Ú_drainz>run_codex_stream.<locals>._drain_for_finalizer.<locals>._drain]  s¨   ø€ ðØ ,ò �HØñð —‘•øð <Ð%Ð;Ð':Ñ;ò AÜ! #Ð'7Ô8Ù  Ô%Ü—‘ð  mà$×8Ñ8Ó:¸C÷Añ Aûô ò tÜ—‘ÐcÐnr�Ösðtûð —‘•ús7   ƒ ŠB œ
B
¦9A$ÁB Á$#B
ÂB Â	B
Â
B ÂBzcodex-post-terminal-drainT)Útargetr)  ÚdaemonzªCodex Responses stream remained open %.1fs after a terminal response (agent.stream_drain_timeout); closing it and returning the completed response instead of retrying. %srŠ  ©rh  ri  )
r%   Ú	threadingÚEventÚThreadÚstartÚwaitr,   re   r¼  r   )rÀ  ÚbudgetrÂ  rŠ  r¿  r¾  Ú_close_event_streamr¶  r   rÁ  r‘  s   `   @€€€€€€r$   Ú_drain_for_finalizerz.run_codex_stream.<locals>._drain_for_finalizerU  sª   ú€ ô 'Ó(ˆØ�QŠ;ØÜ—/‘/Ó#ˆ÷	ò 	ô 	×Ñ Ð-HÐQUÔV×\Ñ\Ô^Ø�<‰<˜ÔØÜ�‰ðVà�E×-Ñ-Ó/ô	
ð "×%Ñ% lÓ3ˆ
ØÐ! j¸Ñ&DÙ 
Ô+Ù˜LÕ)rq   c                ó”   •— t        | dd «      }	 t        |«      r |«        y y # t        $ r ‰�‰j                  ‰d¬«       Y y Y y w xY w)Nrm  Úcodex_stream_close_failedr‡  )r>   r¶   r    Ú_abort_request_openai_client)rÀ  Úclose_fnr°  r   Úclients     €€€r$   rÌ  z-run_codex_stream.<locals>._close_event_stream{  s[   ø€ Ü˜<¨°$Ó7ˆð	fÜ˜Ô!Ù•
ð "øäò 	fð Ð!Ø×2Ñ2°=ÐIdÐ2Öeñ "ð		fús   �$ ¤AÁArI  TÚinterim_assistant_callbackÚis_subagentÚ	delegatedÚ_fallback_indexÚfallbackÚprimaryz3Codex Responses stream request retired before retryz+Agent interrupted before Codex stream retryr#   rŠ  r‹  rz   r©   rŠ   Úcodexc                 ó0   •— t        t        ‰ «      ‰¬«      S )N)r]   )rx  r`   )Úintercepted_eventsr]   s   €€r$   r“   z"run_codex_stream.<locals>.<lambda>ž  s   ø€ Ô&AÄ$ÐGYÓBZÐbgÔ&h€ rq   c                ó   — | S rë  r&   )Úchunks    r$   r“   z"run_codex_stream.<locals>.<lambda>   s   € °€ rq   c                óJ   — t        t        | d«      xr t        | d«       «      S )NrT   Ú__iter__)r   rã   )Úrs    r$   r“   z"run_codex_stream.<locals>.<lambda>¡  s$   € ¼4ÄÈÈ8Ó@TÒ@sÔ]dÐefÐhrÓ]sÐYsÓ;t€ rq   Úcodex_responsesÚ_current_api_request_id)Úapi_modeÚ	call_roleÚretry_countÚapi_request_id)
rz   r)  Ú
model_nameÚ	finalizerÚon_stream_createdÚon_chunkÚchunk_adapterÚcompleted_response_predicateÚmetadataÚdefer_logical_completion)r]   r  r  r  r  re  rr  zLCodex Responses stream connect failed (attempt %s/%s); retrying. %s error=%sz\Codex Responses stream transport failed mid-iteration (attempt %s/%s); retrying. %s error=%szPCodex Responses pre-stream connect failed (attempt %s/%s); retrying. %s error=%s>   ÚfailedÚ
incompletezbCodex Responses stream terminal status=%s (incomplete_details=%s, error=%s, streamed_chars=%d). %sc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrë  )r9   )rì  rW  s     r$   rî  z#run_codex_stream.<locals>.<genexpr>Ñ  s   è ø€ Ò"T¨a¤3 q§6Ñ"Tùs   ‚)rh  r   )r.   úCallable[[Any], None]rh  rò  )r.   úCallable[..., None]rh  ró  )rD  r?   rh  ri  ©rÞ  r   rh  ri  )r®  údict[str, Any])r�   ÚBaseExceptionrh  ri  )r¸  r   rh  ri  )rÀ  r   rh  ri  ).ÚhttpxÚopenair„  r   r…  ÚRemoteProtocolErrorÚReadTimeoutÚ	ReadErrorÚConnectErrorÚConnectionErrorÚ_ensure_primary_openai_clientr   rš  r   r�  r>   Ú_fire_streamed_codex_commentaryr   Úrangert  rp  ru  Úphase_awarer�  r3  rž  rª  r   r?   r;   rx  rZ  r,   r-   r¼  rp   rk  r½  r   rD   ÚTransportErrorr¯   re   rB  rH   Úsum)#r   rf   rÒ  r  Ú_httpxr…  r•  r˜  r,  r¥  r§  r±  r¹  rÍ  rI  Úwants_commentaryr  rä  rÀ  Úfinalr�   r¾  rÌ  r¶  rŽ  r’  r°  rg   rÛ  rµ  r]   r�  rÁ  r¤  r‘  s#   ```                  @@@@@@@@@@@@@@r$   Úrun_codex_streamr  ê  s¾  ÿÿø€ ãÝ@ÝØ×2Ñ2°F×4FÑ4FÈ×HXÑHXÐZ`×ZmÑZmÔo~ÐÐØÒ_˜e×AÑAÐI^ÐAÓ_€MØ ! :§>¡>°'Ó#:ÐÐ˜à-/€EÔ$ô /×2Ñ2Ó4€Nð Ð%ð 	×Òä�UÐ@À$ÓGð ð "°ÈEÑR€Löt÷	õJöcö+ö
;ö$0ö]÷
eñ 
eö1÷
$*ò $*÷L
fô ˜eÐ%6¸Ó=€OÜ˜uÐ&BÀDÓIÐQUÐUÒiÐZiÐÙL\™E %×"GÑ"GÔHÐbfÐÜ '¨¨}¸eÔ D‘Ü$'¬°Ð7HÈ!Ó(LÒ(QÐPQÓ$RÐUVÒ$V‘jÐ\eð äÐ+¨aÑ/Ó0ó I.ˆÙ"Ô$ÜÐTÓUÐUØ×%Ò%Ü"Ð#PÓQÐQØ�QŠ;˜>Ð5¸.×:TÒ:Tð  ×$Ñ$ñ >Ü26·)±)³+�Ô/÷>à#%ÐØLPÐPˆ�WÑÐP ¨\Ñ :¸\Ø,1ˆÐ(Ñ)ð<	.ð1Ø(×/Ñ/Ü˜Ó$Ð&8Ü"¤7¨5°,ÀÓ#CÒ#IÀrÓJÜœW U¨J¸Ó;ÒF¸wÓGÔTWÐX]ÒXcÐacÓTdÜhØ&;ÐFX×F_ÑF_Ù"5Ù1tØ*;È)ÐdkÜ07¸Ð?XÐZ^Ó0_ñaà-1ð  0ó  �ô 4Ø ¨¹WÀ^Ó=TÙ',¨U×-HÑ-HÓ'IÐavØ<JÐ<V¡5¨Ô#8Ð\`Ù$ YÓ/ÐAYô	�ðJ ×-Ò-Ù$ \Ô2Ø�|‰|Ð7Ñ7Ü—‘ð  Zà$Ÿ|™|¨U×-EÑ-EÀuÇ{Á{Ü"Ñ"T°5×3SÑ3SÔ"TÓTÐV[×VoÑVoÓVqôsð á ×-ñSI.÷>ñ >ûð2 $ò ØÐ0Ò0Ù  Ô%ØÜ—‘ØfrÐfzÑbØwØ˜a‘KÐ!3°aÑ!7¸×9RÑ9RÓ9TÐVYôñ
 *Ü!@ÀÈWÐWXÉ[ÐZlÐopÑZpÓ!q�JÛñ:   Ö-ûô9  ò àÐ+°×0KÑ0KÐ0WØ'×6Ñ6Ñ6ñ2   ×-ð1 Ø&ò ð
 Ð0Ò0°\À'Ñ5JÐ5RÜ& s§}¡}°f×6KÑ6KÔLÜ—L‘LØjØ !™Ð%7¸!Ñ%;¸U×=VÑ=VÓ=XÐZ]ôó ñ   Ö-ñ ˜SÔ!Øûðûñ.   Õ-úsd   ÇMÈB<M'Ë
BQ;ÍM$	Í'Q8Í,AOÏ Q;Ï&Q8Ï4Q;Ð Q8ÐAQ3ÑQ;Ñ*	Q3Ñ3Q8Ñ8Q;Ñ;
R)rØ  r  rx  rj  c                ó   — t        | ||¬«      S )a  Backward-compatible alias for the unified event-driven path.

    Historically this was the fallback when the SDK's high-level
    ``responses.stream(...)`` helper raised on shape drift.  The primary
    path now does exactly what the fallback did, so this just forwards.
    Kept as a public symbol because tests and a small number of call sites
    still reference it by name.
    )rÒ  )r  )r   rf   rÒ  s      r$   Ú run_codex_create_stream_fallbackr	  â  s   € ô ˜E :°fÔ=Ð=rq   )rh  r   )
r.   rl  r/   r?   r0   r   r(   rf  r)   rg  )rH   rö  rh  ztuple[int | None, str])rf   r   rg   r   rh   r   rh  r   )r#   r   rh  r   )r/   r?   r€   r   r   zCallable[[], dict]rh  ri  rë  )rh  rõ  )rË   z
int | NonerÌ   r   rh  r   )rm   r   rh  z
list[dict])rm   r   rh  r?   )rm   r   rh  r   )rm   r   rh  r   )rm   r   rh  ztuple[str, bool])rm   r   r)  r?   rh  r?   )rh  zCallable[[dict], None]rÅ  )T)rs  r   rh  útuple[bool, Any])rh  r?   )rh  r	  )rÏ   r	  rh  ri  )rÀ   zList[Dict[str, Any]] | Nonerh  ri  )rÀ   úList[Dict[str, Any]]rh  r   )rÀ   r  r¼  r   rÆ  r   rh  rõ  )rÕ  r?   r¼  r   rÀ   r  rÖ  r?   rÆ  r   rh  úDict[str, Any])r×  r
  rÀ   r  rÎ  r   r  r   rH   r   r½  r   rŒ   r   rh  r  )rÞ  r   r)  r?   r   r   rh  r   rm  rô  )rm   r   rh  r	  )rm   r   rh  r?   )rv  r   r]   r?   rh  r   )r   r   r4   rõ  rh  rõ  r:  )rf   r   rÒ  r   )Rrp  Ú
__future__r   Úcontextvarsra   ÚloggingÚosrÆ  r3  Ú
contextlibr   Útypesr   Útypingr   r   r   r	   Úagent.stream_single_writerr
   r   Ú(agent.transports.hermes_tools_mcp_serverr   Úagent.sdk_transform_bypassr   Úagent.stream_diagr   r¹   r   Ú	getLoggerr=   r,   Ú
ContextVarr   rq  r!   r%   r1   rN   rp   ru   r‚   rÊ   rç   Ú	frozensetrR  rþ   r(  r  r  rö   r   r  r  r!  r+  rj  rn  rv  r|  r€  r‹  r‚  r…  rŒ  r¬  r·  rÉ  rØ  rÔ  rß  rï  rò  rü  rÿ  r  r  rx  r‚  r  Ú__all__r	  r&   rq   r$   ú<module>r     s=  ðòAõ #ã Û Û Û 	Û Û Ý Ý !ß ,Ó ,ç TÝ QÝ CÝ =Ý /à	ˆ×	Ñ	˜8Ó	$€Ø@VÀ×@VÑ@VØ DôAÐ Ð=ó ð !$Ð ó)ð& VXÐosõ :ó>ó."1óJóCôCNðL UYÐhmõ #ñX #Ò#tÓuÐ ð +9ÈÐdpÑqÐ Ø+1ÀÑOÐ Ø%Ð'8Ð9Ð à'0¸wÑG€óKóGóRóó ó0lóRóp ô ó"ð )Ð ØVÐ óKóHó5ô=ó@ðDØ-1ðØ6Dóð4 TYñ'Ø14ð'ØLPð'Ø]kó'ðT	Øð	Ø-0ð	Ø;>ð	ØCQó	ô$3ñ (ò )ó Ð óó ]óEó
÷J'ñ J'ð\ 37È4ÐgkØ $¸ñØðØ"ðð óó:ô0j.òZ€õ	>rq   