+
    jHàj5Ü  ã                  óœ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHt ^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHt ^ RIHt ^ RIH t  ^ RI!H"t" ^ RI#H$t$ ]'       d   ^ RI%H&t& ^ RI'H(t( ]PR                  ! R4      t*R R lt+R R lt,RRRR/R R llt-R R lt. ! R R4      t/R R  lt0R! t1R# )"zKExtracted gateway run_turn_progress responsibility; consumed by TurnRunner.)ÚannotationsN)Úsuppress)Údatetime)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptional)Út)Ú_accepts_keyword)Ú#strip_stale_dangerous_confirmations)ÚPlatform)Ú(repair_explicit_computer_use_media_paths)ÚBasePlatformAdapter)ÚTurnContext)Úcfg_get)Úis_truthy_value)ÚGatewayRunner)Ú
TurnRunnerzgateway.runc               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚmessageÚstrÚoccurrencesÚintÚreturn© )Úformats   "Ú>/home/ubuntu/.hermes/hermes-agent/gateway/run_turn_progress.pyÚ__annotate__r   !   s!   € ÷ !ñ !¨3ð !¸Sð !ÀSñ !ó    c                ó¾   € RV R2pV P                  R4      p\        P                  ! RV4      '       d$   V P                  R4      '       d   RMRpV V V 2# V  RV 2# )u­   Put a repeat counter after a closing code fence on its own line: ```` ``` (Ã—N) ```` is not a
valid closing fence, so Telegram/Markdown renderers would leave the block open.u   (Ã—Ú)z
z(?:^|\n)[ \t]*```[ \t]*\r?\ZÚ
Ú )ÚrstripÚreÚsearchÚendswith)r   r   ÚsuffixÚbodyÚline_ends   &&   r   Ú_append_progress_repeat_countr,   !   sm   € ð �;�-˜qÐ!€FØ�>‰>˜&Ó!€DÜ	‡y‚yÐ0°$×7Ò7Ø$×-Ñ-¨f×5Ò5‘6¸4ˆØ�˜�z & Ð*Ð*ØˆY�a˜�xÐ Ð r    c               ó   € V ^8„  d   QhRR/# ©r   r   Údictr   )r   s   "r   r   r   ,   s   € ÷ ñ ¸ñ r    c                ó„  € ^ RI HpHp \        T;'       g    R4      p\	        V\
        4      '       d   TM/ p^ RIHp R\        T ;'       g    R4      RTRV! WR^PR7      ;'       g    RR	\        T ;'       g    R4      R
VRV! V4      /pV! WR4       Uu. uF  qˆP                  4       NK  	  up;p	'       d   W—R&   V# u upi )z«The ``ToolStartPayload`` contract every client reads (``tool_id``/``name``/``context``),
plus the ``tool_call_id``/``tool_name`` the gateway's own consumers were built on.)Úbuild_tool_previewÚtool_labels_for_callÚtool)Úbounded_argsÚtool_idÚ ÚnameÚcontext©Úmax_lenÚtool_call_idÚ	tool_nameÚargsÚlabels)	Úagent.displayr1   r2   r   Ú
isinstancer/   Úgateway.session_tool_eventsr4   Ú
as_payload)
Úcall_idr<   r=   r1   r2   r7   r4   ÚpayloadÚlabelr>   s
   &&&       r   Ú_tool_lifecycle_payloadrF   ,   s¼   € ÷ GÜˆy×"Ð"˜FÓ#€DÜ˜d¤D×)Ò)‰4¨r€DÝ8Øœ#˜gŸm˜m¨Ó,¨f°d¸IÑGYÐZ^ÐnpÔGq×GwÐGwÐuwØœs 7§= =¨bÓ1°;ÀÀfÉlÐ[_ÓN`ðb€Gá2FÀtÔ2RÓSÑ2R¨×"Ñ"Ö$Ñ2RÑSÐS€vÖSØ"�ÑØ€Nùò Ts   ÂB=Úis_errorÚverboseFc               ó   € V ^8„  d   QhRR/# r.   r   )r   s   "r   r   r   :   s   € ÷ ñ Ðaeñ r    c               ó¼   € ^ RI Hp Vf   ^ RIHp V! W4      ^ ,          p/ \	        WV4      CR\        V4      RV! W44      /CpV'       d   ^ RIHp	 V	! V4      VR&   V# )z½``tool.complete`` as every viewer reads it: the start contract plus the executor's verdict and
the result (ACP renders paths/output and failure from it), and ``result_text`` under /verbose.)Úbounded_result©Ú_detect_tool_failurerG   Úresult)Ú_tool_result_textÚresult_text)rA   rK   r?   rM   rF   ÚboolÚtui_gateway.tool_progressrO   )
rC   r<   r=   rN   rG   rH   rK   rM   rD   rO   s
   &&&&$$    r   Ú_tool_complete_payloadrS   :   si   € õ ;ØÒÝ6Ù'¨	Ó:¸1Õ=ˆð;Ô(¨¸TÓBð ;ÀJÔPTÐU]ÓP^Ø™¨Ó9ñ;€GçÝ?Ù!2°6Ó!:ˆ�ÑØ€Nr    c               ó   € V ^8„  d   QhRR/# ©r   r   rQ   r   )r   s   "r   r   r   I   s   € ÷ ñ È4ñ r    c                ól  € VP                  R4      p0 RmVR8X  d   RR0M	\        4       ,          pVR9  g¦   \        V4      V8w  g–   \        VR,          \        4      '       dy   \        VR,          \        4      '       d\   \        VR,          \        4      '       d?   VR8X  d:   \        VR,          \        4      '       d   \        VR,          4      \        Jd   R	# VR,          VR,          VR,          VP                  R4      3w  rgr‰VR8X  d   \        WgV4      p
M7\        V P                  V,          R
R4      R8H  p\        WgW‰VR,          VR7      p
T P                  WWJ4       ^ RIHpHp V! WW$WgW‰4       VR8X  d   ^ RIHp V! WVRVV! Wx4      V4       R# V! WVRVRRVR,          V	R7	       R# )z²A managed worker's tool frame, published exactly as an in-process turn publishes its own
(the shared viewer stream and this admission's API observers). False for any other frame.Útyper;   r7   r=   útool.completerN   rG   ú
tool.startFÚtool_progress_modeNrH   ©rG   rH   )Úpublish_api_tool_eventÚpublish_api_tool_progress©r1   útool.startedútool.completed)rG   rN   T>   r=   r7   rW   r;   )rY   rX   )ÚgetÚsetr@   r   r/   rW   rQ   rF   ÚgetattrÚsessionsrS   Úpublish_executionÚgateway.session_api_turnr\   r]   r?   r1   )Ú	authorityÚ
session_idÚ
generationÚframeÚkindÚfieldsrC   r7   r=   rN   rD   rH   r\   r]   r1   s   &&&&           r   Úpublish_worker_tool_eventrm   I   sš  € ð �9‰9�VÓ€DÚ5ÐSWÐ[jÔSj¸(ÀJÑ9OÔpsÓpuÕv€FØÐ3Ô3´s¸5³zÀVÔ7KÜ˜e NÕ3´S×9Ò9ÄÈEÐRXÍMÔ[^×A_ÒA_Ü˜e F�m¬T×2Ò2Ø˜Ô'´¸EÀ(½OÌS×1QÒ1QÔUYÐZ_Ð`jÕZkÓUlÔtxÓUxÙØ"'¨Õ"7¸¸v½ÈÈfÍÐW\×W`ÑW`ÐaiÓWjÐ"jÑ€G�4Øˆ|ÔÜ)¨'¸Ó>‰ä˜)×,Ñ,¨ZÕ8Ð:NÐPTÓUÐYbÑbˆÜ(¨¸ÈuÐU_ÕO`ÐjqÔrˆØ×Ñ 
¸ÔFßZÙ˜9°*ÀGÐSWÔ`ð ˆ|ÔÝ4Ù! )¸À^ÐUYÙ"4°TÓ"@À$ô	Hñ
 ñ 	" )¸ÐEUÐW[Ð]aÐcgØ+0°Õ+<ÀVõ	Már    c                  ó¨  € ] tR t^htR]R R lltR R ltR tR R ltR	 R
 ltR R lt	R^R R llt
R R ltR R ltR R lt]R R l4       tR tR R ltR R lt]P(                   ! R R4      4       tR R ltR  R! ltR_R" R# lltR$ R% ltR& R' lt]P(                   ! R( R)4      4       tR* R+ ltR, R- lt]R. R/ l4       tR0 R1 ltR2 R3 lt R4 R5 lt!]R6 R7 l4       t"R8 R9 lt#R: R; lt$R< R= lt%R> R? lt&R@ RA lt'RB RC lt(RD t)RE t*RF RG lt+RH t,RI t-RJ t.RK t/RL RM lt0RN RO lt1RP RQ lt2RR RS lt3RT RU lt4RV RW lt5RX RY lt6RZ R[ lt7R\t8R# )`ÚGatewayTurnProgressMixinNc               ó   € V ^8„  d   QhRR/# )r   Úlog_messager   r   )r   s   "r   r   Ú%GatewayTurnProgressMixin.__annotate__k   s   € ÷ 
ñ 
¨3ñ 
r    c                ó`   € ^ RI Hp T! Yf   V P                  P                  MT\        VR7      # )zJHop a coroutine from the agent's sync worker thread onto the gateway loop.)Úsafe_schedule_threadsafe)Úloggerrq   )Úgateway.runrt   Ú_ctxÚ_loop_for_stepru   )ÚselfÚcororq   Úlooprt   s   &&&& r   Ú	_scheduleÚ"GatewayTurnProgressMixin._schedulek   s*   € å8Ù'Øªl�$—)‘)×*Ò*ÀÌVÐalô
ð 	
r    c               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   rr   r   s   € ÷ ñ  Dñ r    c                óâ   €  V P                   P                  '       d   V P                   P                  ^ ,          MRp\        VRJ;'       d    \        VRR4      4      #   \         d     R# i ; i)zLTrue once the user sent `stop` (agent_holder[0] is the shared agent handle).NÚis_interruptedF)rw   Úagent_holderrQ   rc   Ú	Exception)ry   Úagents   & r   Ú_agent_interruptedÚ+GatewayTurnProgressMixin._agent_interruptedr   s`   € ð	Ø15·±×1G×1GÐ1G�D—I‘I×*Ñ*¨1Ö-ÈTˆEÜ˜ TÐ)×UÐU¬g°eÐ=MÈuÓ.UÓVÐVøÜô 	Úð	ús   ‚A ž.A ÁA ÁA.Á-A.c                	óT   € V P                   P                  pV'       d
   V^ ,          # R# )é    N)rw   Ústream_consumer_holder)ry   Úholders   & r   Ú_stream_consumerÚ)GatewayTurnProgressMixin._stream_consumerz   s"   € Ø—‘×1Ñ1ˆß"ˆv�a�yÐ,¨Ð,r    c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r   r   rr   ~   s   € ÷ ñ  tñ r    c                	óì   € V P                   P                  p\        \        4      ;_uu_ 4        VP	                  4       '       g   VP                  4        K(   R R R 4       R #   + '       g   i     R # ; i©N)rw   Úprogress_queuer   r‚   ÚemptyÚ
get_nowait)ry   Úqs   & r   Ú_drain_progress_queueÚ.GatewayTurnProgressMixin._drain_progress_queue~   sD   € Ø�I‰I×$Ñ$ˆÜ”i× Õ Ø—g‘g—i’iØ—‘–ð  ÷ !× × Ò ús   ®A"ÁA"Á"A3	c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   „   s   € ÷ @ñ @°ñ @r    c                óö   € V P                   pVP                  '       d[   \        VRR4      '       dF   \        VRR4      '       d1   VP                  P	                  \        VP                  4      4       R# R# R# R# )zHRemember a delivered progress/status message id for end-of-turn cleanup.ÚsuccessFÚ
message_idN)rw   Ú_cleanup_progressrc   Ú_cleanup_msg_idsÚappendr   rš   )ry   rN   Úctxs   && r   Ú_track_progress_resultÚ/GatewayTurnProgressMixin._track_progress_result„   sb   € à�i‰iˆØ× × Ð ¤W¨V°YÀ×%FÒ%FÌ7ÐSYÐ[gÐim×KnÒKnØ× Ñ ×'Ñ'¬¨F×,=Ñ,=Ó(>Ö?ñ LoÑ%FÑ r    c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   Š   s   € ÷ )ñ )¨tñ )r    c                	ón   €  VP                  4       pT P                  T4       R #   \         d     R # i ; ir�   )rN   r‚   rŸ   )ry   ÚfutÚress   && r   Ú_track_future_cleanup_idÚ1GatewayTurnProgressMixin._track_future_cleanup_idŠ   s6   € ð	Ø—*‘*“,ˆCð 	×#Ñ# CÖ(øô ô 	Úð	ús   ‚% ¥4³4c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú
event_typer   r<   z
str | NoneÚpreviewr=   zdict | Noner   )r   s   "r   r   rr   “   s*   € ÷ <%ñ <%¨Cð <%¸Jð <%ÐXbð <%Ðq|ñ <%r    c                ó  € V P                   p\        V 4      '       d    ^ RIHp VP	                  WW#V4       VR8X  d   V P                  W54       R# V P                  WV4       VP                  e|   VR8X  du   V'       dm   VR8w  df   \        P                  ! 4       P                  R	4      pV'       d   R
V R2MRp	VP                  P                  V RV RV	 2P                  4       4       VP                   '       d   VP#                  4       '       g   R# VR8X  d-   VP$                  ^ ,          '       g   V P'                  V4       R# VR8X  g   VR8X  dP   VP(                  '       d   VR8X  d   TMTMRp
V
'       d'   VP                   P                  \+        RV
R7      4       R# VP,                  '       d
   VR9   d   R# VP.                  '       d%   VR8w  g   VR8X  g   V P1                  4       '       d   R# VP2                  R8X  d   W&P4                  ^ ,          8X  d   R# W&P4                  ^ &   V P7                  W#V4      pVe   V P9                  V4       R# R#   \
         d    \        P                  RTRR7        ELKi ; i)z3Callback invoked by agent on tool lifecycle events.©Úlocal_viewer_eventsz+Local viewer progress publish failed for %sT©Úexc_infozsubagent.completeNr_   Ú	_thinkingz%Y-%m-%d %H:%M:%Sz "Ú"r6   z  Ú:r`   z gateway.progress.thinking_prefix)ÚtextÚclarifyÚnew¾   r_   r`   )rw   Úlocal_viewer_turnÚgatewayr¬   Úpublish_progressr‚   ru   ÚdebugÚ_progress_subagent_noticeÚ_progress_live_statusÚ	log_queuer   ÚnowÚstrftimeÚputr%   r‘   Ú_run_still_currentÚlong_tool_hint_firedÚ_progress_onboarding_hintÚ_thinking_enabledr
   Ú_native_slack_task_cardsÚtool_progress_enabledr„   Úprogress_modeÚ	last_toolÚ_progress_build_messageÚ_progress_emit)ry   r¨   r<   r©   r=   Úkwargsrž   r¬   ÚtsÚpreview_strÚthinking_textÚmsgs   &&&&&,      r   Úprogress_callbackÚ*GatewayTurnProgressMixin.progress_callback“   s/  € à�i‰iˆÜ˜T×"Ò"ðgÝ7Ø#×4Ñ4°TÀyÐ[aÔbð Ð,Ô,Ø×*Ñ*¨7Ô;ÙØ×"Ñ" :¸$Ô?ð �=‰=Ò$¨°~Ô)EÏ)ÐXaÐepÔXpÜ—’“×(Ñ(Ð)<Ó=ˆBß-4˜B˜w˜i q™/¸"ˆKØ�M‰M×Ñ   B y k°°;°-Ð@×GÑGÓIÔJØ×!×!Ð!¨×)?Ñ)?×)AÒ)AÙØÐ)Ô)°#×2JÑ2JÈ1×2MÔ2MØ×*Ñ*¨6Ô2Ùð ˜Ô$¨	°[Ô(@ØTW×Ti×TiÐTi¨	°[Ô(@™WÁiÐosˆMßØ×"Ñ"×&Ñ&¤qÐ)KÐR_Ô'`ÔaÙð ×'×'Ð'¨JÐ:\Ô,\Ùð ×)×)Ð)Ø˜^Ô+ð ˜IÔ%Ø×&Ñ&×(Ò(áà×Ñ Ô%¨)·}±}ÀQÕ7GÔ*GÙØ$�‰�aÑØ×*Ñ*¨9¸tÓDˆØŠ?Ø×Ñ Ö$ñ øôi ô gä—‘ÐJÈJÐae�×fðgús   ŸI É#JÊJc               ó    € V ^8„  d   QhRRRR/# ©r   rÊ   r/   r   rŽ   r   )r   s   "r   r   rr   Ñ   s   € ÷ Jñ J¸ð JÀ$ñ Jr    c           	     óø  a aa€ S P                   o^ RIHp VP                  R4      p ^ RIHpHp WE9   dœ   SP                  4       '       d„   T! VP                  R4      YBP                  R4      ;'       g    TVP                  R4      VP                  R4      R7      oV! VVV 3R	 lSP                  P                  SP                  R
7       R# R# R#   \         d    \        P                  RRR7        R# i ; i)zLOnly terminal failure statuses render (same notice rail as credit warnings).)Úrender_notificationÚstatus)ÚSUBAGENT_FAILURE_STATUSESÚformat_subagent_failure_lineÚgoalÚsummaryÚduration_secondsÚfailure_reason)ÚerrorrÚ   rÛ   c                 óp   <€ SP                  SP                  P                  S P                  S4      R 4      # )z(subagent failure notice scheduling error)r|   Ú_runnerÚ_deliver_platform_noticeÚsource)rž   Úlinery   s   €€€r   Ú<lambda>ÚDGatewayTurnProgressMixin._progress_subagent_notice.<locals>.<lambda>Þ   s1   ø€ ˜DŸN™N¨4¯<©<×+PÑ+PÐQT×Q[ÑQ[Ð]aÓ+bð  eOô  Pr    )ÚplatformÚuser_configzsubagent failure notice failedTr­   N)rw   Úgateway.warning_notificationsrÔ   ra   Útools.delegate_toolrÖ   r×   rÀ   rà   rä   rå   r‚   ru   r¹   )	ry   r©   rÊ   rÔ   rÕ   rÖ   r×   rž   rá   s	   f&&    @@r   rº   Ú2GatewayTurnProgressMixin._progress_subagent_noticeÑ   sÐ   ú€ à�i‰iˆÝEØ—‘˜HÓ%ˆð	JßcØÔ2°s×7MÑ7M×7OÒ7OÙ3Ø—J‘J˜vÓ&¨·j±jÀÓ6K×6VÐ6VÈwØ%+§Z¡ZÐ0BÓ%CÐTZ×T^ÑT^Ð_oÓTpô�ñ $ö PØ ŸZ™Z×0Ñ0¸c¿o¹o÷Oñ 8PÑ2øô ô 	JÜ�L‰LÐ9ÀDˆL×Ið	Jús#   ¨C ¶C Á)C Á6AC Ã"C9Ã8C9c               ó    € V ^8„  d   QhRRRR/# )r   r¨   r   r   rŽ   r   )r   s   "r   r   rr   ã   s   € ÷ ?ñ ?°ð ?Èñ ?r    c                ó  € V P                   pVP                  pVe   VP                  R8X  g   VR8X  d   R#  VR8X  df   V'       d^   VP                  4       '       dH   ^ RIHp TP                  VP                  P                  T! Y$P                  R8X  d   TMR4      4       R# VR8X  d)   VP                  VP                  P                  R4       R# R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)	z©Live status line (Slack assistant status): stash the tool phrase on the adapter; the
_keep_typing refresh renders it. Plain dict write, safe from the sync worker thread.NÚoffr¯   r_   )Úbuild_status_phraseÚfullr`   zlive status update failed: %s)rw   Ú_live_status_adapterÚ_live_status_moderÀ   r?   rì   Úset_status_textrà   Úchat_idr‚   ru   r¹   )ry   r¨   r<   r=   rž   Úadapterrì   Úerrs   &&&&    r   r»   Ú.GatewayTurnProgressMixin._progress_live_statusã   så   € ð �i‰iˆØ×*Ñ*ˆØŠ?˜c×3Ñ3°uÔ<À	È[Ô@XÙð	?Ø˜^Ô+·	¸c×>TÑ>T×>VÒ>VÝ=Ø×'Ñ'¨¯
©
×(:Ñ(:Ñ<OÐPY×cxÑcxð  }Cô  dCÑ[_ð  IMó  =Nö  OØÐ/Ô/à×'Ñ'¨¯
©
×(:Ñ(:¸DÖAñ 0øô ô 	?Ü�L‰LÐ8¸#×>Ò>ûð	?ús*   ¸C ÁC ÁAC Â$-C ÃDÃ C<Ã<Dc               ó    € V ^8„  d   QhRRRR/# rÒ   r   )r   s   "r   r   rr   ô   s   € ÷ Jñ J°ð J¸ñ Jr    c                ó  € ^ RI HpHp V P                  p VP	                  R4      ;'       g    ^ VP
                  8¼  dš   VP                  R8X  d‡   ^ RIHpH	pH
pHp V! 4       p	\        \        V	RR4      RR7      p
V
'       dR   V! W•4      '       gB   R	VP                  ^ &   VP                  P!                  V! 4       4       V! VR
,          V4       R# R# R# R# R#   \"         d"   p\$        P'                  RT4        Rp?R# Rp?ii ; i)z¢First-touch onboarding: the first time a tool exceeds _LONG_TOOL_THRESHOLD_S while
streaming every tool (progress_mode == "all"), append a one-time /verbose hint.)Ú_hermes_homeÚ_load_gateway_configÚdurationÚall)ÚTOOL_PROGRESS_FLAGÚis_seenÚ	mark_seenÚtool_progress_hint_gatewayÚdisplayÚtool_progress_commandF©ÚdefaultTzconfig.yamlz(tool-progress onboarding hint failed: %sN)rv   r÷   rø   rw   ra   Ú_LONG_TOOL_THRESHOLD_SrÆ   Úagent.onboardingrû   rü   rý   rþ   r   r   rÁ   r‘   r¿   r‚   ru   r¹   )ry   rÊ   r÷   rø   rž   rû   rü   rý   rþ   ÚcfgÚgate_onró   s   &&          r   rÂ   Ú2GatewayTurnProgressMixin._progress_onboarding_hintô   sæ   € ÷ 	CØ�i‰iˆð
	JØ—
‘
˜:Ó&×+Ð+¨!°×0JÑ0JÔJÈs×O`ÑO`ÐdiÔOißoÓoÙ*Ó,�Ü)¬'°#°yÐBYÓ*ZÐdiÔj�ß¡7¨3×#CÒ#CØ26�C×,Ñ,¨QÑ/Ø×&Ñ&×*Ñ*Ñ+EÓ+GÔHÙ˜l¨]Õ:Ð<NÖOñ $D‘7ñ	 PjÑJøô ô 	JÜ�L‰LÐCÀS×IÒIûð	Jús   –C ®B#C ÃDÃ&DÄDc               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   rr     s   € ÷ $ñ $˜#ñ $r    c                 ó2   € ^ RI Hp  V ! 4       pV^ 8”  d   V# ^(# )zTtool_preview_length (default 40): the one-line preview budget for "all"/"new" modes.)Úget_tool_preview_max_len)r?   r
  )r
  Úpls     r   Ú_preview_capÚ%GatewayTurnProgressMixin._preview_cap  s    € õ 	;Ù%Ó'ˆØ˜!”VˆrÐ# Ð#r    c                óŠ  € \        VRR4      '       d`   VR8X  dY   \        V\        4      '       dC   \        VP                  R4      \        4      '       d   VR,          P                  4       '       g   R# VR,          P                  4       pV P                  P                  ^ ,          '       d   RM\        RWBR7      R	,           pV P                  4       pVP                  4       pV'       d
   V^ ,          MTp	\        V	4      V8”  d   V	RV^,
           R
,           p	M\        V4      ^8”  d
   V	R,          p	V RV R2V RV	 R23# )aq  (full, short) fenced blocks for a terminal command on markdown platforms, else (None, None).

No language tag: Slack mrkdwn renders it as a literal first code line. Verbose shows the FULL
command; "all"/"new" truncate to one line capped at ``tool_preview_length``. Consecutive
terminal calls drop the repeated header so back-to-back commands render as adjacent blocks.
Úsupports_code_blocksFÚterminalÚcommandNr6   zgateway.progress.tool_head©Úemojir3   r#   ú...z ...z```
z
```)NN)rc   r@   r/   ra   r   Ústripr%   rw   Úlast_was_terminal_blockr
   r  Ú
splitlinesÚlen)
ry   rò   r<   r=   r  Úcmd_fullÚheaderÚcapÚlinesÚ	cmd_shorts
   &&&&&     r   Ú_progress_terminal_blocksÚ2GatewayTurnProgressMixin._progress_terminal_blocks  s   € ô �GÐ3°U×;Ò;À	ÈZÔ@WÔ\fÐgkÔmq×\rÒ\rÜ˜4Ÿ8™8 IÓ.´×4Ò4¸¸i½×9NÑ9N×9PÒ9PàÐØ˜	•?×)Ñ)Ó+ˆØ—y‘y×8Ñ8¸×;Ô;‘ÄÐC_ÐglÔA}ð  AEõ  BEˆØ×ÑÓ!ˆØ×#Ñ#Ó%ˆß %�E˜!–H¨8ˆ	Üˆy‹>˜CÔØ! ( 3¨¥7Ð+¨eÕ3‰IÜ�‹Z˜!Œ^Ø˜ÕˆIØ�˜˜x˜j¨Ð.°6°(¸%À	¸{È%Ð0PÐPÐPr    c               ó   € V ^8„  d   QhRR/# )r   r   úOptional[str]r   )r   s   "r   r   rr   #  s   € ÷ &Bñ &BÀ=ñ &Br    c           	     ó¶  € V P                   p^ RIHp V! VRR7      p V P                  P	                  VP
                  4      pV P                  WqW64      w  r‰VP                  R8H  p
V
'       d   TMT	pVRJVP                  ^ &   V
'       d™   VfQ   V'       dI   ^ RIH
pHp V! W<! 4       \        VRR4      4      p\        R	Wa\        VP                  4       4      VR
7      pM'Vf$   V'       d   \        RWaVR7      M\        RWaR7      pVP                   P#                  V4       R# Ve   V# V'       g   \        RWaR7      # ^ RIHpHpHpHp V! WW P-                  4       R7      pVe   VP/                  V4      MVP0                  pV! V4      pV'       g   \        RWaVR7      # V! V4      '       d   V RV 2# V RV V! V4       V 2#   \         d    Rp EL”i ; i)zSRender the progress line. Verbose mode queues directly (no dedup) and returns None.)Úget_tool_emojiu   âš™ï¸�r  NrH   )r
  Úverbose_tool_args_textr  Fzgateway.progress.tool_verbose)r  r3   Úkeysr=   zgateway.progress.tool_preview)r  r3   r©   zgateway.progress.tool_pendingr  )Úget_tool_verbÚprepare_tool_previewÚtool_verb_connectorÚverb_drops_preview)Úfallbackr:   r$   )rw   r?   r#  rÞ   Ú_delivery_adapter_forrà   r‚   r  rÆ   r  r
  r$  rc   r
   Úlistr%  r‘   r¿   r&  r'  r(  r)  r  Úformat_tool_previewr²   )ry   r<   r©   r=   rž   r#  r  rò   Ú	code_fullÚ
code_shortrH   Úcoder
  r$  Úargs_strr&  r'  r(  r)  ÚpreparedÚverbs   &&&&                 r   rÈ   Ú0GatewayTurnProgressMixin._progress_build_message#  sä  € à�i‰iˆÝ0Ù˜y°(Ô;ˆð	Ø—l‘l×8Ñ8¸¿¹ÓDˆGð !%× >Ñ >¸wÐSWÓ _Ñˆ	Ø×#Ñ# yÑ0ˆß#‰y¨ˆØ)-°TÐ)9ˆ×#Ñ# AÑ&ßØŠ|§ßZñ 2°$Ð8PÓ8RÜ29¸'ÐCYÐ[`Ó2aóc�äÐ8ÀÔ\`Ðae×ajÑajÓalÓ\mÐt|Ô}‘Ø’ßlsœÐ9ÀÐ`gÕhÜÐ>ÀeÔ\ð à×Ñ×"Ñ" 4Ô(ÙØÒØˆKßÜÐ4¸EÔRÐRßnÓnÙ'¨	À'×SdÑSdÓSfÔgˆØ;BÒ;N�'×-Ñ-¨hÔ7ÐT\×TaÑTaˆñ ˜YÓ'ˆßÜÐ4¸EÐ[bÔcÐcÙ$6°y×$AÒ$A�%�˜˜$˜Ð ð  	BÈ%ÈÐPQÐRVÐQWÑXkÐluÓXvÐWwÐxð  xAð  HBð  	Bøô? ô 	Ø‹Gð	ús   ž%G ÇGÇGc               ó    € V ^8„  d   QhRRRR/# )r   rÎ   r   r   rŽ   r   )r   s   "r   r   rr   K  s   € ÷ (ñ ( #ð (¨$ñ (r    c                ó^  € V P                   pV P                  4       pVRJ;'       d    \        VRR4      pWP                  ^ ,          8X  dŒ   VP                  ^ ;;,          ^,          uu&   V'       d5   VP                  \        WP                  ^ ,          ^,           4      4       R# VP                  P                  RWP                  ^ ,          34       R# V^ uVP                  ^ &   VP                  ^ &   V'       d   VP                  V4       R# VP                  P                  V4       R# )z¦Dedup consecutive identical lines (execute_code boilerplate), then route to the native
stream bubble when the consumer accepts tool progress, else the progress queue.NÚaccepts_tool_progressFÚ	__dedup__)	rw   rŠ   rc   Úlast_progress_msgÚrepeat_countÚon_tool_progressr,   r‘   r¿   )ry   rÎ   rž   ÚscÚnatives   &&   r   rÉ   Ú'GatewayTurnProgressMixin._progress_emitK  sû   € ð �i‰iˆØ×"Ñ"Ó$ˆØ˜4�×OÐO¤G¨BÐ0GÈÓ$OˆØ×'Ñ'¨Õ*Ô*Ø×Ñ˜Q× 1Õ$ÓßØ×#Ñ#Ô$AÀ#×GWÑGWÐXYÕGZÐ]^ÕG^Ó$_Ô`ñ ð ×"Ñ"×&Ñ&¨°S×:JÑ:JÈ1Õ:MÐ'NÔOÙØ8;¸QÐ5ˆ×Ñ˜aÑ  #×"2Ñ"2°1Ñ"5ßØ×Ñ Ö$à×Ñ×"Ñ" 3Ö'r    c                  ó  € ] tR tRt$ RtR]R&   ]P                  ! ]R7      t	R]R&   ]P                  ! ]
R7      tR]R	&   R
tR]R&   RtR]R&   RtR]R&   ^ tR]R&   ]RR R ll4       tR R ltR R ltR R ltR R ltRtR
# )Ú'GatewayTurnProgressMixin._TaskCardStatei`  z=Task-card rail state for ``_send_native_task_card_progress``.r   rò   )Údefault_factoryzdict[str, dict[str, str]]Útasksz	list[str]Ú
task_orderNr!  Úfallback_msg_idFrQ   Únative_failedÚpublication_suppressedr   Úanonymous_seqc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úvaluer   Úlimitr   r   r   r   )r   s   "r   r   Ú4GatewayTurnProgressMixin._TaskCardState.__annotate__r  s&   € ÷ 	Vñ 	V˜Cð 	V¨ð 	V°cñ 	Vr    c                	óÚ   € \         P                  ! R R\        T ;'       g    R4      4      P                  4       p\	        V4      V8:  d   V# VRV^,
           P                  4       R,           # )z\s+r$   r6   Nr  )r&   Úsubr   r  r  r%   )rI  rJ  r²   s   && r   Ú_compactÚ0GatewayTurnProgressMixin._TaskCardState._compactq  sX   € ä—6’6˜& #¤s¨5¯;¨;°BÓ'7Ó8×>Ñ>Ó@ˆDÜ˜t›9¨Ô-�4ÐU°4¸¸%À!½)Ð3D×3KÑ3KÓ3MÐPUÕ3UÐUr    c               ó   € V ^8„  d   QhRR/# )r   r   zlist[dict[str, str]]r   )r   s   "r   r   rK  v  s   € ÷ 	Mñ 	MÐ#7ñ 	Mr    c                	ój   € V P                   RR  Uu. uF  qP                  V,          NK  	  up# u upi )é   Niøÿÿÿ)rC  rB  )ry   Útask_ids   & r   Úvisible_tasksÚ5GatewayTurnProgressMixin._TaskCardState.visible_tasksv  s1   € Ø7;·±ÀrÀsÑ7KÓLÑ7K¨G—J‘J˜w×'Ð'Ñ7KÑLÐLùÒLs   ’0c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   rK  y  s   € ÷ 	Sñ 	S 3ñ 	Sr    c                	óB  € R \        R4      R\        R4      R\        R4      /pV P                  4        Uu. uF6  p\        RVR,          VP                  VR,          VR,          4      R	7      NK8  	  pp\        R
4      R,           RP                  V4      ,           # u upi )Úin_progressz$gateway.progress.task_status_runningÚcompletez%gateway.progress.task_status_completerÜ   z"gateway.progress.task_status_errorzgateway.progress.task_lineÚtitlerÕ   )rZ  rÕ   ú gateway.progress.task_card_titler#   )r
   rT  ra   Újoin)ry   r>   Útaskr  s   &   r   Úfallback_textÚ5GatewayTurnProgressMixin._TaskCardState.fallback_texty  s¤   € Ø#¤QÐ'MÓ%NØ ¤!Ð$KÓ"LØœqÐ!EÓFðHˆFð "&×!3Ñ!3Ô!5ó7Ù!5˜ô Ð3¸4À½=ÐQW×Q[ÑQ[Ð\`ÐaiÕ\jÐlpÐqyÕlzÓQ{×|Ù!5ð ð 7äÐ7Ó8¸4Õ?À$Ç)Á)ÈEÓBRÕRÐRùò7s   ¶<Bc               ó$   € V ^8„  d   QhRRRRRR/# )r   rC   r   rZ  r   zdict[str, str]r   )r   s   "r   r   rK  �  s!   € ÷ 	'ñ 	' 3ð 	'¨sð 	'°~ñ 	'r    c                	óÆ   € WP                   9  d   V P                  P                  V4       R VRV P                  V4      RR/V P                   V&   V P                   V,          # )ÚidrZ  rÕ   rX  )rB  rC  r�   rN  )ry   rC   rZ  s   &&&r   Ú_upsertÚ/GatewayTurnProgressMixin._TaskCardState._upsert�  sS   € ØŸj™jÔ(Ø—‘×&Ñ& wÔ/Ø#'¨°'¸4¿=¹=ÈÓ;OÐQYÐ[hÐ"iˆD�J‰J�wÑØ—:‘:˜gÕ&Ð&r    c               ó    € V ^8„  d   QhRRRR/# )r   Úrawr   r   rQ   r   )r   s   "r   r   rK  ‡  s   € ÷ 	ñ 	 3ð 	¨4ñ 	r    c                	ó’  € \        V\        4      '       d   VP                  R 4      MRpVR9  d   R# \        VP                  R4      ;'       g    R4      pV'       g)   V ;P                  ^,          un        RV P                   2p\        VP                  R4      ;'       g    R4      pVR8X  dD   V P                  VP                  R	4      ^@4      pT P                  Y5'       d   V R
V 2MT4       R# V P                  P                  V4      ;'       g    V P                  W44      pVP                  R4      '       d   RMRVR&   R# )rW   Nr_   Fr;   r6   Ú
anonymous_r<   r3   r©   z - TrG   rÜ   rY  rÕ   rµ   )r@   r/   ra   r   rG  rN  rc  rB  )ry   rf  r¨   rC   r<   r©   r]  s   &&     r   Úapply_eventÚ3GatewayTurnProgressMixin._TaskCardState.apply_event‡  s	  € Ü,6°s¼D×,AÒ,A˜Ÿ™ œÀtˆJØÐ!CÔCÙÜ˜#Ÿ'™' .Ó1×7Ð7°RÓ8ˆGßØ×"Ò" aÕ'Õ"Ø& t×'9Ñ'9Ð&:Ð;�Ü˜CŸG™G KÓ0×:Ð:°FÓ;ˆIØ˜^Ô+ØŸ-™-¨¯©°	Ó(:¸BÓ?�Ø—‘˜WÆG¨¨°3°w°iÑ&@ÐQZÔ[Ùð —:‘:—>‘> 'Ó*×NÐN¨d¯l©l¸7Ó.NˆDØ(+¯©°
×(;Ò(;™WÀˆD�‰NÙr    r   )éx   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__ÚdataclassesÚfieldr/   rB  r,  rC  rD  rE  rF  rG  ÚstaticmethodrN  rT  r^  rc  ri  Ú__static_attributes__r   r    r   Ú_TaskCardStater@  `  s�   ‡ áKØ‹Ø+6×+<Ò+<ÈTÔ+RˆÐ(ÓRØ +× 1Ò 1À$Ô Gˆ
�IÓGØ)-ˆ˜Ó-Ø#ˆ�tÓ#ð (-Ð Ó,Øˆ�sÓà	ö	Vó 
ð	Võ	Mõ	Sõ	'÷	ñ 	r    rv  c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   š  s   € ÷ 8ñ 8¸Dñ 8r    c              ƒ  	ó~  "  € V P                   pVP                  4       p^ RIHp VP                  '       d   R# VP
                  '       d�   VP                  P                  VP                  P                  VP
                  W2P                  R7      G Rj  x€L
 p\        VRR4      '       d   R# V! V4      '       d   \        P                  R4       RVn        R# V P                  W4      G Rj  x€L
 p\        VRR4      '       d2   \        VRR4      '       d   \        VP                   4      Vn        R# R# R#  L¤ LL5i)	r‡   ©Údeclined_sendN)rñ   rš   ÚcontentÚmetadatar™   Fz›Task-card fallback edit DECLINED by the connector's egress guard; suppressing progress delivery for the rest of this turn (the destination is not approved)Trš   )rw   r^  Úgateway.relay.egressrz  rF  rD  rò   Úedit_messagerà   rñ   Ú_progress_metadatarc   ru   ÚwarningÚ_send_progress_textr   rš   )ry   Ústrž   r²   rz  rN   s   &&    r   Ú _task_card_send_or_edit_fallbackÚ9GatewayTurnProgressMixin._task_card_send_or_edit_fallbackš  s  é € Ø�i‰iˆØ×ÑÓ!ˆÝ6à×$×$Ð$ÙØ××ÐØŸ:™:×2Ñ2ØŸ
™
×*Ñ*°r×7IÑ7IÐSW×bxÑbxð 3ó ÷ ˆFô �v˜y¨%×0Ò0Ùñ
 ˜V×$Ò$Ü—‘ð=ôð
 -1�Ô)ÙØ×/Ñ/°Ó9×9ˆÜ�6˜9 e×,Ò,´¸ÀÈt×1TÒ1TÜ!$ V×%6Ñ%6Ó!7ˆBÖñ 2UÑ,ñ%ñ" :ùs2   ‚AD=ÁA	D=ÂD9Â&D=Â<2D=Ã.D;Ã/AD=Ä;D=c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   ·  s   € ÷ :8ñ :8¨dñ :8r    c           	   ƒ  	óJ  "  € V P                   pVP                  '       g   R # VP                  '       d   R # \        VP                  RR 4      p\        V4      '       d]   V! VP                  P                  VP                  VP                  R7      RJ d&   V P                  V4       VP                  '       d   R # VP                  '       Eg7   VP                  P                  VP                  P                  VP                  4       \        R4      VP                  VP                  VP                  4       R7      G R j  x€L
 p\        VRR4      '       d   R # ^ RIHp V! V4      '       d&   RVn        RVn        \$        P'                  R	4       R # RVn        ^ R
IHp \        VRR 4      V9   d3   V P                  V\        VRR4      4       VP                  '       d   R # M!\$        P'                  R\        VRR4      4       V P-                  V4      G R j  x€L
  R #  Lß L5i)NÚ&native_task_card_destination_supported©Úreply_tor|  Fr[  )rñ   rB  rZ  r‰  r|  r^  r™   ry  Tu¦   Slack native task-card progress DECLINED by the connector's egress guard â€” suppressing the text fallback for the rest of this turn (the destination is not approved))Ú_CARD_DESTINATION_REFUSALSrÜ   zunknown errorzSSlack native task-card progress failed; falling back to an editable text update: %s)rw   rB  rF  rc   rò   Úcallablerà   rñ   Ú_progress_reply_tor  Ú!_task_card_uncardable_destinationrE  Úsend_native_task_card_progressrT  r
   r^  r}  rz  ru   r€  Úgateway.run_turn_runnerrŠ  rƒ  )ry   r‚  rž   Údestination_supportedrN   rz  rŠ  s   &&     r   Ú_task_card_publishÚ+GatewayTurnProgressMixin._task_card_publish·  sÛ  é € Ø�i‰iˆØ�x�xˆxÙØ×$×$Ð$ñ ô !(¨¯
©
Ð4\Ð^bÓ cÐÜÐ)×*Ò*Ñ/DØ�J‰J×Ñ¨×)?Ñ)?È#×J`ÑJ`ô0
àó0ð ×2Ñ2°2Ô6Ø×(×(Ð(ÙØ××ÑØŸ:™:×DÑDØŸ
™
×*Ñ*°"×2BÑ2BÓ2DÌAÐNpÓLqØ×/Ñ/¸#×:PÑ:PÐ`b×`pÑ`pÓ`rð Eó ÷ ˆFô �v˜y¨%×0Ò0Ùõ
 ;á˜V×$Ò$ð -1�Ô)Ø#'�Ô Ü—‘ðEôñ
 Ø#ˆBÔÝJÜ�v˜w¨Ó-Ð1KÔKØ×6Ñ6°r¼7À6È7ÐTcÓ;dÔeØ×,×,Ð,Ùð -ô —‘ð5Ü6=¸fÀgÈÓ6_ôð
 ×3Ñ3°BÓ7×7Ò7ñMñL 	8ùs=   ‚2H#µBH#Â9H#ÃA1H#Ä?HÅ ,H#Å-B+H#ÈH!ÈH#È!H#c               ó    € V ^8„  d   QhRRRR/# )r   Úreasonr   r   rŽ   r   )r   s   "r   r   rr   ó  s   € ÷ 
ñ 
¸Cð 
ÐY]ñ 
r    c                ó¶   € V P                   P                  '       d    RVn        \        P	                  RV4       R# RVn        \        P	                  RV4       R# )uÄ  The chat cannot host a card (flat DM: no thread anchor) â€” a property of the destination,
not a transient outage. The text fallback exists to keep a WORKING card lane live through a
transient failure, not to invent text bubbles the operator never asked for: with Slack's tier
default (``tool_progress: off``) the lane goes silent for the turn. An operator who WROTE
``new``/``all`` asked for text progress, so the editable fallback carries it instead.TzuSlack native task cards are unsupported for this destination (%s); tool progress continues as an editable text updateNzhSlack native task cards are unsupported for this destination (%s); tool progress stays off for this turn)rw   rÅ   rE  ru   ÚinforF  )ry   r‚  r”  s   &&&r   r�  Ú:GatewayTurnProgressMixin._task_card_uncardable_destinationó  sR   € ð �9‰9×*×*Ð*Ø#ˆBÔÜ�K‰KðEØFLôñ Ø$(ˆÔ!Ü�‰ð4Ø5;ö	
r    c               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   rr     s   € ÷ 	ñ 	 dñ 	r    c                	ó  € R p  VP                  V P                  P                  P                  4       4      ;'       g    TpK@    \        P
                   d     T# \         d    \        P                  RRR7        T# i ; i)FTz(Slack native progress queue drain failedr­   )	ri  rw   r‘   r“   ÚqueueÚEmptyr‚   ru   r¹   )ry   r‚  Úchangeds   && r   Ú_task_card_drainÚ)GatewayTurnProgressMixin._task_card_drain  sy   € Øˆð	TØØŸ.™.¨¯©×)AÑ)A×)LÑ)LÓ)NÓO×ZÐZÐSZ’øÜ�{‰{ô 	Øð ˆô ô 	TÜ�L‰LÐCÈdˆLÕSØˆð	Tús"   „:A ¿A ÁBÁBÁ%BÂ Bc               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr     s   € ÷ ]ñ ]Àñ ]r    c              ƒ  ó  "  € V P                   pV P                  V4      p VP                  4       '       dh    VP                  P	                  4       pT P                  4       '       d   KI  TP                  T4      '       g   Kb  T P                  T4      G Rj  x€L
  K}   \        VR4      '       dH    VP                  VP                   P"                  VP$                  VP&                  R7      G Rj  x€L
  R# R#   \
        P                   d%    \        P                  ! R4      G Rj  x€L 
   EK  i ; i Lž  \        P                   db    T P                  T4      '       dG   TP                  4       '       d1   T P                  4       '       g   T P                  T4      G Rj  x€L 
   ELi ; i L¿  \        P                   d    h \(         d    \*        P-                  RRR7        R# i ; i  \        TR4      '       d…    TP                  TP                   P"                  TP$                  TP&                  R7      G Rj  x€L 
  i   \        P                   d    h \(         d    \*        P-                  RRR7        i i ; ii ; i5i)z·Drain progress into native cards; supported destinations retain editable fallback.
Unsupported destinations and egress refusals suppress publication, never finalization.

See #29483.
gš™™™™™¹?NÚstop_native_task_card_progressrˆ  z)task-card stop failed during turn cleanupTr­   )rw   rv  rÀ   r‘   r“   rš  r›  ÚasyncioÚsleepr„   ri  r‘  ÚCancelledErrorr�  Úhasattrr¡  rà   rñ   rŒ  r  r‚   ru   r¹   )ry   rò   rž   r‚  rf  s   &&   r   Ú_send_native_task_card_progressÚ8GatewayTurnProgressMixin._send_native_task_card_progress  s-  é € ð �i‰iˆØ× Ñ  Ó)ˆð	]Ø×(Ñ(×*Ò*ðØ×,Ñ,×7Ñ7Ó9�Cð ×.Ñ.×0Ô0°R·^±^ÀC×5HÔ5HØ×1Ñ1°"Ó5×5Ò5ð +ô �wÐ @×AÒAð]Ø!×@Ñ@ØŸ
™
×*Ñ*°S×5KÑ5KÐVY×VlÑVlð Aó ÷ ò ñ	 Bøô —{‘{ô Ü!Ÿ-š-¨Ó,×,Ñ,Ûðúñ 6øÜ×%Ñ%ô 	2Ø×$Ñ$ R×(Ò(¨S×-CÑ-C×-EÒ-EÈd×NeÑNe×NgÒNgØ×-Ñ-¨bÓ1×1Ñ1úð	2úñøô ×-Ñ-ô ØÜ ô ]Ü—L‘LÐ!LÐW[�L×\ð]ûô �wÐ @×AÒAð]Ø!×@Ñ@ØŸ
™
×*Ñ*°S×5KÑ5KÐVY×VlÑVlð Aó ÷ ò øô ×-Ñ-ô ØÜ ô ]Ü—L‘LÐ!LÐW[�LÖ\ð]úð Büs  ‚J¡D8 ¸C: ÁD8 Á*D8 ÂD8 ÂD6ÂD8 ÂG1 ÂJÂ2?F3 Ã1F1Ã2F3 Ã6JÃ:.D3Ä(D+Ä)D3Ä.D8 Ä2D3Ä3D8 Ä8+F.Å$F.Å:F.ÆF.Æ$F'Æ%F.Æ*G1 Æ-F.Æ.G1 Æ1F3 Æ3G.ÇG.Ç*JÇ-G.Ç.JÇ1J	È?IÉIÉIÉ
J	ÉJÉ*JÊJ	ÊJÊJ	Ê	Jc                  ób   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   R]R&   RtR# )Ú+GatewayTurnProgressMixin._ProgressEditStatei4  zSMutable editable-bubble state shared by ``send_progress_messages`` and its helpers.r   rò   r,  Úprogress_linesÚprogress_msg_idrQ   Úcan_editÚ_progress_len_fnr   Ú_PROGRESS_TEXT_LIMITÚ_edit_accepts_metadatar   N)rl  rm  rn  ro  rp  rq  ru  r   r    r   Ú_ProgressEditStater©  4  s-   ‡ áaØ‹ØÓØÓØ‹ØÓØ!Ó!Ø $×$r    r°  c               ó   € V ^8„  d   QhRR/# )r   r   zTurnRunner._ProgressEditStater   )r   s   "r   r   rr   ?  s   € ÷ 
ñ 
Ð/Lñ 
r    c                	óþ  € V P                   p\        V\        4      '       d   VP                  M\        p \        \        VR R4      ;'       g    R4      p\        V\        4      '       d~   \        \        4      ;_uu_ 4        \        VP                  VP                  P                  4      ;'       g    R4      pVP                  VP                  P                  4      pRRR4       T P                  T. RVP                  R8g  T\        ^YD^€8”  d   ^@M^ ,
          4      \!        VP"                  4      ;'       d    \%        VP&                  R4      R7      #   \         d    Rp ELi ; i  + '       g   i     L“; i)ÚMAX_MESSAGE_LENGTHi   NÚseparater|  )rò   rª  r«  r¬  r­  r®  r¯  )rw   r@   r   Úmessage_len_fnr  r   rc   r‚   r   Úmax_message_length_for_chatrà   rñ   Úmessage_len_fn_for_chatr°  Úprogress_groupingÚmaxrQ   r  r   r~  )ry   rò   rž   Úlen_fnÚ	raw_limits   &&   r   Ú_progress_edit_stateÚ-GatewayTurnProgressMixin._progress_edit_state?  s6  € Ø�i‰iˆÜ+5°gÔ?R×+SÒ+S�×'Ò'ÔY\ˆð	ÜœG GÐ-AÀ4ÓH×PÐPÈDÓQˆIô
 �gÔ2×3Ò3Üœ)×$Õ$Ü × CÑ CÀCÇJÁJ×DVÑDVÓ W× _Ð _Ð[_Ó`�	Ø ×8Ñ8¸¿¹×9KÑ9KÓL�÷ %ð ×&Ñ&Ø¨BÀà×*Ñ*¨jÑ8Ø#ä!$ Q¨	Às¼?±RÐPQÕ(RÓ!Sä#'¨×(>Ñ(>Ó#?×#vÐ#vÔDTÐU\×UiÑUiÐkuÓDvð 'ó 	
ð 		
øô ô 	Ø‹Ið	ú÷
 %×$ús$   ¶E ÁE ÂAE,ÅE)Å(E)Å,E<	c               ó    € V ^8„  d   QhRRRR/# )r   rš   r   r{  r   )r   s   "r   r   rr   W  s   € ÷ 7ñ 7¸3ð 7Èñ 7r    c              ƒ  	ó,  "  € V P                   pR VP                  P                  RVRV/p\        VP                  RR4      '       d   RVR&   VP
                  '       d   VP                  VR&   VP                  P                  ! R	/ VB G Rj  x€L
 #  L5i)
rñ   rš   r{  ÚREQUIRES_EDIT_FINALIZEFTÚfinalizer|  Nr   )rw   rà   rñ   rc   rò   r¯  r  r~  )ry   r‚  rš   r{  rž   rÊ   s   &&&&  r   Ú_edit_progress_messageÚ/GatewayTurnProgressMixin._edit_progress_messageW  sƒ   é € Ø�i‰iˆØ˜SŸZ™Z×/Ñ/°¸zÈ9ÐV]Ð^ˆÜ�2—:‘:Ð7¸×?Ò?Ø!%ˆF�:ÑØ×$×$Ð$Ø!$×!7Ñ!7ˆF�:ÑØ—Z‘Z×,Ò,Ñ6¨vÑ6×6Ð6Ñ6ùs   ‚ABÁ.BÂBÂBc               ó    € V ^8„  d   QhRRRR/# )r   r  r,  r   r   r   )r   s   "r   r   rr   a  s   € ÷ 6ñ 6˜dð 6 sñ 6r    c                	ó2   € R P                  R V  4       4      # )r#   c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir�   )r   )Ú.0rá   s   & r   Ú	<genexpr>Ú:GatewayTurnProgressMixin._progress_text.<locals>.<genexpr>b  s   é € Ð5©u tœ˜TŸ˜«uùs   ‚)r\  )r  s   &r   Ú_progress_textÚ'GatewayTurnProgressMixin._progress_text`  s   € à�y‰yÑ5©uÓ5Ó5Ð5r    c               ó    € V ^8„  d   QhRRRR/# )r   r  r,  r   z
list[list]r   )r   s   "r   r   rr   d  s   € ÷ 
7ñ 
7°ð 
7¸ñ 
7r    c                óú   € . p. pV FY  pWE.,           pV'       dD   VP                  V P                  V4      4      VP                  8”  d   VP                  V4       V.pTpK[  	  Y4'       d
   V.,           # . ,           # )z>Partition progress lines into platform-sized editable bubbles.)r­  rÊ  r®  r�   )ry   r‚  r  ÚgroupsÚcurrentrá   Ú	candidates   &&&    r   Ú_split_progress_groupsÚ/GatewayTurnProgressMixin._split_progress_groupsd  sx   € àˆØˆÛˆDØ &Õ(ˆIß˜2×.Ñ.¨t×/BÑ/BÀ9Ó/MÓNÐQS×QhÑQhÔhØ—‘˜gÔ&Ø!˜F�	ØŠGñ ð ¦g˜'˜Õ6Ð6°2Õ6Ð6r    c               ó   € V ^8„  d   QhRR/# )r   r²   r   r   )r   s   "r   r   rr   p  s   € ÷ ñ °#ñ r    c              ƒ  	óè   "  € V P                   pVP                  P                  VP                  P                  W#P
                  VP                  R 7      G Rj  x€L
 pV P                  V4       V#  L5i))rñ   r{  r‰  r|  N)rw   rò   Úsendrà   rñ   rŒ  r  rŸ   )ry   r‚  r²   rž   rN   s   &&&  r   r�  Ú,GatewayTurnProgressMixin._send_progress_textp  sb   é € Ø�i‰iˆØ—z‘z—‘Ø—J‘J×&Ñ&°×?UÑ?UÐ`c×`vÑ`vð 'ó 
÷ 
ˆð 	×#Ñ# FÔ+Øˆñ	
ùs   ‚AA2ÁA0ÁA2c               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   rr   x  s   € ÷ ñ ¸Tñ r    c              ƒ  ó  "  € VP                   '       d   VP                  '       g   R# V P                  WP                   4      p\        V4      ^8:  d   R# VP                  ež   V P                  WP                  V P                  V^ ,          4      4      G Rj  x€L
 pVP                  '       gI   \        VRR4      '       d-   \        P                  RVP                  P                  4       R# RVn        R# VR,          pV Fd  pV P                  WP                  V4      4      G Rj  x€L
 pVP                  '       g   K?  VP                  '       g   KS  VP                  Vn        Kf  	  VR,          Vn         R#  Lá LS5i)uð   Start fresh editable progress bubbles before a bubble exceeds limit.

Returns True when it delivered/split the buffer or a transient edit failure left it
intact for retry â€” either way the caller skips the normal send/edit path this tick.
FNÚ	retryableu>   [%s] Transient overflow edit failure â€” keeping can_edit=TrueT:é   NNéÿÿÿÿ)rª  r¬  rÑ  r  r«  rÂ  rÊ  r™   rc   ru   r¹   rò   r7   r�  rš   )ry   r‚  rÎ  rN   Úgroups   &&   r   Ú!_roll_progress_overflow_if_neededÚ:GatewayTurnProgressMixin._roll_progress_overflow_if_neededx  s-  é € ð × × Ð ¨¯¯¨ÙØ×,Ñ,¨R×1BÑ1BÓCˆÜˆv‹;˜!ÔÙØ×ÑÒ)Ø×6Ñ6°r×;MÑ;MÈt×ObÑObÐciÐjkÕclÓOmÓn×nˆFØ—>—>�>Ü˜6 ;°×6Ò6Ü—L‘LÐ!aÐce×cmÑcm×crÑcrÔsÙØ#�”áØ˜B•ZˆFÛˆEØ×3Ñ3°B×8KÑ8KÈEÓ8RÓS×SˆFØ�~�~Š~ &×"3×"3Ò"3Ø%+×%6Ñ%6�Ö"ñ ð # 2�JˆÔÙñ! oñ Tùs<   ‚$E?§A2E?ÂE;ÂE?Â0A9E?Ä)E=Ä*E?ÅE?Å&E?Å=E?c               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   rr   —  s   € ÷ Rñ R ñ Rr    c                	óv   € \        V \        4      ;'       d#    \        V 4      ^8¬  ;'       d    V ^ ,          R8H  # )rÚ  Ú	__reset__)r@   Útupler  )rf  s   &r   Ú_is_reset_markerÚ)GatewayTurnProgressMixin._is_reset_marker–  s0   € ä˜#œuÓ%×QÐQ¬#¨c«(°a©-×QÐQ¸CÀ½FÀkÑ<QÐQr    c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   š  s   € ÷ Lñ L¨Dñ Lr    c                óŠ   € R. uVn         Vn        R^ uV P                  P                  ^ &   V P                  P                  ^ &   R# )uŸ   Content bubble landed â€” close the tool-progress bubble so the next tool starts fresh
below it; else tool edits hit the ORIGINAL message above (out of order).N)r«  rª  rw   r9  r:  ©ry   r‚  s   &&r   Ú_reset_progress_bubbleÚ/GatewayTurnProgressMixin._reset_progress_bubbleš  s@   € ð 15°bÐ-ˆÔ˜BÔ-ØDHÈ!ÐAˆ�	‰	×#Ñ# AÑ&¨¯	©	×(>Ñ(>¸qÓ(Ar    c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   rr      s   € ÷ 	ñ 	¨3ñ 	r    c                ó:  € \        V\        4      '       dj   \        V4      ^8X  dZ   V^ ,          R8X  dL   Vw  r4pVP                  '       g   V# \	        WE^,           4      VP                  R&   VP                  R,          # VP                  P                  V4       V# )zOFold a queue item into the bubble buffer; returns the line to render this tick.r8  rÛ  )r@   râ  r  rª  r,   r�   )ry   r‚  rf  Ú_Úbase_msgÚcounts   &&&   r   Ú_progress_absorbÚ)GatewayTurnProgressMixin._progress_absorb   sƒ   € ä�cœ5×!Ò!¤c¨#£h°!¤m¸¸A½À+Ô8MØ!$ÑˆA˜Ø×$×$Ð$Ø�Ü$AÀ(ÐTUÍIÓ$VˆB×Ñ˜bÑ!Ø×$Ñ$ RÕ(Ð(Ø
×Ñ× Ñ  Ô%Øˆ
r    c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   «  s   € ÷ rñ r°ñ rr    c           	   ƒ  	ól  "  € VP                   '       dˆ   VP                  '       dt   VP                  '       d`   \        \        4      ;_uu_ 4        V P                  WP                  V P                  VP                  4      4      G R j  x€L
  R R R 4       R # R # R # R #  L  + '       g   i     R # ; i5ir�   )r¬  rª  r«  r   r‚   rÂ  rÊ  rç  s   &&r   Ú_flush_progress_editÚ-GatewayTurnProgressMixin._flush_progress_edit«  s~   é € Ø�;�;ˆ;˜2×,×,Ð,°×1C×1CÐ1CÜœ)×$Õ$Ø×1Ñ1°"×6HÑ6HÈ$×J]ÑJ]Ð^`×^oÑ^oÓJpÓq×qÐq÷ %Ñ$ñ 2DÑ,‰;áq÷ %×$Ð$üs9   ‚$B4§B4¹B4Á9B Â	BÂ
B ÂB4ÂB Â B1	Â+	B4c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   °  s   € ÷ ,ñ ,°Tñ ,r    c              ƒ  	óö  "  € V P                   p\        \        4      ;_uu_ 4        VP                  P	                  4       '       g£   VP                  P                  4       pV P                  V4      '       dF   V P                  V4      G R j  x€L
  V P                  V4      G R j  x€L
  V P                  V4       K–  V P                  W4       V P                  V4      G R j  x€L
  KÂ   R R R 4       VP                  '       d>   VP                  '       d,   VP                  '       d   V P                  V4      G R j  x€L
  V P                  V4      G R j  x€L
  R #  LÏ L¸ L}  + '       g   i     L€; i L8 L!5ir�   )rw   r   r‚   r‘   r’   r“   rã  rÝ  ró  rè  rï  r¬  rª  r«  )ry   r‚  rž   rf  s   &&  r   Ú_drain_progress_on_cancelÚ2GatewayTurnProgressMixin._drain_progress_on_cancel°  s   é € Ø�i‰iˆÜ”i× Õ Ø×(Ñ(×.Ñ.×0Ò0Ø×(Ñ(×3Ñ3Ó5�Ø×(Ñ(¨×-Ò-ð ×@Ñ@ÀÓD×DÐDØ×3Ñ3°BÓ7×7Ð7Ø×/Ñ/°Ö3à×)Ñ)¨"Ô2Ø×@Ñ@ÀÓD×DÒDð 1÷ !ð �;�;ˆ;˜2×,×,Ð,°×1C×1CÐ1CØ×8Ñ8¸Ó<×<Ð<Ø×'Ñ'¨Ó+×+Ò+ñ EÙ7ñ E÷ !× úñ =Ù+ùsŽ   ‚$E9¦ E"Á0E"Á8E"ÂEÂE"Â%EÂ&<E"Ã"E Ã#E"Ã*E9ÄE9ÄE9Ä(E9Ä<E5Ä=E9ÅE7ÅE9ÅE"ÅE"Å E"Å"E2	Å-	E9Å7E9c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   Ã  s   € ÷ ^ñ ^°Dñ ^r    c              ƒ  	ó   "  € V P                   p\        P                  ! R 4      G Rj  x€L
  VP                  4       '       dF   VP                  P                  VP                  P                  VP                  R7      G Rj  x€L
  R# R#  La L
5i)ç333333Ó?N©r|  )	rw   r¢  r£  rÀ   rò   Úsend_typingrà   rñ   r  )ry   r‚  rž   s   && r   Ú_progress_restore_typingÚ1GatewayTurnProgressMixin._progress_restore_typingÃ  si   é € Ø�i‰iˆÜ�mŠm˜CÓ × Ð Ø×!Ñ!×#Ò#Ø—*‘*×(Ñ(¨¯©×);Ñ);Àc×F\ÑF\Ð(Ó]×]Ò]ñ $ñ 	!á]ùs'   ‚&B¨B
©BÁ>BÂBÂ	BÂBc               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   rr   É  s   € ÷ ñ °tñ r    c              ƒ  ó’  a"  € VP                   '       Ed-   VP                  Ee   V P                  WP                  RP                  VP                  4      4      G Rj  x€L
 oSP
                  '       d   R# \        SRR4      '       d-   \        P                  RVP                  P                  4       R# \        ;QJ d    V3R lR	 4       F  '       g   K   RM	  RM! V3R lR	 4       4      '       d,   \        P                  RVP                  P                  4       MRVn         V P                  W4      G Rj  x€L
  R# T P                  YP                   '       d   RP                  VP                  4      MT4      G Rj  x€L
 oSP
                  '       d$   SP                  '       d   SP                  Vn        R#  ELb L† L@5i)
a  Deliver this tick's bubble. Returns False on a transient edit failure (retry next tick).

Transient network errors (ConnectError, timeouts) must not disable editing; only permanent
failures (not found, permissions) set can_edit=False. Flood control backs off but keeps editing.
Nr#   TrÙ  Fu5   [%s] Transient edit failure â€” keeping can_edit=Truec              3  ór   <"  € T F,  q\        SR R4      ;'       g    RP                  4       9   x € K.  	  R# 5i)rÜ   r6   N)rc   Úlower)rÇ  ÚwrN   s   & €r   rÈ  ÚBGatewayTurnProgressMixin._progress_send_or_edit.<locals>.<genexpr>Ö  s0   øé € ÐgÑNfÈœ ¨°"Ó5×;Ð;¸×BÑBÓDÖDÓNfùs   ƒ7œ7z-[%s] Progress edit flood control, backing off)Úfloodzretry after)r¬  r«  rÂ  r\  rª  r™   rc   ru   r¹   rò   r7   Úanyr–  r�  rš   )ry   r‚  rÎ   rN   s   &&&@r   Ú_progress_send_or_editÚ/GatewayTurnProgressMixin._progress_send_or_editÉ  s?  øé € ð �;�;‰;˜2×-Ñ-Ó9Ø×6Ñ6°r×;MÑ;MÈtÏyÉyÐY[×YjÑYjÓOkÓl×lˆFØ�~�~ˆ~ÙÜ�v˜{¨E×2Ò2Ü—‘ÐTÐVX×V`ÑV`×VeÑVeÔfÙß‹sÔgÑNfÓg�s�sŠsÔgÑNfÓg×gÒgÜ—‘ÐKÈRÏZÉZÏ_É_Õ]à#�”Ø×*Ñ*¨2Ó3×3Ð3Ùà×/Ñ/°×T_×T_ÐT_°D·I±I¸b×>OÑ>OÔ4PÐehÓi×iˆØ�>�>ˆ>˜f×/×/Ð/Ø!'×!2Ñ!2ˆBÔÙò! mñ 4ñ jùs]   ƒAGÁG ÁGÁ5AGÃGÃGÃ6AGÄ<GÄ=AGÆGÆGÆGÆ-GÇGÇGc              ƒ  	ón  "  € V P                   pVP                  '       d&   V P                  P                  VP                  4      MR pV'       g   R # VP
                  '       d.   \        VR4      '       d   V P                  V4      G R j  x€L
  R # \        \        V4      RR 4      pVe   V\        P                  J d   V P                  4        R # V P                  V4      pRpRp  VP                  4       '       g   V P                  4        R # VP                  P                  4       pV P!                  4       '       d!   \"        P$                  ! ^ 4      G R j  x€L
  Kz  V P'                  V4      '       d   V P)                  V4       K¤  V P+                  WG4      pV P-                  V4      G R j  x€L
 '       g†   V\.        P0                  ! 4       V,
          ,
          p	V	^ 8”  d"   \"        P$                  ! V	4      G R j  x€L
  EK  VP                  4       '       g   R # V P3                  WH4      G R j  x€L
 '       g   EKY  \.        P0                  ! 4       pV P5                  V4      G R j  x€L
  EKŠ   ELæ EL LÆ Lz LH L  \6        P8                   d%    \"        P$                  ! R4      G R j  x€L 
   EKÐ  \"        P:                   d    T P=                  T4      G R j  x€L 
   R # \>         dB   p
\@        PC                  RT
4       \"        P$                  ! ^4      G R j  x€L 
   R p
?
EKG  R p
?
ii ; i5i)NrŽ  r~  g        g      ø?rû  zProgress message error: %s)"rw   r‘   rÞ   r+  rà   rÄ   r¥  r¦  rc   rW   r   r~  r•   r¼  rÀ   r“   r„   r¢  r£  rã  rè  rï  rÝ  ÚtimeÚ	monotonicr  rþ  rš  r›  r¤  r÷  r‚   ru   rÜ   )ry   rž   rò   Úadapter_editr‚  Úlast_edit_tsÚEDIT_INTERVALrf  rÎ   Ú	remainingÚes   &          r   Úsend_progress_messagesÚ/GatewayTurnProgressMixin.send_progress_messagesâ  sv  é € Ø�i‰iˆØDG×DV×DVÐDV�$—,‘,×4Ñ4°S·Z±ZÔ@Ð\`ˆßÙØ×'×'Ð'¬G°GÐ=]×,^Ò,^Ø×6Ñ6°wÓ?×?Ð?Ùô œt G›}¨n¸dÓCˆØÒ <Ô3F×3SÑ3SÓ#SØ×&Ñ&Ô(ÙØ×&Ñ& wÓ/ˆØˆØˆØð#'Ø×-Ñ-×/Ò/Ø×.Ñ.Ô0ÙØ×(Ñ(×3Ñ3Ó5�ð ×*Ñ*×,Ò,Ü!Ÿ-š-¨Ó*×*Ð*ÙØ×(Ñ(¨×-Ò-Ø×/Ñ/°Ô3ÙØ×+Ñ+¨BÓ4�Ø!×CÑCÀBÓG×GÖGð !.´·²Ó1AÀLÕ1PÕ Q�IØ  1”}Ü%Ÿmšm¨IÓ6×6Ð6Ú Ø×1Ñ1×3Ò3ÙØ!%×!<Ñ!<¸RÓ!E×EÖEÚ Ü#Ÿ~š~Ó/�Ø×3Ñ3°BÓ7×7Ó7òQ @ò* +ñ Hñ 7ñ Fñ 8øÜ—;‘;ô )Ü—m’m CÓ(×(Õ(Ü×)Ñ)ô Ø×4Ñ4°RÓ8×8Ñ8ÚÜô 'Ü—‘Ð9¸1Ô=Ü—m’m AÓ&×&×&Ð&ûð'üsL  ‚AL5ÁL5Á$&L5Â
I0ÂAL5Ã(I> Ã>I> ÄL5Ä/I> Å I> ÅI3ÅI> ÅL5Å I> Å7I> ÆL5Æ
%I> Æ/I6Æ0	I> Æ:AI> Ç=I8Ç>I> ÈL5ÈI> ÈL5ÈI> È1I:È2	I> È<L5È?)I> É(I<É)I> É-L5É3I> É6I> É8I> É:I> É<I> É>.L2Ê,J/Ê-L2Ê2L5Ê6L2Ë	L2ËK!ËL2Ë$L5Ë'L2Ë0L2Ë1/L-Ì L#Ì!L-Ì&L5Ì-L2Ì2L5c                ó  € V P                   pVP                  ^ ,          '       g,   VP                  ^ ,          e   VP                  4       '       g   R# RVP                  ^ &   V P                  P                  VP                  4      pVe   \        VR4      '       g   R#  V P                  VP                  VP                  ^ ,          4      RVP                  R7       R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z?tool_start_callback: speak a one-time ack in the voice channel.NTÚplay_ack_in_voicezvoice ack scheduling error)r{   zvoice ack schedule failed: %s)rw   Ú_voice_ack_firedÚ_voice_ack_guildrÀ   rÞ   r+  rà   r¥  r|   r  Ú_voice_ack_loopr‚   ru   r¹   )ry   rC   r<   r=   rž   rò   ró   s   &&&&   r   Úvoice_ack_callbackÚ+GatewayTurnProgressMixin.voice_ack_callback  sÙ   € à�i‰iˆØ×Ñ ×"Ô" c×&:Ñ&:¸1Õ&=Ò&EÈS×McÑMc×MeÒMeÙØ"&ˆ×Ñ˜QÑà—,‘,×4Ñ4°S·Z±ZÓ@ˆØŠ?¤'¨'Ð3F×"GÒ"GÙð	?Ø�N‰NØ×)Ñ)¨#×*>Ñ*>¸qÕ*AÓBÐD`Ðgj×gzÑgzð ö øô ô 	?Ü�L‰LÐ8¸#×>Ò>ûð	?ús   Â >C  Ã DÃ+DÄDc               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   rr   1  s   € ÷ gñ g 4ñ gr    c                	ó®   € V P                   p\        VP                  4      ;'       d.    VP                  4       ;'       d    V P	                  4       '       * # r�   )rw   rQ   r‘   rÀ   r„   )ry   rž   s   & r   Ú_native_card_gateÚ*GatewayTurnProgressMixin._native_card_gate1  sA   € Ø�i‰iˆÜ�C×&Ñ&Ó'×fÐf¨C×,BÑ,BÓ,D×fÐfÈT×MdÑMdÓMfÔIfÐfr    c                ó$  € V P                  4       '       g   R# ^ RIHp \        T;'       g    R4      pV P                  P
                  P                  RRR\        T;'       g    R4      RTR	T! YS;'       g    / ^@R
7      ;'       g    R/4       R# )zCQueue an ID-correlated native progress start from the agent thread.Nr^   r3   rW   r_   r;   r6   r<   r©   r9   )r  r?   r1   r   rw   r‘   r¿   )ry   rC   r<   r=   r1   r7   s   &&&&  r   Únative_tool_start_callbackÚ3GatewayTurnProgressMixin.native_tool_start_callback9  sz   € à×%Ñ%×'Ò'ÙÝ4Ü�9×&Ð& Ó'ˆØ�	‰	× Ñ ×$Ñ$Ø�N N´C¸¿¸À2Ó4FÈÐUYØÑ)¨$·
°
¸ÀBÔG×MÐMÈ2ð&
ö 	r    c                ó  € V P                  4       '       g   R# ^ RIHp \        T;'       g    R4      pV! Wd4      w  rxV P                  P
                  P                  RRR\        T;'       g    R4      RVR	\        V4      /4       R# )
zAQueue the matching native completion using the real tool-call ID.NrL   r3   rW   r`   r;   r6   r<   rG   )r  r?   rM   r   rw   r‘   r¿   rQ   )	ry   rC   r<   r=   rN   rM   r7   rG   rì  s	   &&&&&    r   Únative_tool_complete_callbackÚ6GatewayTurnProgressMixin.native_tool_complete_callbackD  sx   € à×%Ñ%×'Ò'ÙÝ6Ü�9×&Ð& Ó'ˆÙ*¨4Ó8‰ˆØ�	‰	× Ñ ×$Ñ$ØÐ$ n´c¸'¿-¸-ÀRÓ6HÈ+ÐW[Ð]gÔimÐnvÓiwð&
ö 	r    c                óx  € \        V 4      '       d   ^ RIHp VP                  WW#4       V P	                  R\        WV4      4       V P                  RWV4       V P                  P                  ^ ,          e   V P                  WV4       V P                  P                  '       d   V P                  WV4       R# R# )z9Compose the voice ack + native task-card start consumers.r«   rY   N)r¶   r·   r¬   Únote_tool_startÚ_publish_executionrF   Ú_publish_api_toolrw   r  r  rÄ   r   )ry   rC   r<   r=   r¬   s   &&&& r   Úcombined_tool_start_callbackÚ5GatewayTurnProgressMixin.combined_tool_start_callbackO  s•   € ä˜T×"Ò"Ý3Ø×/Ñ/°¸yÔOØ×Ñ Ô.EÀgÐZ^Ó._Ô`Ø×Ñ˜|¨WÀÔFØ�9‰9×%Ñ% aÕ(Ò4Ø×#Ñ# G¸Ô=Ø�9‰9×-×-Ð-Ø×+Ñ+¨GÀÖEñ .r    c           
     	ó^  € ^ RI Hp V! W$4      w  rgV P                  pVe*   V^ ,          P                  P	                  V^,          4      MRp	V	RJ;'       d/    \        V	RR4      ;'       g    V P                  P                  R8H  p
\        WW4WjR7      p\        V 4      '       d)   ^ RI
Hp VP                  VP                  WW#V4      4       V P                  RV4       \        V 4      '       dS   \        VP	                  R4      \         4      '       d.   V P                  R	RVR,          R
VP	                  R
^ 4      /4       V P#                  RWW44       \        V 4      '       d   ^ RI
Hp VP%                  V 4       V P                  P&                  '       d   V P)                  WW44       R# R# )r‡   rL   NrZ   rH   r[   r«   rX   Útodosztodo.updatedÚrevision)r?   rM   Ú_approval_ownerrd   ra   rc   rw   rÆ   rS   r¶   r·   r¬   ÚupdateÚcomplete_fieldsr'  r@   r,  r(  Úpublish_control_if_changedrÄ   r#  )ry   rC   r<   r=   rN   rM   rG   rì  ÚownerÚliverH   rD   r¬   s   &&&&&        r   Úcombined_tool_complete_callbackÚ8GatewayTurnProgressMixin.combined_tool_complete_callback[  sd  € Ý6Ù*¨9Ó=‰ˆØ×$Ñ$ˆØ27Ò2Cˆu�Q�x× Ñ ×$Ñ$ U¨1¥XÔ.Èˆà˜dÐ"×zÐz¬°Ð6JÈDÓ(Q×(lÐ(lÐUY×U^ÑU^×UlÑUlÐqzÑ'zˆÜ(¨¸TÐT\ÔnˆÜ˜T×"Ò"Ý3Ø�N‰NÐ.×>Ñ>¸tÈiÐ_eÓfÔgØ×Ñ °Ô9Ü˜T×"Ò"¤z°'·+±+¸gÓ2FÌ×'MÒ'Mà×#Ñ# N°W¸gÀgÕ>NÐPZÐ\c×\gÑ\gÐhrÐtuÓ\vÐ4wÔxØ×Ñ˜°ÀDÔQÜ˜T×"Ò"Ý3Ø×:Ñ:¸4Ô@Ø�9‰9×-×-Ð-Ø×.Ñ.¨wÀ4ÖPñ .r    c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú	iterationr   Ú
prev_toolsr,  r   rŽ   r   )r   s   "r   r   rr   s  s!   € ÷ 
ñ 
¨Sð 
¸dð 
Àtñ 
r    c                	óú  € V P                   pVP                  4       '       g   R # V P                  RRV/4       V^8”  d1   \        V 4      '       d    ^ RIHp V! WP                  ^ ,          4       VP                  P                  '       g   R # T;'       g    .  Uu. uF@  p\        V\        4      '       d   VP                  ! R4      ;'       g    RM
\        V4      NKB  	  ppT P                  VP                  P                  RRVP                  P                   '       d!   VP                  P                   P"                  MRRVP                  P$                  R	VP&                  RVR
VRV/4      R4       R # u upi )Nz
agent.stepr7  )Úpublish_usager7   r6   z
agent:steprä   Úuser_idrh   Ú
tool_namesÚtoolsz agent:step hook scheduling error)rw   rÀ   r'  r¶   Úgateway.session_usager:  r�   Ú
_hooks_refÚloaded_hooksr@   r/   ra   r   r|   Úemitrà   rä   rI  r;  rh   )ry   r7  r8  rž   r:  r
   Únamess   &&&    r   Ú_step_callback_syncÚ,GatewayTurnProgressMixin._step_callback_syncs  s6  € Ø�i‰iˆØ×%Ñ%×'Ò'ÙØ×Ñ ¨{¸IÐ.FÔGØ�qŒ=Ô.¨t×4Ò4õ <Ù˜$× 0Ñ 0°Õ 3Ô4Ø�~‰~×*×*Ð*Ùð U_×TdÐTdÐbdÐTdÓfÑTdÈa¬*°Q¼×*=Ò*=�!—%’%˜“-×%Ð% 2øÄ3ÀqÃ6ÒIÑTdˆÐfØ�‰Ø�N‰N×Ñ Ø¸¿¹×9L×9LÐ9L˜CŸJ™J×/Ñ/×5Ò5ÐRTØ˜3Ÿ:™:×-Ñ-¨|¸S¿^¹^Ø˜Y¨°e¸WÀjð/ó ð
 /ö	
ùò gs   Â3E8ÃE8c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¨   r   r8   r/   r   rŽ   r   )r   s   "r   r   rr   ‹  s!   € ÷ =ñ =¨sð =¸Tð =Àdñ =r    c                	óò   € V P                   p \        P                  ! VP                  P	                  W4      VP
                  4       R#   \         d"   p\        P                  R T4        Rp?R# Rp?ii ; i)zevent_callback hook error: %sN)	rw   r¢  Úrun_coroutine_threadsafer?  rA  rx   r‚   ru   r¹   )ry   r¨   r8   rž   r  s   &&&  r   Ú_event_callback_syncÚ-GatewayTurnProgressMixin._event_callback_sync‹  sX   € Ø�i‰iˆð	=Ü×,Ò,¨S¯^©^×-@Ñ-@ÀÓ-UÐWZ×WiÑWiÖjøÜô 	=Ü�L‰LÐ8¸!×<Ò<ûð	=ús   Ž:A
 Á
A6ÁA1Á1A6c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   ’  s   € ÷ 	pñ 	p°Tñ 	pr    c                óV  a a€ ^ RI HpHp S P                  pVP                  '       gJ   S P                  4       '       d4   \        SP                  ;'       g    R4      P                  4       '       g   R# V! VV 3R lVP                  P                  VP                  V! S4      R7       R# )zO``AgentNotice`` -> ``notification.show`` for local viewers (the TUI's payload).)Úis_diagnostic_noticerÔ   r6   Nc                 óæ   <€ SP                  R R\        S P                  4      P                  4       RS P                  RS P
                  RS P                  RS P                  RS P                  /4      # )znotification.showr²   Úlevelrk   Úttl_msÚkeyrb  )	r'  r   r²   r  rN  rk   rO  rP  rb  )Únoticery   s   €€r   râ   ÚFGatewayTurnProgressMixin._local_notice_callback_sync.<locals>.<lambda>˜  s[   ø€  D×$;Ñ$;Ð<OØ”C˜Ÿ™Ó$×*Ñ*Ó,¨g°v·|±|ÀVÈVÏ[É[Ø�f—m‘m U¨F¯J©J¸¸f¿i¹iðRIô %Jr    ©rä   rå   Ú
diagnostic)ræ   rL  rÔ   rw   Úmute_notification_replyÚ_status_liver   r²   r  rà   rä   rå   )ry   rQ  rL  rÔ   rž   s   ff   r   Ú_local_notice_callback_syncÚ4GatewayTurnProgressMixin._local_notice_callback_sync’  sy   ù€ ç[Ø�i‰iˆØ×&×&Ð&¨d×.?Ñ.?×.AÒ.AÌÈVÏ[É[×M^ÐM^Ð\^ÓI_×IeÑIe×IgÒIgÙÙõ Jð —Z‘Z×(Ñ(°c·o±oÑRfÐgmÓRn÷	pr    c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   �  s   € ÷ Mñ M¸ñ Mr    c                ó„   € V'       d8   V P                  4       '       d    V P                  RR\        V4      /4       R# R# R# )zJRecovery -> ``notification.clear`` for local viewers (main's TUI payload).znotification.clearrP  N)rV  r'  r   )ry   rP  s   &&r   Ú!_local_notice_clear_callback_syncÚ:GatewayTurnProgressMixin._local_notice_clear_callback_sync�  s4   € ç�4×$Ñ$×&Ò&Ø×#Ñ#Ð$8¸5Ä#ÀcÃ(Ð:KÖLñ '‰3r    c               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   rr   ¢  s   € ÷ Rñ R˜dñ Rr    c                ó„   € \        V P                  P                  4      ;'       d    V P                  P                  4       # )zDStatus adapter present and this run is still the current generation.)rQ   rw   Ú_status_adapterrÀ   )ry   s   &r   rV  Ú%GatewayTurnProgressMixin._status_live¢  s,   € ä�D—I‘I×-Ñ-Ó.×QÐQ°4·9±9×3OÑ3OÓ3QÐQr    c               ó$   € V ^8„  d   QhRRRRRR/# )r   r²   r   rq   r   rŽ   r   )r   s   "r   r   rr   ¦  s&   € ÷ lñ l cð lÀ#ð lÈ$ñ lr    c                	óŒ   € V P                   pV P                  VP                  P                  VP                  WR 7      V4       R# )rü  N)rw   r|   r_  rÕ  Ú_status_chat_id)ry   r²   r|  rq   rž   s   &&&& r   Ú_send_status_textÚ*GatewayTurnProgressMixin._send_status_text¦  s6   € Ø�i‰iˆØ�‰�s×*Ñ*×/Ñ/°×0CÑ0CÀTÐ/Ó]Ð_jÖkr    c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rr   ª  s   € ÷ )Sñ )S¸Dñ )Sr    c                ó
  aaaaa	a
€  R Vn         \        VRR4      o	\        V 4      '       d    V P                  w  oopVV3R lpWAn        R# V P
                  oSP                  VP                  VP                  4      o
SP                  S
4      '       d   RoM3SP                  S
4      '       g   SP                  S
4      '       d   RoMR# VVV	V
3R lVn        R#   \         d    \        P                  RR	R
7        R# i ; i)z›Wire the platform thread-rename lane onto the agent as `_on_session_title`.

The titler runs in the turn prologue, so attach before the run, not after it.
c                ó.   € \         P                  R W4      # )z@Gateway auto-title failure suppressed (not user-visible): %s: %s)ru   r¹   )r]  Úexcs   &&r   râ   ÚIGatewayTurnProgressMixin._attach_session_title_callback.<locals>.<lambda>²  s   € ¼f¿l¹lØRÐTXô?r    rh   Nc                ó´   <€ ^ RI Hp ^ RIHp V! \	        SRR4      S4      pSP
                  S,          P                  P                  SV! SV4      RR7       R# )r‡   )Ú
SessionRef)Úlocal_session_infoÚ
profile_idr6   zsession.info)r¨   N)Úgateway.session_contractrl  Úgateway.session_localrm  rc   rd   Úevent_streamÚpublish)rZ  Útitle_sourcerl  rm  Úrefrg   Úcanonical_ids   &&   €€r   Ú	republishÚJGatewayTurnProgressMixin._attach_session_title_callback.<locals>.republishº  sT   ø€ ÝCÝHÙ$¤W¨Y¸ÀbÓ%IÈ<ÓX�CØ×&Ñ& |Õ4×AÑA×IÑIØ$Ñ&8¸ÀCÓ&HÐUcð Jö er    Ú%_schedule_telegram_topic_title_renameÚ(_schedule_discord_semantic_thread_renamec                óF   <€ VR 8H  ;'       d    \        SS4      ! SSV 4      # )Úllm)rc   )rZ  rs  ÚlaneÚrunnerrh   rà   s   &&€€€€r   râ   rj  Ï  s'   ø€ Ø Ñ%×ZÐZ¬'°&¸$Ô*?ÀÈ
ÐTYÓ*ZÐZr    z'Failed to attach session title callbackTr­   )Ú_title_failure_callbackrc   r¶   r.  Ú_on_session_titlerÞ   Ú#_recover_discord_auto_thread_sourcerà   Úsession_keyÚ_is_telegram_topic_laneÚ_is_discord_auto_thread_laneÚ_is_relay_discord_channel_laner‚   ru   r¹   )ry   rƒ   rž   Ú_generationrv  rg   ru  r|  r}  rh   rà   s   &&&  @@@@@@r   Ú_attach_session_title_callbackÚ7GatewayTurnProgressMixin._attach_session_title_callbackª  sä   ý€ ð
$	Sñ-ˆEÔ)ô ! ¨°dÓ;ˆJÜ  ×&Ò&à7;×7KÑ7KÑ4�	˜<¨öeð +4Ô'ÙØ—\‘\ˆFØ×?Ñ?ÀÇ
Á
ÈCÏOÉOÓ\ˆFð ×-Ñ-¨f×5Ò5Ø>‘Ø×4Ñ4°V×<Ò<À×@eÑ@eÐfl×@mÒ@mØA‘á÷'ˆEÖ#øô ô 	SÜ�L‰LÐBÈTˆL×Rð	Sús5   ˆ%C ®C ÁAC ÂC Â0C ÃC ÃC Ã"DÄDc               ó$   € V ^8„  d   QhRRRRRR/# )r   r¨   r   r   r   rŽ   r   )r   s   "r   r   rr   Õ  s&   € ÷ Oñ O°ð O¸cð OÀdñ Or    c                	óF  a aaa	a
€ ^ RI HpHpHo ^ RIHpHp S P                  o	S	P                  '       g   S P                  4       '       g   R# V! S	P                  P                  SV4      o
S
fw   \        P                  RS	P                  P                  '       d!   S	P                  P                  P                  MRST! \        T;'       g    R4      4      R,          4       R# VV	VV
V 3R lpV! VS	P                  P                  S	P                   V! SV4      R	7       R# )
r‡   )Ú_prepare_gateway_status_messageÚ#_redact_gateway_user_facing_secretsÚ_send_or_update_status_coro)Úis_warning_statusrÔ   Nz(status_callback suppressed for %s/%s: %sÚunknownr6   :Né    Nc            	     óT  <€ \        S4      '       d#   SP                  R R\        SS4      RS/4       R# SP                  S! SP                  SP
                  SSSP                  4      RS R24      p V e2   SP                  '       d   V P                  SP                  4       R# R# R# )zstatus.updaterk   r²   Nzstatus_callback (z) scheduling error)
r¶   r'  Ú_viewer_status_kindr|   r_  rc  Ú_status_thread_metadatar›   Úadd_done_callbackr¥   )r£   rŒ  rž   r¨   r2  ry   s    €€€€€r   ÚpresentÚ?GatewayTurnProgressMixin._status_callback_sync.<locals>.presentã  s³   ø€ Ü  ×&Ò&Ø×'Ñ'¨¸&ÔBUÐV`ÐbjÓBkØ:@À(ð:Lô MáØ—.‘.Ù+¨C×,?Ñ,?À×ATÑATÐV`ÐbjÐlo÷  mHñ  mHó  IØ# J <Ð/AÐBóˆCð Š 3×#8×#8Ð#8Ø×%Ñ% d×&CÑ&CÖDñ $9‰r    rS  )rv   rŠ  r‹  rŒ  ræ   r�  rÔ   rw   rU  rV  rà   rä   ru   r¹   rI  r   rå   )ry   r¨   r   rŠ  r‹  r�  rÔ   r”  rŒ  rž   r2  s   ff&     @@@r   Ú_status_callback_syncÚ.GatewayTurnProgressMixin._status_callback_syncÕ  sß   ü€ ÷ 	Bñ  	BßXØ�i‰iˆØ×&×&Ð&¨d×.?Ñ.?×.AÒ.AÙÙ2°3·:±:×3FÑ3FÈ
ÐT[Ó\ˆØÒÜ�L‰LØ:Ø-0¯Z©Z×-@×-@Ð-@�—
‘
×#Ñ#×)Ò)ÀiÐQ[Ù3´C¸¿¸À2Ó4FÓGÈÕMôñ
 ÷
	Eñ 
	Eñ 	˜G¨c¯j©j×.AÑ.AÈsÏÉÙ'8¸ÀWÓ'M÷	Or    r   r�   )NNN)zno thread anchor)9rl  rm  rn  ro  r|   r„   rŠ   r•   rŸ   r¥   rÏ   rº   r»   rÂ   rt  r  r  rÈ   rÉ   rr  Ú	dataclassrv  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)  r4  rC  rH  rW  r[  rV  rd  r†  r–  ru  r   r    r   ro   ro   h   sy  † ÷
õò-õõ@õ)÷<%õ|Jõ$?õ"Jð" ô$ó ð$òQõ.&BõP(ð* ×Ñ÷7ð 7ó ð7õr8õ::8÷x
õ&	õ]ðF ×Ñ÷%ð %ó ð%õ
õ07ð ô6ó ð6õ
7õõð< ôRó ðRõLõ	õrõ
,õ&^õò26'òt?õ*gò	ò	ò
FòQõ0
õ0=õ	põMõ
Rõlõ)S÷VOñ Or    ro   c               ó   € V ^8„  d   QhRR/# rU   r   )r   s   "r   r   r   ò  s   € ÷ cñ c ñ cr    c                ó–   € \        V RR4      RJ;'       d4    \        \        V P                  RR4      RR4      \        P                  8H  # )z™A local route's viewers read the canonical event stream; ``LocalSessionAdapter.send``
publishes nothing, so status and notices go to that stream instead.r.  Nrà   rä   )rc   rw   r   ÚLOCAL)r}  s   &r   r¶   r¶   ò  sM   € ô �FÐ-¨tÓ4¸DÐ@÷ bð bÜœ §¡¨X°tÓ<¸jÈ$ÓOÔS[×SaÑSaÑaðcr    c                óR   € ^ RI Hp V R8X  d   V! V4      '       d   R# \        V 4      # )zWThe TUI's ``status.update`` kind: auto-compaction progress is re-tagged ``compacting``.)Úis_compaction_progress_statusÚ	lifecycleÚ
compacting)Úagent.conversation_compressionr�  r   )rk   r²   r�  s   && r   r‘  r‘  ù  s*   € åLØ ;Ô.Ñ3PÐQU×3VÒ3Vˆ<ÐeÔ\_Ð`dÓ\eÐer    )2rp  Ú
__future__r   r¢  rr  Úloggingrš  r&   Ú	threadingr  Ú
contextlibr   r   Útypingr   r   r   r   r	   Ú
agent.i18nr
   Úagent.interrupt_compatr   Úagent.replay_cleanupr   Úgateway.configr   Úgateway.media_repairr   Úgateway.platforms.baser   Úgateway.turn_contextr   Úhermes_cli.configr   Úutilsr   rv   r   r�  r   Ú	getLoggerru   r,   rF   rS   rm   ro   r¶   r‘  r   r    r   Ú<module>r°     s    ðÙ QÝ "ã Û Û Û Û 	Û Û Ý Ý ß ;Õ ;å Ý 3Ý DÝ #Ý IÝ 6Ý ,Ý %Ý !çÝ)Ý2ð 
×	Ò	˜=Ó	)€õ!õðÈð ÐW\÷ õ÷>GOñ GOõTcôfr    