+
    jHàjNa ã                  óô  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t% ^ RI&H't' ]'       d   ^ RI(H)t) ]PT                  ! R4      t+^t,0 R%mt-R R lt.R R lt/R&t0R't1R R lt2R R lt3 ! R R]44      t5 ! R R]44      t6^ RI7H8t8 ^ RI9H:t: R  t;R! R" lt< ! R# R$]8]:4      t=R# )(aC  Per-turn callback runner (progress/status/voice/run_sync) for the gateway agent turn.

``TurnRunner`` owns the per-turn callbacks ``GatewayRunner._run_agent_inner`` binds. ``gateway.run``
internals are imported lazily inside method bodies (import cycle), so ``patch("gateway.run.X")``
keeps intercepting them at call time.
)ÚannotationsN)Úsuppress)Údatetime)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptional©Út)Ú_accepts_keyword)Úcanonicalize_replay_history)ÚPlatform)Ú(repair_explicit_computer_use_media_paths)ÚBasePlatformAdapter)Úea_default_reason_text)ÚTurnContext)Úcfg_get)Úis_truthy_value)ÚGatewayRunnerzgateway.runc               ó    € V ^8„  d   QhRRRR/# )é   Úadapter_clsÚtypeÚreturnÚbool© )Úformats   "Ú</home/ubuntu/.hermes/hermes-agent/gateway/run_turn_runner.pyÚ__annotate__r   4   s   € ÷ Hñ H°ð H¸ñ Hó    c                ó¨   € \        V RR4      p\        V4      '       d'   \        V \        4      '       d   \	        V! 4       4      # \        V RR4      RJ# )zùTrue when the adapter class renders native approval buttons. BasePlatformAdapter subclasses
say so through ``supports_exec_approval_buttons``; anything else (test doubles, relay-style
duck types) counts when it defines ``send_exec_approval`` itself.Úsupports_exec_approval_buttonsNÚsend_exec_approval)ÚgetattrÚcallableÚ
issubclassr   r   )r   Úprobes   & r   Ú_renders_exec_approval_buttonsr(   4   sJ   € ô �KÐ!AÀ4ÓH€EÜ�‡‚œ: kÔ3F×GÒGÜ‘E“G‹}ÐÜ�;Ð 4°dÓ;À4ÐGÐGr    c               ó   € V ^8„  d   QhRR/# ©r   r   Ústrr   )r   s   "r   r   r   @   s   € ÷ (ñ ( ñ (r    c                 ó   € \        R 4      # )zgateway.clarify.expiredr
   r   r    r   Ú_clarify_expired_noticer-   @   s   € ÜÐ&Ó'Ð'r    c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r   P   s   € ÷ *ñ *˜Tñ *r    c                 ó    € ^ RI Hp  V ! 4       RJ # )é    ©Úfinite_turn_requiredT)Úgateway.session_finiter3   r2   s    r   Ú_finite_viewer_turnr5   P   s   € Ý;ÙÓ! TÐ)Ð)r    c               ó   € V ^8„  d   QhRR/# )r   r   zdict | Noner   )r   s   "r   r   r   U   s   € ÷ Bñ BÀ;ñ Br    c                óª  € ^ RI Hp \        V\        4      '       g   R# VP	                  R4      '       d   RM1VP	                  R4      '       g   VP	                  R4      '       d   RMRpT! VP	                  R4      \        V RR4      TVP	                  R	4      T\        V4      \        J ;'       d    V\        \        V R
R4      RR4      8H  R R7      # )a\  ``message.complete.persisted_turn`` for this turn, the receipt the TUI gateway's own turns
publish: clients bind the streamed reply to its stored row instead of comparing words. The
agent copies ``conversation_history`` into its message list, so an untouched pre-turn prefix
is the same dicts (transcript rows here carry no ``_row_id`` to compare).)Úpersisted_turn_receiptNÚinterruptedÚfailedÚerrorÚcompleteÚmessagesÚ_persist_user_message_idxÚfinal_responseÚcontext_compressorÚcompression_countc                ó   € WJ # ©Nr   )ÚbeforeÚafters   &&r   Ú<lambda>Ú!_persisted_turn.<locals>.<lambda>d   s   € °±r    )Úcompression_unchangedÚprefix_row_matches)Úagent.persisted_turn_receiptr8   Ú
isinstanceÚdictÚgetr$   r   Úint)ÚagentÚagent_historyÚresultÚcompressionsr8   Ústatuss   &&&&  r   Ú_persisted_turnrT   U   sÇ   € õ
 DÜ�fœd×#Ò#ÙØ%Ÿz™z¨-×8Ò8‰mØ$Ÿj™j¨×2Ò2°f·j±jÀ×6IÒ6I‘7Èzð á!Ø�
‰
�:Ó¤¨Ð/JÈDÓ QÐS`Ø�
‰
Ð#Ó$ fÜ" <Ó0´CÐ7÷ Sð S¸LÌGÜ�EÐ/°Ó6Ð8KÈTóMSñ =Sá@ôBð Br    c                  ó   € ] tR t^gtRtRtR# )Ú_NoStreamConsumerz²Raised by the delta callback when nothing consumed the text; ``_call_quietly`` turns it into
'not delivered' so the agent's partial-delivery accounting matches what the user saw.r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   r    r   rV   rV   g   s   † õ]r    rV   c                  ó   € ] tR t^ltRtRtR# )Ú_ExecApprovalDeclinedaE  The connector refused the approval card's destination.

Raised (not returned) so it propagates out of `_approval_notify_sync` to
`_await_gateway_decision`, whose notify-failure path drops the central
approval queue entry and unblocks the waiting tool. A plain return
suppressed the text fallback but left that entry pending.
r   NrW   r   r    r   r_   r_   l   s   † õr    r_   )ÚGatewayTurnProgressMixin)ÚGatewaySessionAgentMixinc           	     ó”  € ^ RI Hp V! 4       pVe   \        V\        4      '       g   R# VR,          p VR,          P	                  YP                  R4      VP                  R4      VP                  R4      ;'       g    RR	R
7      VR,          R&   R#   \         d*   pTP                  RR	R\        T4      R7        Rp?R# Rp?ii ; i)z A confirmed API model lock settles only on the runtime it named (main's
``_finish_turn_result``): the served runtime rides the usage, a mismatch fails the turn.)Úapi_runtime_lockedNÚsettingsÚadapterÚrouteÚrequested_runtimeÚroute_sourceÚ T)rf   rg   rh   Úconfirmed_runtime_lockÚusageÚruntimeF)r?   r:   Ú	completedr;   )	Úgateway.session_api_turnrc   rK   rL   Ú_turn_runtime_metadatarM   ÚRuntimeErrorÚupdater+   )rO   rQ   Úcapturedrc   Úapird   Úexcs   &&&    r   Ú_settle_api_runtime_lockru   z   s¶   € õ <Ù
Ó
€CØ
‚{œ* V¬T×2Ò2ÙØ�:�€HðWØ'*¨9¥~×'LÑ'LØŸ™ gÓ.À(Ç,Á,ÐObÓBcØ!Ÿ™ nÓ5×;Ð;¸ÐTXð (Mó (Zˆ�Õ˜)Ó$øô ô WØ�‰ R°ÀÌSÐQTËXˆ×VÒVûðWús   ´A	B Á>B ÂCÂCÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r   rt   Ú	ExceptionÚplatformr   r   ztuple[str, str, bool]r   )r   s   "r   r   r   Š   s'   € ÷ "Eñ "E 9ð "E¸ð "EÐEZñ "Er    c                ó°  € ^ RI Hp ^ RIHpHp ^ RIHp VP                  P                  p\        W4      '       d   RV P                   R2VR3# V! V P                  4      '       d   ^ RIHp V! \        V 4      4      VR3# V\        P                   8X  d	   RV  2VR3# \#        4       pR;ršT pVe|   \%        V4      V9  dl   VP'                  \%        V4      4       T	;'       g    \        V\(        4      p	T
;'       g    \        W³4      p
VP                  ;'       g    VP*                  pK  V	'       d   V
'       g   \-        R	4      R
R3# \-        R4      VR3# )ze``(chat text, failure_reason, retryable)`` for a model/credential resolution failure before the turn.)ÚFailoverReason)Ú	AuthErrorÚis_rate_limited_auth_error©ÚRuntimeStoreErroruB   âš ï¸� This session's launch credentials are no longer available (zY), so this message wasn't processed. Start a new session from the CLI to bind them again.F)Ú_gateway_provider_error_replyu   âš ï¸� zgateway.errors.generic_failedÚ
host_errorzgateway.errors.no_credentials)Úagent.error_classifierrz   Úhermes_cli.authr{   r|   Úhermes_state_runtimer~   Úauth_permanentÚvaluerK   ÚreasonÚ	__cause__Úgateway.runr   r+   r   ÚLOCALÚsetÚidÚaddÚOSErrorÚ__context__r   )rt   rx   rz   r{   r|   r~   r„   r   ÚseenÚhostÚauthÚlinks   &&          r   Ú_resolution_failure_replyr“   Š   s@  € å5ßEÝ6Ø#×2Ñ2×8Ñ8€NÜ�#×)Ò)ð UÐUX×U_ÑU_ÐT`ð aað aØbpÐrwðyð 	yá! #§-¡-×0Ò0å=Ù,¬S°«XÓ6¸ÈÐMÐMØ”8—>‘>Ô!ð ˜˜ˆ °Ð5Ð5Ü“U€DØÐ€DØ!$€DØ
Ò
œr $›x¨tÔ3Ø�‰”�D“ÔØ×0Ð0”z $¬Ó0ˆØ×2Ð2”z $Ó2ˆØ�~‰~×1Ð1 ×!1Ñ!1Šß—Dô
 Ð0Ó1°<ÀÐFÐFÜÐ,Ó-¨~¸uÐDÐDr    c                  ó$  € ] tR t^¯tRtRtR R ltR tR,R ltR t	R R	 lt
R
 t]R R l4       tR tR-R R lltR tR R ltR.R R lltR R ltR R ltR tR R ltR R ltR tR tR  tR! tR" R# ltR$ tR% R& ltR' R( ltR) t R* t!R+t"R# )/Ú
TurnRunnerz\Per-turn collaborator carrying ``GatewayRunner._run_agent_inner``'s tool-progress callbacks.Nc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrunnerr   Úctxr   r   ÚNoner   )r   s   "r   r   ÚTurnRunner.__annotate__·   s&   € ÷ Iñ I˜}ð I°;ð IÀ4ñ Ir    c                	óh  € Wn         W n        ^ RIHp V! V4      pVe”   \	        VRR4      p\	        VRR4      \
        P                  8X  d   VP                  MVP                  VP                  4      pWdP                  9   d.   VP                  P                  V4      R,          pWFV3V n        R# R# R# )r1   ©Úactive_authorityNÚsourcerx   Úruntime_generation)Ú_runnerÚ_ctxÚgateway.session_authoritiesr�   r$   r   r‰   Úchat_idÚlogical_ownerÚ
session_idÚsessionsÚdbÚget_sessionÚ_approval_owner)Úselfr—   r˜   r�   Ú	authorityrž   Úowner_idÚ
generations   &&&     r   Ú__init__ÚTurnRunner.__init__·   sœ   € ØŒØŒ	Ý@Ù$ VÓ,ˆ	ØÒ Ü˜S (¨DÓ1ˆFÜ*1°&¸*ÀdÓ*KÌxÏ~É~Ô*]˜ŸšØ&×4Ñ4°S·^±^ÓDð à×-Ñ-Ô-Ø&Ÿ\™\×5Ñ5°hÓ?Ð@TÕU�
Ø(1¸ZÐ'H�Ö$ñ .ñ	 !r    c                	ód   € V P                   e"   V P                   w  r4pVP                  WEW4      # R# ©NF)r©   Úpublish_execution)rª   Ú
event_typeÚpayloadr«   r¥   r­   s   &&&   r   Ú_publish_executionÚTurnRunner._publish_executionÅ   s4   € Ø×ÑÒ+Ø04×0DÑ0DÑ-ˆI :Ø×.Ñ.¨zÀzÓ[Ð[Ùr    c                ó´   € V P                   eJ   ^ RIHp V P                   w  rxp	T! YxY‘\        T;'       g    R4      \        T;'       g    R4      WE4       R# R# )zŠThe retained tool payload reaches the API observers of this exact admission only;
the shared viewer stream keeps its ID-correlated frames.N)Úpublish_api_tool_eventri   Útool)r©   rn   r¸   r+   )
rª   r³   Úcall_idÚ	tool_nameÚargsrQ   r¸   r«   r¥   r­   s
   &&&&&&    r   Ú_publish_api_toolÚTurnRunner._publish_api_toolË   sU   € ð ×ÑÒ+ÝGØ04×0DÑ0DÑ-ˆI :Ù" 9¸*Ü#& w§} }°"Ó#5´s¸9×;NÐ;NÈÓ7OÐQUö_ñ ,r    c                	óÆ  a aaaaa€ S P                   oSP                  '       d   R# R oSP                  ^ ,          o\        \        S P                  RR 4      RR 4      pVf   ^ RIHp V! 4       pSP                  SP                  VR4      pSP                  '       * ;'       d    VP                  V4      p\        SP                  4      ;'       d)    SP                  '       * ;'       d    \        4       '       * pV'       g
   V'       Ed    ^ RIHp S P                  P!                  SP"                  4      pV'       dØ   \        VRR4      ;'       g    \        \        VRR4      4      p	T;'       d    T	p
S P                  P%                  SP"                  Y(V'       d   R	MR
R7      w  r¼T! TSP"                  P&                  TSP(                  SP*                  e   V3R lMR VSP,                  SP.                  R7      oSSP0                  ^ &   V
Sn        S'       d   SP2                  '       d   SMR S3 Uu. uF  pVf   K	  VNK  	  upoR p\        SP"                  RR 4      \:        P<                  8H  oS'       g   S P>                  e   R VVVV 3R llpRR/R VVV VV3R lllpSVVV3#   \4         d!   p\6        P9                  RT4        R p?L¿R p?ii ; iu upi )NFÚconfigÚ	streaming)ÚStreamingConfig)ÚGatewayStreamConsumerÚSUPPORTS_MESSAGE_EDITINGTÚSUPPORTS_NATIVE_STREAMINGÚfallbackÚraise)Úon_missing_cursorc                 ó:   <€ S P                   P                  R4      # )Ú	__reset__)rÊ   )Úprogress_queueÚput)r˜   s   €r   rF   Ú3TurnRunner._setup_stream_consumer.<locals>.<lambda>ÿ   s   ø€  S×%7Ñ%7×%;Ñ%;¸NÔ%Kr    )re   r£   rÀ   ÚmetadataÚon_new_messageÚon_before_finalizeÚinitial_reply_to_idÚrun_still_currentz$Could not set up stream consumer: %srx   c               ó    € V ^8„  d   QhRRRR/# )r   ÚtextzOptional[str]r   r™   r   )r   s   "r   r   Ú7TurnRunner._setup_stream_consumer.<locals>.__annotate__  s   € ÷ .ñ . mð .¸ñ .r    c                óP  <€ SP                  4       '       g   R # \        S4      pV e    SP                  RRV /4      ;'       g    TpMS'       d   SP                  RRR /4       S F  pVP                  V 4       K  	  V e%   V'       d   \	        4       '       d   \        4       hR # R # )Nzmessage.deltarÔ   )Ú_run_still_currentr   rµ   Úon_deltar5   rV   )rÔ   Ú	deliveredÚsinkr˜   Údelta_sinksÚlocal_viewer_routerª   s   &  €€€€r   Ústream_delta_cbÚ:TurnRunner._setup_stream_consumer.<locals>.stream_delta_cb  s™   ø€ Ø×-Ñ-×/Ò/ÙÜ  Ó-�	ØÒ#Ø $× 7Ñ 7¸È&ÐRVÈÓ X× eÐ eÐ\e‘Iß'ð ×+Ñ+¨O¸fÀd¸^ÔLÛ'�DØ—M‘M $Ö'ñ (àÒ#¯YÔ:M×:OÒ:Oô
 ,Ó-Ð-ñ ;PÑ#r    Úalready_streamedc               ó$   € V ^8„  d   QhRRRRRR/# )r   rÔ   r+   rß   r   r   r™   r   )r   s   "r   r   rÕ   (  s'   € ÷ 	yñ 	y sð 	yÀð 	yÐRVñ 	yr    c               ó¨  <€ SP                  4       '       g   R # RpS'       dO   V'       gG   \        T ;'       g    R4      P                  4       '       d   RV RR/pSP                  RV4      '       * pSe<   SP	                  R 4       V'       g#   SP	                  V 4       SP	                  R 4       V'       d   R # Se.   V'       d   SP                  4        R # SP                  V 4       R # V'       g_   SP                  '       dK   \        T ;'       g    R4      P                  4       '       d    SP                  V SP                  R4       R # R # R # R # )NFri   rÔ   rß   zmessage.interimz+interim_assistant_callback scheduling error)
r×   r+   Ústriprµ   rØ   Úon_segment_breakÚon_commentaryÚ_status_adapterÚ_send_status_textÚ_status_thread_metadata)	rÔ   rß   Úunseenr´   r˜   rÜ   rª   Ústream_consumerÚsttss	   &$  €€€€€r   Úinterim_assistant_cbÚ?TurnRunner._setup_stream_consumer.<locals>.interim_assistant_cb(  s   ø€ Ø×)Ñ)×+Ò+ÙØˆFß!×*:¼sÀ4Ç:À:È2»×?TÑ?T×?VÒ?Vð " 4Ð);¸UÐC�Ø!×4Ñ4Ð5FÈÓPÔP�ØÒà—‘˜dÔ#ß'Ø—M‘M $Ô'Ø—M‘M $Ô'ßÙØÒ*ß6F�×0Ñ0Ö2ÈO×LiÑLiÐjnÖLoß%¨#×*=×*=Ð*=Ä#ÀdÇjÀjÈbÃ/×BWÑBW×BYÒBYØ×&Ñ& t¨S×-HÑ-HÐJwÖxñ CZÑ*=Ñ%r    )NNNF) r¡   Úmute_notification_replyÚstreaming_tts_consumer_holderr$   r    Úgateway.configrÂ   Úresolve_display_settingÚuser_configÚscheduled_heartbeatÚenabled_forr   Ú"interim_assistant_messages_enabledr5   Úgateway.stream_consumerrÃ   Ú_delivery_adapter_forrž   Ú_build_stream_consumer_configr£   rç   rË   Úevent_message_idr×   Ústream_consumer_holderÚstream_deltas_enabledrw   ÚloggerÚdebugr   r‰   r©   )rª   Úplatform_keyÚscfgrÂ   Úplat_streamingÚwant_stream_deltasÚwant_interim_messagesrÃ   re   Úsupports_incremental_streamÚconsumer_stream_deltasÚconsumer_cfgÚpause_typing_before_finalizeÚerrÚscrÝ   rë   r˜   rÛ   rÜ   ré   rê   s   f&               @@@@@r   Ú_setup_stream_consumerÚ!TurnRunner._setup_stream_consumerÖ   sµ  ý€ Ø�i‰iˆØ×&×&Ð&Ø*Ð*Øˆð ×0Ñ0°Õ3ˆÜ”w˜tŸ|™|¨X°tÓ<¸kÈ4ÓPˆØŠ<Ý6Ù"Ó$ˆDà×4Ñ4°S·_±_ÀlÐT_Ó`ˆØ!$×!8Ñ!8Ô8×]Ð]¸T×=MÑ=MÈnÓ=]Ðô "& c×&LÑ&LÓ!M÷ "?ð "?ÐVY×VmÑVmÔRm÷ "?ð "?Ü)<Ó)>Ô%>ð 	ç×!6Ð!6ðJÝIØŸ,™,×<Ñ<¸S¿Z¹ZÓH�ßä Ð)CÀTÓJ÷ Vð VÜ¤¨Ð1LÈeÓ TÓUð 0ð .@×-_Ð-_ÐD_Ð*ØAEÇÁ×AkÑAkØŸ
™
 D÷ 9N©*ÐSZð Bló BÑ>�Lñ '<Ø '°·±×1CÑ1CÈLØ!$×!<Ñ!<àPS×PbÑPbÒPnÕKÐtxà+GØ,/×,@Ñ,@ÐTW×TjÑTjô'�Oð 5D�C×.Ñ.¨qÑ1ð =S�OÔ9÷ $3°×7\×7\Ð7\‘ÐbfØñó
ñ�2ð ÷ ˆBñ ñ
ˆð ˆÜ$ S§Z¡Z°¸TÓBÄhÇnÁnÑTÐß˜$×.Ñ.Ò:÷.ó .ð&	yÈ÷ 	yö 	yð2  Ð1EÐG\Ð\Ð\øôq ô JÜ—‘ÐCÀS×IÑIûðJüò
s7   Ä2J0 Å J0 ÅJ0 Å4B#J0 È9KÉKÊ0KÊ;KËKc               ó   € V ^8„  d   QhRR/# ©r   r   r™   r   )r   s   "r   r   rš   F  s   € ÷ Vñ V¨tñ Vr    c                ó°  a aaa€ ^ RI Ho ^ RIHpHp S P
                  P                  '       g   S P                  4       '       g   R# \        \        SRR4      ;'       g    R4      oSR8X  g   SP                  R4      '       d   R# V! S4      pVVVV 3R lpV! VS P
                  P                  P                  S P
                  P                  VR	7       R# )
z±Credits / out-of-band notices (usage bands, depletion, restored) fire from the agent's
sync worker thread; hop onto the gateway loop. Fired-once latch lives on the cached agent.)Úrender_notice_line)Úis_diagnostic_noticeÚrender_notificationNÚkeyri   zcredits.window_limitzcredits.window.c                 óJ  <€  S! S4      p SP                  R 4      '       d   ^ RIHp V! V 4      p T '       dC   SP                  SP                  P                  SP                  P                  T 4      R4       R# R#   \         d    \        P                  RRR7        R# i ; i)zcredits.)Úportal_wordingzrender_notice_line failedT©Úexc_infoNz)notice_callback delivery scheduling error)Ú
startswithÚagent.plan_limitsr  rw   rû   rü   Ú	_scheduler    Ú_deliver_platform_noticer¡   rž   )Úliner  r  Únoticer  rª   s     €€€€r   ÚpresentÚ1TurnRunner._notice_callback_sync.<locals>.presentT  s�   ø€ ðÙ)¨&Ó1�Ø—>‘> *×-Ò-å@Ù)¨$Ó/�D÷ Ø—‘˜tŸ|™|×DÑDÀTÇYÁY×EUÑEUÐW[Ó\ð  _Jö  Kñ øô ô Ü—‘Ð8À4�ÔHÚðús   ƒA< ¢A< Á<"B"Â!B")rx   rñ   Ú
diagnostic)rˆ   r  Úgateway.warning_notificationsr  r  r¡   rí   Ú_status_liver+   r$   r  rž   rx   rñ   )rª   r  r  r  r  r  r  r  s   ff    @@r   Ú_notice_callback_syncÚ TurnRunner._notice_callback_syncF  s¨   û€ õ 	3ß[Ø�9‰9×,×,Ð,°D×4EÑ4E×4GÒ4GÙô ”'˜& %¨Ó,×2Ð2°Ó3ˆØÐ(Ô(¨C¯N©NÐ;L×,MÒ,MÙÙ)¨&Ó1ˆ
÷	Kð 	Kñ 	˜G¨d¯i©i×.>Ñ.>×.GÑ.GØ(,¯	©	×(=Ñ(=È*÷	Vr    c                ón  a aaaaaaa	a
a€ ^ RI HoHo S P                  o\        P
                  ! 4       o. o	\        P                  ! 4       o
S P                  oSRJ;'       d)    \        SP                  RR4      \        P                  8H  oR VVVVVV 3R lloR VV	V
V3R llpR VVVV	V
VV 3R	 llpW!3# )
u    (send, release): background-review messages ("ðŸ’¾ Memory updated") are held until the
adapter's post-delivery hook releases them after the main response lands.)Ú_interim_metadataÚ_non_conversational_metadataNrx   c               ó    € V ^8„  d   QhRRRR/# ©r   Úmessager+   r   r™   r   )r   s   "r   r   Ú:TurnRunner._make_bg_review_callbacks.<locals>.__annotate__o  s   € ÷ 	ñ 	˜Sð 	 Tñ 	r    c           
     ól  <€ S'       dT   S	eP   S	w  rpVP                   P                  V4      pVe*   VP                  P                  VR\	        V 4      /RR7       R # S
P                  4       '       dB   S
P                  V S! S! SP                  SP                  P                  R7      4      R4       R # R # )NrÔ   zreview.summary)r³   )rx   z+background_review_callback scheduling error)
r¦   rM   Úevent_streamÚpublishr+   r  ræ   rç   rž   rx   )r'  r«   r¥   Ú_generationÚliver#  r$  r˜   Úlocal_viewerÚownerrª   s   &    €€€€€€r   ÚdeliverÚ5TurnRunner._make_bg_review_callbacks.<locals>.delivero  s¦   ø€ ß Ò 1ð 6;Ñ2�	 {Ø ×)Ñ)×-Ñ-¨jÓ9�ØÒ#Ø×%Ñ%×-Ñ-¨j¸6Ä3ÀwÃ<Ð:PÐ]mÐ-ÔnÙØ× Ñ ×"Ò"Ø×&Ñ&ØÙ%Ñ&BÀ3×C^ÑC^Ðil×isÑis×i|Ñi|Ô&}Ó~ØAöñ #r    c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   r(  €  s   € ÷ 	!ñ 	!˜ñ 	!r    c                 óÌ   <€ SP                  4        S;_uu_ 4        \        S4      p SP                  4        R R R 4       X  F  pS! V4       K  	  R #   + '       g   i     L#; irC   )rŠ   ÚlistÚclear)Úqueuedr'  r0  ÚpendingÚpending_lockÚrelease_evts     €€€€r   ÚreleaseÚ5TurnRunner._make_bg_review_callbacks.<locals>.release€  sE   ø€ Ø�O‰OÔß’Ü˜g›�Ø—‘”÷ ó "�Ù˜Ö ó "÷ —ús   œAÁA#	c               ó    € V ^8„  d   QhRRRR/# r&  r   )r   s   "r   r   r(  ˆ  s   € ÷ 	ñ 	˜#ð 	 $ñ 	r    c                óŠ  <€ S'       d«   Se§   Sw  rpVP                   P                  V4      p\        P                  ! 4       ^x,           pVe]   \        P                  ! 4       V8  dC   VP                  P
                  P                  R4      V8X  d   \        P                  ! R4       K`  S! V 4       R # SP                  4       '       g   R # SP                  4       '       gG   S
;_uu_ 4        SP                  4       '       g   S	P                  V 4        R R R 4       R #  R R R 4       S! V 4       R #   + '       g   i     L; i)NÚexecution_generationgš™™™™™©?)
r¦   rM   ÚtimeÚ	monotonicr*  Ú	executionÚsleepr  Úis_setÚappend)r'  r«   r¥   r­   r-  Údeadliner0  r.  r/  r7  r8  r9  rª   s   &     €€€€€€€r   ÚsendÚ2TurnRunner._make_bg_review_callbacks.<locals>.sendˆ  sï   ø€ ß Ò 1ð
 5:Ñ1�	 zØ ×)Ñ)×-Ñ-¨jÓ9�ÜŸ>š>Ó+¨cÕ1�ØÒ'¬D¯NªNÓ,<¸xÔ,GØ×,Ñ,×6Ñ6×:Ñ:Ð;QÓRÐV`Ô`Ü—J’J˜tÖ$Ù˜Ô ÙØ×$Ñ$×&Ò&ÙØ×%Ñ%×'Ò'ß!’\Ø&×-Ñ-×/Ò/ØŸ™ wÔ/Ø÷ "‘\Ø/÷ "ñ �GÖ÷	 "—\ús   Ã,)D2Ä2E	)rˆ   r#  r$  r¡   Ú	threadingÚEventÚLockr©   r$   rž   r   r‰   )rª   r:  rF  r#  r$  r˜   r0  r.  r/  r7  r8  r9  s   f  @@@@@@@@@r   Ú_make_bg_review_callbacksÚ$TurnRunner._make_bg_review_callbacksc  sŽ   ÿù€ ÷ 	PØ�i‰iˆÜ—o’oÓ'ˆØˆÜ —~’~Ó'ˆà×$Ñ$ˆØ DÐ(×dÐd¬W°S·Z±ZÀÈTÓ-RÔV^×VdÑVdÑ-dˆ÷	õ 	÷"	!ó 	!÷	ö 	ð. ˆ}Ðr    c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rš   ¢  s   € ÷ ?ñ ?¸Dñ ?r    c                óx  € \        \        V R/ 4      ;'       g    / 4      p\        V R/ 4      ;'       g    / P                  4        F/  w  r4VP                  V4      V8X  g   K  VP	                  VR4       K1  	  \        VP                  R4      ;'       g    / 4      pVP                  V4       W n        WPn        R# )zóMerge, never overwrite: init-time request overrides (e.g. a custom provider's extra_body)
must survive every reused-agent turn. Drop only the PREVIOUS turn's routing overrides before
layering this turn's, so stale per-turn values never linger.Úrequest_overridesÚ_gateway_turn_request_overridesN)rL   r$   ÚitemsrM   Úpoprq   rO  rP  )rO   Ú
turn_routeÚ	overridesr  r…   Úturn_overridess   &&    r   Ú_merge_turn_request_overridesÚ(TurnRunner._merge_turn_request_overrides¡  s    € ô
 œ Ð(;¸RÓ@×FÐFÀBÓGˆ	Ü" 5Ð*KÈRÓP×VÐVÐTV×]Ñ]Ö_‰JˆCØ�}‰}˜SÓ! UÖ*Ø—‘˜c 4Ö(ñ `ô ˜jŸn™nÐ-@ÓA×GÐGÀRÓHˆØ×Ñ˜Ô(Ø"+ÔØ0>Ö-r    c                ó	  € V P                   pV P                  pVP                  Vn        VP                  P
                  Vn        VP                  Vn        VP                  ^ ,          f   VP                  '       d!   VP                  ;'       g    VP                  MRVn        VP                  '       d   VP                  MRVn        V P                   e#   V P"                  Vn        V P$                  Vn        VP&                  P(                  '       g   V P                   e   VP*                  MRVn        WAn        V'       d   TMRTn        ^ RIHp	 VP6                  V	! V 4      '       d   V P8                  MV P:                  uVn        Vn        RVn         V P                   e.   ^ RI!H"p
H#p V
PI                  4       e   V! WP                   V4       V	! V 4      '       d   V PJ                  MRTn&        VPN                  Vn(        W8PR                  uVn*        Vn+        V PY                  W4       ^ RI-H.p V! WP_                  VP`                  4      VPb                  R7       V Pe                  4       w  Vn3        pVPh                  '       d�   VP`                  '       d~   \k        \m        VPh                  4      RR4      e3   VPh                  Po                  VP`                  W×Pp                  R7       M)\k        VPh                  RR4      pVe   WÞVP`                  &   VP                  PI                  R	4      ;'       g    / PI                  R
4      p\s        V\t        4      '       d   V'       d   RMRpV'       d   \w        V4      Py                  4       MRVn=        V P|                  Vn?        VP€                  VnA        VP„                  '       d+   RVn        RVn        RVn        RVn        RVn        RVnA        WP†                  ^ &   V P                   e$   V P                   w  pppVP‰                  VVV4       V P‹                  W4       VPŒ                  VPŽ                  uVnH        VnI        \k        VRR4      VP”                  ^ &   R# )u\   Per-message state (callbacks, reasoning, voice route) â€” never baked into the cached agent.N©Úlocal_viewer_turn)Úapi_executionÚwire_api_observers)Úarm_surface_turn)Ú
voice_turnÚregister_post_delivery_callback)r­   Ú_post_delivery_callbacksÚdisplayÚmemory_notificationsÚonÚoffFÚtools)Kr¡   r    rñ   Ú_notification_configrž   rx   Ú_notification_platformÚprogress_callbackÚtool_progress_callbackÚ_voice_ack_guildÚ_native_slack_task_cardsÚnative_tool_start_callbackÚvoice_ack_callbackÚtool_start_callbackÚnative_tool_complete_callbackÚtool_complete_callbackr©   Úcombined_tool_start_callbackÚcombined_tool_complete_callbackÚ
_hooks_refÚloaded_hooksÚ_step_callback_syncÚstep_callbackÚstream_delta_callbackÚinterim_assistant_callbackÚgateway.run_turn_progressrZ  Ú_status_callback_syncÚ_local_notice_callback_syncr   Ústatus_callbackÚnotice_callbackÚreasoning_callbackrn   r[  r\  rM   Ú!_local_notice_clear_callback_syncÚnotice_clear_callbackÚ_event_callback_syncÚevent_callbackÚ_service_tierÚreasoning_configÚservice_tierrV  Úgateway.session_surfacer]  Ú#_consume_pending_turn_sidecar_notesÚsession_keyr^  rK  Úbackground_review_callbackrå   r$   r   r_  Úrun_generationrK   r   r+   Úlowerrb  Ú_clarify_callback_syncÚclarify_callbackÚ_thinking_enabledÚthinking_progressrí   Úagent_holderÚadopt_agentÚ_attach_session_title_callbackÚprocess_task_idÚprocess_baselineÚ_gateway_turn_process_task_idÚ_gateway_turn_process_baselineÚtools_holder)rª   rO   rS  r„  rÝ   rë   r  r˜   r—   rZ  r[  r\  r]  Ú
bg_releaseÚpdcÚ	mem_notifr«   r¬   r­   s   &&&&&&&            r   Ú_wire_turn_agent_callbacksÚ%TurnRunner._wire_turn_agent_callbacks¯  sÂ  € ð �i‰iˆØ—‘ˆØ%(§_¡_ˆÔ"Ø'*§z¡z×':Ñ':ˆÔ$ð (+×'<Ñ'<ˆÔ$ð
 ×$Ñ$ QÕ'Ò3°s×7S×7SÐ7Sð ×+Ñ+×EÐE¨s×/EÑ/EøØZ^ð 	Ô!ð MP×Lh×LhÐLh s×'HÒ'HÐnrˆÔ$Ø×ÑÒ+Ø(,×(IÑ(IˆEÔ%Ø+/×+OÑ+OˆEÔ(Ø:=¿.¹.×:U×:UÐ:UÐY]×YmÑYmÒYy˜c×5Ò5ð  AEˆÔØ&5Ô#ßCXÑ+?Ð^bˆÔ(Ý?Ø7:×7PÑ7PÙ0AÀ$×0GÒ0GˆD×,Ò,ÈT×MgÑMgð 	5ˆÔ˜uÔ4à#'ˆÔ Ø×ÑÒ+ßRØ× Ñ Ó"Ò.á" 5×*>Ñ*>Ð@UÔVáPaÐbf×PgÒPg d×&LÒ&LÐmqˆÔ#Ø"×7Ñ7ˆÔØ5E×G[ÑG[Ð2ˆÔ Ô 2Ø×*Ñ*¨5Ô=Ý<ñ 	˜× JÑ JÈ3Ï?É?Ó [Ðhk×hvÑhvÕwØ7;×7UÑ7UÓ7WÑ4ˆÔ(¨*ð ××Ð 3§?§? ?Ü”t˜C×/Ñ/Ó0Ð2SÐUYÓZÒfØ×#Ñ#×CÑCÀCÇOÁOÐU_×l~Ñl~ÐCÕä˜c×1Ñ1Ð3MÈtÓT�Ø’?Ø+5˜Ÿ™Ñ(ð —_‘_×(Ñ(¨Ó3×9Ð9°r×>Ñ>Ð?UÓVˆ	Ü�i¤×&Ò&ß )™¨uˆIß?H¤S¨£^×%9Ñ%9Ô%;ÈdˆÔ"Ø!%×!<Ñ!<ˆÔð #&×"7Ñ"7ˆÔØ×&×&Ð&ð ,0ˆEÔ(Ø(,ˆEÔ%Ø+/ˆEÔ(à*.ˆEÔ'Ø/3ˆEÔ,Ø&+ˆEÔ#Ø#×Ñ˜ÑØ×ÑÒ+Ø.2×.BÑ.BÑ+ˆI�x Ø×!Ñ! (¨J¸Ô>à×+Ñ+¨EÔ7ð UX×TgÑTgÐil×i}Ñi}ÐQˆÔ+¨UÔ-QÜ% e¨W°dÓ;ˆ×Ñ˜Ór    c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r†   r+   Úplaceholderz
str | NoneÚreopenr   r   r   )r   s   "r   r   rš     s*   € ÷ ñ °Cð Àjð Ðaeð Ðrvñ r    c                óÖ  € V P                  4       pV'       d   \        VRR4      '       g   R# Rp VP                  W!VR7      p\        V\        4      '       d   Vw  re\        VR4      '       g   R# VP                  ^
R7      pV'       g   \        P                  RV4       \        V4      #   \        \        3 d+   pTe   RTR	&   \        P                  R
Y4        Rp?R# Rp?ii ; i)a  Native-streaming platforms (e.g. WeCom): an interrupting interaction (approval or clarify
prompt) must finalize the current stream first, or post-interaction output keeps updating the
OLD bubble above the prompt. Runs on the agent thread; the consumer serializes via its queue.Ú_use_native_streamingFTN)r†   rŸ  rQ   ©ÚtimeoutuX   %s boundary failed to close stream properly â€” prompt may still appear in typing bubbleÚ	cancelledz#%s boundary timed out or failed: %s)Ú_stream_consumerr$   Úclose_for_approval_promptrK   ÚtupleÚhasattrrQ   rû   Úwarningr   ÚTimeoutErrorrw   )	rª   r†   rž  rŸ  r  Úcancelled_flagÚboundaryÚokr  s	   &&&&     r   Ú_close_native_stream_boundaryÚ(TurnRunner._close_native_stream_boundary  sÕ   € ð ×"Ñ"Ó$ˆß”w˜rÐ#:¸E×BÒBÙØˆð	Ø×3Ñ3°KÐW]Ð3Ó^ˆHä˜(¤E×*Ò*Ø+3Ñ(�Ü˜8 X×.Ò.ÙØ—‘¨�Ó,ˆBßÜ—‘ð?Ø@Fôô ˜“8ˆOøÜœiÐ(ô 	ØÒ)Ø.2�˜{Ñ+Ü�N‰NÐ@À&ÔNÝûð		ús#   ±?B- Á2B- Â B- Â-C(Â>C#Ã#C(c           	   ‹  	ó   "  € V P                   P                  P                  ! R/ VB G R j  x€L
 pV P                  eL   VP                  '       d:   T P                  w  rEp^ RIHp VP                  WVVVP                  V R4      R7       V#  L_5i)N©Úlocal_viewer_eventsÚclarify©Ú	timeout_sr   )	r¡   rå   Úsend_clarifyr©   ÚsuccessÚgatewayr²  Úregister_clarifyÚprompt_timeout_s)rª   ÚentryÚkwargsrQ   r«   r¥   r­   r²  s   &&,     r   Ú_send_shared_clarifyÚTurnRunner._send_shared_clarify   s�   é € Ø—y‘y×0Ñ0×=Ò=ÑGÀÑG×GˆØ×ÑÒ+°··°Ø04×0DÑ0DÑ-ˆI :Ý3Ø×&Ñ& z¸uØ1D×1UÑ1UÐVZÐ\eÓ1fð 'ô hàˆñ Hùs   ‚*B¬B­#BÁ<Bc               ó   € V ^8„  d   QhRR/# )r   r   rL   r   )r   s   "r   r   rš   )  s   € ÷ &ñ &°4ñ &r    c           	     ó¶  € ^ RI HpHpHp ^ RIHpHp \        4       '       d   ^ RIH	p V! 4       # ^ RI
Hp V! V 4      '       d   ^ RIHp	 V	! W4      # / p
RV
RR/p\        V4      ^,
          p\        \        V P                   R	R
4      RR
4      pV\"        P$                  8X  d   RMR\'        R4       2p\)        V4       F—  w  ppVR,           V 2pV P+                  VVR,          \-        VR,          4      Wü8H  R7      w  ppVV8X  d	   RVR&    V# V'       g(   VW#V39   pTP/                  V'       d   RMRVR7        V# VV8X  d   R
MTV
VR,          &   K™  	  V# )u  Answer the clarify tool's questions (clarify_tool's synchronous contract): one card per
question, stop at the first the user never answers. The stream/typing re-arm waits for the
last question â€” between two cards it only opens a bubble the next boundary closes.)ÚUNDELIVEREDÚUNDELIVERED_DECLINEDÚUNDELIVERED_NO_SURFACE)Ú	CANCELLEDÚSKIPPED)Úfinite_clarify_reply)Úclarify_batch_turn)Úask_clarify_batchÚanswersÚoutcomeÚ	submittedrž   Nrx   ri   Ú
zgateway.clarify.skip_hintÚquestionÚchoicesÚmulti_select)Úrearmr¤  ÚundeliveredÚ	timed_out)rÊ  r  Úqid)Ú(gateway.run_turn_runner_clarify_deliveryrÁ  rÂ  rÃ  Útools.clarify_gatewayrÄ  rÅ  r5   r4   rÆ  Úgateway.session_cli_turnrÇ  Úgateway.session_clarify_batchrÈ  Úlenr$   r¡   r   r‰   r   Ú	enumerateÚ_ask_clarify_questionr   rq   )rª   Ú	questionsrÁ  rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  ÚreplyÚlastrx   ÚhintÚindexr»  rÍ  ÚrawÚansweredrÑ  s   &&                   r   rŒ  Ú!TurnRunner._clarify_callback_sync)  sj  € ÷ 	wÑvß<Ü× Ò õ DÙ'Ó)Ð)Ý?Ù˜d×#Ò#åGÙ$ TÓ5Ð5Ø"$ˆØ!*¨G°YÀÐ LˆÜ�9‹~ Õ!ˆô œ7 4§9¡9¨h¸Ó=¸zÈ4ÓPˆØ¤§¡Ô/‰r°r¼!Ð<WÓ:XÐ9YÐ5ZˆÜ% iÖ0‰LˆE�5Ø 
Õ+Ð,¨T¨FÐ3ˆHØ ×6Ñ6Ø˜% 	Õ*¬D°°~Õ1FÓ,GÈuÉ}ð 7ó ^‰MˆC�à�iÔØ#.��iÑ Øð ˆ÷ ð " kÐI_Ð%`Ñ`�Ø—‘·k¡]À{Ð[^�Ô_Øàˆð -0°7¬N¡DÀˆG�E˜%•LÓ!ñ 1ð ˆr    c               ó    € V ^8„  d   QhRRRR/# )r   rÐ  r   r   ztuple[str, bool]r   )r   s   "r   r   rš   Q  s   € ÷ R"ñ R"ÈDð R"Ð\lñ R"r    c           	     ór  a aaa€ ^ RI HpHpHo ^ RIHp ^ RIpS P                  oSP                  '       g   VR3# SP                  ;'       g    Rp	VP                  4       P                  R,          p
V'       d   \        V4      MRp\        SP                  WV
V	SP                  R7      oVV VV3R lpVP!                  W©W\#        V4      R	7      pS P%                  R
\'        R4      RR7       \)        \*        4      ;_uu_ 4        SP                  P-                  SP                  4       RRR4       \/        S P1                  4       RR4      p \3        V4      '       d
   V! RR7       S P9                  S P:                  ! T3/ SB R4      pT! YêY—TR7      w  ppS P<                  e>   S P<                  w  pppTP>                  T,          P@                  PC                  TT4       T'       gb   \/        \E        SP                  4      RR4      p\3        T4      '       d-   S P9                  T! SP                  T
\G        4       4      R4       TT3# T'       dP   S P1                  4       pTe    TPI                  4         SP                  PK                  SP                  4       TT3# TT3#   + '       g   i     EL‡; i  \*         d    \4        P7                  RRR7        ELyi ; i  \*         d    \4        P7                  RRR7        L�i ; i  \*         d    \4        P7                  RRR7        TT3# i ; i)z›One card: register, send, wait, then retire it (no answer) or re-arm (answer).
Returns ``(response, answered)``; the caller decides what "no answer" means.)rÃ  Ú_clarify_send_then_waitÚtext_fallback_coro)Úclarify_gatewayNFri   :Né
   N)r£   rÍ  rÎ  Ú
clarify_idrˆ  rÎ   c                 óZ   <€ S! SP                   3/ SB p V f   R# SP                  V R4      # )zWSchedule the plain-text prompt when the native card cannot render; None = no such path.Nz(Clarify text fallback failed to schedule)rå   r  )Úcoror˜   rª   Úsend_kwargsræ  s    €€€€r   Ú_text_fallbackÚ8TurnRunner._ask_clarify_question.<locals>._text_fallbacke  s3   ø€ á% c×&9Ñ&9ÑI¸[ÑIˆDØš<�4Ðm¨T¯^©^¸DÐBlÓ-mÐmr    )ré  rˆ  rÍ  rÎ  rÏ  ÚClarifyz)gateway.clarify.native_stream_placeholderT)rŸ  Úflush_pending_syncg      @r¢  z2Stream-consumer flush before clarify prompt failedr  zClarify send failed to schedule)ré  rˆ  Úclarify_modrÆ   Úretire_clarify_cardz&Clarify card retire failed to schedulez/request_reopen_seed after clarify answer failedz2resume_typing_for_chat after clarify answer failed)&rÔ  rÃ  rå  ræ  re  rç  Úuuidr¡   rå   rˆ  Úuuid4Úhexr4  rL   Ú_status_chat_idrç   Úregisterr   r®  r   r   rw   Úpause_typing_for_chatr$   r¥  r%   rû   rü   r  r½  r©   r¦   ÚcontrolsÚsnapshotr   r-   Úrequest_reopen_seedÚresume_typing_for_chat)rª   rÍ  rÎ  rÏ  rÐ  rÃ  rå  rñ  ró  rˆ  ré  rí  r»  ÚflushÚfutÚresponserá  r«   r¥   r­   Úretirer  r˜   rì  ræ  s   f&&&&                 @@@r   rÚ  Ú TurnRunner._ask_clarify_questionQ  sÿ  û€ ÷	Qñ 	Qå8ÛØ�i‰iˆØ×"×"Ð"ð *¨5Ð0Ð0Ø—o‘o×+Ð+¨ˆØ—Z‘Z“\×%Ñ% cÕ*ˆ
ß#*”$�w”-°ˆÜØ×'Ñ'°(ÐXbØ#¨c×.IÑ.Iô
ˆ÷
	nð 	nð ×$Ñ$Ø!ÀXÜ˜lÓ+ð %ó 
ˆð 	×*Ñ*¨9´aÐ8cÓ6dÐmqÐ*Ôrô ”i× Õ Ø×Ñ×5Ñ5°c×6IÑ6IÔJ÷ !ô
 ˜×-Ñ-Ó/Ð1EÀtÓLˆð	^Ü˜�ŠÙ˜cÕ"ð �n‰nØ×%Ò% eÑ;¨{Ñ;Ø-ó
ˆñ 5Ø°KØ#ô%Ñˆ�(ð ×ÑÒ+Ø04×0DÑ0DÑ-ˆI�z :Ø×Ñ˜zÕ*×3Ñ3×<Ñ<¸ZÈÔT÷ ô œT #×"5Ñ"5Ó6Ð8MÈtÓTˆFÜ˜×ÒØ—‘Ù˜3×.Ñ.°
Ô<SÓ<UÓVØ<ô>ð" ˜Ð!Ð!÷ ð ×&Ñ&Ó(ˆBØŠ~ðcØ×*Ñ*Ô,ðbØ×#Ñ#×:Ñ:¸3×;NÑ;NÔOð ˜Ð!Ð!ˆx˜Ð!Ð!÷c !× Ð ûô ô 	^Ü�L‰LÐMÐX\ˆL×]ð	^ûôD !ô cÜ—L‘LÐ!RÐ]a�LÖbðcûô ô bÜ—‘ÐQÐ\`�ÕaØ˜Ð!Ð!ðbúsB   Ä&J)ÅJ= É+K& É<%L Ê)J:	Ê="K#Ë"K#Ë&"LÌ
LÌ"L6Ì5L6c               ó    € V ^8„  d   QhRRRR/# ©r   Úapproval_datarL   r   r™   r   )r   s   "r   r   rš   ¥  s   € ÷ 	jñ 	j°4ð 	j¸Dñ 	jr    c           
     	ó$  € V P                   e!   V P                   w  r#pVP                  W44       V P                  V4       V P                   eC   ^ RIHp XP                  XXV P                  P                  VVP                  V R4      R7       R # R # )Nr±  Úapprovalr´  )	r©   Úcheck_approval_generationÚ_render_approval_syncr¸  r²  Úregister_approvalr¡   rˆ  rº  )rª   r  r«   r¥   r­   r²  s   &&    r   Ú_approval_notify_syncÚ TurnRunner._approval_notify_sync¥  s‡   € Ø×ÑÒ+Ø04×0DÑ0DÑ-ˆI :Ø×/Ñ/°
ÔGà×"Ñ" =Ô1Ø×ÑÒ+Ý3Ø×'Ñ'¨
°JÀÇ	Á	×@UÑ@UÐWdØ2E×2VÑ2VÐW[Ð]gÓ2hð (ö jñ ,r    c               ó    € V ^8„  d   QhRRRR/# r  r   )r   s   "r   r   rš   °  s"   € ÷ _Cñ _C°4ð _C¸Dñ _Cr    c                ó€  € ^ RI HpHpHpHp ^ RIHp V P                  pVP                  pVP                  VP                  4       V P                  R4       V! VP                  RR4      4      p	VP                  R4      ;'       g    \        4       p
R UUu/ uF  w  r¼W±P                  W¼4      bK  	  ppp\        \        V4      4      '       dø    T P!                  VP"                  ! R RVP                  RT	R	VP$                  ;'       g    RRV
R
VP&                  /VB R4      pVf   \)        R4      hV! V^R7      pVR8X  d)   V! WV	\+        VP-                  ^ R7      RR4      R7       R# VR8X  d   \.        P1                  R4       R# VR8X  d!   \.        P1                  R4       \3        R4      h\.        P1                  R4       V! Wš\+        VRR4      3/ VB p / VP&                  ;'       g    / CRR/CpV P!                  VP7                  VP                  VV! V4      R7      R4      pVe    VP-                  ^R7       V! WV	RR7       R# R# u uppi   \2         d    h \4         d!   p\.        P1                  RT4        Rp?LÂRp?ii ; i  \4         d"   p\.        P9                  RT4        Rp?R# Rp?ii ; i)!z­Send the approval request from the agent thread: the adapter's interactive button
approvals (``send_exec_approval``) when available, else plain text with ``/approve`` steps.)Ú_approval_send_outcomeÚ_format_exec_approval_fallbackr#  Ú_redact_approval_command)Úregister_timeout_noticeÚApprovalÚcommandri   ÚdescriptionTr£   rˆ  rÎ   z#send_exec_approval scheduling errorNz$send_exec_approval: loop unavailabler¢  ÚsentÚ
message_id)r  Úcard_message_idÚ	ambiguousu{   Button-based approval send timed out â€” treating as possibly-delivered (no re-send; the prompt stays armed for a late tap)Údeclinedu‘   Button-based approval DECLINED by the connector's egress guard â€” not falling back to text (the destination is not approved for this connection)zGexec approval undeliverable: connector egress declined this destinationzHButton-based approval failed (send returned error), falling back to textz6Button-based approval failed, falling back to text: %sÚtyped_command_prefixÚ/Úis_approval_prompt)rÎ   z#Approval text-send scheduling errorz#Failed to send approval request: %s))Úallow_permanentT)Úallow_sessionT)Úsmart_deniedFr   )rˆ   r  r  r#  r  Ú'gateway.run_turn_runner_approval_settler  r¡   rå   rø  rö  r®  rM   r   r(   r   r  r#   rˆ  rç   rp   r$   rQ   rû   r©  r_   rw   rF  r;   )rª   r  r  r  r#  r  r  r˜   re   ÚcmdÚdescÚkÚdÚflagsrþ  rÊ  ÚeÚmsgrÎ   s   &&                 r   r  Ú TurnRunner._render_approval_sync°  sê  € ÷ 	Dó  	DÝSØ�i‰iˆØ×%Ñ%ˆð 	×%Ñ% c×&9Ñ&9Ô:Ø×*Ñ*¨:Ô6á& }×'8Ñ'8¸ÀBÓ'GÓHˆØ× Ñ  Ó/×KÐKÔ3IÓ3Kˆñ 9Fô  Gñ  9F±°�×%Ñ% aÓ+Ò+ñ  9Fˆñ  Gä)¬$¨w«-×8Ò8ð<\Ø—n‘nØ×.Ò.ñ Ø #× 3Ñ 3ðØ=@ðØNQÏoÉo×NcÐNcÐacðà$(ðà36×3NÑ3NðàRWñð :ó�ð ’;Ü&Ð'MÓNÐNÙ0°¸bÔA�Ø˜fÔ$ñ ,Ø°SÜ(/°·
±
À1°
Ó0EÀ|ÐUYÓ(Zõ\ñ Ø˜kÔ)ô —N‘Nð6ôñ
 Ø˜jÔ(ô —N‘NðKôô 0ð+óð ô —‘ÐiÔjñ -¨S¼ÀÐI_ÐadÓ8eÑoÐinÑoˆð	Cð [˜3×6Ñ6×<Ð<¸"ÐZÐ?SÐUYÑZˆHØ—.‘.Ø—‘˜S×0Ñ0°#Ñ@QÐRZÓ@[�Ó\ð  _DóˆCð ŠØ—
‘
 2�
Ô&ñ (¨ÀSÐZ^×_ñ	 ùóU Gøôt )ô ð Üô \Ü—‘ÐWÐYZ×[Ñ[ûð\ûô" ô 	CÜ�L‰LÐ>À×BÒBûð	CúsV   ÂIÃ9I ÄA I Å-I Æ<I ÇJ Ç1AJ ÉJÉ-JÉ.J	Ê	JÊJ=ÊJ8Ê8J=c           	     	ód  € ^ RI HpHpHpHp V P
                  p^ RIHp VP                  4       p	V	e�   V	R,          e’   ^ RI Hp V	R,          p
V
'       d
   V
R,          MRpV	P                  R4      '       dN   \        V\        4      '       d8   VP                  R4      R8X  d"   ^ R	IHp \        V
4      p
V! W©R
,          V4       V
RV! V
4      3# V! VP                  VP                  V! VP                   4      R7      w  rÞV'       Ed    \#        VRR4      VP$                  8X  Ed   V! V\#        VRR4      4      p\#        V P&                  RR4      pVf   / ;pV P&                  n        WýJd    VP                  VP*                  ^ 4      ^,           ;pVVP*                  &   V\,        8¼  d   \.        P0                  M\.        P2                  pT! RVP*                  \5        V4      \5        V4      TV\,        8¼  d   RMR4       \7        V4      pMVP9                  VP*                  R4       WÞV! V4      3# )r1   )Ú_build_gateway_agent_historyÚ_collect_history_media_pathsÚ_message_timestamps_enabledÚ_select_cached_agent_history©r[  NÚhistory)r+  Úresume_unansweredÚroleÚuser)Úadopt_unanswered_turnÚcontent)Úchannel_promptÚinject_timestampsr¥   Ú_session_messagesÚ_transcript_lag_streaksz±Persisted transcript lagged live cached history for session %s (disk=%d, memory=%d, consecutive_turns=%d); preserving live conversation context (possible FTS write corruption)%szN; state.db is not receiving this session's writes and needs operator attentionri   éÿÿÿÿ)rˆ   r*  r+  r,  r-  r¡   rn   r[  rM   rK   rL   Úagent.session_persistencer3  r4  r/  r5  rñ   r$   r¥   r    r8  rˆ  Ú _TRANSCRIPT_LAG_ESCALATION_TURNSrû   r;   r©  rØ  r   rR  )rª   rO   Úreused_cached_agentr*  r+  r,  r-  r˜   r[  rs   r/  Útailr3  rP   Úobserved_group_contextÚselectedÚstreaksÚstreakÚlogs   &&&                r   Ú_load_turn_historyÚTurnRunner._load_turn_history  sê  € ÷	
ó 	
ð �i‰iˆÝ:Ø×ÑÓ!ˆØŠ?˜s 9�~Ò9Ý@Ø˜)•nˆGß")�7˜2–;¨tˆDØ�w‰wÐ*×+Ò+´
¸4Ä×0FÒ0FÈ4Ï8É8ÐTZÓK[Ð_eÔKeõ LÜ˜w›-�Ù% g°9­~¸uÔEØ˜DÑ">¸wÓ"GÐGÐGñ
 1MØ�K‰K¨×(:Ñ(:ÑNiÐjm×jyÑjyÓNzô1
Ñ-ˆ÷ Ð¤7¨5°,ÀÓ#EÈÏÉÕ#WÙ3°MÄ7È5ÐReÐgkÓClÓmˆHô ˜dŸl™lÐ,EÀtÓLˆGØŠØACÐC�˜$Ÿ,™,Ô>ØÓ,Ø4;·K±KÀÇÁÐQRÓ4SÐVWÕ4WÐW�˜ §¡Ñ1Ø&,Ô0PÔ&P”f—l’lÔV\×VdÑVd�ÙðMð —O‘O¤S¨Ó%7¼¸X»ÈàÔ!AÔAñ eØGIôô !<¸HÓ E‘à—‘˜CŸO™O¨TÔ2àÑ6RÐS`Ó6aÐaÐar    c               ó    € V ^8„  d   QhRRRR/# )r   Úattrr+   r   r™   r   )r   s   "r   r   rš   L  s   € ÷ 6ñ 6¨#ð 6°$ñ 6r    c                ó0  € V P                   p\        V P                  VR4      pV'       d@   VP                  '       d.   VP                  V9   d   VP	                  VP                  R4      MRpV'       d"   VR,           VP
                  ,           Vn        R# R# )z¤Consume a one-shot per-session note (model switch, /reload-skills) into the NEXT user
message. Nothing hits the transcript out-of-band, so alternation stays intact.Nú

)r¡   r$   r    rˆ  rR  r'  )rª   rF  r˜   ÚnotesÚnotes   &&   r   Ú_prepend_pending_noteÚ TurnRunner._prepend_pending_noteL  sk   € ð �i‰iˆÜ˜Ÿ™ d¨DÓ1ˆß38¸S¿_¿_¸_ÐQT×Q`ÑQ`ÐdiÔQiˆu�y‰y˜Ÿ™¨$Ô/ÐosˆßØ �-¨#¯+©+Õ5ˆCŽKñ r    c               ó   € V ^8„  d   QhRR/# r/   r   )r   s   "r   r   rš   U  s   € ÷ oñ o¨$ñ or    c                óˆ   € \        \        V P                  P                  V P                  P
                  4      RR4      4      # )u”   Interactive platforms report the restore and ask what next; event platforms (webhook,
API server) continue the work â€” nobody is present to answer.Úinteractive_resumeT)r   r$   r    rö   r¡   rž   )rª   s   &r   Ú_resume_note_interactiveÚ#TurnRunner._resume_note_interactiveU  s3   € ô ”G˜DŸL™L×>Ñ>¸t¿y¹y×?OÑ?OÓPÐRfÐhlÓmÓnÐnr    c                ó.  € ^ RI HpHpHpHpHp V P                  pVP                  p^ RIH	p	 V	! VP                  4      P                  R4      p
V
e   Ve   TMVP                  pTpW§n        V P                  R4       V! 4       pV! V! VP                  4      VR7      pRpVP                  '       dZ   \!        \"        4      ;_uu_ 4        V P$                  P&                  P(                  P                  VP                  4      pRRR4       VRJ;'       d    \+        VRR4      pV'       d   \+        VR	R4      ;'       g    R
MRpT;'       d    V! \+        VRR4      VR7      pV'       d=   V'       g	   V'       d-   V! VVP                  V P-                  4       R7      w  Vn        pMQV'       dJ   VR,          P                  R4      R8X  d-   V'       d%   VP                  pRVP                  ,           Vn        V P                  R4       V
e   Xp\/        VP                  \0        4      '       dG   VP                  P3                  4       '       g'   V'       d   V! VRV P-                  4       R7      Vn        W‡P4                  3#   + '       g   i     EL‰; i)zîPrepend recovery/notice guidance to ``ctx.message``.

Returns (persist_user_message_override, persist_user_timestamp_override): real user text is
kept separate from API-only recovery guidance so stale guidance never replays as user text.
)Ú_auto_continue_freshness_windowÚ_is_fresh_gateway_interruptionÚ_last_transcript_timestampÚ_prepare_resume_pending_messageÚbuild_resume_recovery_note©Úcli_turnÚapi_textNÚ_pending_model_notes)Úwindow_secsÚresume_pendingFÚresume_reasonÚrestart_timeoutÚlast_resume_marked_at)Úinteractiver1  r¹   zù[System note: A new message has arrived. The conversation history contains pending tool outputs from an interrupted turn. IGNORE those pending results. Address the user's NEW message below FIRST. Do NOT re-execute old tool calls from the history.]

Ú_pending_skills_reload_notesri   r9  )rˆ   rS  rT  rU  rV  rW  r¡   Úpersist_user_messagerÖ  rY  Úinbound_message_idrM   r'  rK  r/  rˆ  r   rw   r    Úsession_storeÚ_entriesr$   rP  rK   r+   râ   Úpersist_user_timestamp)rª   rP   rS  rT  rU  rV  rW  r˜   Úpersist_overriderY  rZ  Ú
clean_textÚwindowÚinterruption_is_freshr»  r]  r^  Úmark_is_freshs   &&                r   Ú_prepare_turn_messageÚ TurnRunner._prepare_turn_messageZ  s+  € ÷	
õ 	
ð �i‰iˆØ*-×*BÑ*BÐÝ5Ù˜C×2Ñ2Ó3×7Ñ7¸
ÓCˆØÒð .>Ò-IÑ)ÈsÏ{É{ˆJØ)ÐØ"ŒKØ×"Ñ"Ð#9Ô:ñ
 1Ó2ˆÙ >Ñ?YÐZ]×ZeÑZeÓ?fÐtzÔ {ÐØˆØ�?�?ˆ?Üœ)×$Õ$ØŸ™×2Ñ2×;Ñ;×?Ñ?ÀÇÁÓP�÷ %à dÐ*×VÐV¬w°uÐ>NÐPUÓ/VˆßXfœ ¨¸Ó>×SÐSÐBSøÐlpˆð '÷ 
ð 
Ñ+IÜ�EÐ2°DÓ9Àvô,
ˆ÷ ×4¿á,KØ˜sŸ{™{¸×8UÑ8UÓ8Wô-Ñ)ˆCŒKÑ)÷ ˜}¨RÕ0×4Ñ4°VÓ<ÀÔF×K`Ø"Ÿ{™{ÐðWð —+‘+õ	ð ŒKð 	×"Ñ"Ð#AÔBØÒØ)Ðô �c—k‘k¤3×'Ò'°·±×0AÑ0A×0CÒ0CÏÙ4°]ÀBÐTX×TqÑTqÓTsÔtˆCŒKØ×!;Ñ!;Ð;Ð;÷A %×$Ð$ús   Ã	:JÊJ	c                ó¨  € V P                   p^ RIHp VP                  4       pVe/   \	        VP                  R4      \
        4      '       d
   VR,          # V P                  P                  VP                  4      pV'       g   VP                  #  ^ RI
Hp V! VP                  V4      w  rgV'       d!   \        P                  R\        V4      V4       \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   V#  VP                  #   \          d,   p\        P                  R	T4        Rp?TP                  # Rp?ii ; i)
zûWrap the user turn as an OpenAI-style multimodal content list when
_prepare_inbound_message_text buffered image paths; consume-and-clear so later turns on the
same runner never re-attach stale images. Falls back to plain text when nothing is readable.r.  Nr4  )Úbuild_native_content_partsz:Native image attachment: skipped %d unreadable path(s): %sc              3  óH   "  € T F  qP                  R 4      R8H  x € K  	  R# 5i)r   Ú	image_urlN)rM   ©Ú.0Úps   & r   Ú	<genexpr>Ú7TurnRunner._native_image_run_message.<locals>.<genexpr>ª  s   é € Ð?¹°A—5‘5˜“= KÖ/»ùs   ‚ "TFz8Native image attachment failed, falling back to text: %s)r¡   rn   r[  rM   rK   r4  r    Ú#_consume_pending_native_image_pathsrˆ  r'  Úagent.image_routingrp  rû   r©  rØ  Úanyrw   )	rª   r˜   r[  rs   Únative_imgsrp  ÚpartsÚskippedrt   s	   &        r   Ú_native_image_run_messageÚ$TurnRunner._native_image_run_message™  s  € ð �i‰iˆÝ:Ø×ÑÓ!ˆØŠ?œz¨#¯'©'°)Ó*<¼d×CÒCØ�y•>Ð!Ø—l‘l×FÑFÀsÇÁÓWˆßØ—;‘;Ðð	\ÝFÙ7¸¿¹À[ÓQ‰NˆEßÜ—‘Ð[Ô]`ÐahÓ]iÐkrÔsß‹sÑ?¹Ó?�s�sŠsÑ?¹Ó?×?Ò?Ø�ð @ð �{‰{Ðøô ô 	\Ü�N‰NÐUÐWZ×[Ð[Ø�{‰{Ðûð	\ús+   ÂAD ÃD Ã1D ÄD ÄEÄ&EÅEc                óÈ  € ^ RI Hp ^ RIHpHp ^ RIHp	Hp
 V P                  pVP                  ;'       g    RpV
! V4      pV! WÀP                  4        V! V P                  4       V4      pRVRVP                  /p^ RIHp VP                  4       pVe@   VP                  R	4      '       d)   \!        VP"                  R	4      '       d   VR	,          VR	&   \!        VP"                  R
4      '       d™   ^ RIHp Ve   VP                  R
4      MyVP                  4       ;'       gc    RVP(                  P*                  ;'       g    RRVP(                  P,                  ;'       g    RR\/        \1        VP(                  RR4      4      /VR
&   VP2                  e   VP2                  VR&   Ve   WOR&   MV'       d   VP4                  VR&   VP6                  '       d   VP6                  VR&   VP8                  '       d   VP8                  VR&   VP:                  e   VP:                  VR&   ^ RIHp V! WP@                  V4      pVe"   \!        VP"                  R4      '       d   VVR&   Ve   W_R&   VPB                  e   \E        VPB                  4      VR&   ^ RI#H$p ^ RI%H&p VP                  4       p\1        VR^ 4      ;'       g    ^ \1        VR^ 4      ;'       g    ^ 3pT! YPN                  VP                  ;'       g    RR7      ;_uu_ 4        VP"                  ! V3/ VB pRRR4       Ve~   \Q        ^ \1        VR^ 4      ;'       g    ^ V^ ,          ,
          4      p\Q        ^ \1        VR^ 4      ;'       g    ^ V^,          ,
          4      pRVRVR VV,           /VR!&   \S        VXV4       XV! V4       \U        \V        4      ;_uu_ 4        ^ R"I,H-p V! V4       RRR4       V	! V4       #   + '       g   i     LÑ; i  + '       g   i     L,; i  T! T4       \U        \V        4      ;_uu_ 4        ^ R"I,H-p T! T4       RRR4       M  + '       g   i     M; iT	! T4       i ; i)#u´   Run the turn with the per-session gateway approval callback registered: dangerous-command
approval blocks the agent thread (mirrors CLI input()); the callback bridges syncâ†’async.)Ú+_wrap_current_message_with_observed_context)Úregister_gateway_notifyÚunregister_gateway_notify)Úreset_current_session_keyÚset_current_session_keyri   Úconversation_historyÚtask_idr.  NÚrelay_metadataÚturn_author)Úadmission_authorr‹   ÚnameÚis_botFÚtitle_user_messagerc  Úpersist_user_display_kindÚpersist_user_display_metadataÚ
moa_config)Úarm_onboarding_turnÚpreluderg  Úpersist_user_platform_id)Únotification_turn©Úexecution_resultÚsession_prompt_tokensÚsession_completion_tokens)Úmutedr¥   Úinput_tokensÚoutput_tokensÚtotal_tokensrk   )Úclear_session).rˆ   r�  Útools.approvalr‚  rƒ  Útools.approval_contextr„  r…  r¡   rˆ  r
  r~  r¥   rn   r[  rM   r   Úrun_conversationÚgateway.session_ingressrŠ  rž   Úuser_idÚ	user_namer   r$   r�  r'  rŽ  r�  r�  Úgateway.session_onboardingr‘  r©   rd  r+   Úagent.notification_presentationr”  Úgateway.session_resultsr–  rí   Úmaxru   r   rw   rÕ  r�  )rª   rO   rP   r>  Úpersist_user_message_overrideÚpersist_user_timestamp_overrider�  r‚  rƒ  r„  r…  r˜   rˆ  ÚtokenÚapi_messager¼  r[  rs   rŠ  r‘  r’  r”  r–  rr   rD   rQ   ÚincomingÚoutgoingr�  s   &&&&&&                       r   Ú_run_conversation_with_approvalÚ*TurnRunner._run_conversation_with_approval°  sÞ  € õ 	LßUß]Ø�i‰iˆØ—o‘o×+Ð+¨ˆÙ'¨Ó4ˆÙ ×-GÑ-GÔHð:	-ÙEÀd×FdÑFdÓFfÐh~ÓˆKØ,¨m¸YÈÏÉÐWˆFÝ>Ø×#Ñ#Ó%ˆCØŠ 3§7¡7Ð+;×#<Ò#<ÔAQÐRW×RhÑRhÐjz×A{ÒA{Ø+.Ð/?Õ+@�Ð'Ñ(Ü × 6Ñ 6¸×FÒFåDØCFÂ?¨¯©°Ô)?Ø$×(Ñ(Ó*÷ eð e¨t°S·Z±Z×5GÑ5G×5OÐ5OÈ4ÐQWÐY\×YcÑYc×YmÑYm×YuÐYuÐquØ/7¼¼gÀcÇjÁjÐRZÐ\aÓ>bÓ9cð/eð �}Ñ%ð ×%Ñ%Ò1Ø/2×/EÑ/E�Ð+Ñ,Ø,Ò8Ø1NÐ-Ò.ß'Ø14·±�Ð-Ñ.Ø×,×,Ð,ð 7:×6SÑ6S�Ð2Ñ3Ø×0×0Ð0Ø:=×:[Ñ:[�Ð6Ñ7Ø�~‰~Ò)Ø'*§~¡~��|Ñ$ÝFÙ)¨%×1EÑ1EÀ}ÓUˆGØÒ"Ô'7¸×8NÑ8NÐPY×'ZÒ'ZØ$+��yÑ!Ø.Ò:Ø3RÐ/Ñ0ð ×%Ñ%Ò1Ü58¸×9OÑ9OÓ5P�Ð1Ñ2ÝIÝ@Ø'×+Ñ+Ó-ˆHÜ˜eÐ%<¸aÓ@×EÐEÀAÜ˜eÐ%@À!ÓD×IÐIÈðKˆFá" 5×0KÑ0KÐX[×XfÑXf×XlÐXlÐjl×mÖmØ×/Ò/°ÑF¸vÑF�÷ nàÒ#Ü˜q¤7¨5Ð2IÈ1Ó#M×#RÐ#RÐQRÐV\Ð]^ÕV_Õ"_Ó`�Ü˜q¤7¨5Ð2MÈqÓ#Q×#VÐ#VÐUVÐZ`ÐabÕZcÕ"cÓd�Ø%3°X¸ÐPXØ%3°XÀÕ5Hð%J�˜Ñ!ä(¨°¸ÔAØá% kÔ2ô œ)×$Õ$Ý?Ù˜kÔ*÷ %ñ & eÕ,÷! n×mú÷ %×$ûñ & kÔ2ô œ)×$Õ$Ý?Ù˜kÔ*÷ %×$×$Ð$úñ & eÕ,ús”   ÁAP Â,A5P Ä"P ÅP Å!AP Æ6 P Ç P Ç8CP Ë P Ë#P Ë:P Ì
O'Ì%P Í.P Í35P ÏO:Ï'O7	Ï2P Ï:P
Ð Q!Ð-Q	Ð<	Q!ÑQÑQ!c                	óô  € V P                   p\        V\        4      '       dW   \        VP                  R 4      \        4      '       d2   \        VR ,          VP                  R. 4      \        V4      R7      VR &   WP                  ^ &   Vf   R# Rp\        V\        4      '       dŠ   VP                  R4      '       gs   VP                  R4      '       g\   VP                  R4      RJdG   VP                  R 4      p\        V\        4      '       d    VP                  4       '       d
   VR8w  d   TpVf   VP                  4        R#  VP                  V4       R#   \         d    TP                  4         R# i ; i)	r?   r=   )Úhistory_offsetNr:   r9   rm   Fz(empty))r¡   rK   rL   rM   r+   r   rØ  Úresult_holderrâ   ÚfinishÚ	TypeError)rª   rQ   rP   ré   r˜   Ú_final_for_streamÚfrs   &&&&   r   Ú_finish_stream_consumerÚ"TurnRunner._finish_stream_consumer÷  s2  € Ø�i‰iˆô �fœd×#Ò#¬
°6·:±:Ð>NÓ3OÔQT×(UÒ(UÜ'OØÐ'Õ(¨&¯*©*°ZÀÓ*DÔUXÐYfÓUgô(ˆFÐ#Ñ$ð  &×Ñ˜!ÑØÒ"Ùð !Ðä�vœt×$Ò$¨V¯Z©Z¸×-AÒ-AÈ&Ï*É*ÐUb×JcÒJcØ—
‘
˜;Ó'¨uÓ4à—‘Ð,Ó-ˆBÜ˜"œc×"Ò" r§x¡x§z¢z°b¸I´oØ$&Ð!ØÒ$Ø×"Ñ"Ô$Ùð	%Ø×"Ñ"Ð#4Ö5øÜô 	%Ø×"Ñ"×$ð	%ús   ÅE ÅE7Å6E7c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   rš     s   € ÷ hñ hÈ4ñ hr    c                óÆ  € V P                   p V P                  P                  P                  P	                  VR7      pV'       ds   VP                  R4      '       dZ   \        VR,          4      VP                  n        \        P                  RVP                  P                  VP                  V4       R# R# R#   \         d    \        P                  RRR7        R# i ; i)zæTelegram DM whose source.thread_id was lost in the session split (synthetic/recovered
event): restore it from the binding so _thread_metadata_for_source yields the right
message_thread_id instead of the General thread (non-fatal).)r¥   Ú	thread_iduG   Restored source.thread_id=%s from binding after session split %s â†’ %sz<Failed to restore thread_id from binding after session splitTr  N)r¡   r    Ú_session_dbÚ_dbÚ%get_telegram_topic_binding_by_sessionrM   r+   rž   r»  rû   rü   r¥   rw   )rª   Úagent_session_idr˜   Úbindings   &&  r   Ú'_restore_telegram_thread_id_after_splitÚ2TurnRunner._restore_telegram_thread_id_after_split  s¯   € ð �i‰iˆð
	hà—l‘l×.Ñ.×2Ñ2×XÑXÐdtÐXÓuˆGß˜7Ÿ;™; {×3Ò3Ü'*¨7°;Õ+?Ó'@�—
‘
Ô$Ü—‘Ø]Ø—J‘J×(Ñ(¨#¯.©.Ð:Jöñ 4‰wøô ô 	hÜ�L‰LÐWÐbfˆL×gð	hús   Ž7B: ÁB: ÁAB: Â:"C ÃC c                óà  € V P                   pV P                  pVP                  ^ ,          pV'       d   \        \	        VRR4      4      MRpV'       d   \	        VRVP
                  4      MVP
                  p\        T;'       d#    VP                  ;'       d    WbP
                  8g  4      pV'       EdÝ   \        P                  RVP
                  V4       VP                  P                  P                  VP                  4      pRp	V'       dü   \	        VRR4      p
VP                  4       '       g7   \        P                  RVP                  ;'       g    RVP                  4       M¢W¦8X  d   Rp	M™W¢P
                  8w  d8   \        P                  R	VP                  ;'       g    RVP
                  V
4       MRWhn        VP                  P                  4        VP                  P                  WbP                  VP                   4       Rp	V	'       d€   VP                   p\	        VR
R4      \"        P$                  8X  dA   \	        VRR4      R8X  d/   \	        VRR4      f    VP&                  e   V P)                  V4       VP+                  W¸RR7       ^ RIHp V! VP0                  4      P                  R4      '       g   VP3                  Wd4       V'       g	   V'       d   ^ M
\5        V4      pWVV3# )zúSync session_id right after run_conversation(): compression can rotate before a follow-up
model call fails, and the failure return must still point at the compressed child.
Returns (compacted_in_place, effective_session_id, effective_history_offset).Ú_last_compaction_in_placeFr¥   u/   Session split detected: %s â†’ %s (compression)NuS   Skipping session split sync for stale run %s â€” generation %s is no longer currentÚ?TznSkipping session split sync for %s because the session binding moved from %s to %s before compression finishedrx   Ú	chat_typeÚdmr»  zagent-run-compression)r†   rX  Úmodel_override)r¡   r    r�  r   r$   r¥   rˆ  rû   Úinfore  rf  rM   r×   rŠ  Ú_saveÚ_record_gateway_session_peerrž   r   ÚTELEGRAMr¼  rÁ  Ú_sync_telegram_topic_bindingrÖ  rY  rd  Ú_sync_session_model_from_agentrØ  )rª   rP   r˜   r—   rO   Úcompacted_in_placer¿  Úsession_was_splitr»  Ú	persistedÚentry_session_idÚsrcrY  Úoffsets   &&            r   Ú_sync_session_after_runÚ"TurnRunner._sync_session_after_run)  s_  € ð �i‰iˆØ—‘ˆØ× Ñ  Õ#ˆ÷ Z_œT¤'¨%Ð1LÈeÓ"TÔUÐdiÐßKPœ7 5¨,¸¿¹ÔGÐVY×VdÑVdÐÜ  ×!aÐ!a¨3¯?©?×!aÐ!aÐ?O×SaÑSaÑ?aÓbÐßÐÜ�K‰KÐIÈ3Ï>É>Ð[kÔlØ×(Ñ(×1Ñ1×5Ñ5°c·o±oÓFˆEØˆIßÜ#*¨5°,ÀÓ#EÐ Ø×-Ñ-×/Ò/Ü—K‘Kð=àŸ™×.Ð.¨3°×0BÑ0Bõð
 &Ô9Ø $‘IØ%¯©Ô7Ü—K‘Kð/ð Ÿ™×.Ð.¨3°·±Ð@Põ	ð (8Ô$Ø×(Ñ(×.Ñ.Ô0Ø×(Ñ(×EÑEÐFV×XgÑXgÐil×isÑisÔtØ $�I÷ Ø—j‘j�ä˜C ¨TÓ2´h×6GÑ6GÔGÌGÐTWÐYdÐfjÓLkÐosÔLsÜ  [°$Ó7Ò?ÀF×DVÑDVÒDbà×@Ñ@ÐAQÔRØ×3Ñ3°CÐG^Ð3Ô_Ý5Ù˜×.Ñ.Ó/×3Ñ3Ð4D×EÒEð ×1Ñ1Ð2BÔJ÷ )×,>‘ÄSÈÓEWˆØ!°VÐ;Ð;r    c               ó   € V ^8„  d   QhRR/# r*   r   )r   s   "r   r   rš   d  s   € ÷ ñ ¨Cñ r    c                ó^  € V P                   p^ RIHp VP                  4       pVe#   VR,          P                  R4      ;'       g    R# VP                  ;'       g    RpVP
                  ;'       g    RP                  4       V P                  P                  VP                  P                  VP                  P                  ;'       g    R\        VP                  RR4      \        VP                  RR4      R7      3 F+  pV'       g   K  VR	,           V,           P                  4       pK-  	  V# )
z„Platform context + YAML channel_prompts hint + channel_overrides system_prompt (or global
ephemeral) + the gateway ephemeral prompt.r.  Nrd   Úephemeral_system_promptri   r»  Úparent_chat_id)r»  Ú	parent_idrH  )r¡   rn   r[  rM   Úcontext_promptr5  râ   r    Ú_get_system_prompt_for_channelrž   rx   r£   r$   )rª   r˜   r[  rs   ÚcombinedÚextras   &     r   Ú_combined_ephemeral_promptÚ%TurnRunner._combined_ephemeral_promptd  sý   € ð �i‰iˆÝ:Ø×ÑÓ!ˆØŠ?Ø�z•?×&Ñ&Ð'@ÓA×GÐGÀRÐGØ×%Ñ%×+Ð+¨ˆà×Ñ×%Ð% 2×,Ñ,Ó.Ø�L‰L×7Ñ7Ø—
‘
×#Ñ# S§Z¡Z×%7Ñ%7×%=Ð%=¸2ÌÐQT×Q[ÑQ[Ð]hÐjnÓIoÜ! #§*¡*Ð.>ÀÓEð 8ó ó
ˆE÷ ‰uØ$ vÕ-°Õ5×<Ñ<Ó>’ñ
ð ˆr    c               ó    € V ^8„  d   QhRRRR/# )r   r?   r+   r   r   )r   s   "r   r   rš   x  s   € ÷ >ñ >°cð >Ðjmñ >r    c                ó  € ^ RI Hp RV9   d   V# V! VP                  R. 4      \        V4      VR7      w  rgV'       g   V# V'       d   R.M. \	        \
        P                  V4      4      ,           pVR,           RP                  V4      ,           # )uj  Append MEDIA:<path> tags from tool results (e.g. TTS) that the model's final text omits, so
extract_media() delivers each file once. Scoped to THIS turn (slice at len(agent_history)) so
a stale MEDIA: path from an earlier turn never rides a later reply; the history-path dedup is
the secondary guard â€” and the sole one when mid-run compression shrank the list.)Ú_collect_auto_append_media_tagszMEDIA:r=   )r±  Úhistory_media_pathsz[[audio_as_voice]]rÌ  )rˆ   rä  rM   rØ  r4  rL   ÚfromkeysÚjoin)	rª   r?   rQ   rP   rå  rä  Ú
media_tagsÚhas_voice_directiveÚunique_tagss	   &&&&&    r   Ú_append_auto_media_tagsÚ"TurnRunner._append_auto_media_tagsx  s‡   € õ
 	@Ø�~Ô%Ø!Ð!ñ +JØ�J‰J�z 2Ó&´s¸=Ó7IÐ_rô+
Ñ'ˆ
÷ Ø!Ð!ß1DÐ,Ñ-È"ÔPTÔUY×UbÑUbÐcmÓUnÓPoÕoˆØ Õ$ t§y¡y°Ó'=Õ=Ð=r    c           
     	óö  € ^ RI Hp ^ RIHpHpHpHp ^ RIHp ^ RI	H
p ^ RIHp V! V P                  V P                  P                  4      p	V! 4       ;_uu_ 4       p
 V
P!                  V! W—! V P                  4      R7      4       V
P!                  V! 4       4       V! W�P                  P"                  4       V P%                  4       p^ R	IHp VP-                  4       pVeM   V P.                  P1                  R
R4      pV'       d$   / VCVCVP-                  R4      '       d   RR/M/ CMTVR&   VuuRRR4       #   T d%   pTP&                  R8w  d   h T! T	4      p Rp?L˜Rp?ii ; i  + '       g   i     R# ; i)r1   )Ú	ExitStack)Úbind_turn_workspaceÚpolicy_for_sourceÚpolicy_scopeÚworkspace_unavailable_result)Úapi_policy_scoperœ   r}   )r«   Úworkspace_unavailableNr•  Ú_cli_result_fieldsÚresponse_previewedTrQ   )Ú
contextlibrî  Úgateway.session_policyrï  rð  rñ  rò  rn   ró  r¢   r�   rƒ   r~   r    r¡   rž   Úenter_contextr¥   Ú_run_sync_scopedr†   r¦  r–  rM   Ú__dict__rR  )rª   rî  rï  rð  rñ  rò  ró  r�   r~   ÚpolicyÚscoperQ   rt   r–  rr   Ú
cli_fieldss   &               r   Úrun_syncÚTurnRunner.run_sync•  sD  € Ý(ß}Ó}Ý=Ý@Ý:Ù" 4§<¡<°·±×1AÑ1AÓBˆÙ�[Œ[˜Eð	1Ø×#Ñ#¡L°ÐCSÐTX×T`ÑT`ÓCaÔ$bÔcð ×#Ñ#Ñ$4Ó$6Ô7Ù# F¯I©I×,@Ñ,@ÔAØ×.Ñ.Ó0�Ý@Ø'×+Ñ+Ó-ˆHØÒ#Ø!Ÿ]™]×.Ñ.Ð/CÀTÓJ�
÷
 "ð {�vÐz ÐzÐPV×PZÑPZÐ[o×PpÒPpÐ1EÀtÑ0LÐvxÑzØ'-ð ˜Ñ"ð ÷+ Š[øð %ô >Ø—:‘:Ð!8Ô8ØÙ5°fÓ=•ûð>ú÷ �[ˆ[úsC   ÁE'Á(D9ÂA?E'ÄE'Ä!E'Ä9E$Å EÅE'ÅE$Å$E'Å'E8	c                óÂ  a aCaDaEaFaG€ ^ RI HpHpHp S P                  pS P
                  p^ RIHp V! WTP                  4      pV'       d=   VP                  '       d+   VP                  '       d   ^ RIHp V! VP                  4       V'       d   VP                  MJVP                  P                  \        P                  8X  d   RMVP                  P                  P                   p	S P#                  4       p
V'       d6   VP$                  '       d$   RP'                  R W§P$                  3 4       4      p
V'       d   VP(                  MV! 4       p^ RIHp V! 4       pVe'   VP.                  p\1        VP2                  4      Vn         VP5                  VP                  VP                  VP6                  R	7      w  rï\9        VR
R4      pRVn        ^ RIHp V! Wï4      w  rïV'       d8   VP@                  '       d&   V'       g   ^ RI!H"p VPG                  V! V4      4      p^ RI$H%p V! S W~V4      w  rï\L        PO                  RYïPQ                  R4      VP                  ;'       g    R4       ^ RI!H"p ^ RI/H0p T'       d   T! T! T4      T4      MTPb                  pT'       d   TPe                  YTP                  4      M'TPg                  TP                  TP                  TR7      p^ RI$H4p T! S T4      pT'       d   TPk                  YTP                  4      M&TPm                  TP                  TP                  R 7      Tn7        ^ R!IH8p TPQ                  4       pTeZ   ^ R"I9H:pH;p H<p! T! TR#,          PQ                  R$4      4      p"T"e   T"pT ! TR#,          PQ                  R$4      4      p#T#T!Jd   T#Tn7        TTn=        S P}                  T	4      w  p$p%p&p'TP                  TP€                  Yï4      p(S Pƒ                  T(YšTTT4      w  oCp)T'       d   TSCnB        S P‡                  SCT(TT%T&T'4       ^ R%IDHEp* Rp+T*! S 4      '       d\   TPŒ                  '       gJ   ^ R&IGHHp, T,P“                  S SC4      p+^ R'IJHKp- \™        SCT-\›        \9        SCR(^ 4      ;'       g    ^ 4      4        S P�                  SCT)4      w  oDoEp.S PŸ                  SD4      w  oFoG\9        \9        SCR)R4      R*R4      p/^ R+I$HPp0 ^ R,IQHRp1 ^ R-ISHTp2 T2! S SC4      ;_uu_ 4        T1! S SC4      ;_uu_ 4        T0! S TCTDTETFTGT 3R. l4      p3RRR4       RRR4       T+e9   ^ R&IGHHp, T,P«                  SCT+4       ^ R/IJHVp4 T4! S SCRR07       ^ R1IWHXp5 T5! S SC4       \³        SCSDX3T/4      p6S Pµ                  T3SDT$4       \·        4       '       d'   \9        SCR2R4      e   SCP¹                  4        RSCn]        T3PQ                  R4      p7TP¼                  ^ ,          oC\¿        SC4      ;'       d    \Á        SCR)4      p8T8'       d   SCPÂ                  MRp9R3T8'       d   \9        T9R3^ 4      M^ R4T8'       d   \9        SCR5^ 4      M^ R6T8'       d   \9        SCR7^ 4      M^ R8SC'       d   \9        SCR8R4      MRRSC'       d   \9        SCRR4      MRR9T8'       d   \9        T9R9^ 4      ;'       g    ^ M^ /\Ä         U:u/ uF  p:T:T39   g   K  T:T3PQ                  T:4      bK   	  up:Cp;S PÇ                  SD4      w  p<p=p>RT3PQ                  R. 4      RT3PQ                  R^ 4      RT3PQ                  RR4      R:T3PQ                  R:4      R;T3PQ                  R;4      R<T3PQ                  R<R4      RT3PQ                  R4      R=T3PQ                  R=R4      R>T3PQ                  R>4      RT3PQ                  R4      /
\È         U:u/ uF  p:T:T39   g   K  T:T3T:,          bK  	  up:CR?T3PQ                  R?R4      R@T3PQ                  R@R4      RTPÊ                  ^ ,          ;'       g    . RAT>RBT<RCT=/CT<'       g   T=TPÌ                  8w  d   RDR/M/ CRET39   d   RET3RE,          /M/ CT;CT6'       d   RFT6/M/ Cp?T3PQ                  RGR4      p@/ pAT+eÈ   \9        SCRHR4      pB\¿        X@;'       g1    \Ï        XB4      ;'       d    \¿        T74      ;'       d    XB! T74      RJ 4      p@RIR/\Ñ        T3PQ                  RJ4      \Ò        4      '       d   RJT3RJ,          /M/ C\Ñ        T3PQ                  RK4      \\        4      '       d   T3RK,          '       d   RKT3RK,          /M/ CpAT7'       g²   T! T3T7;'       g    R\Õ        SD4      RL7      p7T! TP                  P                  T74      p7T7'       g.   T3PQ                  R4      '       d   \×        RMT3R,          RN7      MRp7T+e8   RT7/T?CXACROT3PQ                  RO4      RGX@RP\¿        T3PQ                  RP4      4      /C# RT7/T?C# S PÙ                  T7T3SDT.4      p7RT7ROT3PQ                  RO4      /T?CXACRGX@RPT3PQ                  RPR4      RQT3PQ                  RQR4      RRT3PQ                  RRR4      /C#   \R         dƒ   p\L        PU                  RTP                  ;'       g    RTRR7       ^ RI+H,p \[        TTP                  P                  4      w  pppT! RTR. R^ R. RRRRR\]        T4      /TT4      u Rp?# Rp?ii ; i  + '       g   i     ELÒ; i  + '       g   i     ELÞ; i  T+e:   ^ R&IGHHp, T,P«                  SCT+4       ^ R/IJHVp4 T4! S SCRR07       ^ R1IWHXp5 T5! S SC4       i i ; iu up:i u up:i )Sub  Executor-thread body of the turn; returns the gateway result dict.

The turn message lives on the shared TurnContext (``ctx.message``) so ``_run_agent_inner`` sees
every rebind. session_key propagates via contextvars (_set_session_env / set_current_session_key)
â€” never os.environ["HERMES_SESSION_KEY"], which would misroute approvals across sessions.
)Ú_current_max_iterationsÚ_normalize_empty_agent_responseÚ _sanitize_gateway_final_response)rð  )Úapply_launch_yoloÚclirH  c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irC   r   rs  s   & r   rv  Ú.TurnRunner._run_sync_scoped.<locals>.<genexpr>Ð  s   é € Ð,hÑ8b°1Ófg¯QªQÓ8bùs   ‚	�
)Úcurrent_room_execution_policyN)rž   rˆ  rñ   Ú_pre_agent_fallback_notice)Úprepare_api_runtimerœ   )Úone_turn_routez3run_agent resolved: model=%s provider=%s session=%sÚproviderri   z*Model resolution failed for session %s: %sTr  )Ústamp_failurer?   r=   Ú	api_callsre  r:   rm   Fr;   )Úsession_routing)rž   rˆ  Úmodel)Úone_turn_reasoning)rž   rˆ  r.  )Ú_request_reasoning_configÚ_request_service_tierÚ_REQUEST_OPTION_MISSINGrd   Úmodel_optionsrY  r±  )ÚTURN_BASE_ATTRÚsession_output_tokensr@   rA   )Úrun_classic_cli_turn)Úsecret_prompt_scope)Úsudo_prompt_scopec                 ó.   <€ SP                  S SSSS4      # rC   )r®  )rO   rP   r>  Úpersist_msgÚ
persist_tsrª   s   €€€€€€r   rF   Ú-TurnRunner._run_sync_scoped.<locals>.<lambda>$  s   ø€ ¸D×<`Ñ<`Ø˜=Ð*@À+Èzô=[r    )Úpublish_usage)Úrecord)Úpublish_settled_infoÚ_codex_sessionÚlast_prompt_tokensrš  r—  r›  r˜  r  Úcontext_lengthÚfailure_reasonÚusage_limitÚpartialr9   Úinterrupt_messageÚcompression_exhaustedÚcompression_deferredr±  rÏ  r¥   Ú_compressedÚcurrent_turn_user_idxÚpersisted_turnrö  Ú_interim_text_was_deliveredr.  Úbilling_blockr©  )Úhistory_lenzgateway.shared.warn_passthrough)r;   Úlast_reasoningÚresponse_transformedÚresponse_reusedÚagent_persisted)mrˆ   r  r  r  r¡   r    rø  rð  rž   Úyolorˆ  Útools.approval_yolor  rx   r   r‰   r…   rà  Úskills_promptrç  Ú	max_turnsÚ$gateway.hosted_room_execution_policyr	  Úmax_iterationsr4  Úenabled_toolsetsÚ_resolve_session_agent_runtimerñ   r$   r
  rn   r  r  r¢   r�   Úcurrent_modelrÖ  r  rû   rü   rM   rw   r©  Úagent.turn_failure_copyr  r“   r+   Ú gateway.session_worker_constructr  Ú_provider_routingÚcurrent_reasoning_configÚ!_resolve_session_reasoning_configr  Úcurrent_service_tierÚ_resolve_session_service_tierrƒ  r[  Úgateway.platforms.api_serverr  r  r  Ú_reasoning_configr  Ú_resolve_turn_agent_configr'  Ú_resolve_turn_agentÚ_pending_fallback_noticer›  ry  rZ  rí   r¸  r²  ÚwireÚgateway.session_usager  ÚsetattrrN   rC  rm  r  Úgateway.session_secret_promptr  Úgateway.session_sudo_promptr  Úrestorer   Úgateway.session_local_inventoryr"  rT   r·  r5   Ú_close_codex_sessionÚ_codex_session_promptr�  r   r¨  r@   Ú_LEDGER_PASSTHROUGH_KEYSrÕ  Ú_FAILURE_DESCRIPTOR_KEYSr—  r¥   r%   rK   rL   rØ  r   rë  )Hrª   r  r  r  r˜   r—   rð  rü  r  rý   Úcombined_ephemeralr;  r	  Úroomr  Úruntime_kwargsÚpending_fallback_noticer  r�   r  rt   r  rÔ   r†   Ú	retryabler  Úprr„  r  r[  rs   r  r  r  Úrequested_reasoningÚtierré   rÝ   Ú
interim_cbÚwant_interimrS  r<  rZ  Úlocal_sinksr²  r  rå  rR   r  r  r  rQ   r   r"  r.  r?   Úhas_compÚcompr  rk   rÏ  Úeffective_session_idr±  ÚcommonÚ	previewedÚviewer_metaÚwas_deliveredrO   rP   r>  r  r  sH   f                                                                  @@@@@r   rú  ÚTurnRunner._run_sync_scoped³  sÒ
  ý€ ÷ 	{ÑzØ�i‰iˆØ—‘ˆõ 	=Ù" 6¯:©:Ó6ˆß�f—k—k�k c§o§o oÝ=Ù˜cŸo™oÔ.ß*0�v—’ÀÇ
Á
×@SÑ@SÔW_×WeÑWeÔ@e±uÐkn×kuÑku×k~Ñk~÷  lEñ  lEˆØ!×<Ñ<Ó>Ðß�f×*×*Ð*Ø!'§¡Ñ,hÐ9K×MaÑMaÑ8bÓ,hÓ!hÐß-3˜×)Ò)Ñ9PÓ9RˆÝVÙ,Ó.ˆØÒØ!×0Ñ0ˆNÜ#'¨×(=Ñ(=Ó#>ˆCÔ ð	mØ$*×$IÑ$IØ—z‘z¨s¯©ÈCÏOÉOð %Jó %Ñ!ˆEô
 '.¨fÐ6RÐTXÓ&YÐ#Ø04ˆFÔ-ÝDÙ$7¸Ó$NÑ!ˆEß˜&Ÿ,Ÿ,˜,×/Fõ IØ×,Ñ,Ñ-=¸fÓ-EÓF�å?Ù$2°4¸ÈÓ$WÑ!ˆEÜ�L‰LØEØ×)Ñ)¨*Ó5°s·±×7LÐ7LÈ"ôõ 	AÝDßBH‰_Ñ-¨fÓ5°vÔ>Èf×NfÑNfˆßX^˜F×;Ñ;¸FÇOÁOÔTØ×4Ñ4¸C¿J¹JÐTW×TcÑTcÐkpÐ4Óqð 	å?Ù-¨dÐ4DÓEÐßX^ × ;Ñ ;¸FÇOÁOÔ TØ×0Ñ0¸¿
¹
ÐPS×P_ÑP_Ð0Ó`ð 	Ôå:Ø×ÑÓ!ˆØŠ?ß~Ñ~Ù";¸CÀ
½O×<OÑ<OÐP_Ó<`Ó"aÐØ"Ò.Ø#6Ð Ù(¨¨Z­×)<Ñ)<¸_Ó)MÓNˆDØÐ2Ó2Ø'+�Ô$Ø#3ˆÔ ØEI×E`ÑE`ÐamÓEnÑBˆ˜¨*°lØ×6Ñ6°s·{±{ÀEÓZˆ
Ø%)×%=Ñ%=Ø˜¸.ÐJZÐ\^ó&
Ñ"ˆÐ"÷ #à-DˆEÔ*Ø×'Ñ'¨¨zÐ;KÈ_Ð^hÐjvÔwÝ?ØˆÙ˜T×"Ò"¨3×+F×+FÐ+Få3Ø-×2Ñ2°4¸Ó?ˆKÝ<Ü�E˜>¬3¬w°uÐ>UÐWXÓ/Y×/^Ð/^Ð]^Ó+_Ô`ð	2ØIM×I`ÑI`ÐafÐh{ÓI|ÑFˆMÐ1Ð3FØ&*×&@Ñ&@ÀÓ&OÑ#ˆK˜Ü"¤7¨5Ð2FÈÓ#MÐObÐdhÓiˆLÝEÝIÝEÙ" 4¨×/Õ/Ñ1DÀTÈ5×1QÕ1QÙ-¨d÷ 5[ñ 5[ó \�÷ 2R×/ð Ò&Ý7Ø#×+Ñ+¨E°;Ô?Ý?Ù˜d E°$Õ7ÝPÙ$ T¨5Ô1Ü(¨°¸vÀ|ÓTˆØ×$Ñ$ V¨]¸OÔLÜ× Ò ¤W¨UÐ4DÀdÓ%KÒ%Wð ×&Ñ&Ô(Ø*.ˆEÔ'ð  Ÿ™Ð$4Ó5ˆà× Ñ  Õ#ˆÜ˜“;×GÐG¤7¨5Ð2FÓ#Gˆß+3ˆu×'Ò'¸ˆà ÏH¤'¨$Ð0DÀaÔ"HÐZ[ØÏ(œG EÐ+BÀAÔFÐXYØÏxœW UÐ,GÈÔKÐ]^Ø·e”W˜U G¨TÔ2Àà¿Eœ  z°4Ô8ÀtØÏ8œw tÐ-=¸qÓA×FÐFÀQøÐYZð
õ 0HÓYÑ/G¨È3ÐRXÉ=Ô#ˆs�F—J‘J˜s“OÒ#Ñ/GÑYð
ˆð DH×C_ÑC_Ð`mÓCnÑ@ÐÐ0°.ð ˜Ÿ
™
 :¨rÓ2°KÀÇÁÈKÐYZÓA[Ø�f—j‘j ¨5Ó1Ð3CÀVÇZÁZÐP`ÓEaà˜6Ÿ:™: mÓ4Ø�v—z‘z )¨UÓ3°[À&Ç*Á*È[ÓBYØ˜6Ÿ:™: m°UÓ;Ð=PÐRX×R\ÑR\Ð]pÓRqØ�V—Z‘Z Ó(ð
õ ,DÓUÑ+C CÀsÈfÁ}Ôˆs�F˜3•KÒÑ+CÑUð
ð $ V§Z¡ZÐ0GÈÓ%OØ" F§J¡JÐ/EÀuÓ$MØ�S×%Ñ% aÕ(×.Ð.¨BØ˜nÐ.BÐDVÐXdÐfzñ
÷ );Ð>RÐVY×VdÑVdÔ>d�˜tÑ$Ðjlð
ð$ NeÐhnÔMnÐ'¨Ð0GÕ)HÑIÐtvð%
ð& ð'
÷( 6DÐ  .Ñ1Èð)
ˆð, —J‘JÐ3°UÓ;ˆ	ØˆØÒ"Ü# EÐ+HÈ$ÓOˆMÜ˜Y÷  Gð  G¬8°MÓ+B÷  ,Fð  ,FÄtÈNÓG[÷  ,Fð  ,FÑ`mÐn|Ó`}ð  BFð  aFó  HˆIà ðäAKÈFÏJÉJÐWfÓLgÔim×AnÒAn�O V¨OÕ%<Ñ=Ðtvðô 6@ÀÇ
Á
È9Ó@UÔWZ×5[Ò5[Ð`fÐgp×`qÔ`q�I˜v iÕ0Ñ1ÐwyðˆK÷
 Ù<¸VÀ^×EYÐEYÐWYÔgjÐkxÓgyÔzˆNÙ=¸c¿j¹j×>QÑ>QÐSaÓbˆNß!Ø`f×`jÑ`jÐkr×`sÒ`s¤Ð#DÈFÐSZÍOÕ!\Ðy{�ð Ò&à$ nðØ8>ðØBMðà$ f§j¡jÐ1AÓ&BØ(¨)Ø*¬D°·±Ð<RÓ1SÓ,Tñ	ð ð % nÐ?¸Ð?Ð?Ø×5Ñ5°nÀfÈmÐ]pÓqˆð ˜nÐ.>ÀÇ
Á
ÐK[Ó@\ð
Ø`fð
Øjuð
à  )Ø" F§J¡JÐ/EÀuÓ$MØ˜vŸz™zÐ*;¸UÓCð ˜vŸz™zÐ*;¸TÓBñ
ð 	
øôk ô 		mô
 �N‰NÐGÈÏÉ×I^ÐI^Ð\^Ð`cÐnrˆNÔsÝ=Ü&?ÀÀSÇZÁZ×EXÑEXÓ&YÑ#ˆD�&˜)Ù Ð"2°D¸*ÀbÈ+ÐWXÐZaÐceØ"*¨D°+¸uÀgÌsÐSVËxð"YØZ`Ðbkómõ mûð		mú÷l 2R×1QÐ1Qú×/×/Ð/ûð Ò&Ý7Ø#×+Ñ+¨E°;Ô?Ý?Ù˜d E°$Õ7ÝPÙ$ T¨5Õ1ð 'üòD Zùò Vs‚   ÆA1i Ç6i Ç>A)i ÒA%l Ó?lÔk-	Ô$lÔ,l Ú=	mÛmÞ2	mß mék*é(A7k%ëk*ë%k*ë-k>ë8	lìl	ì	l ì?m)r©   r¡   r    rC   r±   )T)#rX   rY   rZ   r[   r\   r©   r®   rµ   r½   r  r   rK  ÚstaticmethodrV  r›  r®  r½  rŒ  rÚ  r
  r  rC  rK  rP  rm  r~  r®  r·  rÁ  rÕ  rà  rë  rÿ  rú  r]   r   r    r   r•   r•   ¯   s¼   † Ùfð
 €OõIòô_òk]õ`Vò:<ð| ô?ó ð?òQ<÷jò8õ&÷PR"õh	jõ_CòF7bõr6õoò
=<ò~ò.E-òN%õBhò"9<õvõ(>ò:ö<W
r    r•   >   úNo Slack thread targetú(slack task_card requires a thread anchorúKslack task_card requires a thread anchor (Slack streams are thread replies))
Úestimated_cost_usdÚcost_statusÚcost_sourceÚcache_read_tokensÚcache_write_tokensÚreasoning_tokensrœ  r  Úturn_exit_reasonr…  )Ú	free_tierÚfailure_retryableÚfailure_resets_atÚusage_window_message)>r\   Ú
__future__r   ÚasyncioÚdataclassesÚjsonÚloggingÚqueueÚrerH  r?  r÷  r   r   Útypingr   r   r   r   r	   Ú
agent.i18nr   Úagent.interrupt_compatr   Úagent.replay_cleanupr   rï   r   Úgateway.media_repairr   Úgateway.platforms.baser   Ú$gateway.platforms.base_exec_approvalr   Úgateway.turn_contextr   Úhermes_cli.configr   Úutilsr   rˆ   r   Ú	getLoggerrû   r;  Ú_CARD_DESTINATION_REFUSALSr(   r-   rT  rU  r5   rT   rp   rV   r_   ry  r`   Úgateway.session_executionra   ru   r“   r•   r   r    r   Ú<module>rŒ     sá   ðñõ #ã Û Û Û Û Û 	Û Û Ý Ý ß ;Õ ;å Ý 3Ý <Ý #Ý IÝ 6Ý GÝ ,Ý %Ý !çÝ)ð 
×	Ò	˜=Ó	)€ð $%Ð  òÐ õHõ(ðÐ ð kÐ õ*õ
Bô$]˜ô ]ô
˜Lô õ ?Ý >òWõ "EôJ[
Ð)Ð+Cö [
r    