+
    jHàje' ã                  ó¦  € R t ^ RIHt ^ RIHt ^ RI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 ^ RIHtHt ^ R	IHt ^ R
IHt ^ RIH t  ^ RI!H"t"H#t# ^ RI$H%t% ^ RI&H't'H(t(H)t)H*t*H+t+ ^ RI,H-t-H.t.H/t/ ^ RI0H1t1H2t2H3t3H4t4 ^ RI5H6t6 ^ RI7H8t8 ^ RI9H:t:H;t; ^ RI<H=t= ^ RI>H?t? ^ RIH@t@HAtAHBtBHCtCHDtDHEtE ^ RIFHGtG ]'       d   ^ RIHHItI ^ RIJHKtK ]P˜                  ! R4      tM]Pœ                  ! 4       tOR R ltPR,tQR R ltRR-R R  lltSR! R" ltTR.tUR# R$ ltVR% R& ltW^ R'IXHYtY ^ R(IZH[t[ ^ R)I\H]t]  ! R* R+]Y][]]4      t^R# )/a"  Agent-turn execution for GatewayRunner: _handle_message_with_agent, _run_agent*, proxy path,
background tasks, MCP reload. Bound onto ``GatewayRunner`` via the MRO; ``gateway.run`` internals
are imported lazily inside method bodies (import cycle) so ``patch("gateway.run.X")`` still works.
)Úannotations)Úinstall_hintN)ÚTYPE_CHECKING©Út)Úformat_iteration_progress)ÚFAILED_TURN_DISPLAY_KINDÚFAILED_TURN_NOTICEÚPARTIAL_FAILED_TURN_NOTICE)ÚnullcontextÚsuppress)Úcopy_context)ÚPlatform)Ú(repair_explicit_computer_use_media_paths)ÚBasePlatformAdapterÚProcessingOutcome)ÚMessageEvent)Údisplay_kind_for_eventÚdisplay_metadata_for_eventÚis_machinery_display_kindÚreply_expected_metadataÚsilence_allowed)Údiagnostic_metadataÚdiagnostic_turn_mutedÚdiagnostic_wake_muted)ÚSessionSourceÚ_session_key_namespaceÚbuild_channel_continuity_noteÚbuild_session_context)ÚTranscriptReadError)ÚTurnContext)ÚDEFAULT_LEASE_WAITÚTurnLeaseTimeoutError)Úget_hermes_home_override)ÚPath)ÚAnyÚCallableÚDictÚListÚOptionalÚTuple)Úbase_url_hostname)ÚGatewayRunner©Ú
TurnRunnerzgateway.runc               ó   € V ^8„  d   QhRR/# )é   Úreturnzlogging.Logger© )Úformats   "Ú5/home/ubuntu/.hermes/hermes-agent/gateway/run_turn.pyÚ__annotate__r5   7   s   € ÷ ñ ˜>ñ ó    c            	     óÊ  € \         P                  ! R4      p \        ;_uu_ 4        V P                  '       g�   ^ RIHp ^ RIHp ^ RIH	p VR,          pVP                  RRR7       V! VR,          R^R	R
7      pVP                  V! R4      4       V P                  \         P                  4       RV n        V P                  V4       RRR4       V #   + '       g   i     T # ; i)a_  Process-wide ``hermes.tool_calls`` Logger + one RotatingFileHandler on logs/tool_calls.log.
Named Loggers live in ``logging.Logger.manager.loggerDict`` forever, so the former per-turn name
(``hermes.tool_calls.<id(log_queue)>``) leaked one Logger per logged turn (#62950); a single
shared handler also keeps concurrent turns from double-writing lines.zhermes.tool_calls)ÚRotatingFileHandler)ÚRedactingFormatter)Ú_hermes_homeÚlogsT)ÚparentsÚexist_okztool_calls.logúutf-8)ÚmaxBytesÚbackupCountÚencodingz%(message)sFNi  P )ÚloggingÚ	getLoggerÚ_tool_call_logger_lockÚhandlersÚlogging.handlersr8   Úagent.redactr9   Úgateway.runr:   ÚmkdirÚsetFormatterÚsetLevelÚINFOÚ	propagateÚ
addHandler)Útool_loggerr8   r9   r:   Úlog_dirÚhandlers         r4   Ú_tool_call_loggerrR   7   sÁ   € ô
 ×#Ò#Ð$7Ó8€Kß	Ö	Ø×#×#Ð#Ý<Ý7Ý0à" VÕ+ˆGØ�M‰M $°ˆMÔ6Ù)ØÐ*Õ*°_ÐRSÐ^eôˆGð × Ñ Ñ!3°MÓ!BÔCØ× Ñ ¤§¡Ô.Ø$)ˆKÔ!Ø×"Ñ" 7Ô+÷ 
 ð Ð÷ 
 Ö	ð Ðús   ¥B"CÃC"	c               ó   € V ^8„  d   QhRR/# ©r0   r1   Ústrr2   )r3   s   "r4   r5   r5   X   s   € ÷ 2ñ 2 3ñ 2r6   c                 ó   € \        R4      # )zXReply when the model returned only a silence marker for a message that needed an answer.z!gateway.errors.unexpected_silencer   r2   r6   r4   Ú_unexpected_silence_replyrW   X   s   € äÐ0Ó1Ð1r6   c               ó$   € V ^8„  d   QhRRRRRR/# )r0   ÚpromptrU   ÚlimitÚintr1   r2   )r3   s   "r4   r5   r5   ]   s&   € ÷ Nñ N˜sð N¨3ð N¸ñ Nr6   c                óÌ   € RP                  \        T ;'       g    R4      P                  4       4      p\        V4      V8:  d   V# VRV^,
           P	                  4       R,           # )zgShort single-line quote of a /bg prompt for its failure notice (the task id means nothing to the user).Ú Ú Nu   â€¦)ÚjoinrU   ÚsplitÚlenÚrstrip)rY   rZ   Útexts   && r4   Ú_bg_prompt_previewrd   ]   sS   € à�8‰8”C˜Ÿ˜ "Ó%×+Ñ+Ó-Ó.€DÜ�t“9 Ô%ˆ4ÐM¨4°°%¸!µ)Ð+<×+CÑ+CÓ+EÈÕ+MÐMr6   c               ó$   € V ^8„  d   QhRRRRRR/# )r0   Úagent_resultÚdictÚhistory_lenr[   r1   Úboolr2   )r3   s   "r4   r5   r5   c   s'   € ÷ iñ i°Tð iÈð iÐPTñ ir6   c                ó„  a€ V P                  R4      '       g   R# V P                  R4      '       d   R# \        V P                  R4      ;'       g    R4      P                  4       o\        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      ;'       g    RS9   ;'       d    V^28„  # )	aB  One verdict for "this failed turn is a context overflow", shared by transcript persistence
(#1630 skip) and the user-facing reply so the two can never disagree.

Multi-word phrases (not bare "exceed"/"token") avoid matching "rate limit exceeded" or
"invalid authentication token"; a bare 400 only counts on a long session.ÚfailedFÚcompression_exhaustedTÚerrorr^   c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5i©Nr2   )Ú.0ÚpÚerrs   & €r4   Ú	<genexpr>Ú5is_context_overflow_failure_result.<locals>.<genexpr>n   s   øé € ÐAÑ!@˜A�CŽxÓ!@ùs   ƒÚ400)ÚgetrU   ÚlowerÚanyÚ_CONTEXT_OVERFLOW_ERROR_PHRASES)rf   rh   rr   s   &&@r4   Ú"is_context_overflow_failure_resultrz   c   s’   ø€ ð ×Ñ˜H×%Ò%ÙØ×ÑÐ/×0Ò0ÙÜ
ˆl×Ñ˜wÓ'×-Ð-¨2Ó
.×
4Ñ
4Ó
6€Cß‹3ÔAÕ!@ÓA�3�3Š3ÔAÕ!@ÓAÓA×hÐhÀeÈsÁl×FgÐFgÐWbÐegÑWgÐhr6   c               ó$   € V ^8„  d   QhRRRRRR/# )r0   Úhistoryz	list[Any]rZ   r[   r1   r2   )r3   s   "r4   r5   r5   w   s!   € ÷ 5ñ 5¨yð 5Àð 5Èñ 5r6   c                óî  € \        V 4      V8:  d   V # ^ pV\        V 4      8  dH   \        W,          \        4      '       d,   W,          P                  R4      \        9   d   V^,          pKW  \        W!^,
          4      p\        V 4      W,
          ,
          pV\        V 4      8  dD   \        W,          \        4      '       d(   W,          P                  R4      R8X  d   V^,          pKS  V RV WR ,           # )u  Fail-closed in-context bound for a turn where hygiene has not landed (#111988).

Keeps the leading ``system``/``session_meta`` setup rows plus the newest tail, total <= ``limit``.
Deterministic (the same transcript always yields the same cut) and payload-only: the stored
transcript is never touched, so the agent's durable-prefix slice (``history_offset``) is
unaffected. Returns ``history`` unchanged â€” same object â€” when nothing needs dropping, so the
landed-compression and below-the-limit paths stay byte-identical.
ÚroleÚtoolN)ra   Ú
isinstancerg   rv   Ú_HYGIENE_SETUP_ROLESÚmin)r|   rZ   Úhead_endÚ
tail_starts   &&  r4   Ú!bound_model_input_without_hygiener…   w   sÇ   € ô ˆ7ƒ|�uÔØˆØ€HØ”c˜'“lÔ"¤z°'Õ2CÄT×'JÒ'JØÕ ×$Ñ$ VÓ,Ô0DÔDØ�A�Šä�8 Q�YÓ'€HÜ�W“ Õ!1Õ2€Jð œ˜G›Ô$¬°GÕ4GÌ×)NÒ)NØÕ"×&Ñ& vÓ.°&Ô8Ø�a�Š
Ø�9�HÐ ¨Ð 4Õ4Ð4r6   c               ó   € V ^8„  d   QhRR/# rT   r2   )r3   s   "r4   r5   r5   ‘   s   € ÷ .ñ . sñ .r6   c                ó’  € \        \        V RR4      4      '       g   R# \        V RR4      pVRJ g   \        V\        4      '       d   R# \        V RR4      pV'       d   R	V 2# \        V R
R4      fD   \        V RR4      '       d   RMRp\        V RR4      pRV 2V'       d   RV 2,           # R,           # \        V RR4      f   R# R# )a&  Name WHY a hygiene compression left the session id unchanged with no in-place commit.
The terminal ``else`` used to blame "no session_db on the hygiene agent" for every route into it,
but that is one of several causes (#71097): an attempt that ABORTED before any commit boundary
(lock skip, transient cooldown, summary timeout, codex thread interrupted) leaves
``_last_compression_attempt_in_place`` at ``None``; a DB-less agent is only the case when
``_session_db`` really is missing. Read the per-attempt signals the compressor sets, in that order.Ú"_last_compression_attempt_recordedFzcompression did not runÚ _compression_skipped_due_to_lockNTz:attempt skipped: compression lease held by another processÚ_compression_blocked_transientzattempt blocked: Ú"_last_compression_attempt_in_placeÚ_last_compression_timed_outzsummary timed outzaborted before commitÚ!_last_compression_summary_warningzattempt z: r^   Ú_session_dbz"no session_db on the hygiene agentz in-place commit did not complete)ri   Úgetattrr€   rU   )ÚagentÚ	lock_skipÚblockedÚdetailÚwarnings   &    r4   Úhygiene_no_commit_reasonr•   ‘   sÐ   € ô ”˜ÐCÀUÓK×LÒLÙ(Ü˜ÐAÀ4ÓH€IØ�DÓœJ y´#×6Ò6ÙKÜ�eÐ=¸tÓD€GßØ" 7 )Ð,Ð,ÜˆuÐ:¸DÓAÒIÜ(/°Ð7TÐV[×(\Ò(\Ñ$ÐbyˆÜ˜%Ð!DÀdÓKˆØ˜&˜Ð"¿¨¨7¨) nÕHÐHÀRÕHÐHÜˆu�m TÓ*Ò2Ù3Ù-r6   )ÚGatewayTurnPrepareMixin)ÚGatewayTurnHygieneMixin)ÚGatewayTurnPersistenceMixinc                  ó  € ] tR t^®tRtR t]R 4       t]R R l4       tR t	R R lt
R	 R
 ltR R ltR R lt]R 4       tR R ltR R ltR R ltRrR R lltR R ltR R ltRrR R lltR R  ltR! R" ltR# R$ ltR% R& ltR' R( lt]R) R* l4       tR+ R, ltRsR. R/ lltR0 R1 ltR2 R3 ltRtt R4 R5 lt!R6 R7 lt"R8 R9 lt#R: R; lt$R< R= lt%R> R? lt&]R@ RA l4       t'RB RC lt(RD RE lt)RF RG lt*RH RI lt+]RJR-/RK RL ll4       t,RM RN lt-]RO RP l4       t.]RQ RR l4       t/RS RT lt0RU RV lt1RW RX lt2RY RZ lt3R[ R\ lt4R] R^ lt5R_ R` lt6Ra Rb lt7Rc Rd lt8Re Rf lt9Rg Rh lt:Ri Rj lt;Rk Rl lt<Rm Rn lt=RuRo Rp llt>Rqt?R# )vÚGatewayTurnMixinz>Agent-turn execution for GatewayRunner (see module docstring).c                óB   € V P                  W P                  V4      4      # )zCThread metadata for a send that replies to ``event`` on ``source``.)Ú_thread_metadata_for_sourceÚ_reply_anchor_for_event)ÚselfÚeventÚsources   &&&r4   Ú_event_thread_metadataÚ'GatewayTurnMixin._event_thread_metadata²   s   € à×/Ñ/°×8TÑ8TÐUZÓ8[Ó\Ð\r6   c                óÆ   € \        \        V 4      RR4      e   V P                  WR7      # V '       d/   \        V R4      '       d   V P                  P                  VR4      # R# )zUPop the adapter's deferred post-delivery callback for ``key`` (legacy dict fallback).Úpop_post_delivery_callbackN©Ú
generationÚ_post_delivery_callbacks)r�   Útyper¤   Úhasattrr§   Úpop)ÚadapterÚkeyr¦   s   &&&r4   Ú_pop_post_delivery_callbackÚ,GatewayTurnMixin._pop_post_delivery_callback¶   sX   € ô ”4˜“=Ð">ÀÓEÒQØ×5Ñ5°cÐ5ÓQÐQß”w˜wÐ(B×CÒCØ×3Ñ3×7Ñ7¸¸TÓBÐBÙr6   c               ó   € V ^8„  d   QhRR/# ©r0   r1   ri   r2   )r3   s   "r4   r5   ÚGatewayTurnMixin.__annotate__À   s   € ÷ ñ ¸4ñ r6   c                	óD   €  ^ RI Hp V! W4      #   \         d     R# i ; i)é    )Ú#is_intentional_silence_agent_resultF)Úgateway.response_filtersr´   Ú	Exception)rf   Úresponser´   s   && r4   Ú_is_intentional_silenceÚ(GatewayTurnMixin._is_intentional_silence¿   s'   € ð	ÝTÙ6°|ÓNÐNøÜô 	Úð	ús   ‚ �žc           	   ƒ  óô  "  € \        \        4      ;_uu_ 4        V P                  V4      p\        V4      pV'       dQ   \	        \        VRR4      4      '       d5   VP                  VP                  V P                  W4      4      G Rj  x€L
  MGV'       d@   \	        \        VRR4      4      '       d$   VP                  VP                  4      G Rj  x€L
  RRR4       R#  LV L  + '       g   i     R# ; i5i)z Stop the typing indicator (never raises). Slack AI status is scoped to a thread/
workspace, so preserve the routing metadata used by the response delivery path.Ú_stop_typing_with_metadataNÚstop_typing)
r   r¶   Ú_delivery_adapter_forr¨   Úcallabler�   r»   Úchat_idr¡   r¼   )rž   rŸ   r    Ú_typing_adapterÚ_kinds   &&&  r4   Ú_hmwa_stop_typing_for_turnÚ+GatewayTurnMixin._hmwa_stop_typing_for_turnÊ   sµ   é € ô ”i× Õ Ø"×8Ñ8¸Ó@ˆOÜ˜Ó)ˆEß¤8¬G°EÐ;WÐY]Ó,^×#_Ò#_Ø%×@Ñ@ÀÇÁÐQU×QlÑQlÐmrÓQ{Ó|×|Ñ|ß ¤X¬g°e¸]ÈDÓ.Q×%RÒ%RØ%×1Ñ1°&·.±.ÓA×AÐA÷ !Ñ ñ }áA÷ !× Ð üsG   ‚C8šA/C$Â	C Â
C$Â:C$ÃC"ÃC$Ã
C8Ã C$Ã"C$Ã$C5	Ã/	C8c               ó    € V ^8„  d   QhRRRR/# )r0   Ú
_quick_keyrU   Úrun_generationr[   r2   )r3   s   "r4   r5   r±   ×   s   € ÷ 9ñ 9È#ð 9Ð_bñ 9r6   c              ƒ  ó  "  € \         P                   ! 4       p\        VP                  R4      '       d   VP                  P                  M\	        VP                  4      p\
        P                  RYbP                  ;'       g    VP                  ;'       g    RVP                  ;'       g    RVP                  ;'       g    RR,          P                  RR4      \        VRR	4      \        VR
R	4      ;'       g    RR,          P                  RR4      4       V P                  W4      G R	j  x€L
 pVf   R	# Vw  r(p	V P                  WW‰W44      G R	j  x€L
 w  r«\        W P                   4      '       g   V
# V
P"                  V
P$                  rÜ RVP                  '       d   VP                  P                  MRRVP                  RVP                  ;'       g    RR\        VRR	4      '       d   \	        VP&                  4      MRR\        VRR4      ;'       g    RRVP(                  RVR,          /pV P*                  P-                  RV4      G R	j  x€L
  ^ RIHp V! WV	4      '       g    V P3                  V4       R	# VP(                  p\         P4                  ! 4       pRVn        T P9                  Y‘P:                  TVP<                  ;'       g    \        VRR4      R7      w  ppVP<                  '       g   V P?                  V	V4      G R	j  x€L
  T PA                  YÚPB                  TTTT	Y@PE                  V4      VPF                  '       d   \	        VPF                  4      MR	V\        VRR	4      V
PH                  V
PJ                  V
PL                  V
PN                  VPP                  RV
PR                  /\U        V4      C\W        VPP                  4      C\Y        V4      CVPZ                  \]        \        VRR	4      4      R7      G R	j  x€L
 p\         P4                  ! 4       V,
          p\        V\^        4      '       dz   VPa                  R4      pV'       d   \	        V4      Vn1        RV9   d   VR,          VPd                  R&   \        VPa                  R 4      \\        4      '       d   VR ,          Vn3        V Pi                  W4      G R	j  x€L
  V Pk                  W44      '       g'   V Pm                  W#V4        V P3                  V4       R	# V Po                  VW,W‰W4VWeV
PN                  VPP                  R!7      G R	j  x€L
 w  pppV Pq                  VV Ps                  VVVV4      4      pV Pu                  VVV4      pV'       d/   V'       d'   VPa                  R"4      '       g   V'       g   V R#V 2pV Pw                  VVV4      G R	j  x€L
  V Py                  VWÈ4      w  pppV'       d*   V'       g"   V P{                  VV P}                  V4      4      pV P                  VVW‰V4      G R	j  x€L
 w  ppV P�                  WW‰VVV
VVVVR$7      G R	j  x€L
  V Pƒ                  WW‰VVVVVV4
      G R	j  x€L
 V P3                  V4       #  EL^ EL; EL? EL… ELŒ ELË EL\ LÒ Lq LN L0  \„         d9   pT P‡                  TYY‰T
4      G R	j  x€L 
 u R	p?T P3                  T4       # R	p?ii ; i  T P3                  T4       i ; i5i)%zAInner handler that runs under the _running_agents sentinel guard.ÚvaluezSinbound message: platform=%s user=%s chat=%s msg=%r reply_to_id=%s reply_to_text=%rÚunknownr^   :NéP   NÚ
r]   Úreply_to_message_idNÚreply_to_textÚplatformÚuser_idr¿   Ú	thread_idÚ	chat_typeÚ
session_idÚmessageºNiô  Nzagent:start)Úheartbeat_owner_is_currentTÚinherit_channel_pinF©ÚinternalÚ_moa_configÚgateway_input_ownerÚ_heartbeat_session_id)rÓ   Úcontext_promptr|   r    rÒ   Úsession_keyrÆ   Úevent_message_idÚinbound_message_idÚchannel_promptÚ
moa_configÚtitle_user_messageÚpersist_user_messageÚpersist_user_timestampÚpersist_user_display_kindÚreply_expectedÚpersist_user_display_metadataÚmessage_typeÚscheduled_heartbeatÚqueued_terminal_inbound_idÚ%queued_terminal_notification_categoryÚnotification_categoryÚ_notification_reply_muted)rå   ræ   Úalready_sentz

)rŸ   r    Úsession_entryrÝ   rf   Úagent_messagesÚpreparedr·   Úagent_failed_earlyÚhidden_reasoning_incompleteÚis_context_overflow_failure)DÚtimer©   rÎ   rÈ   rU   ÚloggerÚinfoÚ	user_namerÏ   r¿   rc   Úreplacer�   Ú_hmwa_resolve_sessionÚ_hmwa_prepare_turnr€   Ú_PreparedTurnr|   Úmessage_textrÐ   rÒ   ÚhooksÚemitÚ gateway.run_heartbeat_acceptancerÕ   Ú_clear_session_envÚ	monotonicÚ_heartbeat_execution_startedÚ_pinned_channel_inputsrà   rØ   Ú_persist_prompt_pinsÚ
_run_agentrÜ   r�   Ú
message_idrâ   rã   rä   rå   ræ   Úpersistence_ownerr   r   r   rè   ri   rg   rv   Úledger_message_idÚmetadatarí   rÂ   Ú_is_session_run_currentÚ_hmwa_discard_stale_resultÚ_hmwa_shape_agent_responseÚ_usage_window_chat_wordingÚ_hmwa_prepend_reasoningÚ_hmwa_runtime_footer_lineÚ_hmwa_post_turn_hooksÚ_hmwa_classify_turn_failureÚ_hmwa_add_failed_turn_noticeÚ_hmwa_failed_turn_noticeÚ"_hmwa_compression_exhaustion_resetÚ_hmwa_persist_turn_transcriptÚ'_deliver_turn_response_then_limit_offerr¶   Ú_hmwa_agent_error_reply)rž   rŸ   r    rÅ   rÆ   Ú_msg_start_timeÚ_platform_nameÚresolvedrï   rÝ   rñ   Ú_session_env_tokensr|   rý   Úhook_ctxrÕ   Ú_run_start_session_idÚ_turn_started_monotonicÚ_turn_channel_promptÚ_turn_sourcerf   Ú_turn_secondsÚ_terminal_inboundr·   Ú_intentional_silencerð   Ú_footer_linerò   ró   rô   Úes   &&&&&                          r4   Ú_handle_message_with_agentÚ+GatewayTurnMixin._handle_message_with_agent×   s¥  é € äŸ)š)›+ˆÜ29¸&¿/¹/È7×2SÒ2S˜Ÿ™×.Ò.ÔY\Ð]c×]lÑ]lÓYmˆÜ�‰ØaØ×,Ñ,×KÐK°·±×KÐKÀ)Ø�N‰N×'Ð'˜i¨%¯*©*×*:Ð*:¸¸CÕ)@×)HÑ)HÈÈsÓ)SÜ�EÐ0°$Ó7Ü�U˜O¨TÓ2×8Ð8°b¸#Õ>×FÑFÀtÈSÓQô	
ð ×3Ñ3°EÓB×BˆØÒÙØ-5Ñ*ˆ˜{Ø.2×.EÑ.EØ˜=°zó/
÷ )
Ñ%ˆô ˜(×$6Ñ$6×7Ò7ØˆOØ (× 0Ñ 0°(×2GÑ2G�ðh	9à°V·_·_°_˜FŸO™O×1Ò1È"Ø˜6Ÿ>™>Ø˜6Ÿ>™>×/Ð/¨RØ´g¸fÀkÐSW×6XÒ6XœS ×!1Ñ!1Ô2Ð^`ØœW V¨[¸"Ó=×CÐCÀØ˜m×6Ñ6Ø˜<¨Õ-ðˆHð —*‘*—/‘/ -°Ó:×:Ð:õ TÙ-¨d¸;×GÒGØðp ×#Ñ#Ð$7Ö8ðo %2×$<Ñ$<Ð!Ü&*§n¢nÓ&6Ð#ð 26ˆEÔ.Ø15×1LÑ1LØ×1Ñ1°6ØŸ™×WÐW¬7°5Ð:OÐQVÓ+Wð 2Mó 2YÑ.Ð  ,ð —>—>�>ð ×/Ñ/°Ð=RÓS×SÐSØ!%§¡Ø$×5LÑ5LÐV]ÐfrØ0¸kØ-×@\Ñ@\Ð]bÓ@cØ<A×<L×<LÐ<L¤3 u×'7Ñ'7Ô#8ÐRVØ3ÄÈÈ}Ð^bÓ@cØ#+×#>Ñ#>Ø%-×%BÑ%BØ'/×'FÑ'FØ*2×*LÑ*LØ$×3Ñ3à)¨8×+EÑ+Eð/cÜIcÐdiÓIjð/cä-¨e×.BÑ.BÓCð/cäGZÐ[`ÓGað/cð #×/Ñ/Ü$(¬°Ð8OÐQUÓ)VÓ$Wð "1ó "÷ ˆLô" !ŸNšNÓ,Ð/FÕFˆMô ˜,¬×-Ò-Ø$0×$4Ñ$4Ð5QÓ$RÐ!ß$Ü.1Ð2CÓ.D�EÔ+Ø:¸lÔJØ>JÐKrÕ>s�E—N‘NÐ#:Ñ;Ü˜l×.Ñ.Ð/JÓKÌT×RÒRØ6BÐC^Õ6_�EÔ3à×1Ñ1°%Ó@×@Ð@à×/Ñ/°
×KÒKØ×/Ñ/°ÀNÔSØðN ×#Ñ#Ð$7Ö8ðK DH×CbÑCbØ˜f¨}ØÐ,AÀ>Ø*2×*LÑ*LØ$×3Ñ3ð	 Dcó D÷ >Ñ:ˆHÐ*¨Nð ×6Ñ6°|ÀT×EaÑEaÐbnÐpxð  {Að  CWó  FXó  YˆHØ×9Ñ9¸,ÈÐP]Ó^ˆLç§°×1AÑ1AÀ.×1QÒ1Q×ZnØ&˜Z t¨L¨>Ð:�Ø×,Ñ,¨X°|ÀXÓN×NÐNð ×0Ñ0°¸wÓVñ YÐÐ ;Ð=X÷ "×*EØ×<Ñ<¸XÀt×GdÑGdÐeqÓGrÓs�Ø,0×,SÑ,SØ˜h¨ÀFó-÷ 'Ñ#ˆH�mð ×4Ñ4Ø¸-Ø)¸.ÐS[Ø!Ð6HØ,GØ,Gð 5ó ÷ ð ð ×EÑEØ˜}¸>Ø˜n¨h¸ÐFZó÷ ð ×#Ñ#Ð$7Õ8òg Cò)
ò" ;ò$ Tòò@ Aò>ñ Oñ'ññøô
 ô 	nØ×5Ñ5°a¸ÈÐdlÓm×mÐmÔmð ×#Ñ#Ð$7Õ8ûð		nûð ×#Ñ#Ð$7Õ8üs�  ‚A?\Â\Â\Â+\Ã 8\Ã92\Ä+Z	Ä,%\ÅZÅ:\ÆA	Z& ÇA Z& È8Z& ÉZÉZ& É+\É>AZ& Ë'Z& Ë8Z& ÌZÌC;Z& Ð	ZÐ
AZ& ÑA4Z& ÓZÓ-Z& Ó<\Ô0Z& Ô?ZÕ AZ& ÖZ& ÖZ& Ö&Z& Ö.Z& ×Z×)Z& ×68Z& Ø.Z Ø/$Z& ÙZ"ÙZ& Ù3Z$Ù4Z& Ù7\Ú\ÚZ& ÚZ& ÚZ& ÚZ& ÚZ& ÚZ& Ú Z& Ú"Z& Ú$Z& Ú&[)Ú1[$Û[Û	[$Û[)Û[, Û\Û$[)Û)[, Û,[?Û?\c               ó   € V ^8„  d   QhRR/# ©r0   r    r   r2   )r3   s   "r4   r5   r±   X  s   € ÷ Hñ H°ñ Hr6   c                óŠ   € ^ RI Hp ^ RIHp V P	                  V4      pT! YVe   V! V4      4      # V P                  4       4      # )u™  ``_profile_runtime_scope`` for ``source``'s profile when a secret scope is required.

Under multiplexing config/skills/memory resolve to the source profile's home AND credentials
come from its secret scope (never process-global ``os.environ``). A standalone gateway
(``multiplex_profiles`` off) still binds once a hosted room has flipped the process-wide
credential guard â€” see ``_standalone_launch_scope``.©Ú_profile_runtime_scope)Úlocal_desktop_turn)rH   r-  Úgateway.session_policyr.  Ú_profile_scope_key_for_sourceÚ_standalone_launch_scope)rž   r    r-  r.  Úhomes   &&   r4   Ú_profile_scope_for_sourceÚ*GatewayTurnMixin._profile_scope_for_sourceX  sQ   € õ 	7Ý=Ø×1Ñ1°&Ó9ˆÙ! $ÐPTÒP`Ñ0FÀtÓ0Ló Hð 	HØ'+×'DÑ'DÓ'FóHð 	Hr6   c               ó    € V ^8„  d   QhRRRR/# )r0   r    r   r1   zOptional[Path]r2   )r3   s   "r4   r5   r±   e  s   € ÷ ñ °Mð Ànñ r6   c                ód   € \        \        V RR4      RR4      '       d   V P                  V4      # R# )a"  Profile home ``_profile_scope_for_source`` binds for ``source``, or ``None`` when it falls
back to the standalone launch scope. The single owner of that branch condition: callers that
group work per scope (heartbeat restore) key on this so they cannot drift from the scope
actually entered.ÚconfigNÚmultiplex_profilesF)r�   Ú _resolve_profile_home_for_source©rž   r    s   &&r4   r0  Ú.GatewayTurnMixin._profile_scope_key_for_sourcee  s1   € ô
 ”7˜4 ¨4Ó0Ð2FÈ×NÒNØ×8Ñ8¸Ó@Ð@Ùr6   c               ó   € V ^8„  d   QhRR/# r*  r2   )r3   s   "r4   r5   r±   n  s   € ÷ ;ñ ;°mñ ;r6   c                ób   € ^ RI Hp V P                  V4      pVe	   V! V4      # ^ RIHp V! 4       # )ab  ``async with`` twin of :meth:`_profile_scope_for_source` (secret hydration off-loop).

Slash dispatch runs under the RECEIVING bot's scope (auth needs its ``.env``), which is not
the routed runtime when a bot serves another profile's chat; every handler reading
home-relative state (pending writes, memory store, config) binds the runtime here (#119915).)Ú_async_profile_runtime_scope)Ú)async_launch_profile_scope_if_multiplexed)rH   r>  r0  Ú!tui_gateway.launch_profile_policyr?  )rž   r    r>  r2  r?  s   &&   r4   Ú_async_profile_scope_for_sourceÚ0GatewayTurnMixin._async_profile_scope_for_sourcen  s4   € õ 	=Ø×1Ñ1°&Ó9ˆØÒÙ/°Ó5Ð5Ý_Ù8Ó:Ð:r6   c                 ó   € ^ RI Hp  V ! 4       # )uÓ  Scope for a standalone gateway's own (launch-profile) work: a no-op until the process hosts
another profile home, then the launch profile's OWN runtime scope.

A native hosted room running a second profile calls
``tui_gateway.launch_profile_policy.activate_multi_profile_hosting`` inside the gateway process,
so ``get_secret`` fails closed for every unscoped read afterwards â€” including the standalone
gateway's ordinary turns, which never bound a scope because ``multiplex_profiles`` is off
(#112878). The launch profile is a profile too: bind its ``.env`` over the env frozen at
activation (a key injected by systemd / ``op run`` has no file to rebuild it from), never a
secondary's scope and never live ``os.environ``.©Ú#launch_profile_scope_if_multiplexed)r@  rE  rD  s    r4   r1  Ú)GatewayTurnMixin._standalone_launch_scope{  s   € õ 	ZÙ2Ó4Ð4r6   c               ó   € V ^8„  d   QhRR/# r*  r2   )r3   s   "r4   r5   r±   Š  s   € ÷ Yñ Y°}ñ Yr6   c                óŽ   € \        \        V RR4      RR4      '       g   \        4       # ^ RIHp V! V P	                  V4      / 4      # )aQ  Home + terminal-policy scope for validating a turn's MEDIA / local-file paths on the
adapter's delivery side, which runs after the routed turn scope was reset.

Docker path translation (``platforms/base.py::_translate_docker_container_media_path``)
infers the producing container from the ACTIVE profile (``get_active_profile_name``) and the
scope-aware ``TERMINAL_DOCKER_VOLUMES``; without this a secondary's ``MEDIA:/output/x.png``
resolves against the default profile's sandbox and mounts (#109024). No secret hydration:
path validation reads no credentials and this runs on the event loop.r7  Nr8  Fr,  )r�   r   rH   r-  r9  )rž   r    r-  s   && r4   Ú _media_delivery_scope_for_sourceÚ1GatewayTurnMixin._media_delivery_scope_for_sourceŠ  sA   € ô ”w˜t X¨tÓ4Ð6JÈE×RÒRÜ“=Ð Ý6Ù% d×&KÑ&KÈFÓ&SÐUWÓXÐXr6   c               ó    € V ^8„  d   QhRRRR/# )r0   r    r   r1   rU   r2   )r3   s   "r4   r5   r±   ˜  s   € ÷ /ñ /°ð /À3ñ /r6   c                ó’   € V P                  V4      ;_uu_ 4        V P                  4       uuRRR4       #   + '       g   i     R# ; i)a
  Session-info block for the auto-reset notice, resolved inside the profile serving ``source``.

Call via ``asyncio.to_thread``: resolution can block (credential refresh, context-length
probes), and the scope is entered here so contextvars behave in the worker thread.N)r3  Ú_format_session_infor:  s   &&r4   Ú_reset_notice_session_infoÚ+GatewayTurnMixin._reset_notice_session_info˜  s0   € ð
 ×+Ñ+¨F×3Õ3Ø×,Ñ,Ó.÷ 4×3×3Ó3ús	   š5µA	c               ó   € V ^8„  d   QhRR/# rT   r2   )r3   s   "r4   r5   r±      s   € ÷  ñ   cñ  r6   c           	     ó‚  € ^ RI Hp V! 4       pVP                  pRRRR/P                  VP                  R4      pVR8¼  d   VR,          R R2MVR	8¼  d   VR	,           R
2M
\        V4      p\        RVP                  R7      \        RVP                  ;'       g    RR7      \        RWTR7      .pVP                  ;'       g    RR8X  d¦   ^ RI	H
p ^ RIHp V! V! 4       P                  R4      4      R,          P                  VP                  / 4      P                  R4      ;'       g    / p	V	'       d<   VP                  \        RV	P                  R4      V	P                  R4      R7      4       VP                  p
V
'       d-   \        V
4      R9   d   VP                  \        RV
R7      4       RP!                  V4      # ) z[Model / provider / context-length / endpoint block so users can spot bad context detection.)Ú_resolve_gateway_model_contextr7  Údefaultu:   default â€” set model.context_length in config to overrideÚdetectedi@B z.1fÚMiè  ÚKzgateway.session.info_model)Úmodelzgateway.session.info_providerÚ
openrouter)Úproviderzgateway.session.info_context)Útokensr    r^   Úmoa)Úload_config)Únormalize_moa_configÚpresetsÚ
aggregatorz!gateway.session.info_acting_modelrY  rW  )rY  rW  zgateway.session.info_endpoint)ÚurlrË   )Ú	localhostz	127.0.0.1z0.0.0.0)rH   rR  Úcontext_lengthrv   Úcontext_sourcerU   r   rW  rY  Úhermes_cli.configr\  Úhermes_cli.moa_configr]  ÚappendÚbase_urlr+   r_   )rž   rR  r  rb  Ú
ctx_sourceÚctx_displayÚlinesr\  r]  Úaggrg  s   &          r4   rM  Ú%GatewayTurnMixin._format_session_info   s�  € å>Ù1Ó3ˆØ!×0Ñ0ˆà�hØÐSð
÷ ‰#ˆh×%Ñ% zÓ
2ð 	ð
 5CÀiÔ4Oˆ~ 	Õ)¨#Ð.¨aÑ0Ø2@ÀEÔ2I�N eÕ+Ð,¨AÑ.ÌsÐSaÓObð 	ô
 Ð*°(·.±.ÔAÜÐ-¸×8IÑ8I×8YÐ8YÈ\ÔZÜÐ,°[ÔTð
ˆð
 ×Ñ×#Ð# ¨Ô-å5ÝBÙ&¡{£}×'8Ñ'8¸Ó'?Ó@ÀÕK×OÑOÐPX×P^ÑP^Ð`bÓc×gÑgÐhtÓu×{Ð{Ðy{ˆCßØ—‘œQÐBÈSÏWÉWÐU_ÓM`Ðhk×hoÑhoÐpwÓhxÔyÔzØ×$Ñ$ˆßÔ)¨(Ó3Ð7\Ô\Ø�L‰LœÐ:ÀÔIÔJØ�y‰y˜ÓÐr6   Nc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
R	RR/# ©r0   rY   rU   r    r   Útask_idrÞ   úOptional[str]Ú
media_urlszOptional[list[str]]Úmedia_typesr1   ÚNoner2   )r3   s   "r4   r5   r±   ¾  sH   € ÷ 	ñ 	Øð	Ø#0ð	Ø;>ð	à'ð	à<Oð	ð )ð	ð 
ñ		r6   c           
   ƒ  ó´   "  € V P                  V4      ;_uu_ 4        V P                  WW4WV4      G Rj  x€L
 uuRRR4       #  L  + '       g   i     R# ; i5i)zRProfile-scoping wrapper around the background agent task (mirrors ``_run_agent``).N)r3  Ú_run_background_task_inner)rž   rY   r    ro  rÞ   rq  rr  s   &&&&&&&r4   Ú_run_background_taskÚ%GatewayTurnMixin._run_background_task¾  sJ   é € ð ×+Ñ+¨F×3Õ3Ø×8Ñ8Ø ¸:ó÷ ÷ 4Ò3ñ÷ 4×3Ð3üs+   ‚AœA³A´A·AÁAÁA	Á	Ac               ó(   € V ^8„  d   QhRRRRRRRR/# )	r0   Úuser_configrg   r    r   Úplatform_keyrU   r1   Úlistr2   )r3   s   "r4   r5   r±   É  s2   € ÷ Fñ FØðFØ)6ðFØFIðFà	ñFr6   c                ó€  € ^ RI Hp  V P                  V4      pVe   VP                  V4      MRpV'       d`   \        V\        4      '       dJ   \        VP                  R4      ;'       g    / 4      pV Uu. uF  p\        V4      NK  	  upWs&   / VCRV/Cp\        V! W4      4      #   \         d    Rp L‡i ; iu upi )zÐEnabled toolsets for an agent run, honoring an adapter ``toolsets_for_source()`` override
validated through the SAME ``_get_platform_tools`` path (unknown / platform-restricted
toolsets dropped, not trusted).)Ú_get_platform_toolsNÚplatform_toolsets)Úhermes_cli.tools_configr}  r½   Útoolsets_for_sourcer¶   r€   r{  rg   rv   rU   Úsorted)	rž   ry  r    rz  r}  r«   ÚoverrideÚptsÚxs	   &&&&     r4   Ú$_resolve_enabled_toolsets_for_sourceÚ5GatewayTurnMixin._resolve_enabled_toolsets_for_sourceÉ  sº   € õ 	@ð	Ø×0Ñ0°Ó8ˆGØ>EÒ>Q�w×2Ñ2°6Ô:ÐW[ˆH÷ œ
 8¬T×2Ò2Ü�{—‘Ð':Ó;×AÐA¸rÓBˆCÙ19Ó :±¨A¤ Q¦±Ñ :ˆCÑØC˜[ÐCÐ*=¸sÑCˆKÜÑ)¨+ÓDÓEÐEøô ô 	ØŠHð	üò !;s   ˆ(B( Á6B;Â(B8Â7B8c               ó$   € V ^8„  d   QhRRRRRR/# )r0   ry  rg   r    r   rz  rU   r2   )r3   s   "r4   r5   r±   Û  s"   € ÷ !ñ !°$ð !Àð !Ð]`ñ !r6   c                ó¬   € ^ RI Hp V P                  WV4      pT! VP                  R4      ;'       g    / P                  R4      4      ;'       g    RpWV3# )zI``(enabled_toolsets, disabled_toolsets)`` for an agent run on ``source``.)Úparse_config_string_listr�   Údisabled_toolsetsN)Úagent.skill_utilsr‰  r…  rv   )rž   ry  r    rz  r‰  ÚenabledÚdisableds   &&&&   r4   Ú_resolve_turn_toolsetsÚ'GatewayTurnMixin._resolve_turn_toolsetsÛ  sQ   € å>Ø×;Ñ;¸KÐQ]Ó^ˆÙ+¨[¯_©_¸WÓ-E×-KÐ-KÈ×,PÑ,PÐQdÓ,eÓf×nÐnÐjnˆØÐ Ð r6   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
R	RR/# rn  r2   )r3   s   "r4   r5   r±   â  sQ   € ÷ Hñ HØðHØ#0ðHØ;>ðHà'ðHà<OðHð )ðHð 
ñ	Hr6   c              ƒ  ó  a aaa$a%a&a'a(a)a*a+a,a-a."  € ^ RI Ho%HpHpHp	 ^ RIHo$ T;'       g    . pT;'       g    . pS P                  S4      p
V
'       g$   \        P                  RSP                  S4       R# S P                  SV4      p V! 4       o.S P                  SS.R7      w  rÍVP                  R4      '       g2   V
P                  SP                  \!        R4      VR7      G Rj  x€L
  R# V	! SP                  4      o*S P#                  S.SS*4      w  o'o&S P$                  o+V! 4       o)S P'                  SVR	7      o,S,S n        S P+                  SR
7      S n        S P/                  WV4      o-Vo(\1        V4       UUu. uF8  w  rïV\3        V4      8  d	   Wn,          MRP5                  R4      '       g   K6  VNK:  	  pppV'       d    S P7                  VV4      G Rj  x€L
 o(V$V%V&V'V(V)V*V+V,V VVV-V.3R lpS P;                  V4      G Rj  x€L
 pV'       d   VP                  RR4      MRpV'       g4   V'       d,   VP                  R4      '       d   \!        RVR,          R7      pV'       d   \=        VVP                  R. 4      4      pVR,          \3        V4      ^<8”  d   RMR,           p\!        RVR7      p. . RpppV'       d?   V
P?                  V4      w  pp\@        PB                  ! V4      pV
PE                  V4      w  ppV'       d/   V
P                  SP                  VV,           VR7      G Rj  x€L
  MFV'       g?   V'       g7   V
P                  SP                  V\!        R4      ,           VR7      G Rj  x€L
  T;'       g    .  FM  w  pp\G        \8        4      ;_uu_ 4        V
PI                  SP                  VVVR7      G Rj  x€L
  RRR4       KO  	  ^ RI%H&p ^ RI'H(pH)p T;'       g    .  F÷  w  pp \T        PV                  PY                  V4      ^,          P[                  4       p!\G        \8        4      ;_uu_ 4        V! SP                  V!V 4      '       d)   V
P]                  SP                  VVV R7      G Rj  x€L
  M[V!V9   d   V
P^                  R3M"V!V9   d   V
P`                  R3MV
Pb                  R 3w  p"p#V"! R&R!SP                  R"V/V#V/B G Rj  x€L
  RRR4       Kù  	  R#  ELu uppi  EL   \8         d"   p\        P                  RT4        Rp?ELERp?ii ; i EL& ELþ ELº ELl  + '       g   i     EKÁ  ; i LÊ Lp  + '       g   i     EKo  ; i  \8         d–    \        Pe                  R#S4       \G        \8        4      ;_uu_ 4        T
Pg                  SP                  \!        R$\i        T4      R7      TSP                  R%7      G Rj  x€L 
  RRR4        R#   + '       g   i      R# ; ii ; i5i)'zCExecute a background agent task and deliver the result to the chat.)Ú_checkpoint_agent_kwargsÚ_current_max_iterationsÚ_load_gateway_configÚ_platform_config_key©ÚAIAgentz0No adapter for platform %s in background task %sN)r    ry  Úapi_keyz!gateway.background.no_credentials©r
  )r    rW  )r    r^   zimage/z,Background task vision enrichment failed: %sc                 ó®  <€ S! RR SR ,          /SR,          BS! S4      B/ RSbRRbRRbRSbRSbR	S
bR
SP                   bRSP                  R4      bRS	P                  R4      bRS	P                  R4      bRS	P                  R4      bRS	P                  R4      bRS	P                  RR4      bRS	P                  R4      bRSbRSbBR U u/ uF  q \        SV 4      bK  	  up BR\        SP                  RSP                  4      RSP	                  4       /B p VP                  SSR7      SP                  V4       # u up i   SP                  T4       i ; i) rW  ÚruntimeÚmax_iterationsÚ
quiet_modeTÚverbose_loggingFÚenabled_toolsetsrŠ  Úreasoning_configÚservice_tierÚrequest_overridesÚproviders_allowedÚonlyÚproviders_ignoredÚignoreÚproviders_orderÚorderÚprovider_sortÚsortÚprovider_require_parametersÚrequire_parametersÚprovider_data_collectionÚdata_collectionrÒ   rÎ   Ú
session_dbÚ_dbÚfallback_model)Úuser_messagero  r2   )rÏ   Úuser_id_altrø   r¿   Ú	chat_namerÑ   rÐ   )Ú_service_tierrv   r�   rŽ   Ú_refresh_fallback_modelÚrun_conversationÚ_cleanup_agent_resources)Úkr�   r—  r’  rŠ  rŸ  Úenriched_promptrœ  rz  Úprr   rž   r    ro  Ú
turn_routery  s     €€€€€€€€€€€€€€r4   Úrun_syncÚ=GatewayTurnMixin._run_background_task_inner.<locals>.run_sync  sº  ø€ Ùñ Ø$ WÕ-ðà  Õ+ðñ /¨{Ó;òñ $2ð	ñ
  $ðñ %*ðñ &6ðñ '8ðñ &6ðð "&×!3Ò!3ðð '1§n¡nÐ5HÔ&Iðð ')§f¡f¨V¤nðð ')§f¡f¨XÔ&6ðð %'§F¡F¨7¤Oðð #%§&¡&¨¤.ðð  13·±Ð7KÈUÔ0Sð!ð" .0¯V©VÐ4EÔ-Fð#ñ$  'ð%ñ& *ð'ñ(7ó ñ 7°œ' &¨!Ó,Ò,ñ 7ñ ñ)ô.  ' t×'7Ñ'7¸À×@PÑ@PÓQð/ð4 $(×#?Ñ#?Ó#Aò5�ð89Ø ×1Ñ1¸ÐX_Ð1Ó`à×1Ñ1°%Õ8ùòøð ×1Ñ1°%Õ8ús   Ã
D<ÄE ÅEÚfinal_responserm   zgateway.shared.error_prefix©rm   Úmessages:Né<   Nz...z"gateway.background.complete_header)Úpreview)r¿   Úcontentr
  zgateway.background.no_response)r¿   Ú	image_urlÚcaptionr
  )Úshould_send_media_as_audio)Ú_IMAGE_EXTSÚ_VIDEO_EXTS)r¿   Ú
audio_pathr
  Úis_voiceÚ
video_pathÚ
image_pathÚ	file_pathr¿   r
  zBackground task %s failedzgateway.background.failed©r
  Úlogical_platformr2   )5rH   r’  r“  r”  r•  Ú	run_agentr—  r½   rö   r”   rÎ   rœ   Ú_resolve_session_agent_runtimerv   Úsendr¿   r   rŽ  Ú_provider_routingÚ!_resolve_session_reasoning_configÚ_reasoning_configÚ_resolve_session_service_tierrµ  Ú_resolve_turn_agent_configÚ	enumeratera   Ú
startswithÚ_enrich_message_with_visionr¶   Ú_run_in_executor_with_contextr   Úextract_mediar   Úfilter_media_delivery_pathsÚextract_imagesr   Ú
send_imageÚgateway.platforms.baserÇ  Úgateway.run_notificationsrÈ  rÉ  ÚosÚpathÚsplitextrw   Ú
send_voiceÚ
send_videoÚsend_image_fileÚsend_documentÚ	exceptionÚemit_warningrd   )/rž   rY   r    ro  rÞ   rq  rr  r“  r”  r•  r«   Ú_thread_metadatarW  Úruntime_kwargsÚirä  Úimage_pathsr&  r½  Úresultr·   rÃ  ÚheaderÚimagesÚmedia_filesÚtext_contentrÅ  Úalt_textÚ_should_send_media_as_audiorÈ  rÉ  Ú
media_pathÚ	_is_voiceÚ_extÚsenderr¬   r—  r’  rŠ  rŸ  rº  rœ  rz  r»  r   r¼  ry  s/   f&ff&&&                             @@@@@@@@@@@r4   ru  Ú+GatewayTurnMixin._run_background_task_innerâ  sP  ÿýé € ÷	
ó 	
õ 	&Ø×%Ð% 2ˆ
Ø!×'Ð' RˆØ×,Ñ,¨VÓ4ˆßÜ�N‰NÐMÈvÏÉÐ`gÔhÙØ×;Ñ;¸FÐDTÓUÐðu	Ù.Ó0ˆKØ$(×$GÑ$GÈvÐcnÐ$GÓ$oÑ!ˆEØ!×%Ñ% i×0Ò0Ø—l‘l 6§>¡>´1Ð5XÓ3YÐdt�lÓu×uÐuÙá/°·±Ó@ˆLØ26×2MÑ2MÈkÐ[aÐcoÓ2pÑ/ÐÐ/Ø×'Ñ'ˆBÙ4Ó6ˆNØ#×EÑEÈVÐ[`ÐEÓaÐØ%5ˆDÔ"Ø!%×!CÑ!CÈ6Ð!CÓ!RˆDÔØ×8Ñ8¸ÈÓWˆJð %ˆOä$-¨jÔ$9ôÙ$9™˜Ø&'¬#¨kÓ*:Ô&:�K–NÀ×NÑNÈx×X÷ �Ñ$9ð ñ ÷ ðVØ,0×,LÑ,LÈVÐU`Ó,a×&a�O÷ 9÷  9ò  9ðD  ×=Ñ=¸hÓG×GˆFç;A�v—z‘zÐ"2°BÔ7ÀrˆHß§¨6¯:©:°g×+>Ò+>ÜÐ:À&ÈÅ/ÔR�çÜCÀHÈfÏjÉjÐYcÐegÓNhÓi�à˜S•k¬c°&«k¸BÔ.>¡UÀBÕGˆGÜÐ;ÀWÔMˆFØ02°B¸ �KˆFßØ(/×(=Ñ(=¸hÓ(GÑ%�˜XÜ1×MÒMÈkÓZ�Ø'.×'=Ñ'=¸hÓ'GÑ$�˜ßØ—l‘l¨6¯>©>À6ÈLÕCXÐcs�lÓt×tÑtß§KØ—l‘lØ"ŸN™N°F¼QÐ?_Ó=`Õ4`Ðk{ð #ó ÷ ð ð )/¯¨°"ªÑ#�	˜8Üœi×(Õ(Ø!×,Ñ,Ø &§¡¸)ÈXÐ`pð -ó ÷ ð ÷ )Ñ(ñ )5õ ißJØ*5×*;Ð*;¸Ò*;Ñ%�
˜IÜ—w‘w×'Ñ'¨
Ó3°AÕ6×<Ñ<Ó>�Üœi×(Õ(Ù2°6·?±?ÀDÈ)×TÒTØ%×0Ñ0Ø$*§N¡N¸zÐTdØ%.ð 1ó ÷ ñ ð CGÈ+ÔBU˜W×/Ñ/°Ñ>ØLPÐT_ÔL_ '×"9Ñ"9¸<Ñ!HØ")×"7Ñ"7¸Ð!Eñ $˜ ñ
 %Ñl¨V¯^©^ÐlÐFVÐlÐ[^Ð`jÐZkÑl×lÐl÷ )Ñ(ó +<òs vùóò 'bøÜ ô VÜ—N‘NÐ#QÐST×UÒUûðVúòJ Hò" uòò
÷ )×(Ñ(úññ m÷ )×(Ñ(ûô ô 	Ü×ÑÐ8¸'ÔBäœ)×$Õ$Ø×*Ñ*Ø—N‘NÜÐ1Ô;MÈfÓ;UÔVØ-ÀÇÁð +ó ÷ ñ ÷ %×$×$Ô$úð	üs¨  �'X
¸X
Á5X
Â
AU' Ã'S2Ã(U' Ã,X
Ã.BU' Å<3S5Æ4S5Æ:U' ÇS> ÇS;ÇS> Ç 'U' ÈT-ÈU' ÈU' È0U' È8U' ÉU' É+BU' Ì
(U' Ì2T0Ì3U' Í U' Í1U' Í9T3Í:U' Î U' Î'#T9Ï
T6
ÏT9Ï"U' Ï2AU' Ñ=UÒU
ÒAUÓU
Ó UÓ$U' Ó0X
Ó2U' Ó5U' Ó;S> Ó>T*Ô	T%ÔU' Ô%T*Ô*U' Ô0U' Ô3U' Ô6T9Ô9UÕ
U' ÕUÕUÕU$Õ
U' Õ'8XÖAW1× W#
×!W1×&X×.X
×1X×<XØ X
ØXØX
c               ó    € V ^8„  d   QhRRRR/# )r0   Ú	multiplexri   r1   rs  r2   )r3   s   "r4   r5   r±   l  s   € ÷ [ñ [¸4ð [ÈTñ [r6   c                óB  €  ^ RI Hp \        V RR4      p\        V RR4      pVe	   V'       g   R# V'       d   \        V4      R,           MRpT;_uu_ 4        \	        VP                  4       4       F`  w  rxV'       d#   \        V4      P                  V4      '       g   K/  \        V\        4      '       d
   V^ ,          MTp	V	f   KV  V! V	RR7       Kb  	  RRR4       R#   + '       g   i     R# ; i  \         d"   p
\        P                  RT
4        Rp
?
R# Rp
?
ii ; i)	a  Refresh cached agents so existing sessions see new MCP tools on their next turn without
a history-destroying ``/new``. Each agent keeps its build-time toolset selection EXACTLY: a
session built with restricted enabled_toolsets (e.g. ["safe"]) must NOT silently gain tools.)Úrefresh_agent_mcp_toolsÚ_agent_cacheNÚ_agent_cache_lockÚ:T)r�  z8Failed to update cached agent tools after MCP reload: %s)Útools.mcp_tool_agentrÿ  r�   r   r{  ÚitemsrU   rÚ  r€   Útupler¶   rö   Údebug)rž   rý  Úprofilerÿ  Ú_cacheÚ_cache_lockÚ
_ns_prefixÚ	_sess_keyÚ_entryÚ_agentÚ_excs   &&&        r4   Ú!_mcp_reload_refresh_cached_agentsÚ2GatewayTurnMixin._mcp_reload_refresh_cached_agentsl  sØ   € ð	[ÝDÜ˜T >°4Ó8ˆFÜ! $Ð(;¸TÓBˆKØÒ"¯&ÙçBKÔ/°Ó8¸3Ö>ÐQUˆJß’Ü)-¨f¯l©l«nÖ)=Ñ%�Iß!¬#¨i«.×*CÑ*CÀJ×*OÒ*OÙ Ü*4°V¼U×*CÒ*C˜V AžYÈ�FØÔ)Ù/°À4×Hñ *>÷ ——’ûô ô 	[Ü�L‰LÐSÐUY×ZÒZûð	[úsF   ‚+C2 °C2 ¸C2 ÁA+CÃCÃC2 ÃC/	Ã)C2 Ã/C2 Ã2DÃ=DÄDc               ó    € V ^8„  d   QhRRRR/# )r0   rŸ   r   r1   rU   r2   )r3   s   "r4   r5   r±   ‚  s   € ÷ P;ñ P;¨|ð P;Àñ P;r6   c              ƒ  óV	  aaa a!a"a#"  € ^ RI Hp \        \        V P                  RR4      4      pV'       di   \        4       '       gY   V P                  VP                  4      pV! \        V4      4      ;_uu_ 4        V P                  V4      G Rj  x€L
 uuRRR4       #  ^ RI
Ho# ^ RIHp ^ RIHo!HoHo  ^ RIHp ^ R	IHo ^ R
IHp V'       d   VP1                  4       MRo"R VVV V!V"3R llpV! 4       p	V P3                  V"V#3R l4      G Rj  x€L
  V! 4        ^ RIHp
 V
! 4       ;_uu_ 4        V P3                  V4      G Rj  x€L
 pRRR4       V! 4       pS"eB   ^ RIHp S;_uu_ 4        X Uu. uF  qíP;                  V4      V9   g   K  VNK  	  ppRRR4       RRWÉ,          3RRWÉ,
          3RRWœ,
          33p\=        R4      .V UUUu. uF6  w  pppV'       g   K  \=        VRP?                  \A        V4      4      R7      NK8  	  uppp,           p^ RIH!p V P3                  V4      G Rj  x€L
 pTPE                  V'       g   \=        R4      M\=        R\G        X4      \G        V4      R7      4       V'       d/   VPE                  \=        RRRP?                  V4       2R7      4       V PI                  W1P                  PJ                  4       V^,          V^,          V^ ,          3 UUUu. uF0  w  pppV'       g   K  V R RP?                  \A        V4      4       2NK2  	  ppppX'       d   \G        V4       R!2MR"pV'       d   R#P?                  V4      R#,           MR$pR%R&R'R(V V R)2/p\M        \N        4      ;_uu_ 4        V PP                  PS                  VP                  4      G Rj  x€L
 pV PP                  PU                  VPV                  V4      G Rj  x€L
  RRR4       R*P?                  V4      #  ELl  + '       g   i     ELq; i EL ELÑ  + '       g   i     ELØ; iu upi   + '       g   i     EL¥; iu upppi  ELu upppi  L¦ Lz  + '       g   i     L€; i  \N         d.   p\X        P[                  R+T4       \=        RTR7      u Rp?# Rp?ii ; i5i),a$  Disconnect, reconnect, and notify MCP tool changes (shared by button / text / no-confirm paths).

Under multiplex the reload runs inside the requesting profile's runtime scope (entered here
when the caller did not) and only that profile's servers are torn down and rediscovered.

See #95518.
r,  r8  FN)Úshutdown_mcp_servers)Údiscover_mcp_tools)Ú_serversÚ_lockÚ_server_visible_in_scope)Úreprobe_tool_availability)Ú	_key_name)Úregistryc               ó   € V ^8„  d   QhRR/# )r0   r1   Úsetr2   )r3   s   "r4   r5   Ú:GatewayTurnMixin._execute_mcp_reload.<locals>.__annotate__š  s   € ÷ oñ o¨#ñ or6   c            	     ó²   <€ S;_uu_ 4        S U u0 uF  p S! V S4      '       g   K  S! V 4      kK  	  up uuR R R 4       # u up i   + '       g   i     R # ; iro   r2   )r¬   r  r  r  r  Úreload_scopes    €€€€€r4   Ú_scoped_server_namesÚBGatewayTurnMixin._execute_mcp_reload.<locals>._scoped_server_namesš  s@   ø€ ß’UÙ6>Ón±h¨sÑBZÐ[^Ð`l×BmœN™I cžN±hÑn÷ ’UùÚn÷ —U�Uús    ŒA‘A §A ³AÁ AÁA	c                 ó   <€ S! S R 7      # ))Úscoper2   )r  r  s   €€r4   Ú<lambda>Ú6GatewayTurnMixin._execute_mcp_reload.<locals>.<lambda>Ÿ  s   ø€ Ñ=QÐXdÕ=er6   )Úsuppress_interactive_oauth)Ú_mcp_tool_server_namesÚReconnectedzgateway.reload_mcp.reconnectedÚAddedzgateway.reload_mcp.addedÚRemovedzgateway.reload_mcp.removedzgateway.reload_mcp.headerú, )Únames)Úmcp_servers_not_connectedz!gateway.reload_mcp.none_connectedz"gateway.reload_mcp.tools_available)ÚtoolsÚserverszgateway.reload_mcp.failedzdid not connect: rÀ  z
 servers: z MCP tool(s) now availablezNo MCP tools availablez. r^   r~   ÚuserrÄ  z,[IMPORTANT: MCP servers have been reloaded. zD. The tool list for this conversation has been updated accordingly.]rË   zMCP reload failed: %s).rH   r-  ri   r�   r7  r#   r9  r    r$   Ú_execute_mcp_reloadÚtools.mcp_tool_lifecycler  Útools.mcp_tool_discoveryr  Útools.mcp_toolr  r  r  r  r  Útools.mcp_tool_scoper  Útools.registryr  Úcurrent_scope_keyrÜ  Útools.mcp_oauthr&  r'  rv   r   r_   r�  r-  rf  ra   r  r  r   r¶   Úasync_session_storeÚget_or_create_sessionÚappend_to_transcriptrÒ   rö   r”   )$rž   rŸ   r-  rý  Úprofile_homer  r  r  r   Úold_serversr&  Ú	new_toolsÚconnected_serversr'  ÚnÚchangesÚ_labelr¬   r,  rj  r-  rk   ÚlabelÚ_keyÚchange_partsÚtool_summaryÚchange_detailÚ
reload_msgrï   r&  r  r  r  r  r  r  s$   &&                            @@@@@@r4   r1  Ú$GatewayTurnMixin._execute_mcp_reload‚  sñ  ýé € õ 	7Üœ §¡Ð.BÀEÓJÓKˆ	ßÔ5×7Ò7Ø×@Ñ@ÀÇÁÓNˆLÙ'¬¨\Ó(:×;Õ;Ø!×5Ñ5°eÓ<×<÷ <Ò;ðB	;ÝEÝCßPÑPÝFÝ6Ý/ç;D˜8×5Ñ5Ô7È$ˆL÷oô oñ /Ó0ˆKØ×4Ñ4Õ5eÓf×fÐfá%Ô'õ CÙ+×-Õ-Ø"&×"DÑ"DÐEWÓ"X×X�	÷ .ñ !5Ó 6ÐØÒ'ÝAß’UÙ,5Ó l©I q×9SÑ9SÐTUÓ9VÐZkÑ9k§ ©I�IÐ l÷ ð Ð @ÐBSÕBaÐbØÐ4Ð6GÕ6UÐVØÐ8¸+Õ:YÐZðˆGô
 Ð2Ó3Ð4ÙQXõ8ÙQXÑ;M¸6À3ÈÔ\aÔ6”�#˜TŸY™Y¤v¨e£}Ó5×6ÑQXó8õ ˆEõ KØ×=Ñ=Ð>WÓX×XˆFØ�L‰L×GXœÐ>Ô?Ô^_Ø4¼CÀ	»NÔTWÐXiÓTjô_lô mçØ—‘œQÐ:ÐDUÐVZ×V_ÑV_Ð`fÓVgÐUhÐBiÔjÔkà×2Ñ2°9¿l¹l×>RÑ>RÔSð
 ,3°1­:°w¸qµzÀ7È1Å:Ñ*Nõá*NÑ&�E˜4 ÔRWô ?�5�'˜ D§I¡I¬f°U«mÓ$<Ð#=Ó>Ù*Nð ò ÷ MVœc )›nÐ-Ð-GÑHÐ[sˆLß>J˜DŸI™I lÓ3°dÖ:ÐPRˆMà˜ØÐIÈ-ÈÐYeÐXfð  gkð  lðˆJô œ)×$Õ$Ø&*×&>Ñ&>×&TÑ&TÐUZ×UaÑUaÓ&b× b�Ø×.Ñ.×CÑCÀM×D\ÑD\Ð^hÓi×iÐi÷ %ð —9‘9˜UÓ#Ð#ò =÷ <×;Ð;úò" gò Y÷ .×-Ð-üò !m÷ —U�Uüô8ò Yùôñ !cÙi÷ %×$ûô ô 	;Ü�N‰NÐ2°AÔ6ÜÐ0¸Ô:Õ:ûð	;üsW  ˆA3R)Á;O?ÂO<ÂO?ÂR)Â /Q. Ã?Q. ÄPÄ Q. Ä0PÅPÅPÅ
#Q. Å-P2Å2P-ÆP-ÆP2Æ9Q. ÇQ
Ç")Q
È%Q. È0QÈ1Q. É6Q. É?A1Q. Ë0QÌ#QÌ&#Q. Í
=Q. Î)QÎ0QÎ1-QÏQÏQÏ#Q. Ï;R)Ï<O?Ï?P	Ð
	R)ÐQ. ÐPÐP*	Ð$	Q. Ð-P2Ð2Q	Ð=Q. ÑQ. ÑQÑQÑQ+	Ñ&Q. Ñ.R&Ñ9"R!ÒR&ÒR)Ò!R&Ò&R)c               ó   € V ^8„  d   QhRR/# )r0   r1   rp  r2   )r3   s   "r4   r5   r±   Ô  s   € ÷ 0ñ 0 ñ 0r6   c                ó˜  € ^ RI Hp ^ RIHpHp  V! R4      ;'       g    RP                  4       pV'       gH   V! 4       P                  R4      ;'       g    / P                  R4      ;'       g    RP                  4       pV'       d   VP                  R4      # R#   T d)    \        P                  ! RR4      P                  4       p L˜i ; i)	u{  Proxy URL if proxy mode is configured (GATEWAY_PROXY_URL env wins over ``gateway.proxy_url``).
Per-profile like GATEWAY_PROXY_KEY: under multiplex a raw environ read would ship a secondary's
turns (authenticated with ITS scoped key) to the default profile's proxy. Same fallback shape as
the key â€” only ``UnscopedSecretError`` (the unscoped default-profile path) reads the env.)r”  )ÚUnscopedSecretErrorÚ
get_secretÚGATEWAY_PROXY_URLr^   ÚgatewayÚ	proxy_urlÚ/N)
rH   r”  Úagent.secret_scoperL  rM  Ústriprã  Úgetenvrv   rb   )rž   r”  rL  rM  r`  s   &    r4   Ú_get_proxy_urlÚGatewayTurnMixin._get_proxy_urlÔ  s¨   € õ
 	5ßFð	=ÙÐ1Ó2×8Ð8°b×?Ñ?ÓAˆC÷ Ù(Ó*×.Ñ.¨yÓ9×?Ð?¸R×DÑDÀ[ÓQ×WÐWÐUW×^Ñ^Ó`ˆCß"%ˆs�z‰z˜#‹Ð/¨4Ð/øð	 #ô 	=Ü—)’)Ð/°Ó4×:Ñ:Ó<ŠCð	=ús   �B ŸB Â,C	ÃC	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r0   r    r   Úscfgr%   r«   Úon_missing_cursorrU   r1   z(tuple[Any, Optional[Callable[[], None]]]r2   )r3   s   "r4   r5   r±   ã  s4   € ÷ #<ñ #<Ø#ð#<Ø+.ð#<Ø9<ð#<ØTWð#<à	1ñ#<r6   c               ó®  € ^ RI Hp RpVP                  \        P                  8X  d&   \        VR4      '       d   W1P                  3R R llp\        VRR4      p\        \        VRR	4      4      pV'       g   V'       g   VR
8X  d   \        R4      hV'       d   VP                  MRp	VP                  \        P                  8X  d   Rp	VP                  \        P                  8X  d!   \        \        VRR4      ;'       g    R4      MRp
T! VP                  VP                  T	Y¢P                  ;'       g    R\        VRR4      ;'       g    RR7      pW¶3# )zùBuild the shared ``StreamConsumerConfig`` and optional Telegram pause-typing closure.
For non-editing adapters ``on_missing_cursor="fallback"`` streams with an empty cursor;
``"raise"`` raises ``RuntimeError`` so the caller skips streaming entirely.)ÚStreamConsumerConfigNÚpause_typing_for_chatc               ó   € V ^8„  d   QhRR/# ©r0   r1   rs  r2   )r3   s   "r4   r5   ÚDGatewayTurnMixin._build_stream_consumer_config.<locals>.__annotate__ì  s   € ÷ 9ñ 9Ð\`ñ 9r6   c                ó(   € V P                  V4       R # ro   )r\  )Ú_adapterÚ_chat_ids   &&r4   Ú_pause_typing_before_finalizeÚUGatewayTurnMixin._build_stream_consumer_config.<locals>._pause_typing_before_finalizeì  s   € Ø×.Ñ.¨xÖ8r6   ÚSUPPORTS_MESSAGE_EDITINGTÚSUPPORTS_NATIVE_STREAMINGFÚraisez(skip streaming for non-editable platformr^   Úfresh_final_after_secondsç        ÚeditrÑ   )Úedit_intervalÚbuffer_thresholdÚcursorrh  Ú	transportrÑ   )Úgateway.stream_consumerr[  rÎ   r   ÚTELEGRAMr©   r¿   r�   ri   ÚRuntimeErrorrm  ÚMATRIXÚfloatrk  rl  rn  )rž   r    rX  r«   rY  r[  rc  Ú_adapter_supports_editÚ_adapter_supports_native_streamÚ_effective_cursorÚ_fresh_final_secsÚ_consumer_cfgs   &&&&$       r4   Ú_build_stream_consumer_configÚ.GatewayTurnMixin._build_stream_consumer_configã  s'  € õ 	AØ(,Ð%Ø�?‰?œh×/Ñ/Ô/´G¸GÐE\×4]Ò4]Ø7>ÏÉ÷ 9ô ")¨Ð2LÈdÓ!SÐÜ*.¬w°wÐ@[Ð]bÓ/cÓ*dÐ'ß%×.MÐRcÐgnÔRnÜÐIÓJÐJß+A˜DŸKšKÀrÐà�?‰?œhŸo™oÔ-Ø "Ðð �‰¤(×"3Ñ"3Ô3ô ”'˜$Ð ;¸SÓA×HÐHÀSÔIØ9<ð 	ñ -Ø×,Ñ,¸t×?TÑ?TØ$Ø&7Ç>Á>×C[ÐC[ÐU[Ü˜f k°2Ó6×<Ð<¸"ô	
ˆð Ð;Ð;r6   c               ó$   € V ^8„  d   QhRRRRRR/# )r0   rÝ   rp  rÆ   úOptional[int]r1   zCallable[[], bool]r2   )r3   s   "r4   r5   r±     s#   € ÷ "ñ "°ð "ÐP]ð "Ðbtñ "r6   c                ó"   a aa€ R VV V3R llpV# )z^Predicate: does this run's generation still own ``session_key``? (always True when untracked).c               ó   € V ^8„  d   QhRR/# r°   r2   )r3   s   "r4   r5   Ú<GatewayTurnMixin._run_still_current_fn.<locals>.__annotate__
  s   € ÷ 	Mñ 	M Dñ 	Mr6   c                 óD   <€ S e	   S'       g   R# SP                  SS 4      # )NT©r  ©rÆ   rž   rÝ   s   €€€r4   Ú_run_still_currentÚBGatewayTurnMixin._run_still_current_fn.<locals>._run_still_current
  s!   ø€ ØÒ%¯[ÙØ×/Ñ/°¸^ÓLÐLr6   r2   )rž   rÝ   rÆ   rƒ  s   fff r4   Ú_run_still_current_fnÚ&GatewayTurnMixin._run_still_current_fn  s   ú€ ÷	Mò 	Mð "Ð!r6   c               ó    € V ^8„  d   QhRRRR/# )r0   rc   rU   r1   údict[str, Any]r2   )r3   s   "r4   r5   r±     s   € ÷ Uñ U #ð U¨.ñ Ur6   c                	ó   € R V R. R^ R. /# )r¿  rÁ  Ú	api_callsr.  r2   )rc   s   &r4   Ú_proxy_error_resultÚ$GatewayTurnMixin._proxy_error_result  s   € à  $¨
°B¸ÀQÈÐQSÐTÐTr6   c               ó   € V ^8„  d   QhRR/# r*  r2   )r3   s   "r4   r5   r±     s   € ÷  ñ  ¨]ñ  r6   c           
     ó  € ^ RI HpHp \        \        V RR4      RR4      pVf   ^ RIHp V! 4       pVP                  '       g   R# ^ RIHp	 V	! V! 4       V! VP                  4      R4      p
VP                  V
4      '       g   R#  ^ RIHp V P                  V4      pV'       g   R# V P                  WVRR	7      w  rÞV! WÁP                  VW>W$R
7      #   \          d"   p\"        P%                  RT4        Rp?R# Rp?ii ; i)zUPlatform stream consumer for the proxy path when streaming is enabled, else ``None``.)r”  r•  r7  NÚ	streaming)ÚStreamingConfig)Úresolve_display_setting)ÚGatewayStreamConsumerÚfallback)rY  )r«   r¿   r7  r
  Úon_before_finalizeÚinitial_reply_to_idÚrun_still_currentz+Proxy: could not set up stream consumer: %s)rH   r”  r•  r�   Úgateway.configr�  Úglobally_enabledÚgateway.display_configr‘  rÎ   Úenabled_forro  r’  r½   ry  r¿   r¶   rö   r  )rž   r    rÞ   rì  rƒ  r”  r•  Ú_scfgr�  r‘  Ú_plat_streamingr’  ra  rx  rc  Ú_sc_errs   &&&&&           r4   Ú_proxy_stream_consumerÚ'GatewayTurnMixin._proxy_stream_consumer  sô   € çJÜœ  h°Ó5°{ÀDÓIˆð Š=Ý6Ù#Ó%ˆEà×%×%Ð%ÙÝBÙ1Ñ2FÓ2HÑJ^Ð_e×_nÑ_nÓJoÐq|Ó}ˆØ× Ñ  ×1Ò1Ùð	ÝEØ×1Ñ1°&Ó9ˆHßÙØ;?×;]Ñ;]Ø˜x¸:ð <^ó <Ñ8ˆMñ )Ø ¯.©.ÀØ)Ø$4ôð øô
 ô 	Ü�L‰LÐFÈÔPÝûð	ús   ÂC Â&+C ÃC>ÃC9Ã9C>Fc               ó@   € V ^8„  d   QhRRRRRRRRRRR	R
RRRRRRRR/
# )r0   rÓ   rU   rÜ   r|   úlist[dict[str, Any]]r    r   rÒ   rÝ   ú
str | NonerÆ   r|  rÞ   rp  ré   ri   r1   rˆ  r2   )r3   s   "r4   r5   r±   6  sr   € ÷ j
ñ j
Øðj
Ø,/ðj
Ø:Nðj
àðj
à+.ðj
à=Gðj
ð &ðj
ð ANðj
ð "ð	j
ð
 
ñj
r6   c
              ƒ  óN  aaaaa%a&"  € ^ RI Hp
  ^ RIHpHp T P                  4       pT'       g   T P                  \        R4      4      # ^ RI
Hp T! R4      P                  4       pT P                  SS4      pR	 TTTT3R
 llpT'       d   RRRT/.M. pTS Uu. uFX  pTP                  R4      R?9   g   K  TP                  R4      '       g   K4  RTP                  R4      RTP                  R4      /NKZ  	  up,          pTP                  RRRT/4       RR/pT'       d	   RT 2TR&   S'       d   STR&   RRRTRR/pT P!                  YH4      pT	'       d   RMT P#                  YHTT4      o%S%'       d%   \$        P&                  ! S%P)                  4       4      MRpT P+                  T4      pT'       dN   T	'       gF   \-        \.        4      ;_uu_ 4        TP1                  TP2                  TR7      G Rj  x€L
  RRR4       Ro&\4        P4                  ! 4       pRpR T%T&3R llp T! ^ R ^R!7      pT! TR"7      ;_uu_4       GRj  x€L
 pTP7                  T R#2TTR$7      ;_uu_4       GRj  x€L
 pTP8                  ^È8w  dÖ   TP;                  4       G Rj  x€L
 p\<        P?                  R%TP8                  TTR&,          4       T P                  \        R'TP8                  TR(,          R)7      4      uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  S%'       d   S%PA                  4        T'       d#    \$        PB                  ! TR*R"7      G Rj  x€L
  # # Rp TPJ                  PM                  4         Rj  x€L
  p!T! 4       '       gq   T! R4      u uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  S%'       d   S%PA                  4        T'       d#    \$        PB                  ! TR*R"7      G Rj  x€L
  # # T T!PO                  R+R,R-7      ,          p R.T 9   d)   T PQ                  R.^4      w  p"p T! T"4      '       g   K,  Rp T'       d    M\S        T 4      T
8”  g   Kì  \U        R/4      hT'       g   T '       d	   T! T 4      pT'       g©   \<        P?                  R0T\S        S&4      4       S&'       g�   T P                  \        R14      4      uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  S%'       d   S%PA                  4        T'       d#    \$        PB                  ! TR*R"7      G Rj  x€L
  # # RRR4      GRj  x€L
  RRR4      GRj  x€L
  S%'       d   S%PA                  4        T'       d#    \$        PB                  ! TR*R"7      G Rj  x€L
  M \4        P4                  ! 4       T,
          p$T! 4       '       g	   T! R54      # \<        PY                  R6TS;'       g    RR7,          T$\S        S&4      4       R8S&;'       g    \        R94      RRRRT/RRRS&/.R:^R;. R<\S        S4      R=SR>S%RJ;'       d    \[        S&4      /#   \
         d)    T P                  \        R\        R4      R7      4      u # i ; iu upi  ELŒ  + '       g   i     EL“; i ELR EL- EL EL¢ EL“ ELU  \D        \$        PF                  3 d    TPI                  4         # i ; i ELb EL< EL- ELï  \D        \$        PF                  3 d    TPI                  4         # i ; iEDžEL° ELB EL3 ELõ  \D        \$        PF                  3 d    TPI                  4         # i ; i EL  + GRj  x€L 
 '       g   i     EL/; i EL'  + GRj  x€L 
 '       g   i     EL?; i  \$        PF                   d    h \.         dÀ   p#\<        PW                  R2TT#4       S&'       g–   T P                  \        R3T#R47      4      u Rp#?#S%'       d   S%PA                  4        T'       dU    \$        PB                  ! TR*R"7      G Rj  x€L 
  #   \D        \$        PF                  3 d    TPI                  4         # i ; i#  Rp#?#ELRp#?#ii ; i ELè  \D        \$        PF                  3 d    TPI                  4         ELi ; i  S%'       d   S%PA                  4        T'       dU    \$        PB                  ! TR*R"7      G Rj  x€L 
  i   \D        \$        PF                  3 d    TPI                  4         i i ; ii ; i5i)@zðForward the message to a remote Hermes API server instead of running a local AIAgent.

Lets a Docker container handle Matrix E2EE while the agent runs on the host with full
access to local files, memory, skills, and a unified session store.)Ú#_GATEWAY_PROXY_SSE_BUFFER_MAX_CHARS)ÚClientSessionÚClientTimeoutzgateway.proxy.requires_aiohttpÚ	messaging)Úhintzgateway.proxy.url_missing)Úget_secret_strÚGATEWAY_PROXY_KEYc               ó    € V ^8„  d   QhRRRR/# )r0   ÚwhatrU   r1   rˆ  r2   )r3   s   "r4   r5   Ú;GatewayTurnMixin._run_agent_via_proxy.<locals>.__annotate__U  s   € ÷ 	ñ 	 ð 	¨ñ 	r6   c                óŽ   <€ \         P                  R T S;'       g    RS;'       g    ^ 4       RRR. R^ R. R\        S4      RSR	R
/# )uG   Discarding stale proxy %s for %s â€” generation %d is no longer currentÚ?r¿  r^   rÁ  rŠ  r.  Úhistory_offsetrÒ   Úresponse_previewedF)rö   r÷   ra   )r¬  r|   rÆ   rÒ   rÝ   s   &€€€€r4   Ú_stale_resultÚ<GatewayTurnMixin._run_agent_via_proxy.<locals>._stale_resultU  sY   ø€ Ü�K‰KØYØ�k×(Ð( S¨.×*=Ð*=¸Aôð
 ! " j°"°kÀ1ÀgÈrØ ¤# g£,°¸jÐJ^Ð`eðð r6   r~   ÚsystemrÄ  r0  Ú	assistantzContent-Typezapplication/jsonzBearer ÚAuthorizationzX-Hermes-Session-IdrW  zhermes-agentrÁ  ÚstreamTNr™  r^   Fc               ó    € V ^8„  d   QhRRRR/# )r0   ÚlinerU   r1   ri   r2   )r3   s   "r4   r5   r­    s   € ÷ 	ñ 	 Cð 	¨Dñ 	r6   c                ó  <€ V P                  4       p V P                  R4      '       g   R# V R,          pVP                  4       R8X  d   R#  \        P                  ! V4      P	                  R4      ;'       g    . pV'       d*   V^ ,          P	                  R/ 4      P	                  RR	4      MR	pT'       d#   ST,          oS'       d   SP                  T4       R#   \        P
                  \        \        \        3 d     R# i ; i)
uÔ   Parse one SSE line into full_response; True when the terminal ``[DONE]`` was seen.

Malformed frames (bad JSON, ``choices: [null]``, non-dict deltas) are skipped â€”
one bad chunk must not abort the whole stream.zdata: F:é   NNz[DONE]TÚchoicesÚdeltarÄ  r^   )
rS  rÚ  ÚjsonÚloadsrv   ÚJSONDecodeErrorÚ	TypeErrorÚAttributeErrorÚ
IndexErrorÚon_delta)r¹  Údatar¼  rÄ  Ú_stream_consumerÚfull_responses   &   €€r4   Ú_consume_sse_lineÚ@GatewayTurnMixin._run_agent_via_proxy.<locals>._consume_sse_line  sÎ   ø€ ð —:‘:“<ˆDØ—?‘? 8×,Ò,ÙØ˜•8ˆDØ�z‰z‹|˜xÔ'ÙðÜŸ*š* TÓ*×.Ñ.¨yÓ9×?Ð?¸R�ßLS˜' !�*Ÿ.™.¨°"Ó5×9Ñ9¸)ÀRÔHÐY[�÷ Ø Õ(�ß#Ø$×-Ñ-¨gÔ6Ùøô ×(Ñ(¬)´^ÄZÐPô Úðús   Á+C Á8
C Â+C Ã%DÄDé  )ÚtotalÚ	sock_readÚsock_connect©Útimeoutz/v1/chat/completions)r¾  ÚheaderszProxy error (%d) from %s: %srÔ   zgateway.proxy.http_error:Ni,  N)Ústatusrm   ç      @r>   rù   )ÚerrorsrË   zAProxy SSE stream exceeded max buffer size without a line boundaryu_   Proxy SSE stream from %s ended without [DONE] â€” response may be truncated (%d chars received)zgateway.proxy.closed_earlyz Proxy connection error to %s: %szgateway.proxy.connection_errorrÀ  rð  z>proxy response: url=%s session=%s time=%.1fs response=%d chars:Né   Nr¿  zgateway.proxy.no_responserŠ  r.  r°  rÒ   r±  >   r0  rµ  ).rH   r¤  Úaiohttpr¥  r¦  ÚImportErrorr‹  r   r   rU  rR  r©  rS  r…  rv   rf  rœ   rž  ÚasyncioÚcreate_taskÚrunr½   r   r¶   Úsend_typingr¿   rõ   ÚpostrÑ  rc   rö   r”   ÚfinishÚwait_forÚTimeoutErrorÚCancelledErrorÚcancelrÄ  Úiter_anyÚdecoder`   ra   Ú
ValueErrorrm   r÷   ri   )'rž   rÓ   rÜ   r|   r    rÒ   rÝ   rÆ   rÞ   ré   r¤  Ú_AioClientSessionr¦  rP  r©  Ú	proxy_keyrƒ  r²  Úapi_messagesÚmsgrÐ  Úbodyrì  Ústream_taskra  Ú_startÚsaw_donerÈ  Ú_timeoutÚsessionÚrespÚ
error_textÚbufferÚchunkr¹  r&  Ú_elapsedrÆ  rÇ  s'   &&&f&fff&&                           @@r4   Ú_run_agent_via_proxyÚ%GatewayTurnMixin._run_agent_via_proxy6  sò  ýé € õ 	Dð	qßQð ×'Ñ'Ó)ˆ	ßØ×+Ñ+¬AÐ.IÓ,JÓKÐKõ 	6á"Ð#6Ó7×=Ñ=Ó?ˆ	à!×7Ñ7¸À^ÓTÐ÷	ó 	÷ ao¨v°xÀÈNÐ.[Ñ-\ÐtvˆØáó
á� #§'¡'¨&£/Ð5JÑ"Jô EØORÏwÉwÐW`×Oaô EˆV�S—W‘W˜V“_ i°·±¸Ó1CÓDÙñ
õ 	
ˆð 	×Ñ˜V V¨Y¸Ð@ÔAà#1Ð3EÐ"FˆßØ)0°°Ð'<ˆG�OÑ$ßØ-7ˆGÐ)Ñ*Ø˜¨°\À8ÈTÐRˆà59×5UÑ5UÐV\Ó5oÐç'‰DØ×,Ñ,¨VÐGWÐYkÓlð 	÷ FV”g×)Ò)Ð*:×*>Ñ*>Ó*@ÔAÐ[_ˆà×-Ñ-¨fÓ5ˆß×/Üœ)×$Õ$Ø×*Ñ*¨6¯>©>ÐDTÐ*ÓU×UÐU÷ %ð ˆÜ—’“ˆØˆ÷	ñ 	ð.6	)ñ %¨1¸È2ÔNˆHÙ(°×:×:Õ:¸gØ"Ÿ<™<¨9¨+Ð5IÐ(JÐQUÐ_f˜<×g×gÔgÐkoØ—{‘{ cÔ)Ø+/¯9©9«;×%6˜
ÜŸ™Ð'EÀtÇ{Á{ÐT]Ð_iÐjnÕ_oÔpØ#×7Ñ7¼Ð:TÐ]a×]hÑ]hÐpzÐ{õ  qAô  9Bó   C÷	 h×gÑg÷ ;×:Ñ:÷X  Ø ×'Ñ'Ô)ßð)Ü!×*Ò*¨;ÀÔD×DÑDð ðO  �FØ'+§|¡|×'<Ñ'<Ô'>÷ rð r˜eÙ1×3Ò3Ù#0°Ó#:Ñ:÷ h×gÑg÷ ;×:Ñ:÷X  Ø ×'Ñ'Ô)ßð)Ü!×*Ò*¨;ÀÔD×DÑDð ðG  %§,¡,¨w¸y ,Ó"IÕI˜Ø" fœnØ+1¯<©<¸¸aÓ+@™L˜D &Ù0°×6Ô6Ø+/ Ø %ç#Ù!Ü˜v›;Ð)LÖLÜ",Ð-pÓ"qÐq÷ $¯Ù#4°VÓ#<˜ß#ô Ÿ™ð2Ø3<¼cÀ-Ó>Pô÷  -Ø#'×#;Ñ#;¼AÐ>ZÓ<[Ó#\÷E h×gÑg÷ ;×:Ñ:÷X  Ø ×'Ñ'Ô)ßð)Ü!×*Ò*¨;ÀÔD×DÑDð ÷[ h×g÷ ;×:÷X  Ø ×'Ñ'Ô)ßð)Ü!×*Ò*¨;ÀÔD×DÑDð ô —9’9“; Õ'ˆÙ!×#Ò#Ù  Ó*Ð*Ü�‰ØLØ˜
×(Ð( b¨#Õ.°¼#¸mÓ:Lô	
ð
 ˜m×MÐM¬qÐ1LÓ/MØØ˜ ¨GÐ4Ø˜ i°Ð?ðð ˜Ø�RØœc '›lØ˜*Ø Ð"2¸$Ð">×"VÐ"VÄ4ÈÓCVð
ð 	
øôe ô 	qØ×+Ñ+¬AÐ.NÔUaÐbmÓUnÔ,oÓpÒpð	qüò>
ò. V÷ %×$Ð$úòD ;Úgâ%6ò hò ;ò` EøÜ$¤g×&<Ñ&<Ð=ô )Ø×&Ñ&Ö(ð)úòSrò hò ;ò` EøÜ$¤g×&<Ñ&<Ð=ô )Ø×&Ñ&Ö(ð)úóS (?ò hò ;ò` EøÜ$¤g×&<Ñ&<Ð=ô )Ø×&Ñ&Ö(ð)ú÷a h×g×gÔgú÷ ;×:×:Ô:ûôH ×%Ñ%ô 	ØÜô 	^Ü�L‰LÐ;¸YÈÔJß Ø×/Ñ/´Ð2RÐZ[Ô0\Ó]Ô]÷  Ø ×'Ñ'Ô)ßð)Ü!×*Ò*¨;ÀÔD×DÒDøÜ$¤g×&<Ñ&<Ð=ô )Ø×&Ñ&Ö(ð)úð õ !ûð	^úò EøÜ$¤g×&<Ñ&<Ð=ô )Ø×&Ñ&×(ð)û÷  Ø ×'Ñ'Ô)ßð)Ü!×*Ò*¨;ÀÔD×DÒDøÜ$¤g×&<Ñ&<Ð=ô )Ø×&Ñ&Ö(ð)úð üsë  ˆd%�Y ˜d%°Ad%Âd%ÂY;Â7Y;Ã(Y;Ã8)d%Ä"d%Ä2Ad%Å5>d%Æ4d%Æ<d%Ç!ZÇ4Z Ç5ZÇ9+d%È% ^ ÉZÉ^ É	$]8É-ZÉ.]8É1%]	ÊZÊA]	Ë1]8Ë>Z 
Ë?]8Ì^ ÌZ#Ì^ Ìd%Ì6Z)ÍZ&ÍZ)Íd%Í]	Í4\
Í8[Í9\
Í<]	Î]8Î![
Î"]8Î&^ Î3[ Î4^ Î8d%Ï[&Ï4[#Ï5[&Ï9d%Ï;A]	Ñ
]	Ñ]	Ñ ]	Ñ3]	Ñ;]	ÒA]	Ó]8Ó\
Ó]8Ó^ Ó+\Ó,^ Ó0d%Ô\$Ô,\!Ô-\$Ô1d%Ô3]8Ô>]Ô?]8Õ^ Õ]5Õ^ Õd%Õ4a: Öa7Öa: Ö*d%Ö?!d%×!"d%Ø3d%Ø8d%Ù0Y8Ù5d%Ù7Y8Ù8d%Ú ZÚZ	Ú	d%Ú^ Ú]8Ú]	Ú ]8Ú#^ Ú&Z)Ú)+[Ûd%Û[Ûd%Û\
Û]8Û ^ Û#[&Û&+\Üd%Ü\Üd%Ü]	Ü]8Ü^ Ü!\$Ü$+]Ýd%Ý]Ýd%Ý]8Ý]2Ý]!Ý
]2Ý*]2Ý,	]8Ý5^ Ý8^	Ý>^Ý?
^	Þ
^	Þ^ Þb, Þ^ Þa4Þ4a4Þ5:a/ß/a4ß0b, ß4d%ß<d%à`7à0`3à1`7à6d%à7+a%á"d%á$a%á%d%á)b, á/a4á4b, á7a: á:+b)â%d%â(b)â)d%â, d"ãc0ã)c,ã*c0ã/d"ã0+däd"ädäd"ä"d%c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r0   rÓ   rU   rÜ   r|   r¡  r    r   rÒ   r1   rˆ  r2   )r3   s   "r4   r5   r±   â  sF   € ÷ tñ tØðtØ,/ðtØ:Nðtàðtà+.ðtð 
ñtr6   c           	   ‹  ó¸   "  € V P                  V4      ;_uu_ 4        V P                  ! WW4V3/ VB G Rj  x€L
 uuRRR4       #  L  + '       g   i     R# ; i5i)zuProfile-scoping wrapper around ``_run_agent_inner`` (same keyword parameters; pass-through
when multiplexing is off).N)r3  Ú_run_agent_inner)rž   rÓ   rÜ   r|   r    rÒ   Úturn_kwargss   &&&&&&,r4   r  ÚGatewayTurnMixin._run_agentâ  sJ   é € ð ×+Ñ+¨F×3Õ3Ø×.Ò.¨wÈÐYcÑsÐgrÑs×s÷ 4Ò3Ùs÷ 4×3Ð3üs+   ‚AœAµA¶A¹AÁAÁA	Á	Ac               ó    € V ^8„  d   QhRRRR/# )r0   r    r   r1   úGatewayRunner._RunAgentDisplayr2   )r3   s   "r4   r5   r±   ë  s   € ÷ w
ñ w
°-ð w
ÐDbñ w
r6   c                ó€  aa"a#a$a%a&a'a(a)€ ^ RI Ho"Ho%HpHp ^ RIHp ^ RIHo(H	p ^ RI
Ho&Hp ^ RIHpHp V! V S4      p	^ RIHp
 V	'       d   V	P%                  V
! V 4      RR7      MV! 4       o)V	'       d   V	P&                  MV! SP&                  4      o'V P)                  S)SS'4      w  r¼V	'       d   V! V
! V 4      V	S)SP*                  4      pV P-                  S4      pR	R
^ R 3RRR\.        33 FP  w  rïpp\1        \2        4      ;_uu_ 4        ^ RIHp S(! S)S'VV4      p\9        VV4      ! V! V4      4       RRR4       KR  	  V! S)S'V! R4      4      w  ppS(! S)S'R4      ;'       g    Rp. o$V! S)S'4      o#RRRRRR/R V"V%V'V(VV)3R lllpRRRRRR/R V#V$V&3R lllpSP&                  \:        P<                  8H  pVR*9  ;'       d    V'       * pS(! S)S'R R!4      p\9        VR"R4      '       d
   VR8w  d   TMRpVR8H  ;'       d    V'       * pV! R#R\:        P>                  0R$7      pV'       * ;'       d    VR8g  pV! R%R\:        P>                  0R$7      R8g  p Rp!SP&                  \:        P@                  8X  d<   \C        VR&4      '       d*   V'       d   VR8X  g    \/        VPE                  4       4      p!T PK                  S)S'TTS(TTTTTTTV'       d   \L        PN                  ! 4       MRTT T!T;'       g    T ;'       g    T!VR)7      #   + '       g   i     EK*  ; i  \2         d    \F        PI                  R'RR(7        L�i ; i)+zYResolve per-platform display, progress, status and streaming-surface settings for a turn.)Ú_gateway_platform_valueÚ_has_platform_display_overrider”  r•  )rM  )r‘  Úresolve_tool_progress)Úchoose_status_phraseÚresolve_status_phrase_catalog)Úpolicy_for_sourceÚpolicy_turn_toolsets©Úactive_authorityF)ÚsecretsÚset_tool_preview_max_lenÚtool_preview_lengthc                ó,   € V '       d   \        V 4      # ^ # )r³   )r[   )Úvs   &r4   r$  Ú>GatewayTurnMixin._run_agent_display_settings.<locals>.<lambda>ÿ  s   € ×WXÌSÐQRËVÐM_Ð^_ÐM_r6   Úset_friendly_tool_labelsÚfriendly_tool_labelsT)ÚdisplayNÚHERMES_TOOL_PROGRESS_MODEÚtool_progress_groupingÚ
accumulaterS  Úrequire_platform_override_forÚallow_genericc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r0   ÚsettingrU   rS  ri   r  zset[Any] | Noner  r1   r2   )r3   s   "r4   r5   ÚBGatewayTurnMixin._run_agent_display_settings.<locals>.__annotate__  s6   € ÷ 	3ñ 	3Øð	3Ø&*ð	3à+:ð	3àRVð	3ð ñ	3r6   c               óh  <€ V'       dB   S! SP                   4      pV Uu0 uF  pS! V4      kK  	  ppWF9   d   S	! SS
V 4      '       g   R# S! SS
W4      p\        V\        4      '       d0   VP                  4       P	                  4       R8X  d   V'       d   R# R# \        V4      '       d   R# R# u upi )z8Return off|raw|generic for a gateway visibility surface.ÚoffÚgenericÚraw)rÎ   r€   rU   rS  rw   ri   )r  rS  r  r  Úcurrent_platformÚitemÚplatform_onlyrÈ   rý  rþ  rz  r‘  r    ry  s   &$$$    €€€€€€r4   Ú_display_surface_modeÚKGatewayTurnMixin._run_agent_display_settings.<locals>._display_surface_mode  s£   ø€ ÷
 -Ù#:¸6¿?¹?Ó#KÐ ÙKhÓ iÑKhÀ4Ñ!8¸Ö!>ÑKh�Ð ià$Ô5Ù:¸;ÈÐV]×^Ò^á Ù+¨K¸ÀwÓXˆEÜ˜%¤×%Ò%¨%¯+©+«-×*=Ñ*=Ó*?À9Ô*Lß$1�yÐ<°uÐ<Ü  ŸKšK�5Ð2¨UÐ2ùò !js    B/Ú	tool_namerÃ  Úargsc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r0   ÚkindrU   r   r¢  rÃ  r!  r%   r1   r2   )r3   s   "r4   r5   r  $  s=   € ÷ 
	Jñ 
	J¨ð 
	J¸Jð 
	JÐXbð 
	JÐqtð 
	Jð  ADñ 
	Jr6   c          	     ó´   <€  S! WW#SSR 7      #   \          d>   p\        P                  RT4       T R9   d   \        R4      M
\        R4      u Rp?# Rp?ii ; i))r   rÃ  r!  ÚrecentÚcatalogz*generic status phrase selection failed: %sz%gateway.progress.status_fallback_longz&gateway.progress.status_fallback_shortN>   rÑ  ÚwaitingÚ	heartbeatÚlong_running)r¶   rö   r  r   )r#  r   rÃ  r!  Ú_phrase_errÚ_generic_status_catalogÚ_generic_status_recentr   s   &$$$ €€€r4   Ú_generic_status_phraseÚLGatewayTurnMixin._run_agent_display_settings.<locals>._generic_status_phrase$  sg   ø€ ð	JÙ+Ø°wØ1Ð;Rôð øô ô JÜ—‘ÐIÈ;ÔWàÐ#UÔUô ÐAÔBäÐGÓHõJûðJús   ƒ �Aš2AÁAÁAr  ÚlogÚlive_statusÚfullÚsupports_status_textÚinterim_assistant_messages)rS  r  Úthinking_progressÚnative_task_cards_enabledz*Slack native task-card config check failed©Úexc_info)ry  rz  rŸ  rŠ  r‘  Úprogress_modeÚprogress_groupingr  Útool_progress_enabledÚ_live_status_modeÚ_live_status_adapterÚlog_mode_enabledÚ	log_queueÚ"interim_assistant_messages_enabledÚ_thinking_enabledÚ_native_slack_task_cardsÚneeds_progress_queuer-  >   r/  r  )(rH   rý  rþ  r”  r•  rR  rM  r™  r‘  rÿ  Úgateway.status_phrasesr   r  r/  r  r  Úgateway.session_authoritiesr  r7  rÎ   rŽ  r¿   r½   ri   r   r¶   r�   r  r�   r   ÚWEBHOOKÚ
MATTERMOSTÚSLACKr©   r5  rö   r  Ú_RunAgentDisplayÚqueueÚQueue)*rž   r    r”  r•  rM  rÿ  r  r  r  Úpolicyr  rŸ  rŠ  r«   Ú_setterÚ_settingÚ_defaultÚ_castÚ_agent_displayÚ_valr8  Ú_tool_progress_explicitr9  r  r-  Ú
is_webhookr:  r;  r<  r=  Úinterim_assistant_messages_moder?  r@  rA  rý  r+  r,  rþ  r   rz  r‘  ry  s*   &f                                @@@@@@@@r4   Ú_run_agent_display_settingsÚ,GatewayTurnMixin._run_agent_display_settingsë  si  ÿø€ ÷	
ó 	
õ 	2ßYß^ßRÙ" 4¨Ó0ˆÝ@ßNT�f—m‘mÑ$4°TÓ$:ÀE�mÔJÑZnÓZpˆß*0�v—’Ñ6JÈ6Ï?É?Ó6[ˆØ.2×.IÑ.IÈ+ÐW]Ð_kÓ.lÑ+ÐßÙ3Ñ4DÀTÓ4JÈFÐT_Ðag×aoÑaoÓpÐØ×,Ñ,¨VÓ4ˆð (Ð)>ÀÑC_Ð`Ø'Ð)?ÀÄtÐLó3
Ñ.ˆG˜x¨ô œ)×$Õ$Ý;Ù.¨{¸LÈ(ÐT\Ó]�Ü˜¨Ô0±°t³Ô=÷ %Ñ$ñ	3
ñ 2GØ˜¡zÐ2MÓ'Nó2
Ñ.ˆÐ.ñ 4°KÀÐOgÓh×xÐxÐlxÐØ,.ÐÙ"?ÀÈ\Ó"ZÐð	3Ø-2ð	3à=Að	3àY^÷	3÷ 	3ð$
	JÈð 
	JÐeið 
	JÐw{÷ 
	Jô 
	Jð —_‘_¬×(8Ñ(8Ñ8ˆ
Ø -°^Ñ C× VÐ VÈJÌÐá3°KÀÈ}Ð^dÓeÐä˜wÐ(>À×FÒFÐK\Ð`eÔKe‰GÐkoð 	ð )¨EÑ1×DÐD¸*´nÐñ +@Ø(°$ÔW_×WjÑWjÐVkô+
Ð'ð 2<¬^×-hÐ-hÐ@_ÐchÑ@hÐ*Ù1Ø¨Ìx×ObÑObÐNcô
àñÐð $)Ð à�O‰OœxŸ~™~Ô-Ü˜Ð!<×=Ò=ß,°À%Ô1GðZÜ+/°×0QÑ0QÓ0SÓ+TÐ(ð ×$Ñ$Ø#°,ÐQaØ/ÐI`Ø'Ð;LØ"7Ø"7ÐK\Ø!5ÐHXß'7”e—k’k”m¸TØ/QØ/ÐJbØ!6×!gÐ!gÐ:K×!gÐ!gÐOgØ#9ð %ó 
ð 	
÷i %×$Ñ$ûôd ô ZÜ—‘ÐIÐTX�ÖYðZús   Ä	*LÊL ÌLÌ"L=Ì<L=c               ó4   € V ^8„  d   QhRRRRRRRRR	R
RRRR/# )r0   Údisprû  r—  r%   rÓ   rU   r    r   rÝ   rp  rÆ   r|  r1   z#tuple[TurnContext, TurnRunner, Any]r2   )r3   s   "r4   r5   r±   l  sF   € ÷ )7ñ )7Ø2ð)7Ø=@ð)7ØNQð)7Ø[hð)7à"ð)7à4Að)7ð 
-ñ)7r6   c               óR  € ^ RI Hp V P                  V4      .p	\        VP	                  VP
                  VP                  R4      4      p
V
'       d   V P                  V4      MRpVe0   \        \        V4      RR4      R\        P                  39   d   Rp
Rp\        RRTRTRTR	TR
TRT
RV P                  WV4      RVP                  '       d   \        P                   ! 4       MRRV	R\"        P$                  ! 4       /
V P&                   Uu/ uF  qÌ\        W4      bK  	  upBVB pV! W4      p\)        VP*                  VP,                  VP
                  4      Vn        VP0                  Vn        VP2                  Vn        VP4                  Vn        VP8                  Vn        WÞV3# u upi )uÇ   Build the ``TurnContext`` and its ``TurnRunner``; ``turn_params`` (history, context_prompt,
session_id, persist_user_*, â€¦) are stored verbatim. Returns ``(turn_ctx, turn_runner,
cleanup_adapter)``.r-   Úcleanup_progressNÚdelete_messageFr    rÓ   r—  rÝ   rÆ   Ú_cleanup_progressrƒ  Úprogress_queueÚ_voice_ack_guildÚ_voice_ack_loopr2   )Úgateway.run_turn_runnerr.   Ú_voice_ack_guild_forri   r‘  ry  rz  r½   r�   r¨   r   r[  r    r…  rB  rI  rJ  r×  Úget_running_loopÚ_DISPLAY_TO_TURN_CTXr   rç   rÎ   Úmute_notification_replyÚprogress_callbackÚvoice_ack_callbackÚcombined_tool_start_callbackÚnative_tool_start_callbackÚnative_tool_complete_callback)rž   rX  r—  rÓ   r    rÝ   rÆ   Úturn_paramsr.   r^  r\  Ú_cleanup_adapterÚnameÚturn_ctxÚturn_runners   &&&$$$$,       r4   Ú_run_agent_build_turn_contextÚ.GatewayTurnMixin._run_agent_build_turn_contextl  sà  € õ 	7ð 26×1JÑ1JÈ6Ó1RÐ0SÐô !Ø×(Ñ(¨×)9Ñ)9¸4×;LÑ;LÐN`Óaó
Ð÷ BS˜4×5Ñ5°fÔ=ÐX\ÐØÒ'¬G´DÐ9IÓ4JÐL\Ð^bÓ,cØÔ%×4Ñ4ðh
ô -
ð !&ÐØ#Ðô ñ 
Øð
Ø#*ð
Ø4;ð
ØITð
à)ð
à=Nð
ð  $×9Ñ9¸+ÓVð
ð -1×,E×,EÐ,Eœ5Ÿ;š;œ=È4ð	
ð
 .ð
ô
 @G×?WÒ?WÓ?Yð
ð 6:×5NÒ5NÓOÑ5N¨T”W˜TÓ(Ò(Ñ5NÑOð
ð T_ñ
ˆñ ! Ó0ˆÜ+@Ø×2Ñ2°F·O±OÀX×EYÑEYó,[ˆÔ(ð &1×%BÑ%BˆÔ"Ø&1×&DÑ&DˆÔ#Ø.9×.VÑ.VˆÔ+Ø1<×1ZÑ1ZˆÔ.ØÐ&6Ð6Ð6ùò Ps   Ä	F$c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r0   r    r   rÞ   rp  Ú_progress_thread_idr%   Ú_relay_prospective_thread_idr1   úOptional[dict[str, Any]]r2   )r3   s   "r4   r5   r±   —  s6   € ÷ ñ Ø#ðØ7DðØ[^ðà&3ðð 
"ñr6   c           
     óê   € V'       g   RpMWW1P                   8X  d   V P                  W4      pM5V P                  VP                  VP                  V\        VRR4      VR7      pVf   V'       d   RV/pV# )a  Thread metadata for a progress-lane send; relay Discord auto-thread lane falls back to the reply anchor.

The connector will auto-thread on the reply anchor (thread is born on its FIRST send), so
carrying it routes progress / status bubbles into the same thread as the final reply.NrÑ   )rÑ   rÌ   rÌ   )rÐ   rœ   Ú_thread_metadata_for_targetrÎ   r¿   r�   )rž   r    rÞ   rr  rs  r
  s   &&&&& r4   Ú_thread_metadata_for_progressÚ.GatewayTurnMixin._thread_metadata_for_progress—  sw   € ÷ #Ø‰HØ ×$4Ñ$4Ô4Ø×7Ñ7¸ÓQ‰Hà×7Ñ7Ø—‘ §¡Ð1DÜ! &¨+°tÓ<ÐRbð 8ó ˆHð Ò× <Ø-Ð/?Ð@ˆHØˆr6   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r0   r    r   rÞ   rp  rA  ri   r1   z4tuple[Optional[dict], Optional[str], Optional[dict]]r2   )r3   s   "r4   r5   r±   ¬  s8   € ÷ AOñ AOØ#ðAOØ7DðAOØ`dðAOà	=ñAOr6   c                ó6  € ^ RI HpHp \        \	        VP
                  RVP
                  4      ;'       g    R4      P                  4       R8H  pRpVP
                  \        P                  8X  g	   V'       d   V P                  V4      MRpVep    V'       d   \	        VRR4      R	8g  pMU\	        VR
R4      p	\        \        V	4      '       d   V	! 4       M%VP                  P                  P                  RR4      4      p V! VP
                  VP                   W'R7      p
VP
                  \        P"                  8X  dO   \	        VRR4      '       d<   \	        VRR4      '       d)   VP                   '       g   \        \	        VRR4      4      MRpV! V P%                  WW«4      VP
                  R7      pV'       dŽ   \'        T;'       g    / 4      pVP(                  '       d9   VP+                  RVP(                  4       VP+                  RVP(                  4       VP,                  '       d   VP+                  RVP,                  4       VP
                  \        P.                  \        P0                  39   d   VP                   '       d	   V'       g!   V'       d   V'       d	   V'       g	   V'       d   TMRpVP
                  \        P.                  8X  d"   VP                   '       d   V'       d   RV
RV/pMV P%                  WW«4      pWÍV3#   \         d    Rp ELi ; i)a¡  Resolve where progress bubbles are threaded (platform-specific).

Returns ``(progress_metadata, progress_reply_to, status_thread_metadata)``; the latter is
for status / approval / stream sends (Feishu topics need the triggering message id via the
reply API, so carry it as a fallback). Slack and Buzz honour the user's reply_in_thread
opt-out: never synthesise a thread for progress, or every later reply inherits it.)Ú_non_conversational_metadataÚ_resolve_progress_thread_idrÈ   r^   ÚbuzzTNÚ_reply_to_modeÚfirstr  Ú_effective_reply_in_threadÚreply_in_thread)r�  Údelivered_via_upstream_relayFÚprospective_thread_id©rÎ   Úrecipient_team_idÚslack_team_idÚrecipient_user_idrÐ   rÌ   )rH   r{  r|  rU   r�   rÎ   rw   r   rG  r½   ri   r¾   r7  Úextrarv   r¶   rÐ   ÚDISCORDrw  rg   Úscope_idÚ
setdefaultrÏ   ÚFEISHUrF  )rž   r    rÞ   rA  r{  r|  Úis_buzzÚ_progress_reply_in_threadra  Ú_mode_fnrr  rs  Ú_progress_metadataÚ_progress_reply_toÚ_status_thread_metadatas   &&&&           r4   Ú_run_agent_progress_threadingÚ.GatewayTurnMixin._run_agent_progress_threading¬  s•  € ÷ 	ZÜ”g˜fŸo™o¨w¸¿¹ÓH×NÐNÈBÓO×UÑUÓWÐ[aÑaˆØ$(Ð!Ø9?¿¹ÌHÏNÉNÔ9Z×^e�4×-Ñ-¨fÔ5ÐkoˆØÒð
1ßÜ07¸ÐBRÐT[Ó0\Ð`eÑ0eÑ-ô  ' xÐ1MÈtÓT�HÜ04Ü&.¨x×&8Ò&8™œ
¸h¿o¹o×>SÑ>S×>WÑ>WÐXiÐkoÓ>pó1Ñ-ñ
 :Ø�O‰O˜V×-Ñ-Ð/?ô
Ðð �‰¤(×"2Ñ"2Ô2Ü˜Ð >À×FÒFÜ˜Ð 7¸×>Ò>Ø×$×$Ð$ô	 ”˜Ð 7¸Ó>Ô?ð
 ð 	%ñ :Ø×.Ñ.ØÐ*=óð —_‘_ô	
Ð÷ $ä!%Ð&8×&>Ð&>¸BÓ!?ÐØ��ˆØ"×-Ñ-Ð.AÀ6Ç?Á?ÔSØ"×-Ñ-¨o¸v¿¹ÔOØ�~�~ˆ~Ø"×-Ñ-Ð.AÀ6Ç>Á>ÔRð —‘¤H§O¡O´X×5HÑ5HÐ#IÔIÈf×N^×N^ÐN^×csß×,×1Jß+ñ ð ð 	ð �?‰?œhŸo™oÔ-°&×2B×2BÐ2B×GWØ'2Ð4GÐI^Ð`pÐ&qÑ#à&*×&HÑ&HØÐ*=ó'Ð#ð "Ð7NÐNÐNøôU ô 1Ø,0Ó)ð1ús   ÂL ÂL Â(AL ÌLÌLc               ó    € V ^8„  d   QhRRRR/# )r0   r>  r%   r1   rs  r2   )r3   s   "r4   r5   r±   ï  s   € ÷ $ñ $¸ð $Àñ $r6   c           	   ƒ  óR  "  € Vf   R# \        4       p   VP                  RVP                  4       4       K$    \        P                   d$    \
        P                  ! R4      G Rj  x€L 
   K[  \         dA   p\        P                  RT4       \
        P                  ! ^4      G Rj  x€L 
   Rp?K   Rp?ii ; i  \
        P                   d     Mi ; i\        \        4      ;_uu_ 4         TP                  RTP                  4       4       K#    + '       g   i     M; i\        \        4      ;_uu_ 4        TP                   F  pTP                  4        K  	  RRR4       R#   + '       g   i     R# ; i  \        \        4      ;_uu_ 4         TP                  RTP                  4       4       K#    + '       g   i     M; i\        \        4      ;_uu_ 4        TP                   F  pTP                  4        K  	  RRR4       i   + '       g   i     i ; i; i5i)u¬   Drain log_queue and append tool-call lines to tool_calls.log (tool_progress=log).

RotatingFileHandler (5MB Ã— 3) bounds the log; RedactingFormatter keeps secrets off disk.Nz%sg333333Ó?zwrite_tool_log error: %s)rR   r÷   Ú
get_nowaitrI  ÚEmptyr×  Úsleepr¶   rö   rm   rß  r   rE   Úflush)rž   r>  rO   r&  rQ   s   &&   r4   Ú_run_agent_write_tool_logÚ*GatewayTurnMixin._run_agent_write_tool_logï  ss  é € ð ÒÙÜ'Ó)ˆð	$Øð+Ø×$Ñ$ T¨9×+?Ñ+?Ó+AÖBøÜ—{‘{ô -Ü!Ÿ-š-¨Ó,×,Ô,Ü ô +Ü—L‘LÐ!;¸QÔ?Ü!Ÿ-š-¨Ó*×*×*ûð+ûô ×%Ñ%ô 	Ùð	úô œ)×$Õ$ØØ×$Ñ$ T¨9×+?Ñ+?Ó+AÖB÷ %×$úô œ)×$Õ$Ø*×3Ô3�GØ—M‘M–Oñ  4÷ %×$×$Ò$ûô œ)×$Õ$ØØ×$Ñ$ T¨9×+?Ñ+?Ó+AÖB÷ %×$úô œ)×$Õ$Ø*×3Ô3�GØ—M‘M–Oñ  4÷ %×$×$Ð$ÿsØ   ‚H'”B< – 8 ¶B< ¸.B9Á&A)Á'B9Á,B< Á/B9Á8B9Á9/B4Â(B+Â)B4Â.B< Â4B9Â9B< Â<CÃE> ÃCÃE> ÃH'Ã.$DÄD"	ÄH'Ä<$E*Å 
H'Å*E;	Å5	H'Å>H$Æ$F:	Æ:G
ÇH$Ç$$H	È	H$ÈH!ÈH$È$H'c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r0   r    r   rè   rp  r’  rt  Ústreaming_tts_consumer_holderr{  r1   rs  r2   )r3   s   "r4   r5   r±   
  s=   € ÷ Sñ SØ#ðSØ3@ðSà!9ðSàZ^ðSð 
ñSr6   c                ó8  € V P                  V4      pVRJ;'       d(    \        \        VRV4      4      P                  4       R8H  pVe*   V'       d"   VP	                  VP
                  4      '       g   R#  ^ RIHp ^ RIH	p T! YQP
                  V! 4       V P                  ;'       g    \        P                  ! 4       VR7      p	V	P                  '       d   W”^ &   V	P                  4        R# R#   \         d"   p
\         P#                  RT
4        Rp
?
R# Rp
?
ii ; i)zÝStart the streaming-TTS consumer for a voice-input turn on an auto-TTS chat.

Created on the gateway loop thread (not run_sync's executor); an inactive consumer leaves
the holder None so the whole-file fallback path runs.NrÈ   Úvoice)ÚStreamingTTSConsumer)Ú_load_tts_config)r«   r¿   Ú
tts_configÚloopr
  z+Could not set up streaming TTS consumer: %s)r½   rU   r�   rw   Ú_should_auto_tts_for_chatr¿   Úgateway.streaming_tts_consumerr¡  Útools.tts_toolr¢  Ú_gateway_loopr×  Úget_event_loopÚactiveÚstartr¶   rö   r  )rž   r    rè   r’  rž  Ú_stts_adapterÚ_is_voice_inputr¡  r¢  Ú_stts_consumerÚ	_stts_errs   &&&&&      r4   Ú_run_agent_start_streaming_ttsÚ/GatewayTurnMixin._run_agent_start_streaming_tts
  sý   € ð ×2Ñ2°6Ó:ˆà Ð$÷ Uð UÜ”G˜L¨'°<Ó@ÓA×GÑGÓIÈWÑTð 	ð Ò ¯¸}×?fÑ?fÐgm×guÑgu×?vÒ?vÙð	SÝKÝ7Ù1Ø%¯~©~ÑJZÓJ\Ø×'Ñ'×CÐC¬7×+AÒ+AÓ+CØ0ôˆNð
 ×$×$Ð$Ø3A¨aÑ0Ø×$Ñ$Ö&ñ %øô ô 	SÜ�L‰LÐFÈ	×RÒRûð	Sús$   Á51C- Â'-C- ÃC- Ã-DÃ8DÄDc               ó    € V ^8„  d   QhRRRR/# )r0   Ústream_consumer_holderr{  r1   rs  r2   )r3   s   "r4   r5   r±   +  s   € ÷ &ñ &ÈDð &ÐUYñ &r6   c              ƒ  óÐ   "  € \        ^È4       FN  pV^ ,          e#   V^ ,          P                  4       G Rj  x€L
   R# \        P                  ! R4      G Rj  x€L
  KP  	  R#  L+ L5i)zTWait (up to 10s) for the stream consumer to be created inside run_sync, then run it.Nçš™™™™™©?)ÚrangerÙ  r×  r™  )rž   r³  Ú_s   && r4   Ú_run_agent_stream_consumer_taskÚ0GatewayTurnMixin._run_agent_stream_consumer_task+  sP   é € ä�s–ˆAØ% aÕ(Ò4Ø,¨QÕ/×3Ñ3Ó5×5Ð5ÚÜ—-’- Ó%×%Ò%ó	 á5á%ùs!   ‚4A&¶A"· A&ÁA$ÁA&Á$A&c               ó   € V ^8„  d   QhRR/# r^  r2   )r3   s   "r4   r5   r±   4  s   € ÷ "ñ "°ñ "r6   c              ƒ  óL  "  €  \         P                  ! V RR7      G Rj  x€L
  R#  L  \        \         P                  3 d_    T P	                  4        \        \         P                  4      ;_uu_ 4        T G Rj  x€L 
  RRR4        R#   + '       g   i      R# ; ii ; i5i)z:Give the stream consumer task 5s to flush, then cancel it.rÒ  rÎ  N)r×  rÝ  rÞ  rß  rà  r   )ré  s   &r4   Ú_await_stream_taskÚ#GatewayTurnMixin._await_stream_task3  sn   é € ð	"Ü×"Ò" ;¸Ô<×<Ô<øÜœg×4Ñ4Ð5ô 	"Ø×ÑÔ Üœ'×0Ñ0×1Õ1Ø!×!Ñ!÷ 2×1×1Ô1úð	"üs\   ‚B$„( Ÿ& ( ¤B$¦( ¨AB!Á4BÁ:A=
Á;BÂ B!ÂB$ÂBÂB!ÂB$ÂB!Â!B$c               ó    € V ^8„  d   QhRRRR/# ©r0   rm  r    r1   rs  r2   )r3   s   "r4   r5   r±   =  s   € ÷ 4ñ 4°[ð 4ÀTñ 4r6   c              ƒ  óê  "  € VP                   VP                  VP                  rCpV^ ,          f!   \        P                  ! R4      G Rj  x€L
  K+  V'       g   R# Ve;   V P                  W#4      '       g$   \        P                  RT;'       g    RV4       R# V P                  V4      P                  pV^ ,          VuVn
        Vn        V P                  '       d   V P                  R4       R# R#  L¦5i)u    Track this agent as running for the session (interrupt support) once it is created â€” only
if this run is still current, else leave the newer run's slot alone.Nrµ  uL   Skipping stale agent promotion for %s â€” generation %s is no longer currentr^   Údraining)rÝ   rÆ   Úagent_holderr×  r™  r  rö   r÷   Ú_session_stateÚturnr�   ÚctxÚ	_drainingÚ_update_runtime_status)rž   rm  rÝ   rÆ   rÂ  Ú
turn_states   &&    r4   Ú_run_agent_track_agentÚ'GatewayTurnMixin._run_agent_track_agent=  sÊ   é € ð 5=×4HÑ4HÈ(×JaÑJaÐck×cxÑcx \ˆØ˜1�oÒ%Ü—-’- Ó%×%Ò%ßÙØÒ%¨d×.JÑ.JÈ;×.gÒ.gÜ�K‰KØ^Ø×!Ð!˜r >ôñ Ø×(Ñ(¨Ó5×:Ñ:ˆ
Ø+7¸­?¸HÐ(ˆ
Ô˜*œ.Ø�>�>ˆ>Ø×'Ñ'¨
Ö3ñ ñ &ùs   ‚AC3Á
C1ÁC3Á5C3ÂA#C3c               ó<   € V ^8„  d   QhRRRRRRRRRR	R
RRRRRRR/	# )r0   r«   r%   r�   r    r   rÝ   rU   Ú_interrupt_detectedúasyncio.Eventrž  r{  Úlog_contextr/  zCallable[[], None]r1   rs  r2   )r3   s   "r4   r5   r±   P  sZ   € ÷ $$ñ $$Øð$$Ø#&ð$$Ø0=ð$$ØLOð$$à*ð$$àKOð$$ð ð$$ð  2ð$$ð 
ñ	$$r6   c          	   ƒ  ó   "  € ^ RI Hp	 VP                  P                  V4      p
RpV
e™   V
P                  ;'       g    RpV P                  V
4      '       dA   T P                  Y¡Y;TVP                  '       d   RVP                  /MRR7      G Rj  x€L
 w  r¼M+V'       g$   \        V
RR4      '       g	   . '       d	   V	! V
4      pV! 4        VP                  V4       VP                  4        V^ ,          pVe   VP                  R4       R# R#  L|5i)a+  Peek the adapter's pending event, transcribe voice, then signal the agent + abort streaming TTS.

Peek WITHOUT consuming: the event must stay for the post-run ``_dequeue_pending_event()``
(popping races the agent finishing). Transcribe BEFORE signaling so voice interrupts carry
the real transcript.)Ú_build_media_placeholderNr^   rÐ   ©rÎ  r
  rq  zbarge-in)rH   rÐ  Ú_pending_messagesrv   rc   Ú_pending_event_audio_pathsÚ"_transcribe_and_echo_pending_voicerÐ   r�   Ú	interruptr  Úabort)rž   r«   r�   r    rÝ   rÌ  rž  rÎ  r/  rÐ  Ú_peek_eventÚpending_textr·  Ú_sttss   &&&&&&&$$     r4   Ú!_run_agent_fire_pending_interruptÚ2GatewayTurnMixin._run_agent_fire_pending_interruptP  sö   é € õ 	9Ø×/Ñ/×3Ñ3°KÓ@ˆØˆØÒ"Ø&×+Ñ+×1Ð1¨rˆLØ×.Ñ.¨{×;Ò;Ø(,×(OÑ(OØ¨&ÈKØ@F×@P×@PÐ@P˜k¨6×+;Ñ+;Ñ<ÐVZð )Pó )÷ #‘�˜a÷ "¤w¨{¸LÈ$×'OÒ'O×SUÙ7¸ÓD�ÙŒØ�‰˜Ô%Ø×ÑÔ!ð .¨aÕ0ˆØÒØ�K‰K˜
Ö#ñ ñ'#ùs)   ‚:D½DÁ8DÂDÂDÂDÂ:ADc               ó$   € V ^8„  d   QhRRRRRR/# )r0   rm  r    rÌ  rÍ  r1   rs  r2   )r3   s   "r4   r5   r±   v  s(   € ÷ Wñ W¸{ð WÐanð WÐswñ Wr6   c              ƒ  óF  "  € VP                   VP                  VP                  rTpVP                  pV'       g   R#  \        P
                  ! R4      G Rj  x€L
   V P                  V4      pV'       g   K;  \        VR4      '       dO   VP                  V4      '       d6   V^ ,          pV'       d#   V P                  WxW4VVRR R7      G Rj  x€L
  R# K™  K›  K�   L‚ L  \        P                   d    h \         d"   p	\        P                  RT	4        Rp	?	KÝ  Rp	?	ii ; i5i)a   Poll the adapter for interrupts (new messages) every 200ms and signal the agent.

Level 1 (base.py) catches regular text before _handle_message(); the inactivity poll loop
has a BACKUP check in case this task dies. Keyed by session_key, NOT source.chat_id.Ngš™™™™™É?Úhas_pending_interruptzVoice-interruptc                 ó,   € \         P                  R 4      # )z3Interrupt detected from adapter, signaling agent...)rö   r  r2   r6   r4   r$  ÚCGatewayTurnMixin._run_agent_monitor_for_interrupt.<locals>.<lambda>Œ  s   € ¬¯©Ð5jÔ(kr6   ©rÎ  r/  z,monitor_for_interrupt error (will retry): %s)r    rÝ   rÂ  rž  r×  r™  r½   r©   rÞ  rÚ  rß  r¶   rö   r  )
rž   rm  rÌ  r    rÝ   rÂ  rž  ra  r�   Ú_mon_errs
   &&&       r4   Ú _run_agent_monitor_for_interruptÚ1GatewayTurnMixin._run_agent_monitor_for_interruptv  s  é € ð
 -5¯O©O¸X×=QÑ=QÐS[×ShÑSh˜\ˆØ(0×(NÑ(NÐ%ßÙØÜ—-’- Ó$×$Ð$ðWà×5Ñ5°fÓ=�ßÙÜ˜8Ð%<×=Ò=À(×B`ÑB`Ðal×BmÒBmØ(¨�O�EßØ"×DÑDØ$¨VÐBUØ9ÐGXÙ kð Eó ÷ ð ñ
 ñ ñ CnÑ=ñ %ñøô ×)Ñ)ô ØÜô WÜ—‘ÐKÈX×VÒVûðWüsl   ‚AD!ÁCÁD!ÁC Á5D!Á7(C Â C Â1C ÃCÃC Ã	D!ÃC ÃDÃ<DÃ=DÄD!ÄDÄD!c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r0   rm  r    rÌ  rÍ  Úinterrupt_monitorúasyncio.Taskr1   rs  r2   )r3   s   "r4   r5   r±   ”  s,   € ÷ ñ Ø#ðØ:GðØ\hðà	ñr6   c              ƒ  ó°  aa"  € VP                   VP                  upoVP                  4       '       g	   S'       g   R# V P                  V4      pVP                  ^ ,          pV'       di   V'       d_   \        VR4      '       dK   VP                  S4      '       d2   V P                  WVVSVVP                  RVV3R lR7      G Rj  x€L
  R# R# R# R# R#  L5i)zXBackup interrupt check: if the monitor task died or missed the interrupt, catch it here.NrÞ  zVoice-backup-interruptc                 ój   <€ \         P                  R SS P                  4       '       d   R4      # R4      # )zABackup interrupt detected for session %s (monitor task state: %s)ÚdoneÚrunning)rö   r÷   rê  )ræ  rÝ   s   €€r4   r$  ÚDGatewayTurnMixin._run_agent_backup_interrupt_check.<locals>.<lambda>¤  s-   ø€ œFŸK™KØWØÐ+<×+AÑ+A×+CÒ+C ôàIRôr6   rá  )	r    rÝ   Úis_setr½   rÂ  r©   rÞ  rÚ  rž  )rž   rm  rÌ  ræ  r    Ú_backup_adapterÚ_backup_agentrÝ   s   &&&f   @r4   Ú!_run_agent_backup_interrupt_checkÚ2GatewayTurnMixin._run_agent_backup_interrupt_check”  sÆ   ùé € ð 'Ÿo™o¨x×/CÑ/CÐˆ�Ø×%Ñ%×'Ò'¯{ÙØ×4Ñ4°VÓ<ˆØ ×-Ñ-¨aÕ0ˆß§Ü˜OÐ-D×EÒEØ#×9Ñ9¸+×FÒFØ×8Ñ8Ø°¸ÐEXØ×6Ñ6Ø4õð	 9ó ÷ ò ñ Gñ Fñ !.‰Oñùs(   „7C¼-CÁ*CÁ2(CÂ*CÃCÃCÚ	previewedc               ó$   € V ^8„  d   QhRRRRRR/# )r0   Ú
final_textrU   rò  ri   r1   r2   )r3   s   "r4   r5   r±   «  s#   € ÷ ñ Èð Ð\`ð Ðmqñ r6   c               ó˜  € V f   R# \        V RR4      '       d[   \        V RR4      p\        V4      '       d;   \        \        4      ;_uu_ 4        V! V4      RJ d    RRR4       R#  RRR4       R# R# \        V RR4      p\        V4      '       d    \	        V! V4      4      # R#   + '       g   i     R# ; i  \         d     R# i ; i)uì   True only when the actual final reply reached the user: a finalize call may carry only the
last preview snapshot, so reconcile against the recorded payload â€” a demonstrable mismatch
(False) overrides the flag; None keeps legacy trust.NFÚfinal_response_sentÚdelivered_final_matchesTÚhas_durably_delivered_text)r�   r¾   r   r¶   ri   )Úconsumerrô  rò  ÚmatcherÚhas_delivered_texts   &&$  r4   Ú*_run_agent_stream_confirmed_final_deliveryÚ;GatewayTurnMixin._run_agent_stream_confirmed_final_deliveryª  sÁ   € ð
 ÒÙÜ�8Ð2°E×:Ò:Ü˜hÐ(AÀ4ÓHˆGÜ˜× Ò Üœi×(Õ(Ù˜zÓ*¨eÓ3Ø$÷ )Ñ(Ø3÷ )ó ô % XÐ/KÈTÓRÐÜÐ&×'Ò'ðÜÑ.¨zÓ:Ó;Ð;ñ ÷# )Ö(ñ ûô ô Úðús   ÁB&ÂB: Â&B7	Â:C	ÃC	c               ó$   € V ^8„  d   QhRRRRRR/# )r0   rm  r    r½  zCallable[[], Any]r1   úGatewayRunner._RunAgentWorkerr2   )r3   s   "r4   r5   r±   Ç  s(   € ÷ @ñ @°[ð @ÐL]ð @Ðbñ @r6   c                óœ  a aaaaa€ ^ RI HpHp ^ RIHp VP
                  VP                  VP                  uoooR V! RR4      V! RR4      3 4       w  rgVP                  ;'       g    RpVP                  V4      p	W�n
        W‘n        S P                  YgTT	\        P                  ! 4       \        P                  ! 4       \        P                  ! 4       Se	   VV V3R	 lMR
 R7      oVVV3R lp
VeJ   \        P                   ! VRSRVRR/S P#                  S4      CRVR,           2RR7      P%                  4        ^ RIHp V! S SSV
4       S# )a5  Schedule ``run_sync`` on the executor plus the inactivity watchdog thread.

*Inactivity* timeout (agent.gateway_timeout / HERMES_AGENT_TIMEOUT, env wins; 0 = unlimited),
not wall-clock. The daemon watchdog is independent of asyncio: cgroup memory reclaim can
starve the loop that runs the normal timeout poll.)Ú
_float_envÚ_watch_gateway_turn_inactivity)Úprocess_registryc              3  ó8   "  € T F  pV^ 8”  d   TMRx € K  	  R# 5i)r³   Nr2   )rp   r
  s   & r4   rs   Ú@GatewayTurnMixin._run_agent_start_turn_worker.<locals>.<genexpr>Ð  s"   é € ð *
áp�ð �Q”‰A˜DÔ Ûpùs   ‚ÚHERMES_AGENT_TIMEOUTrÊ  ÚHERMES_AGENT_TIMEOUT_WARNINGi„  r^   c                 ó(   <€ SP                  SS 4      # ro   r�  r‚  s   €€€r4   r$  Ú?GatewayTurnMixin._run_agent_start_turn_worker.<locals>.<lambda>ä  s   ø€ ˜×5Ñ5°kÀ>ÔRr6   c                 ó   € R # )Tr2   r2   r6   r4   r$  r	  æ  s   € ™dr6   )Úagent_timeoutÚagent_warningro  Úprocess_baselineÚworker_doneÚtimeout_firedÚcleanup_lockÚ
is_currentc                 ó>  <€  S! 4       SP                   P                  4        S'       d
   S^ ,          MRp V e   RV n        \        4       V n        # #   SP                   P                  4        S'       d
   S^ ,          MRp T e   RT n        \        4       T n        i i ; i)r³   Nr^   )r  r  Ú_gateway_turn_process_task_idÚ	frozensetÚ_gateway_turn_process_baseline)Ú_finished_agentrÂ  r½  Úworkers    €€€r4   Ú _run_sync_with_timeout_lifecycleÚWGatewayTurnMixin._run_agent_start_turn_worker.<locals>._run_sync_with_timeout_lifecycleê  s�   ø€ ðQÙ“zà×"Ñ"×&Ñ&Ô(÷ 6B ,¨q¦/Àt�Ø"Ò.ØDF�OÔAÜENÃ[�OÕBð /øð ×"Ñ"×&Ñ&Ô(÷ 6B ,¨q¦/Àt�Ø"Ò.ØDF�OÔAÜENÃ[�OÕBð /ús   ƒA ÁA
BrÂ  rÏ  Úpoll_intervalrÒ  zgateway-turn-watchdog-ºNé   NT©ÚtargetÚkwargsrl  Údaemon)Ústart_turn_worker)rH   r  r  Útools.process_registryr  rÂ  rÝ   rÆ   rÒ   Úsnapshot_running_idsÚprocess_task_idr  Ú_RunAgentWorkerÚ	threadingÚEventÚLockÚThreadÚ_reaper_kwargsr«  Úgateway.session_runtime_workersr!  )rž   rm  r½  r  r  r  Ú_agent_timeoutÚ_agent_warningÚ_turn_task_idÚ_turn_process_baseliner  r!  rÂ  rÆ   rÝ   r  s   f&f         @@@@r4   Ú_run_agent_start_turn_workerÚ-GatewayTurnMixin._run_agent_start_turn_workerÇ  sR  ý€ ÷ 	KÝ;Ø4<×4IÑ4IÈ8×K_ÑK_Ðai×axÑaxÐ1ˆ�k >ñ*
á Ð!7¸Ó>Á
ÐKiÐknÓ@oÑpó*
Ñ&ˆð !×+Ñ+×1Ð1¨rˆð "2×!FÑ!FÀ}Ó!UÐØ#0Ô Ø$:Ô!ð ×%Ñ%Ø(ÐP]Ø3ÄÇÂÓARÜ#Ÿ/š/Ó+¼)¿.º.Ó:Jð "Ò-÷ Sá"ð &ó 	
ˆ÷	Qð" Ò%Ü×ÒØ5à" L°)¸^È_Ð^aðà×)Ñ)¨&Ó1ðð .¨m¸CÕ.@Ð-AÐBØô÷ ‰eŒgÝEÙ˜$ ¨Ð6VÔWØˆr6   c               ó    € V ^8„  d   QhRRRR/# )r0   r  rÿ  r1   rg   r2   )r3   s   "r4   r5   r±   
  s   € ÷ 
ñ 
Ð<ð 
Àñ 
r6   c           	     ób   € / R Uu/ uF  q\        W4      bK  	  upCRV P                  /C# u upi )z7Shared kwargs of the watchdog + timeout-reaper threads.Úis_still_current)ro  r  r  r  r  )r�   r  )r  r¹  s   & r4   r*  ÚGatewayTurnMixin._reaper_kwargs	  s@   € ð
Ù.}Ó~Ñ.}¨”'˜&Ó$Ò$Ñ.}Ñ~ð
à × 1Ñ 1ñ
ð 	
ùÚ~s   †,c               ó    € V ^8„  d   QhRRRR/# )r0   r�   r%   r1   rg   r2   )r3   s   "r4   r5   r±     s   € ÷ ñ  sð ¨tñ r6   c                óÆ   € V '       dE   \        V R4      '       d3   \        \        4      ;_uu_ 4        V P                  4       uuRRR4       # / #   + '       g   i     / # ; i)zF``agent.get_activity_summary()`` or ``{}`` when unavailable / failing.Úget_activity_summaryN)r©   r   r¶   r8  )r�   s   &r4   Ú_agent_activity_summaryÚ(GatewayTurnMixin._agent_activity_summary  sF   € ÷ ”W˜UÐ$:×;Ò;Üœ)×$Õ$Ø×1Ñ1Ó3÷ %Ò$àˆ	÷ %Ö$àˆ	ús   ²AÁA 	c               ó   € V ^8„  d   QhRR/# r^  r2   )r3   s   "r4   r5   r±     s   € ÷ Iñ IÐ^bñ Ir6   c              ƒ  óì  "  € ^ RI Hp V P                  V4      pV'       g   R#  TP                  VP                  \        R\        VP                  ^<,          4      ;'       g    ^\        VP                  VP                  ,
          ^<,          4      ;'       g    ^R7      V! V4      VP                  R7      G Rj  x€L
  R#  L  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i5i)z@Staged one-shot warning before the inactivity timeout escalates.)Ú_interim_metadataNzgateway.progress.stuck_warning)ÚminutesÚ	remainingrÏ  z!Inactivity warning send error: %s)rH   r=  r½   rë  r¿   r   r[   r  r  rÎ   r¶   rö   r  )rž   r  r    r’  r=  Ú_warn_adapterÚ	_warn_errs   &&&&   r4   Ú_run_agent_inactivity_warningÚ.GatewayTurnMixin._run_agent_inactivity_warning  sÏ   é € å1Ø×2Ñ2°6Ó:ˆßÙð		IØ×,Ñ,Ø—‘¤Ø4Ü × 4Ñ 4¸Õ :Ó;×@Ð@¸qÜ! 6×#7Ñ#7¸&×:NÑ:NÕ#NÐSUÕ"UÓV×[Ð[ÐZ[ô!]ñ +Ð+BÓCÐV\×VeÑVeð -ó ÷ ô øô ô 	IÜ�L‰LÐ<¸i×HÒHûð	IüsL   ‚"C4¥>C Á$5C Â"C Â<CÂ=C ÃC4ÃC ÃC1ÃC,Ã&C4Ã,C1Ã1C4c               ó    € V ^8„  d   QhRRRR/# )r0   rm  r    r1   rg   r2   )r3   s   "r4   r5   r±   *  s   € ÷ )ñ )¸+ð )È$ñ )r6   c                óÜ  € ^ RI HpHpHp ^ RIHp VP                  VP                  VP                  r˜pVP                  ^ ,          p
V P                  V
4      pVP                  RR4      pVP                  R^ 4      pVP                  R4      pVP                  R^ 4      pVP                  R^ 4      p\        P                  R	YÑP                  Y|TTT;'       g    R
4       V
'       d   V! W£VR7       \        VP                  ^<,          4      ;'       g    ^p\!        VV4      p\#        RVR7      .pV'       d!   VP%                  \#        RWíR VR7      4       MVP%                  \#        RWÍR VR7      4       VP%                  \#        R4      4       T! RRP'                  V4      RV^ ,          '       d   V^ ,          P                  R. 4      M. RTRV	^ ,          ;'       g    . R^ RR/4      # )zªSynthetic failed run dict for an inactivity timeout, with the activity-tracker diagnostic;
interrupts the agent if it is still running so the thread pool worker is freed.)Ú_INTERRUPT_REASON_TIMEOUTÚ_INTERRUPT_TOOL_REASON_TIMEOUTÚrequest_hard_interrupt)Úrecord_terminal_failureÚlast_activity_descrÉ   Úseconds_since_activityÚcurrent_toolÚapi_call_countrœ  zaAgent idle for %.0fs (timeout %.0fs) in session %s | last_activity=%s | iteration=%s/%s | tool=%sÚnone)Útool_reasonzgateway.progress.timeout_header)r>  z#gateway.progress.timeout_stuck_toolz.0f)r   ÚsecondsÚprogressz&gateway.progress.timeout_last_activity)ÚactivityrP  rQ  zgateway.progress.timeout_hintr¿  rË   rÁ  rŠ  r.  r°  rk   T)rH   rF  rG  rH  Úgateway.session_resultsrI  rÝ   Úresult_holderÚtools_holderrÂ  r9  rv   rö   rm   r  r[   r   r   rf  r_   )rž   r  rm  rF  rG  rH  rI  rÝ   rT  rU  Ú_timed_out_agentÚ	_activityÚ
_last_descÚ	_secs_agoÚ	_cur_toolÚ_iter_nÚ	_iter_maxÚ_timeout_minsÚ_iter_progressÚ_diag_liness   &&&                 r4   Ú_run_agent_timeout_resultÚ*GatewayTurnMixin._run_agent_timeout_result*  sÚ  € ÷ 	rÑqÝCØ3;×3GÑ3GÈ×I_ÑI_Ðai×avÑav LˆØ#×0Ñ0°Õ3ÐØ×0Ñ0Ð1AÓBˆ	Ø—]‘]Ð#7¸ÓCˆ
Ø—M‘MÐ":¸AÓ>ˆ	Ø—M‘M .Ó1ˆ	Ø—-‘-Ð 0°!Ó4ˆØ—M‘MÐ"2°AÓ6ˆ	ä�‰ð=à×+Ñ+¨[ÀgÈyØ×Ð˜ô		
÷ Ù"Ð#3Ð\zÕ{Ü˜F×0Ñ0°BÕ6Ó7×<Ð<¸1ˆÜ2°7¸IÓFˆÜÐ:ÀMÔRÐSˆßØ×ÑœqØ5Ø°S¨/À^ô Uõ Vð ×ÑœqØ8Ø#¸#¨È.ô Zô [ð 	×Ñœ1Ð<Ó=Ô>Ù&Ø˜dŸi™i¨Ó4ØÀÈa×@PÔ@P˜ aÕ(×,Ñ,¨Z¸Ô<ÐVXØ˜Ø�\ !•_×*Ð*¨Ø˜aØ�dð(
ó ð 	r6   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r0   r  rÿ  rm  r    rÌ  rÍ  ræ  rç  r1   r%   r2   )r3   s   "r4   r5   r±   U  s=   € ÷ @ñ @Ø3ð@Ø?Jð@à*ð@à?Kð@ð 
ñ@r6   c              ƒ  óŒ  "  € ^ RI Hp VP                  pRp \        P                  ! VP
                  0RR7      G Rj  x€L
 w  r‰V'       d   VP
                  P                  4       # VP                  Ee   VP                  P                  4       '       d   EMVP                  P                  V P                  V^ ,          4      P                  RR4      4      p
V'       gO   VP                  eA   W¡P                  8¼  d1   RpV P                  WP                   VP"                  4      G Rj  x€L
  W¡P                  8¼  dQ   \$        P&                  ! VR	V/V P)                  V4      CR
VP*                  R,           2RR7      P-                  4        MV P/                  W#V4      G Rj  x€L
  EK•  V P1                  W4      #  EL L• L5i)a  Poll the executor future (inactivity timeout + backup interrupt checks); return its result,
or a synthetic failed run dict on inactivity timeout. Polls even with an unlimited timeout
so the backup interrupt check runs if monitor_for_interrupt() silently died.)Ú_abandon_timed_out_gateway_turnFTrÒ  rÎ  NrK  ri  rÂ  zgateway-turn-reaper-r  r  )rH   rd  rÂ  r×  ÚwaitÚexecutor_taskrð  r  r  rí  Ú
awake_idleÚmeasurer9  rv   r  rB  r    r’  r&  r)  r*  ro  r«  rð  r`  )rž   r  rm  rÌ  ræ  rd  rÂ  Ú_warning_firedrê  r·  Ú
_idle_secss   &&&&&      r4   Ú_run_agent_await_turn_workerÚ-GatewayTurnMixin._run_agent_await_turn_workerU  s‘  é € õ 	@Ø×,Ñ,ˆØˆØÜ#ŸLšL¨&×*>Ñ*>Ð)?ÈÔM×M‰GˆDßð ×+Ñ+×2Ñ2Ó4Ð4Ø×#Ñ#Ó/Ø×'Ñ'×.Ñ.×0Ò0ÙØ%×0Ñ0×8Ñ8¸×9UÑ9UÐVbÐcdÕVeÓ9f×9jÑ9jð  lDð  FIó  :Jó  K�
ß%¨&×*>Ñ*>Ò*JÈz×]qÑ]qÔOqØ%)�NØ×<Ñ<¸VÇ_Á_ÐV^×VvÑVvÓw×wÐwØ×!5Ñ!5Ô5Ü×$Ò$Ø>Ø .°Ð\À×@SÑ@SÐTZÓ@[Ð\Ø3°F·N±NÀ3Õ4GÐ3HÐIÐRVô÷ ‘e”gØØ×8Ñ8¸ÐXiÓj×jÓjØ×-Ñ-¨fÓ?Ð?ò) Nñ xñ kùsC   ‚<G¾F=¿AGÂA
GÃ!A	GÄ*G Ä+A9GÆ$GÆ%GÇ GÇGc               ó    € V ^8„  d   QhRRRR/# r¿  r2   )r3   s   "r4   r5   r±   v  s   € ÷ .ñ .°[ð .ÀTñ .r6   c           
     ój  € VP                   VP                  ^ ,          VP                  ^ ,          rCpVe2   \        VR4      '       d    V'       d   VP	                  R4      '       d   R# \        VRR4      RJd˜   ^ RIHp ^ RIH	p V! WP                  4      pT P                  Y!P                  Y7'       d*   VP                  '       d   VP                  V! V 4      4      MRR	7      pVP                  V8X  g   V P                  W#V4      '       d   R# T;'       g    RVn        V P!                  V4       R# )
uì   Evict the cached agent when a fallback model activated on a SUCCESSFUL run (so /model shows
the active model and the next message retries the primary). Skip failed runs: evicting
would loop bad model â†’ fallback â†’ evict â†’ recreate.NrW  rk   Ú_provider_fallback_activeFTr  )r  )Úpolicy_model)rÝ   rÂ  rT  r©   rv   r�   rD  r  r/  r  r    Ú_fallback_baseline_modelrW  Úcurrent_modelÚ_is_intentional_model_switchÚ_evicted_on_fallbackÚ_evict_cached_agent)	rž   rm  rÝ   r  Ú_result_for_fbr  r  rK  Ú
_cfg_models	   &&       r4   Ú_run_agent_evict_on_fallbackÚ-GatewayTurnMixin._run_agent_evict_on_fallbackv  s  € ð /7×.BÑ.BÀH×DYÑDYÐZ[ÕD\Ð^f×^tÑ^tÐuvÕ^w˜^ˆØŠ>¤¨°×!9Ò!9¿nÐQ_×QcÑQcÐdl×QmÒQmÙä�6Ð6¸Ó>ÀdÓJåDÝ@Ù& t¯_©_Ó=ˆFØ×6Ñ6ØŸ_™_¨fÖsyð  E÷  K÷  Kð  KÀ6×CWÑCWÑXhÐimÓXnÔCoð  QUð 7ó VˆJà�|‰|˜zÔ)¨T×-NÑ-NÈ{Ðdn×-oÒ-oÙØ&1×&9Ð&9°TˆÔ#Ø× Ñ  Ö-r6   c               ó$   € V ^8„  d   QhRRRRRR/# )r0   rm  r    r«   r%   r1   rs  r2   )r3   s   "r4   r5   r±   Š  s(   € ÷ Jñ JÀð JÐVYð JÐ^bñ Jr6   c              ƒ  ó"  "  € VP                   ^ ,          pVf   R# VP                  4         VP                  RR7      G Rj  x€L
  VP                  '       g,   VP                  R4       VP                  RR7      G Rj  x€L
  VP                  '       dF   Ve@   \        VRR4      p\        V4      '       d    V! VP                  VP                  4       R# R# R# R#  Lš  \         d!   p\        P                  RT4        Rp?L¾Rp?ii ; i L�5i)uû   Finalize the streaming-TTS consumer on the outer event-loop thread (covers early returns
from run_sync). On drain timeout abort to free the task â€” audible streams keep whole-file
suppression, silent streams stay eligible for the whole-file fallback.Ng      $@rÎ  z%streaming TTS wait_complete error: %sz"streaming TTS finalisation timeoutç       @Ú"_mark_streaming_tts_completed_turn)rž  rÜ  Úwait_completer¶   rö   r  rê  rÖ  Úsuppress_whole_filer�   r¾   rÝ   rÆ   )rž   rm  r«   rÙ  Ú_stts_done_errÚ
_mark_turns   &&&   r4   Ú!_run_agent_finalize_streaming_ttsÚ2GatewayTurnMixin._run_agent_finalize_streaming_ttsŠ  sñ   é € ð ×6Ñ6°qÕ9ˆØŠ=ÙØ�‰Œð	RØ×%Ñ%¨dÐ%Ó3×3Ð3ð �z�zˆzØ�K‰KÐ<Ô=Ø×%Ñ%¨cÐ%Ó2×2Ð2Ø×$×$Ð$¨Ò)<Ü  Ð*NÐPTÓUˆJÜ˜
×#Ò#Ù˜8×/Ñ/°×1HÑ1HÖIñ $ñ *=Ñ$ñ 4øÜô 	RÜ�L‰LÐ@À.×QÑQûð	Rúñ 3ùsY   ‚*D­C ÁCÁC ÁDÁ&DÁ?DÂ DÂADÃC ÃD
Ã*DÄ DÄD
Ä
Dc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r0   rð  r%   r«   r    r   rÝ   rp  r1   ztuple[Any, Optional[str]]r2   )r3   s   "r4   r5   r±   ž  s;   € ÷ B&ñ B&ØðB&Ø$'ðB&Ø1>ðB&ØMZðB&à	"ñB&r6   c           	   ƒ  ó   "  € ^ RI HpHpHp ^ RIHp Rp	Rp
V'       Ed­   V'       Ed¤   V'       Ed›   V! W$4      p	VP                  R4      '       d   V	e   V P                  WW4V	4       R# V P                  WBV	4      p	VP                  R4      '       d|   V	'       gt   VP                  R4      '       d]   VP                  R4      pV! V4      '       d#   \        P                  RT;'       g    RV4       MÙVP                  4       '       d   RMTp
M¾V	'       d·   V	P                  ;'       g    R	pV P                  V	4      '       dS   T P                  Y’Y<R
VP                  '       d   RVP                  /MRR7      G Rj  x€L
 w  r­T
;'       g	    V! V	4      p
MT;'       g	    V! V	4      p
V
'       d   \        P                  RV
R,          4       V P!                  WW4Wš4      w  ršV
'       d¸   V
P#                  4       P%                  R4      '       d“   V
P#                  4       P'                  R^4      ^ ,          R,          P)                  4       pV'       dO   \+        \,        4      ;_uu_ 4        ^ RIHp V! V4      '       d   \        P                  RV4       Rp	Rp
RRR4       V P2                  '       dD   V	'       g	   V
'       d4   \        P                  RT;'       g    RV P5                  4       4       Rp	Rp
Wš3#  EL}  + '       g   i     Lk; i5i)zµDequeue the adapter's pending / interrupt / leftover-steer follow-up as ``(pending_event, pending)``.

Keyed by session_key (not source.chat_id) to match the adapter's storage keys.)rÐ  Ú_dequeue_pending_eventÚ_is_control_interrupt_message)Úexecuting_admissionNrl   ÚinterruptedÚinterrupt_messagez5Ignoring control interrupt message for session %s: %sr¯  r^   zVoice-drainrÐ   rÑ  z9Processing queued message after agent completion: '%s...'ºNé(   NrQ  :é   NN)Úresolve_commanduZ   Discarding command '/%s' from pending queue â€” commands must not be passed as agent inputz=Discarding pending follow-up for session %s during gateway %s)NN)rH   rÐ  r†  r‡  Úgateway.session_ingressrˆ  rv   Ú_defer_past_exhaustion_resetÚ_promote_queued_eventrö   r÷   rc   rÓ  rÔ  rÐ   r  Ú_merge_leftover_steerrS  rÚ  r`   rw   r   r¶   Úhermes_cli.commandsrŽ  rÆ  Ú_status_action_label)rž   rð  r«   r    rÝ   rÐ  r†  r‡  rˆ  Úpending_eventÚpendingrŠ  Ú_pending_textr·  Ú_pending_cmd_wordÚ_rc_pendings   &&&&&           r4   Ú_run_agent_drain_pendingÚ)GatewayTurnMixin._run_agent_drain_pendingž  s‰  é € ÷ 	pÑoÝ?ØˆØˆßˆ6—g�g§+ +Ù2°7ÓHˆMØ�z‰zÐ1×2Ò2°}Ò7PØ×1Ñ1°&À6ÐXeÔfØ!Ð!ð !×6Ñ6°{È]Ó[ˆMØ�z‰z˜-×(Ò(·À6Ç:Á:ÐNa×CbÒCbØ$*§J¡JÐ/BÓ$CÐ!Ù0Ð1B×CÒCÜ—K‘KØOØ#×*Ð* sÐ,=õð ':×&=Ñ&=×&?Ò&?™dÐEV‘Gßà -× 2Ñ 2× 8Ð 8°b�Ø×2Ñ2°=×AÒAØ'+×'NÑ'NØ%°ÐS`ØDJ×DT×DTÐDT +¨v×/?Ñ/?Ñ!@ÐZ^ð (Oó (÷ "‘J�Gð &×PÐPÑ)AÀ-Ó)P‘Gà+×VÐVÑ/GÈÓ/V�GßÜ—L‘LÐ!\Ð^eÐfiÕ^jÔkð "&×!;Ñ!;¸FÈVÐboÓ!yÑˆ÷ �w—}‘}“×1Ñ1°#×6Ò6Ø '§¡£× 5Ñ 5°d¸AÓ >¸qÕ AÀ"Õ E× KÑ KÓ MÐß Üœi×(Õ(ÝRÙ"Ð#4×5Ò5ÜŸ™ðIØJ[ôð )-˜Ø"&˜÷ )ð �>�>ˆ>Ÿ}·Ü�K‰KØOØ×"Ð"˜s D×$=Ñ$=Ó$?ôð !ˆMØˆGØÐ%Ð%òE"÷" )×(üsœ   ‚&L©L²A(LÂLÂ2LÃLÃ*LÄ	LÄLÄ)LÅ8LÅ;K8Å<LÆLÆLÆ/ALÈALÉLÉ)/K;ÊLÊ2LÊ:LËLËLË;L	ÌLc               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r0   rm  r    r«   r%   r·   rð  ré  r1   rs  r2   )r3   s   "r4   r5   r±   â  sD   € ÷ I%ñ I%Ø#ðI%Ø.1ðI%Ø=@ðI%ØJMðI%Ø\_ðI%à	ñI%r6   c              ƒ  óú  "  € VP                   '       d   R# VP                  pVP                  ^ ,          pV'       d#   V'       d    V P                  V4      G Rj  x€L
  \        V\        4      '       d   TMT;'       g    / p	V	P                  RR4      p
V P                  Wz\        V	P                  R4      4      R7      pV P                  Wš4      '       dv   \        VP                  VP                  4      '       d$   \
        P!                  RT;'       g    R4       Rp
M,\
        P#                  R	T;'       g    R4       \%        4       p
R
pV	P                  R4      '       * pV
'       d›   \
        P!                  V'       d   RMRT;'       g    R4        V P'                  W¡P(                  VVP*                  VP,                  VWÇWaP.                  R7
      G Rj  x€L
 pV'       d    \        V\        4      '       d
   RVR&   WÄR&   V P1                  W&VP2                  4      p\5        V4      '       dP   \7        \        4      ;_uu_ 4        V! 4       p\8        P:                  ! V4      '       d   VG Rj  x€L
  RRR4       R# R#  EL(  \         d"   p\
        P                  RT4        Rp?ELMRp?ii ; i LÛ  \         d!   p\
        P#                  RT4        Rp?LØRp?ii ; i Lr  + '       g   i     R# ; i5i)zXDeliver the first response before a queued follow-up runs, unless streaming already did.Nz5Stream consumer wait before queued message failed: %sr¿  r^   r±  ©rò  zZQueued follow-up for session %s: suppressing intentional silence marker before continuing.r¯  zGQueued follow-up for session %s: replacing a human-turn silence marker.Frk   zlQueued follow-up for session %s: final text delivery confirmed; delivering explicit media before continuing.zoQueued follow-up for session %s: final stream delivery not confirmed; sending first response before continuing.)	r    r«   r
  rÞ   Útext_already_deliveredÚdeliver_mediaÚstream_consumerrÝ   rß   Trî   Úmedia_already_deliveredz7Failed to send first response before queued message: %s)rd  rÝ   r³  r¼  r¶   rö   r  r€   rg   rv   rü  ri   r¸   r   rå   ræ   r÷   r”   rW   Ú_deliver_queued_first_responser    r’  rÞ   rß   r­   rÆ   r¾   r   ÚinspectÚisawaitable)rž   rm  r«   r·   rð  ré  rÝ   Ú_scr&  Ú_delivery_resultÚfirst_responseÚ_already_streamedÚ_deliver_mediaÚ_text_deliveredÚ_bg_cbÚ
_bg_results   &&&&&&          r4   Ú!_run_agent_deliver_first_responseÚ2GatewayTurnMixin._run_agent_deliver_first_responseâ  sš  é € ð ×+×+Ð+ÙØ×*Ñ*ˆØ×-Ñ-¨aÕ0ˆß—;ðYØ×-Ñ-¨kÓ:×:Ð:ô (2°(¼D×'AÒ'A™8ÈÏÈÐRTÐØ)×-Ñ-Ð.>ÀÓCˆØ ×KÑKØ¬4Ð0@×0DÑ0DÐEYÓ0ZÓ+[ð Ló 
Ðð ×'Ñ'Ð(8×IÒIÜ˜x×AÑAÀ8×CZÑCZ×[Ò[Ü—‘ØpØ×&Ð& 3ôð "$‘ä—‘Ø]Ø×&Ð& 3ôô ";Ó!<�Ø$)Ð!à-×1Ñ1°(Ó;Ô;ˆßÜ�K‰Kç$ñ ð BØ×"Ð"˜sô	ðGØ(,×(KÑ(KØ"¯?©?ÀGØ%×=Ñ=ÐPX×PiÑPiØ+<Ø"0ð !,×@[Ñ@[ð )Ló )÷ #�÷$ #¤z°&¼$×'?Ò'?Ø-1�F˜>Ñ*ð 9GÐ4Ñ5à×1Ñ1°'È×H_ÑH_Ó`ˆÜ�F×ÒÜœ)×$Õ$Ù#›X�
Ü×&Ò& z×2Ò2Ø$×$Ð$÷ %Ñ$ñ òw ;øÜô YÜ—‘ÐTÐVW×XÒXûðYúñB#øô ô ]Ü—‘ÐXÐZ[×\Ñ\ûð]úñ( %÷ %×$Ð$üsÓ   ‚;K;¾K;ÁJ ÁJÁJ Á  K;ÂBK;Ä"K;Ä:0K;Å+K;ÆK;ÆK;ÆAJ7 ÇJ5ÇJ7 ÇA+K;É	)K'É2K%É3K'É7K;ÊJ ÊJ2ÊJ-Ê'K;Ê-J2Ê2K;Ê5J7 Ê7K"ËKËK;ËK"Ë"K;Ë%K'Ë'K8	Ë2	K;c               ó8   € V ^8„  d   QhRRRRRRRRRRR	RR
RRR/# )r0   rm  r    r«   r%   r–  rp  r•  r·   rð  ré  r1   r2   )r3   s   "r4   r5   r±   -  sX   € ÷ hñ hØ#ðhØ.1ðhØ<IðhØZ]ðhàðhà"ðhà14ðhð 
ñhr6   c              ƒ  ó  "  € ^ RI Hp ^ RIHp	 VP                  VP
                  VP                  VP                  3w  r«rÍVP                  VP                  VP                  prþ\        P                  RVR,          4       V'       d   \        VRR4      MRpV'       d'   V'       d   VV9   d   VV,          P                  4        WàP                  8¼  d˜   \        P!                  RWì4       V P#                  V
4      pV'       d   V'       d   V! VP$                  WÄ4       M+V'       d$   \'        VR4      '       d   VP)                  WÃ4       VP*                  ^ ,          ;'       g    R	VR
V/# VP-                  R4      '       g   V P/                  WWVV4      G Rj  x€L
  VP-                  R
V4      pY£TpppR;p;ppRpRp\1        V4      pVe   VP2                  MRpVEeb   \        VRR4      ;'       g    T
pV P5                  V4      '       d:   V P7                  V4      '       g#   \        P9                  RT;'       g    R4       V#  V P;                  V4      pV P?                  VVVVR7      G Rj  x€L
 pVf   V# ^ RI H!p V! VV4      pV PE                  V4      p\        VRR4      '       d   \G        VPH                  4      MRpT PK                  TVPL                  TVPN                  ;'       g    \        VRR4      R7      w  ppVPN                  '       g   V PQ                  VV4      G Rj  x€L
  \        VRR4      pMVPL                  pV P#                  V
4      p\        VRR4      p\        VRR4      p Ve?   \S        V 4      '       d.   V'       d&   Ve"   V ! WÍ4      p!V!'       d   VPU                  V!4       V'       dF   \W        \<        4      ;_uu_ 4        VPY                  V
PZ                  VR7      G Rj  x€L
  RRR4       ^ RI.H/p"H0p# Ve   V Pc                  V4      MRp$V#! V$VR4      G Rj  x€L
   V Pe                  WË4      G Rj  x€L
  T Pg                  TVPh                  TTTTYÞ^,           TTTTTTT/ \k        V4      C\m        V4      C\o        V4      C;'       g    RR7      G Rj  x€L
 p%T#! T$TR\v        Pz                  4      G Rj  x€L
  T	! TT%4      p&\}        T&\~        4      '       dR   R T&9  dK   / T&CR TR!TR"TR#Te9   TPN                  '       d'   TP€                  ;'       g    / P-                  R$R%4      MR%/Cp&T&#  EL±  \<         d'    \        P                  RT;'       g    RRR7        EL#i ; i EL ELU ELŒ  + '       g   i     EL“; i ELj ELS Lñ  \p        Pr                   d    T#! T$TRT"! T$4      4      G Rj  x€L 
  h \t         d%    T#! T$TR\v        Px                  4      G Rj  x€L 
  h i ; i EL45i)&zTRun the queued / interrupting follow-up as the next turn (recursive ``_run_agent``).)Úmerge_pending_message_event)Ú(_preserve_queued_followup_history_offsetz#Processing pending message: '%s...'r‹  Ú_active_sessionsNu^   Interrupt recursion depth %d reached for session %s â€” queueing message instead of recursing.Úqueue_messager¿  rÁ  r‰  r    uN   Discarding stale goal continuation for session %s â€” goal is no longer activer¯  z:Queued follow-up session-key resolution failed; reusing %sTr6  )rŸ   r    r|   rÝ   )Ústrip_discord_triggering_noter  rÖ   Fr×   rè   Ú_streaming_tts_completed_turnsÚ_streaming_tts_turn_keyr™  )Ú_followup_cancel_outcomeÚ_run_followup_processing_hookÚon_processing_start)rÓ   rÜ   r|   r    rÒ   rÝ   rÆ   Ú_interrupt_depthrÞ   rß   rà   rè   rã   rå   ræ   rç   Úon_processing_completerê   Úqueued_terminal_display_kindÚqueued_terminal_reply_expectedrë   rì   rð  )Ará  r²  rH   r³  r    rÒ   rÝ   rÆ   r¼  r|   r’  rö   r  r�   ÚclearÚ_MAX_INTERRUPT_DEPTHr”   r½   rÒ  r©   rµ  rT  rv   r®  r   ræ   Ú_is_goal_continuation_eventÚ_goal_still_active_for_sessionr÷   Ú_session_key_for_sourcer¶   Ú,_prepare_profile_scoped_inbound_message_textÚgateway.run_inboundr¶  r�   rU   r  r  rà   rØ   r  r¾   Údiscardr   rÚ  r¿   Úgateway.run_turn_followup_ackr¹  rº  Ú_intake_adapter_forÚ"_refresh_agent_cache_message_countr  rÜ   r   r   r   r×  rß  ÚBaseExceptionr   ÚFAILUREÚSUCCESSr€   rg   r
  )'rž   rm  r«   r–  r•  r·   rð  ré  r²  r³  r    rÒ   rÝ   rÆ   r¼  r|   r’  Ú_activeÚupdated_historyÚnext_sourceÚnext_messageÚnext_session_keyÚnext_message_idÚnext_channel_promptÚnext_message_typeÚnext_inbound_idÚnext_persist_messageÚnext_display_kindÚnext_reply_expectedr¶  Ú_clear_adapterÚ_completed_turnsÚ
_prior_keyÚ_pkr¹  rº  Ú_hook_adapterÚfollowup_resultÚmergeds'   &&&&&&&&                               r4   Ú_run_agent_queued_followupÚ+GatewayTurnMixin._run_agent_queued_followup-  s!  é € õ
 	GÝHà�O‰O˜X×0Ñ0°(×2FÑ2FÈ×H_ÑH_ð;
Ñ7ˆ˜Kð ×%Ñ% x×'7Ñ'7¸×9YÑ9Yð $;˜'ô 	�‰Ð:¸GÀC½LÔI÷ AH”'˜'Ð#5°tÔ<ÈTˆß—{ {°gÔ'=Ø�KÕ ×&Ñ&Ô(ð ×8Ñ8Ô8Ü�N‰Nð9Ø:Jôð ×0Ñ0°Ó8ˆGßŸ=Ù+¨G×,EÑ,EÀ{ÕbßœW W¨o×>Ò>Ø×%Ñ% kÔ;Ø×)Ñ)¨!Õ,×aÐaÐ1AÀ8ÈZÐY`Ð0aÐað �z‰z˜-×(Ò(Ø×8Ñ8¸ÈHÐ^iÓj×jÐjà Ÿ*™* Z°Ó9ˆØ6<À{Ð#3�\ˆàDHÐHˆÐHÐ-Ð0Að ˆà#ÐÜ2°=ÓAÐØ>KÒ>W˜m×:Ò:Ð]aÐàÓ$Ü! -°¸4Ó@×JÐJÀFˆKØ×/Ñ/°×>Ò>Àt×GjÑGjÐku×GvÒGvÜ—‘ØdØ×&Ð& 3ôð �ðØ#'×#?Ñ#?ÀÓ#LÐ ð "&×!RÑ!RØ#¨KÀÐ^nð "Só "÷ ˆLð Ò#Ø�ÝIÙ#@ÀÐP\Ó#]Ð Ø"×:Ñ:¸=ÓIˆOÜ?FÀ}ÐVbÐdh×?iÒ?iœc -×":Ñ":Ô;ÐosˆOØ/3×/JÑ/JØ  -×">Ñ">ÀØ&×/Ñ/×gÐg´7¸=ÐJ_ÐafÓ3gð 0Kó 0Ñ,Ð ð !×)×)Ð)à×/Ñ/Ð0@À*ÓM×MÐMÜ '¨°~ÀtÓ LÑð #+×"9Ñ"9Ðð ×3Ñ3°FÓ;ˆÜ" >Ð3SÐUYÓZÐÜ˜^Ð-FÈÓMˆ
ØÒ'¬H°Z×,@Ò,@Ç[ÐUcÒUoÙ˜[Ó9ˆCßØ ×(Ñ(¨Ô-÷ Üœ)×$Õ$Ø$×0Ñ0°·±ÐJaÐ0Ób×bÐb÷ %÷$ 	jØANÒAZ˜×0Ñ0°Ô=Ð`dˆÙ+¨M¸=ÐJ_Ó`×`Ð`ð	Ø×9Ñ9¸+ÓR×RÐRà$(§O¡OØ$°X×5LÑ5LÐVeØ"¨zÐGWØ-ÐSTÕ@TØ!0À_Ø2ÐARØ%9Ø*;Ø2ð/jÜ0°Ó?ð/jä-Ð.AÓBð/jäFYÐZgÓFhð/j÷ /rð /ràmqð %4ó %÷ ˆOñ* ,Ø˜=Ð*BÔDU×D]ÑD]ó_÷ 	_ð 	_á9¸&À/ÓRˆô �fœd×#Ò#Ð(DÈFÔ(RðØðà,¨oØ.Ð0AØ0Ð2EØ7à$Ò0°]×5K×5KÐ5Kð #×+Ñ+×1Ð1¨r×6Ñ6Ð7NÐPXÔYØQYñˆFð ˆòI køô6 ô Ü—‘ØPØ×&Ð& 3°ð ÷ ðúò
ò Nò( c÷ %×$Ð$úò( 	aò Sñøô ×%Ñ%ô 	Ù/Ø˜}Ð.FÑH`ÐanÓHoóq÷ qñ qàÜô 	Ù/Ø˜}Ð.FÔHY×HaÑHaóc÷ cñ càð	úò	_ùs\  ‚BX
ÂX
Â'A$X
ÄX
Ä(<X
Å%X
ÆX
ÆU
ÆAX
Ç5X
ÈX
È&X
È?	X
É	U ÉX
É2VÉ3A>X
Ë2'X
ÌX
Ì/VÌ0A%X
Î,X
ÏX
Ï!V
Ï;VÏ<V
Ð 4X
Ð4VÐ5X
Ð:V& ÑV!ÑA#V& Ò2V$Ò3V& Ò7X
ÓXÓA	X
ÔX
Ô1X
Õ#U>Õ1	U>Õ:X
Õ=U>Õ>X
ÖX
ÖV
Ö
V	Ö
X
Ö!V& Ö$V& Ö&)X×W×X×X×<W?×=XØX
c               ó8   € V ^8„  d   QhRRRRRRRRRRR	RR
RRR/# )r0   rm  r    Úprogress_taskr%   Úlog_taskræ  rç  Ú_notify_taskÚtracking_taskré  r1   rs  r2   )r3   s   "r4   r5   r±   ×  sX   € ÷ +^ñ +^Ø#ð+^Ø7:ð+^ØFIð+^Ø^jð+^à"ð+^à3?ð+^àNQð+^ð 
ñ+^r6   c             ƒ  ó2  "  € VP                   VP                  r˜W#WE3 F  p
V
'       g   K  V
P                  4        K  	  V'       dr   V'       d   V^ ,          fF   VP                  4        \        \        P
                  4      ;_uu_ 4        VG Rj  x€L
  RRR4       MV P                  V4      G Rj  x€L
  VP                  ^ ,          pVe^   VP                  '       gL   VP                  R4       \        \        4      ;_uu_ 4        VP                  RR7      G Rj  x€L
  RRR4       VP                  4        V	'       d   V P                  W‘P                  R7       V P                  '       d   V P                  R4       W#WFV3 F  p
V
'       g   K   V
G Rj  x€L
  K  	  R#  EL  + '       g   i     EL; i EL
 L   + '       g   i     L¦; i L9  \        P
                   d     Kg  \         d    \         P#                  RRR	7        K‹  i ; i5i)
z\``finally`` half of a turn: cancel background tasks, flush stream, release the session slot.NÚcleanupr|  rÎ  )rÆ   rÁ  z*background turn task failed during cleanupTr6  )r³  rÝ   rà  r   r×  rß  r¼  rž  rê  rÖ  r¶   r~  Ú_release_running_agent_staterÆ   rÆ  rÇ  rö   r  )rž   rm  rä  rå  ræ  ræ  rç  ré  r³  rÝ   ÚtaskÚ_stts_finallys   &&$$$$$$    r4   Ú_run_agent_cleanup_turn_tasksÚ.GatewayTurnMixin._run_agent_cleanup_turn_tasks×  s«  é € ð
 /7×.MÑ.MÈx×OcÑOc Ø"Ð.?ÓNˆDß‰tØ—‘–ñ O÷ ç*Ð/EÀaÕ/HÒ/TØ×"Ñ"Ô$Üœg×4Ñ4×5Õ5Ø%×%Ð%÷ 6Ð5ð ×-Ñ-¨kÓ:×:Ð:ð !×>Ñ>¸qÕAˆàÒ$¨]×-?×-?Ð-?Ø×Ñ 	Ô*Üœ)×$Õ$Ø#×1Ñ1¸#Ð1Ó>×>Ð>÷ %ð 	×ÑÔßð ×-Ñ-¨k×JaÑJaÐ-ÔbØ�>�>ˆ>Ø×'Ñ'¨
Ô3à"Ð.?ÐP\Ó]ˆDß‰tð^Ø—J’Jó ^ò) &÷ 6×5Ð5úò ;ñ ?÷ %×$úñ øÜ×-Ñ-ô ÚÜ ô ^ä—L‘LÐ!MÐX\�L×]ð^üsÐ   ‚$H«HÁHÁ<HÂF)ÂF&ÂF)ÂHÂ3F=Â4,HÃ!(HÄ	GÄG Ä GÄ$HÅ-HÅ2HÆGÆGÆGÆ HÆ&F)Æ)F:	Æ4
HÇ GÇG	ÇHÇGÇHÇ,HÇ/HÇ8HÈHÈHÈHc               ó$   € V ^8„  d   QhRRRRRR/# )r0   Úfail_resultrU   Úfail_excr1   rs  r2   )r3   s   "r4   r5   r±     s$   € ÷ ñ ØGJðØVYðà	ñr6   c          	   ƒ  ó†  "  €  VP                   P                  VP                  VP                  VRR7      G Rj  x€L
 p	\        T	RR4      '       g$   \
        P                  Yu\        T	RR4      4       R# RTR&   \
        P                  ! T!   R#  LU  \         d"   p
\
        P                  Y…T
4        Rp
?
R# Rp
?
ii ; i5i)aK  Edit the stream consumer's message in place with ``content``; on success mark
``response["already_sent"]`` and log ``ok``. A returned failure logs ``fail_result`` as
``(session, error)`` and an exception logs ``fail_exc`` as ``(session, exc)``; either way
``already_sent`` stays unset so the normal final send delivers the content.T)r¿   r  rÄ  ÚfinalizeNÚsuccessrm   rî   )	r«   Úedit_messager¿   r  r¶   rö   r”   r�   r÷   )rž   r¦  r    r·   rÄ  Ú_skÚokrð  rñ  Ú_resÚ	_edit_errs   &&&&&$$$$  r4   Ú _run_agent_edit_streamed_messageÚ1GatewayTurnMixin._run_agent_edit_streamed_message  s¢   é € ð	ØŸ™×1Ñ1ØŸ™°3·>±>È7Ð]að 2ó ÷ ˆDô �t˜Y¨×-Ò-Ü�N‰N˜;¬W°T¸7ÀDÓ-IÔJÙØ#'ˆ�Ñ Ü�Š�RÔñøô ô 	Ü�N‰N˜8¨)Ô4Ýûð	üs>   ‚C„6B ºB»B ¿ACÂB ÂB>ÂB9Â3CÂ9B>Â>Cc               ó$   € V ^8„  d   QhRRRRRR/# )r0   r·   r%   rm  r    r1   rs  r2   )r3   s   "r4   r5   r±     s'   € ÷ Uñ UÀð UÈ{ð UÐ_cñ Ur6   c              ƒ  ó  "  € ^ RI Hp VP                  ^ ,          VP                  VP                  rep\        V\        4      '       d#   VP                  R4      '       g   V! 4       RJ d   R# VP                  R4      ;'       g    RpV'       * ;'       g    VR8H  p\        VP                  R4      4      p	\        T;'       d    \        VR	R
4      4      p
R
pV
'       d[   V'       gS   \        VRR4      p\        V4      '       d+   \        \        4      ;_uu_ 4        V! V4      R
J pRRR4       V'       d   R
p
\        VP                  R4      4      pV P                  WGV	R7      pV'       d   R# T;'       g    RpV'       g/   V'       g	   V
'       d   \        P                  RWþWš4       RVR&   R# V'       gž   V'       d–   Ve’   VP                   p\        VRR
4      '       d   \        P                  RV4       R# V'       d;   VR8w  d4   \        VRR4      e%   V P#                  WEWVRVV3RRR7      G Rj  x€L
  R# \        P                  RV4       R# V'       dN   VeJ   VP                   '       d6   V P#                  WEWR,          VRVP                   V3RRR7      G Rj  x€L
  R# R# Ve:   \        VRR4      '       d%   \        P%                  RWþWšV\'        V4      4       R# R# R#   + '       g   i     ELÍ; i LÆ L]5i)al  Set ``response["already_sent"]`` when streaming already delivered the final reply.

Never when the agent failed (unseen error), on "(empty)", or on a finite (`-z`, `chat -q`) turn:
its viewer prints only the completion text, never the deltas (#139666). Both flags reflect call
success, not content: a mismatch with the recorded turn-final payload never suppresses.)Úfinite_turn_requiredrk   TNr¿  r^   z(empty)r±  Úfinal_content_deliveredFr÷  Úresponse_transformedrž  r¯  zSuppressing normal final send for session %s: final delivery already confirmed (streamed=%s previewed=%s content_delivered=%s).rî   Ú_turn_split_deliveryz¸Stale streamed finalize detected for session %s on a multi-message split; skipping the in-place reconciliation edit and delivering the complete response via normal final send (#78541).Ú__no_edit__r«   ziReconciled stale streamed finalize for session %s: edited message %s with the complete response (#71643).zoStale-finalize reconciliation edit failed for session %s (%s); sending complete response via normal final send.znStale-finalize reconciliation edit failed for session %s: %s; sending complete response via normal final send.)rö  r÷  rð  rñ  z†Stale streamed finalize detected for session %s with no editable message; delivering complete response via normal final send (#71643).zPEdited streamed message %s for session %s to include plugin-transformed content.zfTransformed-final edit failed for session %s (%s); sending transformed response via normal final send.z2Failed to edit streamed message for session %s: %sÚstream_deltas_enableduÒ   Normal final-send NOT suppressed despite active stream consumer for session %s: streamed=%s previewed=%s content_delivered=%s transformed=%s final_len=%d â€” possible duplicate send (see wecom ack-timeout RCA).)Úgateway.session_finiterþ  r³  r    rÝ   r€   rg   rv   ri   r�   r¾   r   r¶   rü  rö   r÷   r  rú  r”   ra   )rž   r·   rm  rþ  r¦  r    rÝ   Ú_finalÚ_is_empty_sentinelÚ
_previewedÚ_content_deliveredÚ_stale_finalizedÚ_matcherÚ_transformedÚ	_streamedrö  Ú
_sc_msg_ids   &&&              r4   Ú!_run_agent_mark_streamed_deliveryÚ2GatewayTurnMixin._run_agent_mark_streamed_delivery  sÝ  é € õ 	@Ø#+×#BÑ#BÀ1Õ#EÀxÇÁÐX`×XlÑXl�[ˆÜ˜(¤D×)Ò)¨X¯\©\¸(×-CÒ-CÑG[ÓG]ÐaeÓGeÙØ—‘Ð.Ó/×5Ð5°2ˆØ!'œZ×>Ð>¨6°YÑ+>Ðô ˜(Ÿ,™,Ð';Ó<Ó=ˆ
Ü! #×"XÐ"X¬'°#Ð7PÐRWÓ*XÓYÐð !Ðß×&8Ü˜sÐ$=¸tÓDˆHÜ˜×!Ò!Üœi×(Õ(Ù'/°Ó'7¸5Ð'@Ð$÷ )çØ%*Ð"ä˜HŸL™LÐ)?Ó@ÓAˆà×CÑCÀCÐ[eÐCÓfˆ	ßÙØ× Ð ˜Sˆß§×.@Ü�K‰Kð RØ 
ôð (,ˆH�^Ó$ß×"2°s²ð Ÿ™ˆJÜ�sÐ2°E×:Ò:Ü—‘ð OØö÷  
¨mÔ ;ÄÈÈYÐX\Ó@]Ò@iØ×;Ñ;Ø °sð Dð  FIð  KUð  Vð !Rð Nð	 <ó ÷ ò ô —‘ð ]Øö÷ ˜cšoà�~�~ˆ~Ø×;Ñ;Ø Ð4DÕ+EÈ3ØjÐlo×lzÑlzÐ|ð  Að !IØQð	 <ó ÷ ò ñ ð Š_¤¨Ð.EÀt×!LÒ!Lô
 �N‰NðGð  
ÀÌcÐRXËkö	ñ "M‰_÷_ )×(Ð(úñ6ñùsŸ   ‚ALÁ $LÂLÂ-LÃLÃ LÃ(5LÄK,Ä(LÄ8ALÅ:
LÆLÆLÆ%LÆ;LÇALÈ3LÈ9L È:%LÉ LÉ6.LÊ$LÊ%ALË,K=	Ë7
LÌLc               ó(   € V ^8„  d   QhRRRRRRRR/# )r0   r·   r%   rk  rm  r    r1   rs  r2   )r3   s   "r4   r5   r±   o  s1   € ÷ $Pñ $P¸3ð $PÐRUð $PÐalð $PÐquñ $Pr6   c                ó8  aaa	a
a€ ^ RI Ho VP                  VP                  rTVP                  '       dT   SeP   V'       dH   V'       d@   \        V\        4      '       d*   VP                  R4      '       g   \        SR4      '       g   R# \        V4      o	VP                  P                  o\        P                  ! 4       o
R VVV	V
V3R llp SP                  WVVP                  R7       R#   \          d"   p\"        P%                  RT4        Rp?R# Rp?ii ; i)	z¼Schedule deletion of tracked temporary progress bubbles after the final response lands.

Failed runs keep them as breadcrumbs. Only on adapters with ``delete_message``; failures swallowed.)Úsafe_schedule_threadsafeNrk   Úregister_post_delivery_callbackc               ó   € V ^8„  d   QhRR/# r^  r2   )r3   s   "r4   r5   ÚIGatewayTurnMixin._run_agent_schedule_bubble_cleanup.<locals>.__annotate__ƒ  s   € ÷ 		ñ 		 tñ 		r6   c            	     ó°   <€ R  VVV3R llp \        \        4      ;_uu_ 4        S! V ! 4       S\        RR7       RRR4       R#   + '       g   i     R# ; i)c               ó   € V ^8„  d   QhRR/# r^  r2   )r3   s   "r4   r5   ÚhGatewayTurnMixin._run_agent_schedule_bubble_cleanup.<locals>._cleanup_temp_bubbles.<locals>.__annotate__„  s   € ÷ Wñ W tñ Wr6   c               “  óÂ   <"  € S F=  p \        \        4      ;_uu_ 4        SP                  SV 4      G R j  x€L
  R R R 4       K?  	  R #  L  + '       g   i     KV  ; i5iro   )r   r¶   r[  )Ú_midÚ_chat_id_snapshotrk  Ú_ids_snapshots    €€€r4   Ú_delete_allÚgGatewayTurnMixin._run_agent_schedule_bubble_cleanup.<locals>._cleanup_temp_bubbles.<locals>._delete_all„  sI   øé € Û)�DÜ!¤)×,Õ,Ø.×=Ñ=Ð>OÐQUÓV×VÐV÷ -Ñ,ó *áV÷ -×,Ð,üs+   ƒA A¶A	
·A»AÁ	AÁAÁ	Az$Temp bubble cleanup scheduling error)rö   Úlog_messageN)r   r¶   rö   )r  r  rk  r  Ú_loop_snapshotr  s    €€€€€r4   Ú_cleanup_temp_bubblesÚRGatewayTurnMixin._run_agent_schedule_bubble_cleanup.<locals>._cleanup_temp_bubblesƒ  s?   ø€ ÷Wò Wô œ)×$Õ$Ù(Ù“M >¼&Ø Fõ÷ %×$×$Ò$ús   ¤AÁA	r¥   z-Post-delivery cleanup registration failed: %s)rH   r  Ú_cleanup_msg_idsrÝ   r\  r€   rg   rv   r©   r{  r    r¿   r×  rb  r  rÆ   r¶   rö   r  )rž   r·   rk  rm  r#  rÝ   r!  Ú_rper  r  r   r  s   &&f&    @@@@r4   Ú"_run_agent_schedule_bubble_cleanupÚ3GatewayTurnMixin._run_agent_schedule_bubble_cleanupo  sÞ   ü€ õ 	9Ø(0×(AÑ(AÀ8×CWÑCW˜+à×&×&Ð&Ø Ò,ß ßÜ˜8¤T×*Ò*Ø—L‘L ×*Ò*ÜÐ(Ð*K×LÒLáÜÐ-Ó.ˆØ$ŸO™O×3Ñ3ÐÜ ×1Ò1Ó3ˆ÷		ô 		ð	PØ×<Ñ<Ø¸x×?VÑ?Vð =ö øô ô 	PÜ�L‰LÐHÈ$×OÒOûð	Pús   ÃC- Ã-DÃ8DÄDc               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r0   rm  r    rn  r.   r    r   rÞ   rp  rA  ri   r1   rt  r2   )r3   s   "r4   r5   r±   •  s>   € ÷ 'ñ 'Ø#ð'Ø2<ð'ØFSð'à'ð'àCGð'ð 
"ñ'r6   c                ó\  € V P                  W4V4      w  Vn        Vn        p\        P                  ! 4       Vn        V P                  Vn        VP                  Vn        VP                  Vn	        VP                  Vn
        V P                  V4      Vn        VP                  Vn        Wan        V# )uæ   Resolve progress threading, then publish progress metadata and the syncâ†’async bridges onto
``turn_ctx`` (the one-slot holders shared with run_sync's executor thread are TurnContext
defaults). Returns ``_status_thread_metadata``.)r“  r�  r‘  r×  rb  Ú_loop_for_steprþ   Ú
_hooks_refÚ_step_callback_syncÚ_event_callback_syncÚ_status_callback_syncr½   Ú_status_adapterr¿   Ú_status_chat_idr’  )rž   rm  rn  r    rÞ   rA  r’  s   &&&&&& r4   Ú_run_agent_bind_turn_wiringÚ,GatewayTurnMixin._run_agent_bind_turn_wiring•  sœ   € ð ×.Ñ.¨vÐIaÓbñ 	ZˆÔ# XÔ%@ÐBYô #*×":Ò":Ó"<ˆÔØ"Ÿj™jˆÔØ'2×'FÑ'FˆÔ$Ø(3×(HÑ(HˆÔ%Ø)4×)JÑ)JˆÔ&Ø#'×#=Ñ#=¸fÓ#EˆÔ Ø#)§>¡>ˆÔ Ø+BÔ(Ø&Ð&r6   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r0   rX  rû  rm  r    Ú_executor_task_holderr{  r1   rs  r2   )r3   s   "r4   r5   r±   ª  s8   € ÷ IIñ IIØ2ðIIØ>IðIIØbfðIIà	ñIIr6   c              ƒ  óÚ  "  € ^ RI HpHpHp \        P                  ! 4       pV! R^´4      pVP                  RRRR7      p	V^ 8:  g   V	R8X  d   R# VP                  VP                  VP                  rËp
VP                  pV P                  V
4      pV'       g   R# Rp \        P                  ! V4      G Rj  x€L
  V P                  W¼^ ,          V^ ,          4      '       g   R# \        \        P                  ! 4       V,
          ^<,          4      pRp\        VP!                  VP"                  VP$                  R	R4      4      pV P'                  V^ ,          4      p\)        \*        4      ;_uu_ 4        V'       d    . pV'       d*   VP-                  \/        VR
,          VR,          4      4       VP1                  R4      ;'       g    VP1                  R4      pV'       d   VP-                  \3        V4      4       V'       d   RRP5                  V4      ,           pRRR4       V	R8X  d   VP7                  R4      M\9        RVVR7      p RpV'       d'    VP;                  V
P<                  VV4      G Rj  x€L
 pV'       d   \C        VRR4      '       gÚ   V P                  W¼^ ,          V^ ,          4      '       g   R# VPE                  V
P<                  VV! V! WÚPF                  R7      4      R7      G Rj  x€L
 p\C        VRR4      '       d_   \C        VRR4      '       dI   \3        VPH                  4      pVPJ                  '       d   VPL                  P-                  V4       EKÇ  EKÊ  EKÍ  EKÐ  EKÓ   EL¹  + '       g   i     ELb; i EL  \*         d$   p\>        PA                  RT4       Rp Rp?EL:Rp?ii ; i LÆ  \*         d#   p\>        PA                  RT4        Rp?EKH  Rp?ii ; i5i)a|  Periodic "still working" heartbeat, edited in place where supported. Stops once this run
no longer owns the session slot or the executor finished. ``_executor_task_holder[0]`` is
bound just after this task is scheduled (reads as None until then).

Interval: agent.gateway_notify_interval / HERMES_AGENT_NOTIFY_INTERVAL (default 180s; 0 or
long_running_notifications=off disables).)r  r=  r{  ÚHERMES_AGENT_NOTIFY_INTERVALÚlong_running_notificationsT)rS  r  r  Nr^   Úbusy_ack_detailrM  rœ  rL  rJ  u    â€” r+  r  rÑ  z"gateway.progress.working_heartbeat)r>  r“   zHeartbeat edit failed: %srô  Fr„  r™  r  z#Long-running notification error: %s)'rH   r  r=  r{  rõ   r  r    rÝ   rÂ  r’  r½   r×  r™  Ú&_should_emit_long_running_notificationr[   ri   r‘  ry  rz  r9  r   r¶   rf  r   rv   rU   r_   r-  r   rõ  r¿   rö   r  r�   rÓ  rÎ   r  r\  r#  )rž   rX  rm  r3  r  r=  r{  Ú_notify_startÚ_NOTIFY_INTERVALÚ_long_running_moder    rÝ   rÂ  r’  Ú_notify_adapterÚ_heartbeat_msg_idÚ_elapsed_minsÚ_status_detailÚ_want_iteration_detailÚ_aÚ_partsÚ_actionÚ_heartbeat_textÚ_notify_resÚ_eeÚ_nes   &&&&                      r4   Ú_run_agent_notify_long_runningÚ/GatewayTurnMixin._run_agent_notify_long_runningª  sj  é € ÷ 	\Ñ[ÜŸ	š	›ˆÙ%Ð&DÀcÓJÐØ!×7Ñ7Ð8TÐ^bÐrvÐ7ÓwÐØ˜qÔ Ð$6¸%Ô$?ÙØ,4¯O©O¸X×=QÑ=QÐS[×ShÑSh˜\ˆØ"*×"BÑ"BÐØ×4Ñ4°VÓ<ˆßÙØ+/ÐØÜ—-’-Ð 0Ó1×1Ð1Ø×>Ñ>Ø¨!�_Ð.CÀAÕ.F÷ò ñ Ü¤§¢£¨}Õ!<ÀÕ CÓDˆMàˆNÜ%)Ø×,Ñ,¨T×-=Ñ-=¸t×?PÑ?PÐRcÐeiÓjó&Ð"ð ×-Ñ-¨l¸1­oÓ>ˆBÜœ)×$Õ$ßØ�Fß-ØŸ™Ô&?ÀÐCSÕ@TÐVXÐYiÕVjÓ&kÔlØ Ÿf™f ^Ó4×TÐT¸¿¹Ð?SÓ8T�GßØŸ™¤c¨'£lÔ3ßØ)0°4·9±9¸VÓ3DÕ)D˜÷ %ð &¨Ô2ð ×+Ñ+¨HÔ5äÐ;À]Ð[iÔjð ð
IØ"�ß$ð+Ø,;×,HÑ,HÈÏÉÐYjÐl{Ó,|×&|˜÷ $¬°¸YÈ×(NÒ(Nð  ×FÑFØ#°!¥_Ð6KÈAÕ6N÷ò ñ Ø(7×(<Ñ(<ØŸ™¨Ù!2Ñ3OÐPg÷  sBñ  sBô  4Có  "Dð )=ó )÷ #�Kô ˜{¨I°u×=Ò=Ä'È+ÐWcÐei×BjÒBjÜ,/°×0FÑ0FÓ,GÐ)Ø#×5×5Ð5Ø$×5Ñ5×<Ñ<Ð=N×Oò 6ò CkÒ=ò )OòG 2÷ %×$Ð$úò& '}øÜ$ô +ÜŸ™Ð%@À#ÔFØ&*žûð+úñ#øô ô IÜ—‘ÐBÀC×HÓHûðIüsÉ   ‚B3O+Â5M.Â6B:O+Å0M1ÆA M1ÇM1Ç!M1È M1È.O+É	N; É N É2NÉ3N É7N; É?9N; Ê8O+Ê:8N; Ë2N9Ë3A,N; ÍO+Í1N	Í<	O+ÎN ÎN6ÎN1Î+N; Î1N6Î6N; Î;O(ÏO#ÏO+Ï#O(Ï(O+c          *     ól   € V ^8„  d   QhRRRRRRRRRRR	R
RRRRRRRRRRRRRRRRRRRRRRRRRRR RR!R"/# )#r0   rÓ   rU   rÜ   r|   r¡  r    r   rÒ   rÝ   r¢  rÆ   r|  r¼  r[   rÞ   rp  rß   rà   rá   zOptional[dict]rã   zOptional[Any]rä   zOptional[float]rå   rè   rç   ræ   zOptional[bool]ré   ri   râ   r1   rˆ  r2   )r3   s   "r4   r5   r±   õ  sò   € ÷ nñ nØðnØ,/ðnØ:Nðnàðnà+.ðnà=Gðnð &ðnð ADðnð (ð	nð ERð	nð
 &ðnð
 ;Iðnð ,ðnð M\ðnð $1ðnð HUðnð (6ðnð 'ðnð "ðnð *ðnð 
ñnr6   c              ƒ  ó
  "  € V P                  4       '       dH   V P                  WW4WVVV	VR7	      G Rj  x€L
 p^ RIHp VP	                  4       pVe   RV9  d   VVR&   V# ^ RIHp V P                  V4      pV'       d   \        P                  ! VRRRRRR7      pT P                  TTYTYrTYXYšY¼TTTTTTT\        \        VRV4      ;'       g    R	4      P                  4       R
8H  R7      w  pppV P                  VVWIVP                  4      pV'       g1   VP                   '       g   V P#                  VVVVP$                  4       \&        P(                  pVP*                  '       d   V! VP-                  4       4      MRpVP.                  '       d"   V! V P1                  VP2                  4      4      MRp V! V P5                  VP6                  4      4      p!V! V P9                  V4      4      p"\&        P:                  ! 4       p#V! V P=                  VV#4      4      p$R.p%V'       g   VP                   '       d   RMV! V P?                  VVV%4      4      p& V PA                  VVPB                  4      p'V'PD                  V%^ &   V PG                  V'VV#V$4      G Rj  x€L
 p(\I        V(\J        4      '       d   VP                   V(R&   V PM                  V4       VPN                  ^ ,          pV PQ                  V4      p)V PS                  VV)4      G Rj  x€L
  V PU                  VV)WF4      G Rj  x€L
 w  p*p+V*'       g	   V+'       d@   V PW                  VV)V+V*V(VV!4      G Rj  x€L
 V PY                  VVV V$V&V"V!R7      G Rj  x€L
  #  V PY                  VVV V$V&V"V!R7      G Rj  x€L
  V P[                  V(V4      G Rj  x€L
  V P]                  V(VV4       V(#  EL˜ EL9 LÇ L® L~ La LA  T PY                  TTT T$T&T"T!R7      G Rj  x€L 
  i ; i LO5i)z|Run the agent; returns the full run_conversation result dict.

Keys: "final_response", "messages", "api_calls", "completed".)	rÓ   rÜ   r|   r    rÒ   rÝ   rÆ   rÞ   ré   N)Úexecution_resultrð  r–  F)r:  r?  r@  rA  rB  rÈ   r^   r   )rÓ   r    rÝ   rÆ   rÜ   r|   rÒ   r¼  rÞ   rß   rà   rá   râ   rã   rä   rå   ræ   rç   ré   Ú
voice_turnrí   )rä  rå  ræ  ræ  rç  ré  )/rU  ró  rS  rL  rv   rÑ  r—  rU  Údataclassesrù   ro  rU   r�   rw   r0  rA  rd  r°  rž  r×  rØ  rB  Úsend_progress_messagesr=  r›  r>  r¸  r³  rÉ  r'  rã  rH  r0  r½  rf  rk  r€   rg   rx  rT  r½   r‚  rš  rá  rí  r  r%  ),rž   rÓ   rÜ   r|   r    rÒ   rÝ   rÆ   r¼  rÞ   rß   rà   rá   rã   rä   rå   rè   rç   ræ   ré   râ   rð  rL  Úcapturedr—  rX  rm  rn  rk  r’  Úspawnrä  rå  ré  rç  rÌ  ræ  r3  ræ  r  r·   r«   r•  r–  s,   &&&&&&&&&&&&&&&&&&&&&                       r4   r÷  Ú!GatewayTurnMixin._run_agent_innerõ  s.  é € ð  ×Ñ× Ò Ø×4Ñ4ØÈØ%È~Ø!1ÐGZð 5ó ÷ ˆFõ AØ'×+Ñ+Ó-ˆHØÒ#¨¸Ô(@Ø%+�˜Ñ"ØˆMå%à×/Ñ/°Ó7ˆßô ×&Ò&ØØ&+Ø38Ø"'Ø).Ø%*ôˆDð 37×2TÑ2TØ�' 7À{Ø)ÐRYØ!Ø-Ø)Ø1Ø!5Ø#9Ø&?Ø)Ø*GÐ]pÜœ7 <°¸,ÓG×MÐMÈ2ÓN×TÑTÓVÐZaÑað 3Uó 3
Ñ/ˆ�+Ð/ð #'×"BÑ"BØ�k 6¸T×=ZÑ=Zó#
Ð÷ $ x×'G×'GÐ'GØ×/Ñ/Ø˜Ð&=¸x×?eÑ?eôô
 ×#Ñ#ˆØGK×G`×G`ÐG`™˜k×@Ñ@ÓBÔCÐfjˆØLP×La×LaÐLa‘5˜×7Ñ7¸¿¹ÓGÔHÐgkˆá˜D×@Ñ@À×A`ÑA`ÓaÓbˆÙ˜d×9Ñ9¸(ÓCÓDˆÜ%Ÿmšm›oÐÙ! $×"GÑ"GÈÐReÓ"fÓgÐà'+ fÐç(¨H×,L×,LÐ,L‰DÙ�t×:Ñ:¸4ÀÐK`ÓaÓbð 	ð
	à×6Ñ6°xÀ×AUÑAUÓVˆFØ'-×';Ñ';Ð! !Ñ$Ø!×>Ñ>¸vÀxÐQdÐfwÓx×xˆHÜ˜(¤D×)Ò)Ø8@×8XÑ8X�Ð4Ñ5Ø×-Ñ-¨hÔ7ð ×+Ñ+¨AÕ.ˆFØ×0Ñ0°Ó8ˆGØ×8Ñ8¸À7ÓK×KÐKØ+/×+HÑ+HÈÐQXÐZ`Ó+n×%nÑ"ˆM˜7ß§Ø!×<Ñ<Ø˜g w°¸xÈÐQ\ó÷ ð ×4Ñ4Ø¨ÀÐ\mØ)¸ÐT_ð 5ó ÷ ñ ð !(ð
 ×4Ñ4Ø¨ÀÐ\mØ)¸ÐT_ð 5ó ÷ ð ð
 ×4Ñ4°X¸xÓH×HÐHØ×/Ñ/°Ð:JÈHÔUØˆò{òN yñ LÙ%nñóø�$×4Ñ4Ø¨ÀÐ\mØ)¸ÐT_ð 5ó ÷ ò úñ
 	Iùsæ   ‚1P³O´A
PÁ?B(PÄ(?PÅ()PÆBPÈ%PÈ7PÉAO ÊOÊA3O Ì	OÌ
O Ì$OÌ%O Ì4O Ì<O ÍOÍO ÍPÍ5OÍ6PÍ<PÎOÎPÎ1PÎ2PÏO ÏO ÏO ÏO ÏPÏPÏO>Ï7O:Ï8O>Ï>P)rÖ  rµ  )NNN)NNNF)r<  r;  r@  r8  r9  r:  r>  r‘  ry  rŸ  rŠ  r=  r?  rB  rA  )NNr³   NNNNNNNNNNFN)@Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r¡   Ústaticmethodr­   r¸   rÂ   r'  r3  r0  rA  r1  rI  rN  rM  rv  r…  rŽ  ru  r  r1  rU  ry  r…  r‹  rž  ró  r  rU  rc  ro  rw  r“  r›  r°  r¸  r¼  rÉ  rÚ  rã  rð  rü  r0  r*  r9  rB  r`  rk  rx  r‚  rš  r®  rá  rí  rú  r  r%  r0  rH  r÷  Ú__static_attributes__r2   r6   r4   rš   rš   ®   sß  † ÙHò]ð ñó ðð ôó ðò	Bõ9õBHõõ;ð ñ5ó ð5õYõ/õ ÷<	õFõ$!÷HõT[õ,P;õd0õ#<õJ"ð ôUó ðUõ ÷Dj
õXtõw
ðtÐõ)7õVõ*AOõF$õ6SõB&ð ô"ó ð"õ4õ&$$õLWõ<ð, ðÐchö ó ðõ8@ðD ô
ó ð
ð ôó ðõIõ")õV@õB.õ(Jõ(B&õHI%õVhõT+^õZõ(Uõn$PõL'õ*II÷Vnó nr6   rš   )zcontext lengthzcontext sizezcontext windowzmaximum contextztoken limitztoo many tokenszreduce the lengthzexceeds the limitzrequest entity too largezprompt is too longzpayload too largezinput is too long)rÂ  )r´  Úsession_meta)_rW  Ú
__future__r   Úpmr   rB   Útypingr   r×  rN  r¤  r¾  rã  rI  r&  rõ   Ú
agent.i18nr   Úagent.session_activityr   Úagent.turn_failure_copyr   r	   r
   Ú
contextlibr   r   Úcontextvarsr   r—  r   Úgateway.media_repairr   rá  r   r   Úgateway.platforms.eventr   rµ   r   r   r   r   r   Úgateway.warning_notificationsr   r   r   Úgateway.sessionr   r   r   r   Úgateway.session_transcriptr   Úgateway.turn_contextr    Úgateway.turn_leaser!   r"   Úhermes_constantsr#   Úpathlibr$   r%   r&   r'   r(   r)   r*   Úutilsr+   rH   r,   r`  r.   rC   rö   r(  rD   rR   ry   rW   rd   rz   r�   r…   r•   Úgateway.run_turn_preparer–   Úgateway.run_turn_hygiener—   Úgateway.run_turn_persistencer˜   rš   r2   r6   r4   Ú<module>rp     sý   ðñõ
 #å Û Ý  Û Û Û Û Û 	Û Û Û Ý Ý <ß lÑ lß ,Ý $Ý #Ý Iß IÝ 0÷õ ÷ lÑ k÷ó õ ;Ý ,ß HÝ 5Ý ß =× =Ý #çÝ)Ý2ð 
×	Ò	˜=Ó	)€à"ŸšÓ)Ð õð2#Ð õ2÷
Nõið" 2Ð õ5õ4.õ0 =Ý <Ý Dôu"Ð.Ð0GÐIdö u"r6   