+
    kHàjvG ã                  ó  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RI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Ht ^ RIHtHt ^ RIHtHtHtHt ^ RIH t  ^ RI!H"t" ^ RI#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+ ^ RI,t, ^ RI-t-^ RI.t-R	t/^ RI1H2t2H3t3 ^ RI4H5t5 ^ RI6H7t7H8t8H9t9H:t:H;t; ^ RI<H=t=H>t> ^ RI?H@tA ^ RIBHCtDHEtF ^ RIGHHtHHItI ^ RIJHKtK ^ RILHMtNHOtOHPtPHQtQHRtRHStSHTtT ^ RIUHVtVHWtWHXtXHYtYHZtZH[t[H\t\H]t]H^t^H_t_H`t`HataHbtbHctcHdtdHeteHftfHgtgHhthHitiHjtjHktkHltl ^ RImHntn ]PÞ                  ! ]p4      tq^ RIrHsts ]s! 4       Pè                  ;tutv]w! ]Y4      tx]Pò                  tzRt{Rt|Rt}Rt~Rt^dt€Rt�Rt‚0 R‹mtƒ^t„Rt…Rt†Rt‡R R  ltˆR!t‰R"tŠR#t‹]EP                  ! R$4      t�]EP                  ! R%4      tŽ]�! 0 RŒm4      t�]EP                  ! R&4      t‘R't’^2t“^t”^t•^t–^t—R( R) lt˜R* R+ lt™R, R- ltš ! R. R/4      t› ! R0 R14      tœ] ! R2 R34      4       t� ! R4 R5]4      tž ! R6 R74      tŸ ! R8 R9]ž4      t  ! R: R;]ž4      t¡ ! R< R=]ž4      t¢R> t£ ! R? R@]ž4      t¤ ! RA RB]ž4      t¥ ! RC RD]ž4      t¦ ! RE RF]K4      t§ ! RG RH]ž4      t¨ ! RI RJ]ž4      t©RK RL ltªRM RN lt«R�RO RP llt¬ ! RQ RR]ž4      t­ ! RS RT]ž4      t® ! RU RV]ž4      t¯ ! RW RX]ž4      t° ! RY RZ]ž4      t± ! R[ R\]ž4      t² ! R] R^] 4      t³R_]>EPh                  R`]>EPj                  Ra]>EPl                  Rb]>EPn                  /t¸ ! Rc Rd]ž4      t¹ ! Re Rf]ž4      tº ! Rg Rh]ž4      t» ! Ri Rj]ž4      t¼ ! Rk Rl]ž4      t½ ! Rm Rn]ž4      t¾ ! Ro Rp4      t¿ ! Rq Rr4      tÀRŽRs Rt lltÁ ! Ru Rv]4      tÂ ! Rw Rx]Â4      tÃ ! Ry Rz]Ã4      tÄ ! R{ R|]Ã4      tÅ ! R} R~]Â4      tÆ ! R R€]Â4      tÇ ! R� R‚4      tÈ ! Rƒ R„4      tÉ ! R… R†4      tÊ ! R‡ Rˆ4      tË ! R‰ RŠ]74      tÌR#   ]0 d	    R
t/Rt- ELji ; i)�u˜  Yuanbao platform adapter: WebSocket gateway client (AUTH_BIND, ping/pong heartbeat, reconnect),
inbound middleware pipeline (T05 push â†’ MessageEvent) and outbound sender (T06 text/media).

Config under ``platforms.yuanbao.extra`` (or env): app_id/YUANBAO_APP_ID, app_secret/YUANBAO_APP_SECRET,
bot_id/YUANBAO_BOT_ID (optional, returned by sign-token), ws_url/YUANBAO_WS_URL, api_domain/YUANBAO_API_DOMAIN.
)ÚannotationsN)ÚABCÚabstractmethod)Ú	dataclassÚfield)ÚdatetimeÚtimezoneÚ	timedeltaÚUTC)ÚEnum)ÚPath)ÚAnyÚCallableÚClassVarÚDictÚIteratorÚListÚOptionalÚTupleTF)ÚPlatformÚPlatformConfig©Út)ÚBasePlatformAdapterÚ
SendResultÚcache_document_from_bytes_asyncÚcache_image_from_bytes_asyncÚcache_video_from_bytes_async)ÚMessageEventÚMessageType)Úhelpers)Úget_scoped_secretÚprofile_scoped)ÚMessageDeduplicatorÚcancel_task)ÚOwnAccessPolicyMixin)Údownload_urlÚget_cos_credentialsÚupload_to_cosÚbuild_image_msg_bodyÚbuild_file_msg_bodyÚguess_mime_typeÚmd5_hex)ÚCMD_TYPEÚWS_HEARTBEAT_RUNNINGÚWS_HEARTBEAT_FINISHÚHERMES_INSTANCE_IDÚ_fields_to_dictÚ_get_stringÚ_get_varintÚ_parse_fieldsÚdecode_conn_msgÚdecode_inbound_pushÚdecode_forward_msg_dataÚdecode_query_group_info_rspÚ decode_get_group_member_list_rspÚencode_auth_bindÚencode_pingÚencode_push_ackÚencode_send_c2c_messageÚencode_send_group_messageÚencode_send_private_heartbeatÚencode_send_group_heartbeatÚencode_query_group_infoÚencode_get_group_member_listÚnext_seq_no)ÚTranscriptReadError)Úget_version_infoz0wss://bot-wss.yuanbao.tencent.com/wss/connectionzhttps://bot.yuanbao.tencent.comg      >@ç      .@ç      $@ç      ð?ç       @g      ^@c               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚstr© )Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/plugins/platforms/yuanbao/adapter.pyÚ__annotate__rR   f   s   € ÷ 6ñ 6˜sñ 6ó    c                 ó   € \        R4      # )zŸPatience notice pushed after SLOW_RESPONSE_TIMEOUT_S of agent silence (localized; the
Chinese wording Yuanbao users historically saw lives in locales/zh.yaml).z%platform.yuanbao.slow_response_noticer   rO   rS   rQ   Úslow_response_messagerU   f   s   € ô Ð4Ó5Ð5rS   zCronjob Response: z
-------------

zI

To stop or manage this job, send me a new message (e.g. "stop reminder zB\[(image|voice|video|file(?::[^|\]]*)?)\|ybres:([A-Za-z0-9_\-]+)\]z\[(\w+):[^\]]*?(/[^\]]+?)\s*\]z\s*\(\d+/\d+\)$ÚTIMTextElemc               ó   € V ^8„  d   QhRR/# )rL   rM   zIterator[tuple[str, str, str]]rO   )rP   s   "rQ   rR   rR   ƒ   s   € ÷ =ñ =Ð!?ñ =rS   c              #  ó   "  € V  Fs  pVP                  ^4      P                  R4      w  r#pVP                  4       \        9   g   KA  VP                  ^4      VP                  4       VP                  4       3x € Ku  	  R# 5i)zYTurn ``_YB_RES_REF_RE`` matches into ``(rid, kind, filename)`` for resolvable kinds only.Ú:N)ÚgroupÚ	partitionÚstripÚ_RESOLVABLE_MEDIA_KINDS)ÚmatchesÚmÚkindÚ_Úfilenames   &    rQ   Ú_iter_ybres_refsrc   ƒ   s]   é € ãˆØŸG™G A›J×0Ñ0°Ó5Ñˆ�Ø�:‰:‹<Ô2Ö2Ø—'‘'˜!“*˜dŸj™j›l¨H¯N©NÓ,<Ð<Ô<ó ùs   ‚?A>Á8A>c               ó    € V ^8„  d   QhRRRR/# )rL   ÚtextrN   rM   ÚdictrO   )rP   s   "rQ   rR   rR   ‹   s   € ÷ Hñ H�Sð H˜Tñ HrS   c                ó   € R\         RRV //# )zA TIMTextElem msg_body entry.Úmsg_typeÚmsg_contentre   )Ú_TEXT_ELEM_TYPE©re   s   &rQ   Ú
_text_elemrl   ‹   s   € àœ¨¸À¸ÐGÐGrS   c               ó    € V ^8„  d   QhRRRR/# )rL   Útaskszdict[str, asyncio.Task]rM   ÚNonerO   )rP   s   "rQ   rR   rR   �   s   € ÷ ñ Ð.ð °4ñ rS   c                ó¶   € \        V P                  4       4       F+  pVP                  4       '       d   K  VP                  4        K-  	  V P	                  4        R# )z;Cancel every unfinished task in *tasks* and clear the dict.N)ÚlistÚvaluesÚdoneÚcancelÚclear)rn   Útasks   & rQ   Ú_cancel_allrw   �   s6   € ä�U—\‘\“^Ö$ˆØ�y‰y�{Œ{Ø�K‰KŽMñ %ð 
‡K�K†MrS   c                  ó4   € ] tR t^˜tRt]RR R ll4       tRtR# )ÚMarkdownProcessorzaYuanbao's fence/table-aware chunking policy over the shared chunker in gateway.platforms.helpers.Nc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   re   rN   Ú	max_charsÚintÚlen_fnúOptional[Callable[[str], int]]rM   ú	list[str]rO   )rP   s   "rQ   rR   ÚMarkdownProcessor.__annotate__›   s0   € ÷ vñ v sð v°sð vÐKið vÐu~ñ vrS   c                ó6   € \         P                  ! WVRRR7      # )z|<= max_chars chunks at paragraph boundaries, never inside a fence or table (an oversized
single block may exceed the limit).TF)Úprefer_paragraphsÚbalance_fences)Ú_mdchunkÚsplit_text_fence_aware)Úclsre   r{   r}   s   &&&&rQ   Úchunk_markdown_textÚ%MarkdownProcessor.chunk_markdown_textš   s   € ô ×.Ò.¨tÀÐZ^ÐotÔuÐurS   rO   ©é   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úclassmethodr‡   Ú__static_attributes__rO   rS   rQ   ry   ry   ˜   s   † ÙkØövó ôvrS   ry   c                  ó8  € ] tR t^¡t$ RtRtRt^tRt^<t	Rt
/ tR]R&   / tR]R	&   ]R
 R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R R ll4       t]R R l4       t]R R R ll4       t]R R R ll4       tRtR# )!ÚSignManagerz{Sign-token acquisition, caching, signing and retry. All state is class-level so one
shared client serves the whole process.z/api/v5/robotLogic/sign-tokenis'  rH   rG   zdict[str, dict[str, Any]]Ú_cachezdict[str, asyncio.Lock]Ú_locksc               ó    € V ^8„  d   QhRRRR/# )rL   Úapp_keyrN   rM   úasyncio.LockrO   )rP   s   "rQ   rR   ÚSignManager.__annotate__°   s   € ÷ #ñ # sð #¨|ñ #rS   c                óŒ   € WP                   9  d#   \        P                  ! 4       V P                   V&   V P                   V,          # )zQPer-app_key refresh lock (create on demand). Call only from a running event loop.)r•   ÚasyncioÚLock)r†   r—   s   &&rQ   Úget_refresh_lockÚSignManager.get_refresh_lock¯   s1   € ð Ÿ*™*Ô$Ü")§,¢,£.ˆC�J‰J�wÑØ�z‰z˜'Õ"Ð"rS   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )rL   ÚnoncerN   Ú	timestampr—   Ú
app_secretrM   rO   )rP   s   "rQ   rR   r™   ·   s8   € ÷ Yñ Y ð Y°ð Y¸sð YÐPSð YÐX[ñ YrS   c                óÎ   € W,           V,           V,           p\         P                  ! VP                  4       VP                  4       \        P                  4      P                  4       # )zPHMAC-SHA256(key=app_secret, msg=nonce+timestamp+app_key+app_secret).hexdigest().)ÚhmacÚnewÚencodeÚhashlibÚsha256Ú	hexdigest)r    r¡   r—   r¢   Úplains   &&&& rQ   Úcompute_signatureÚSignManager.compute_signature¶   sE   € ð Õ! GÕ+¨jÕ8ˆÜ�xŠx˜
×)Ñ)Ó+¨U¯\©\«^¼W¿^¹^ÓL×VÑVÓXÐXrS   c               ó   € V ^8„  d   QhRR/# rK   rO   )rP   s   "rQ   rR   r™   ½   s   € ÷ añ a˜Sñ arS   c                 ót   € \         P                  ! \        \        ^R7      4      R7      P	                  R4      # )zQBeijing-time ISO-8601 timestamp without milliseconds (2006-01-02T15:04:05+08:00).)Úhours©Útzz%Y-%m-%dT%H:%M:%S+08:00)r   Únowr   r	   ÚstrftimerO   rS   rQ   Úbuild_timestampÚSignManager.build_timestamp¼   s)   € ô �|Š|œx¬	¸Ô(:Ó;Ô<×EÑEÐF_Ó`Ð`rS   c               ó    € V ^8„  d   QhRRRR/# )rL   Úentryúdict[str, Any]rM   ÚboolrO   )rP   s   "rQ   rR   r™   Â   s   € ÷ Mñ M >ð M°dñ MrS   c                	ób   € VR ,          \         P                   ! 4       ,
          V P                  8„  # )Ú	expire_ts)ÚtimeÚCACHE_REFRESH_MARGIN_S)r†   r·   s   &&rQ   Úis_cache_validÚSignManager.is_cache_validÁ   s#   € à�[Õ!¤D§I¢I£KÕ/°#×2LÑ2LÑLÐLrS   c               ó   € V ^8„  d   QhRR/# ©rL   rM   ro   rO   )rP   s   "rQ   rR   r™   Æ   s   € ÷ ñ ˜Dñ rS   c                	ó:   € V P                   P                  4        R # ©N)r•   ru   )r†   s   &rQ   Úclear_locksÚSignManager.clear_locksÅ   s   € à�
‰
×ÑÖrS   c               ó   € V ^8„  d   QhRR/# )rL   rM   r|   rO   )rP   s   "rQ   rR   r™   Ê   s   € ÷ !ñ !˜cñ !rS   c           	     ó0  € \         P                   ! 4       pV P                  P                  4        UUu. uF&  w  r#WP                  R^ 4      ,
          ^ 8”  g   K$  VNK(  	  pppV F  pV P                  P	                  VR4       K!  	  \        V4      # u uppi )z7Drop expired token-cache entries; returns count purged.r»   N)r¼   r”   ÚitemsÚgetÚpopÚlen)r†   r²   ÚkÚvÚexpired_keyss   &    rQ   Úpurge_expiredÚSignManager.purge_expiredÉ   sz   € ô �iŠi‹kˆØ&)§j¡j×&6Ñ&6Ô&8Ô\Ñ&8™d˜a¸CÇ%Á%ÈÐUVÓBWÕ<WÐZ[Ñ<[Ÿ˜Ñ&8ˆÑ\ÛˆAØ�J‰J�N‰N˜1˜dÖ#ñ ä�<Ó Ð ùó ]s   ³!BÁBc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# ©rL   r—   rN   r¢   Ú
api_domainÚ	route_envrM   r¸   rO   )rP   s   "rQ   rR   r™   Ó   s8   € ÷ !Fñ !F #ð !F°3ð !FÀCð !FÐTWð !FÐaoñ !FrS   c              ƒ  ó
  "  € VP                  R4       V P                   2p\        P                  ! V P                  R7      ;_uu_4       GRj  x€L
 p\        V P                  ^,           4       EF)  p\        P                  ! ^4      pV P                  4       p	RVRVRV P                  W‰W4      RV	/p
RR	R
\        R\        R\        R\        /pV'       d   WKR&   \        P!                  RYW^ 8”  d   RV RV P                   R2MR4       VP#                  WZVR7      G Rj  x€L
 pVP$                  ^È8w  d-   \'        RVP$                   RVP(                  R,           24      h VP+                  4       pTP1                  R4      pT^ 8X  dq   TP1                  R4      p\3        T\4        4      '       g   \/        RT 24      h\        P!                  RTP1                  R4      4       Tu uuRRR4      GRj  x€L
  # YðP6                  8w  g   YpP                  8¼  d"   \'        RT RTP1                  RR4       24      h\        P9                  R YðP:                  T^,           T P                  4       \<        P>                  ! T P:                  4      G Rj  x€L
  EK,  	  RRR4      GRj  x€L
  \'        R!4      h ELj ELš  \,         d   p\/        RT 24      ThRp?ii ; i Lé LN L;  + GRj  x€L 
 '       g   i     LR; i5i)"zAPOST sign-token, retrying RETRYABLE_CODE up to MAX_RETRIES times.Ú/©ÚtimeoutNr—   r    Ú	signaturer¡   úContent-Typeúapplication/jsonzX-AppVersionzX-OperationSystemzX-Instance-IdzX-Bot-VersionzX-Route-EnvzSign token request: url=%s%sz (retry Ú)Ú )ÚjsonÚheaderszSign token API returned ú: :NéÈ   Nz!Sign token response parse error: ÚcodeÚdataz*Sign token response missing 'data' field: zSign token success: bot_id=%sÚbot_idzSign token error: code=ú, msg=Úmsgz>Sign token retryable: code=%s, retrying in %ss (attempt=%d/%d)z'Sign token failed: max retries exceeded) ÚrstripÚ
TOKEN_PATHÚhttpxÚAsyncClientÚHTTP_TIMEOUT_SÚrangeÚMAX_RETRIESÚsecretsÚ	token_hexr´   r«   Ú_APP_VERSIONÚ_OPERATION_SYSTEMÚ_YUANBAO_INSTANCE_IDÚ_BOT_VERSIONÚloggerÚinfoÚpostÚstatus_codeÚRuntimeErrorre   rÞ   Ú	ExceptionÚ
ValueErrorrÉ   Ú
isinstancerf   ÚRETRYABLE_CODEÚwarningÚRETRY_DELAY_Sr›   Úsleep)r†   r—   r¢   rÓ   rÔ   ÚurlÚclientÚattemptr    r¡   Úpayloadrß   ÚresponseÚresult_dataÚexcrâ   rã   s   &&&&&            rQ   ÚfetchÚSignManager.fetchÒ   s¿  é € ð ×"Ñ" 3Ó'Ð(¨¯©Ð(8Ð9ˆÜ×$Ò$¨S×-?Ñ-?×@×@Õ@ÀFÜ  §¡°1Õ!4×5�Ü×)Ò)¨"Ó-�Ø×/Ñ/Ó1�	Ø$ g¨w¸Ø&¨×(=Ñ(=¸eÐPWÓ(dÐfqÐs|ð~�à)Ð+=¸~Ì|Ð]pô  sDØ*Ô,@À/ÔS_ða�çØ-6˜MÑ*Ü—‘Ð:¸CÐvwÔlwÀ8ÈGÈ9ÐTUÐVY×VeÑVeÐUfÐfgÑAhÐ}ô  AØ!'§¡¨SÈ Ó!P×P�Ø×'Ñ'¨3Ô.Ü&Ð)AÀ(×BVÑBVÐAWÐWYÐZb×ZgÑZgÐhlÕZmÐYnÐ'oÓpÐpðYØ2:·-±-³/�Kð #—‘ vÓ.�Ø˜1”9Ø&Ÿ?™?¨6Ó2�DÜ% d¬D×1Ò1Ü(Ð+UÐVaÐUbÐ)cÓdÐdÜ—K‘KÐ ?ÀÇÁÈ(ÓASÔTØ‘K÷1 A×@Ò@ð2 ×-Ñ-Ô-°¿O¹OÔ1KÜ&Ð)@ÀÀÀfÈ[Ï_É_Ð]bÐdfÓMgÐLhÐ'iÓjÐjÜ—‘Ð_Ø#×%6Ñ%6¸À!½ÀSÇ_Á_ôVä—m’m C×$5Ñ$5Ó6×6Ó6ñ9 6÷ A×@ô< ÐDÓEÐEò= Aò Qøô
 !ô YÜ$Ð'HÈÈÐ%NÓOÐUXÐXûðYúñ! Añ: 7÷; A×@×@Ò@üs¸   ‚ALÁJ9ÁLÁCK'Ä"J<
Ä#AK'Å%J?Å5A5K'Ç*LÇ7K!Ç8LÇ=BK'ÊK#
Ê	K'ÊLÊ)K%Ê*LÊ<K'Ê?K	Ë
K	ËK	ËK'Ë!LË#K'Ë%LË'L 	Ë-K0Ë.
L 	Ë9L 	Ë;Lc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )rL   r—   rN   r¢   rÓ   rÔ   rM   ro   rO   )rP   s   "rQ   rR   r™   ÷   s2   € ÷ 
ñ 
¨cð 
¸sð 
ÐPSð 
Ð`cð 
Ðhlñ 
rS   c              ƒ  	óf  "  € V P                  WW44      G R j  x€L
 pVP                  R^ 4      pRVP                  RR4      RVP                  RR4      RTRVP                  RR4      RVP                  RR4      R\        P                  ! 4       V^ 8”  d   TMR,           /V P                  V&   R #  L–5i)	NÚdurationÚtokenrÝ   rä   ÚproductÚsourcer»   i  )r  rÉ   r¼   r”   )r†   r—   r¢   rÓ   rÔ   rã   r  s   &&&&&  rQ   Ú_fetch_into_cacheÚSignManager._fetch_into_cacheö   s™   é € à—Y‘Y˜w°JÓJ×JˆØŸ™ ¨QÓ/ˆà�T—X‘X˜g rÓ*¨H°d·h±h¸xÈÓ6LÈjÐZbØ�t—x‘x 	¨2Ó.°¸$¿(¹(À8ÈRÓ:PØœŸš›°H¸q´L©ÀdÕKð
ˆ�
‰
�7Óñ Kùs   ‚B1˜B/™BB1c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# rÒ   rO   )rP   s   "rQ   rR   r™     s1   € ÷ )ñ ) cð )°sð )Èð )ÐX[ð )Ðesñ )rS   c              ƒ  óú  "  € V P                  4        V P                  P                  V4      pV'       dc   V P                  V4      '       dL   \        P                  R\        VR,          \        P                  ! 4       ,
          4      4       \        V4      # V P                  V4      ;_uu_4       GRj  x€L
  V P                  P                  V4      pV'       d5   V P                  V4      '       d   \        V4      uuRRR4      GRj  x€L
  # V P                  WW44      G Rj  x€L
  RRR4      GRj  x€L
  \        V P                  V,          4      #  L¡ LM L4 L&  + GRj  x€L 
 '       g   i     L=; i5i)zKWS auth token, served from cache while valid (with CACHE_REFRESH_MARGIN_S).z"Using cached token (%ds remaining)r»   N)rÏ   r”   rÉ   r¾   rô   rõ   r|   r¼   rf   r�   r  )r†   r—   r¢   rÓ   rÔ   Úcacheds   &&&&& rQ   Ú	get_tokenÚSignManager.get_token   s  é € ð 	×ÑÔØ—‘—‘ Ó(ˆß�c×(Ñ(¨×0Ò0Ü�K‰KÐ<¼cÀ&ÈÕBUÔX\×XaÒXaÓXcÕBcÓ>dÔeÜ˜“<ÐØ×'Ñ'¨×0×0Õ0Ø—Z‘Z—^‘^ GÓ,ˆFß˜#×,Ñ,¨V×4Ò4Ü˜F“|÷ 1×0Ò0ð ×'Ñ'¨¸ZÓS×SÐS÷	 1×0ô
 �C—J‘J˜wÕ'Ó(Ð(ó 1ñ T÷	 1×0×0Ò0üs‹   ‚A
E;ÁA(E;Â5EÂ6E;Â9:EÃ4
EÃ>E;ÄEÄE;ÄEÄ&EÄ'EÄ+E;Ä6EÄ7!E;ÅE;ÅEÅE;ÅE8	Å%E(Å&
E8	Å1E8	Å3E;c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# rÒ   rO   )rP   s   "rQ   rR   r™     s1   € ÷ )ñ )¨#ð )¸3ð )ÈCð )Ð\_ð )Ðiwñ )rS   c              ƒ  óˆ  "  € \         P                  RVRR 4       V P                  V4      ;_uu_4       GRj  x€L
  V P                  P	                  VR4       V P                  WW44      G Rj  x€L
  RRR4      GRj  x€L
  \        V P                  V,          4      #  Lf L2 L$  + GRj  x€L 
 '       g   i     L;; i5i)z#Clear the cached token and re-sign.zC[force-refresh] Clearing cache and re-signing token: app_key=****%sNéüÿÿÿ)rô   rý   r�   r”   rÊ   r  rf   )r†   r—   r¢   rÓ   rÔ   s   &&&&&rQ   Úforce_refreshÚSignManager.force_refresh  s�   é € ô 	�‰Ð\Ð^eÐfhÐfiÐ^jÔkØ×'Ñ'¨×0×0Õ0Ø�J‰J�N‰N˜7 DÔ)Ø×'Ñ'¨¸ZÓS×SÐS÷ 1×0ô �C—J‘J˜wÕ'Ó(Ð(ñ 1áS÷ 1×0×0Ò0üs\   ‚7C¹B ºC½2B&Á/B"Á0B&Á4CÁ?B$Â !CÂ"B&Â$CÂ&B?	Â,B/Â-
B?	Â8B?	Â:CrO   N©rÝ   )r‹   rŒ   r�   rŽ   r�   rè   rü   rí   rþ   r½   rë   r”   Ú__annotations__r•   r�   r�   Ústaticmethodr«   r´   r¾   rÄ   rÏ   r  r  r  r  r‘   rO   rS   rQ   r“   r“   ¡   s  ‡ ñ/à0€JØ€NØ€KØ€MØÐØ€NØ(*€FÐ%Ó*ð ')€FÐ#Ó(àô#ó ð#ð ôYó ðYð
 ôaó ðað ôMó ðMð ôó ðð ô!ó ð!ð ö!Fó ð!FðF ô
ó ð
ð ö)ó ð)ð ö)ó ô)rS   r“   c                  óØ  € ] tR tRt$ RtR]R&   ]! ]R7      tR]R&   Rt	R	]R
&   Rt
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   ]! ]R7      tR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   ]! ]R7      tR]R&   RtR	]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R &   RtR]R!&   ]! ]R7      tR]R"&   ]! ]R7      tR]R#&   ]! ]R7      tR]R$&   Rt R]R%&   R&t!R# )'ÚInboundContexti  zNMutable context passed through every inbound middleware in registration order.r   Úadapter)Údefault_factoryrq   Ú
raw_framesNúOptional[dict]ÚpushrÝ   rN   Údecoded_viaÚfrom_accountÚ
group_codeÚ
group_nameÚsender_nicknameÚmsg_bodyÚmsg_idÚcloud_custom_dataÚchat_idÚ	chat_typeÚ	chat_nameÚraw_textÚ
media_refsÚforwarded_recordsúOptional[str]Úowner_commandzOptional[Any]r  rh   Úreply_to_message_idÚreply_to_textÚquote_media_refsÚ
media_urlsÚmedia_typesÚchannel_promptrO   )"r‹   rŒ   r�   rŽ   r�   r  Údc_fieldrq   r"  r$  r%  r&  r'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r4  r  rh   r5  r6  r7  r8  r9  r:  r‘   rO   rS   rQ   r  r    s&  ‡ áXØƒLÙ°Ô5€J�Ó5Ø€Dˆ.ÓØ€K�ÓØ€L�#ÓØ€J�ÓØ€J�ÓØ€O�SÓÙ¨dÔ3€HˆdÓ3Ø€FˆCÓØÐ�sÓØ€GˆSÓØ€IˆsÓØ€IˆsÓØ€HˆcÓÙ°Ô5€J�Ó5Ø(,Ð�~Ó,Ø#'€M�=Ó'Ø €FˆMÓ Ø"€HˆmÓ"Ø)-Ð˜Ó-Ø#'€M�=Ó'Ù%°dÔ;Ð�dÓ;á°Ô5€J�Ó5Ù °Ô6€K�Ó6Ø$(€N�M×(rS   r  c                  óX   € ] tR tRt$ RtRtR]R&   ]R R l4       tR R	 lt	R
 R lt
RtR# )ÚInboundMiddlewarei9  zˆSet class-level ``name`` and implement ``handle(ctx, next_fn)``; ``await next_fn()``
continues the pipeline, returning without it stops.rÝ   rN   Únamec               ó$   € V ^8„  d   QhRRRRRR/# ©rL   Úctxr  Únext_fnr   rM   ro   rO   )rP   s   "rQ   rR   ÚInboundMiddleware.__annotate__?  s   € ×OÑO ÐO¸ÐOÀdÑOrS   c              ƒ  	ó   "  € R # 5irÃ   rO   ©ÚselfrA  rB  s   &&&rQ   ÚhandleÚInboundMiddleware.handle>  s   é € ÙLOùó   ‚c               ó$   € V ^8„  d   QhRRRRRR/# r@  rO   )rP   s   "rQ   rR   rC  A  s!   € ÷ /ñ / .ð /¸8ð /Èñ /rS   c              ƒ  	ó@   "  € V P                  W4      G R j  x€L
 #  L5irÃ   )rG  rE  s   &&&rQ   Ú__call__ÚInboundMiddleware.__call__A  s   é € Ø—[‘[ Ó.×.Ð.Ñ.ùs   ‚—˜c               ó   € V ^8„  d   QhRR/# rK   rO   )rP   s   "rQ   rR   rC  D  s   € ÷ Añ A˜#ñ ArS   c                	óR   € R V P                   P                   RV P                  : R2# )Ú<z name=Ú>)Ú	__class__r‹   r>  ©rF  s   &rQ   Ú__repr__ÚInboundMiddleware.__repr__D  s&   € Ø�4—>‘>×*Ñ*Ð+¨6°$·)±)±¸aÐ@Ð@rS   rO   N)r‹   rŒ   r�   rŽ   r�   r>  r  r   rG  rL  rT  r‘   rO   rS   rQ   r=  r=  9  s/   ‡ ñ;à€Dˆ#ƒNàÜOó ØOõ/÷Añ ArS   r=  c                  ó¤   € ] tR tRtRtR R lt]RR l4       tRR R lltR	 R
 lt	RR R llt
RR R lltR R lt]R R l4       tR R ltRtR# )ÚInboundPipelineiH  zºOnion-model middleware pipeline: named middlewares, ``when`` guards, use_before/use_after/
remove. Accepts ``InboundMiddleware`` instances or plain ``async def(ctx, next_fn)`` callables.c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   ÚInboundPipeline.__annotate__K  s   € ÷ %ñ %˜$ñ %rS   c                	ó   € . V n         R # rÃ   ©Ú_middlewaresrS  s   &rQ   Ú__init__ÚInboundPipeline.__init__K  s
   € Ø"$ˆÖrS   Nc                	óP   € \        V \        4      '       d   V P                  V 3# W3# rÃ   )rû   r=  r>  )Ú
name_or_mwÚhandlers   &&rQ   Ú
_normalizeÚInboundPipeline._normalizeN  s(   € ä�jÔ"3×4Ò4Ø—?‘? JÐ.Ð.ØÐ"Ð"rS   c               ó   € V ^8„  d   QhRR/# ©rL   rM   rW  rO   )rP   s   "rQ   rR   rY  T  s   € ÷ Iñ I¸/ñ IrS   c                ó*   € V P                  R^ WV4      # )zJAppend ``pipeline.use(SomeMiddleware())`` or ``pipeline.use("name", fn)``.N©Ú_insert_relative)rF  r`  ra  Úwhens   &&&&rQ   ÚuseÚInboundPipeline.useT  s   € à×$Ñ$ T¨1¨jÀ4ÓHÐHrS   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Útargetr3  Úoffsetr|   rM   rW  rO   )rP   s   "rQ   rR   rY  X  s"   € ÷ ñ  }ð ¸cð Ðapñ rS   c                óú   a€ V P                  W44      w  rg\        V3R l\        V P                  4       4       R4      pV P                  P	                  Vf   \        V P                  4      MW‚,           WgV34       V # )zPInsert at index(target)+offset; appends when *target* is None or not registered.c              3  óF   <"  € T F  w  pw  p q2S8X  g   K  Vx € K  	  R # 5irÃ   rO   )Ú.0ÚiÚnra   rm  s   &   €rQ   Ú	<genexpr>Ú3InboundPipeline._insert_relative.<locals>.<genexpr>[  s#   øé € ÐVÑ*F™,˜!™Y˜a  AÈvÉ+—A’AÓ*Fùs   ƒ!—
!N)rb  ÚnextÚ	enumerater\  ÚinsertrË   )	rF  rm  rn  r`  ra  ri  r>  ÚhÚidxs	   &f&&&&   rQ   rh  Ú InboundPipeline._insert_relativeX  sf   ø€ à—/‘/ *Ó6‰ˆÜÔV¬)°D×4EÑ4EÔ*FÓVÐX\Ó]ˆØ×Ñ× Ñ ¸3º;¤ T×%6Ñ%6Ô!7ÈCÍLÐ[_ÐdhÐZiÔjØˆrS   c               ó    € V ^8„  d   QhRRRR/# ©rL   rm  rN   rM   rW  rO   )rP   s   "rQ   rR   rY  _  s   € ÷ Kñ K ð KÈoñ KrS   c                	ó*   € V P                  V^ W#V4      # ©é    rg  ©rF  rm  r`  ra  ri  s   &&&&&rQ   Ú
use_beforeÚInboundPipeline.use_before_  ó   € Ø×$Ñ$ V¨Q°
ÀTÓJÐJrS   c               ó    € V ^8„  d   QhRRRR/# r}  rO   )rP   s   "rQ   rR   rY  b  s   € ÷ Kñ K ð KÈ_ñ KrS   c                	ó*   € V P                  V^W#V4      # )é   rg  r�  s   &&&&&rQ   Ú	use_afterÚInboundPipeline.use_afterb  r„  rS   c               ó    € V ^8„  d   QhRRRR/# )rL   r>  rN   rM   rW  rO   )rP   s   "rQ   rR   rY  e  s   € ÷ ñ ˜3ð  ?ñ rS   c                	óx   € V P                    UUUu. uF  w  r#qBV8w  g   K  W#V3NK  	  upppV n         V # u upppi rÃ   r[  )rF  r>  rs  ry  Úws   &&   rQ   ÚremoveÚInboundPipeline.removee  s;   € Ø6:×6GÒ6GÕUÑ6G©7¨1°ÐPTÉ9œY˜a A›YÑ6GÓUˆÔØˆùô Vs   ‘5¡5c               ó   € V ^8„  d   QhRR/# )rL   rM   rq   rO   )rP   s   "rQ   rR   rY  j  s   € ÷ 4ñ 4 $ñ 4rS   c                	óP   € V P                    UUu. uF  w  p q!NK
  	  upp# u uppi rÃ   r[  )rF  rs  ra   s   &  rQ   Úmiddleware_namesÚ InboundPipeline.middleware_namesi  s(   € à!%×!2Ò!2Ô3Ñ!2‘g�a˜˜A’Ñ!2Ò3Ð3ùÓ3s   �"c               ó    € V ^8„  d   QhRRRR/# ©rL   rA  r  rM   ro   rO   )rP   s   "rQ   rR   rY  m  s   € ÷ ñ  ð °Dñ rS   c              ƒ  ól   aaaa"  € V P                   o^ oR VVVV3R lloS! 4       G Rj  x€L
  R#  L5i)z;Run the chain; each middleware receives ``(ctx, next_fn)``.c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   Ú-InboundPipeline.execute.<locals>.__annotate__r  s   € ÷ 	ñ 	˜tñ 	rS   c               “  óþ   <"  € S\        S4      8  d>   SS,          w  rpS^,          oVe   V! S4      '       g   K9   V! SS4      G Rj  x€L
  R# R#  L  \         d    \        P                  RT RR7       h i ; i5i)r‡  Nz'[InboundPipeline] middleware [%s] errorT©Úexc_info)rË   rù   rô   Úerror)r>  ra  Úwhen_fnÚchainrA  ÚindexrB  s      €€€€rQ   rB  Ú(InboundPipeline.execute.<locals>.next_fnr  sƒ   øé € àœ#˜e›*Ô$Ø).¨u­Ñ&�˜wØ˜•
�ØÒ&©w°s¯|ª|ÙðÙ! # wÓ/×/Ð/ñ ñ %ñ 0øÜ ô Ü—L‘LÐ!JÈDÐ[_�LÔ`Øðüs3   ƒ7A=»A=¾A Á
AÁA ÁA=ÁA Á%A:Á:A=Nr[  )rF  rA  r�  rž  rB  s   &f@@@rQ   ÚexecuteÚInboundPipeline.executem  s+   ûé € à×!Ñ!ˆØˆ÷	ó 	ñ ‹i�Œùs   †%4«2¬4r[  rÃ   ©NN)r‹   rŒ   r�   rŽ   r�   r]  r  rb  rj  rh  r‚  rˆ  r�  Úpropertyr‘  r   r‘   rO   rS   rQ   rW  rW  H  s[   † ñgõ%ð ó#ó ð#÷
Iõ÷K÷Kõð ô4ó ð4÷ñ rS   rW  c                  óx   € ] tR tRtRtRt]R R l4       t]R R l4       t]R R	 l4       t	R
 R lt
R R ltRtR# )ÚDecodeMiddlewarei‚  zWDecode raw inbound frames (JSON or protobuf via ``decode_inbound_push``) into ctx.push.Údecodec               ó    € V ^8„  d   QhRRRR/# )rL   Úraw_bodyrq   rM   rO   )rP   s   "rQ   rR   ÚDecodeMiddleware.__annotate__‡  s   € ÷ ñ ¨ð °ñ rS   c                óÎ  € . pT ;'       g    .  F½  p\        V\        4      '       g   K  VP                  R4      ;'       g    VP                  RR4      pVP                  R4      ;'       g    VP                  R/ 4      p\        V\        4      '       d    \        P
                  ! V4      pTP                  RTRT;'       g    / /4       K¿  	  V#   \         d    RT/p L6i ; i)zYNormalize JSON msg_body (PascalCase or snake_case keys) to [{"msg_type", "msg_content"}].rh   ÚMsgTyperÝ   ri   Ú
MsgContentre   )rû   rf   rÉ   rN   rÞ   Úloadsrù   Úappend)r¨  ÚresultÚitemrh   ri   s   &    rQ   Úconvert_json_msg_bodyÚ&DecodeMiddleware.convert_json_msg_body†  sÎ   € ð ˆØ—N�N ’NˆDÜ˜d¤D×)Ò)ÙØ—x‘x 
Ó+×FÐF¨t¯x©x¸	À2Ó/FˆHØŸ(™( =Ó1×OÐO°T·X±X¸lÈBÓ5OˆKÜ˜+¤s×+Ò+ð8Ü"&§*¢*¨[Ó"9�Kð �M‰M˜: x°À×@QÐ@QÈrÐRÖSñ #ð ˆøô !ô 8Ø#)¨;Ð"7’Kð8ús   ÂCÃC$Ã#C$c               ó    € V ^8„  d   QhRRRR/# )rL   Úraw_jsonrf   rM   ztuple[str, str]rO   )rP   s   "rQ   rR   r©  ˜  s   € ÷ (ñ ( Tð (¨oñ (rS   c                óì   € V P                  RR4      ;'       g    V P                  RR4      pV P                  RR4      ;'       g-    V P                  RR4      ;'       g    V P                  RR4      pW3# )z](from_account, group_code) accepting both Tencent IM PascalCase and internal snake_case keys.r&  rÝ   ÚFrom_Accountr'  ÚGroupIdÚgroup_id©rÉ   )r´  r&  r'  s   &  rQ   Újson_sender_fieldsÚ#DecodeMiddleware.json_sender_fields—  sl   € ð  —|‘| N°BÓ7×[Ð[¸8¿<¹<ÈÐXZÓ;[ˆØ—\‘\ ,°Ó3×rÐr°x·|±|ÀIÈrÓ7R×rÐrÐV^×VbÑVbÐcmÐoqÓVrˆ
ØÐ'Ð'rS   c               ó    € V ^8„  d   QhRRRR/# )rL   r´  rf   rM   zdict | NonerO   )rP   s   "rQ   rR   r©  Ÿ  s   € ÷ 
ñ 
 $ð 
¨;ñ 
rS   c                óŒ  € V '       g   R# \         P                  V 4      w  r\         P                  V P                  R. 4      ;'       g    V P                  R. 4      4      pV'       g"   V'       g   V P                  R4      '       g   R# RV P                  RR4      RTRV P                  RR4      ;'       g    V P                  RR4      R	V P                  R	R4      ;'       g    V P                  R
R4      RTRV P                  RR4      RV P                  R^ 4      ;'       g    V P                  R^ 4      RV P                  RR4      ;'       g-    V P                  RR4      ;'       g    V P                  RR4      RTRV P                  RR4      ;'       g    V P                  RR4      RV P                  RR4      ;'       g    V P                  RR4      RV P                  R4      ;'       g    RR\	        V P                  R4      \
        4      '       d-   V P                  R4      ;'       g    / P                  RR4      /# R/# )u¹   JSON push â†’ dict shaped like ``decode_inbound_push`` output; accepts both the callback
format (callback_command/from_account/msg_body) and legacy keys (GroupId/MsgSeq/MsgKey/MsgBody).Nr*  ÚMsgBodyÚcallback_commandrÝ   r&  Ú
to_accountÚ
To_Accountr)  Ú	nick_namer'  r(  Úmsg_seqÚMsgSeqr+  Úmsg_keyÚMsgKeyr,  ÚCloudCustomDataÚbot_owner_idÚ
botOwnerIdÚrecall_msg_seq_listÚtrace_idÚlog_ext)r¥  rº  r±  rÉ   rû   rf   )r´  r&  r'  r*  s   &   rQ   Úparse_json_pushÚ DecodeMiddleware.parse_json_pushž  sù  € ÷ ÙÜ#3×#FÑ#FÀxÓ#PÑ ˆÜ#×9Ñ9¸(¿,¹,ÀzÐSUÓ:V×:uÐ:uÐZb×ZfÑZfÐgpÐrtÓZuÓvˆç§H°X·\±\ÐBT×5UÒ5UÙà §¡Ð-?ÀÓ DØ˜LØ˜(Ÿ,™, |°RÓ8×ZÐZ¸H¿L¹LÈÐWYÓ<ZØ˜xŸ|™|Ð,=¸rÓB×cÐcÀhÇlÁlÐS^Ð`bÓFcØ˜*Ø˜(Ÿ,™, |°RÓ8Ø�x—|‘| I¨qÓ1×NÐN°X·\±\À(ÈAÓ5NØ�h—l‘l 8¨RÓ0×mÐm°H·L±LÀÈBÓ4O×mÐmÐS[×S_ÑS_Ð`hÐjlÓSmØ˜Ø §¡Ð.AÀ2Ó!F×!mÐ!mÈ(Ï,É,ÐWhÐjlÓJmØ˜HŸL™L¨¸Ó<×^Ð^ÀÇÁÈ\Ð[]Ó@^Ø! 8§<¡<Ð0EÓ#F×#NÐ#NÈ$ØÌzÐZb×ZfÑZfÐgpÓZqÔsw×OxÒOx˜Ÿ™ iÓ0×6Ð6°B×;Ñ;¸JÈÓKð
ð 	
ð Að
ð 	
rS   c               ó    € V ^8„  d   QhRRRR/# )rL   rã   ÚbytesrM   ÚtuplerO   )rP   s   "rQ   rR   r©  ¹  s   € ÷ :ñ :¨Eð :°eñ :rS   c                ó8  €  \         P                  ! VP                  R4      4      p\	        V\
        4      '       d    V P                  V4      pV'       d   VR3# R#  \        V4      pV'       d   VR3# R#   \         d    Rp L^i ; i  \         d    Rp L0i ; i)u9   One raw frame â†’ (push_dict, decoded_via) or (None, '').úutf-8NrÞ   Úprotobuf©NrÝ   )rÞ   r­  r¦  rù   rû   rf   rÍ  r6   )rF  r   rã   Ú	conn_jsonr$  s   &&&  rQ   Ú_decode_singleÚDecodeMiddleware._decode_single¹  sœ   € ð	ÜŸ
š
 4§;¡;¨wÓ#7Ó8ˆIô �i¤×&Ò&Ø×'Ñ'¨	Ó2ˆDß%)�D˜&�>Ð9¨zÐ9ð	Ü& tÓ,ˆD÷ &*��jÐ!Ð9¨zÐ9øô ô 	ØŠIð	ûô ô 	ØŠDð	ús#   ‚%A6 ÁB	 Á6BÂBÂ	BÂBc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   r©  È  s   € ÷ ñ  ð ¸Dñ rS   c              ƒ  	óÆ  "  € VP                   '       g   R # R pVP                    EFB  pV P                  VP                  V4      w  rVV'       gM   \        P	                  RVP                  P
                  V'       d   VP                  4       R,          MR4       Kv  Vf@   YVuq1n        \        P	                  RVP                  P
                  V\        V4      4       K¹  VP                  R. 4      '       g   KÓ  VP                  R. 4      \        R4      .,           VR,          ,           VR&   \        P	                  RVP                  P
                  \        VR,          4      4       EKE  	  V'       g   R # W1n        \        P	                  RVP                  P
                  VP                  VP                  R	R
4      VP                  RR
4      VP                  RR
4      VP                  R. 4       Uu. uF  qwP                  RR
4      NK  	  up4       \        P                  RVP                  P
                  VP                  4       V! 4       G R j  x€L
  R # u upi  L5i)Nz;[%s] Push decoded but no valid message. raw hex(first64)=%s:Né€   Nz(empty)z#[%s] Frame decoded (via=%s): len=%dr*  Ú
z;[%s] Merged %d extra msg_body elements from aggregated pushzC[%s] Push decoded (via=%s): from=%s group=%s msg_id=%s msg_types=%sr&  rÝ   r'  r+  rh   z[%s] Push payload: %s)r"  r×  r   rô   rõ   r>  Úhexr%  rË   rÉ   rl   r$  Údebug)rF  rA  rB  Úmergedrã   r$  ÚviaÚes   &&&     rQ   rG  ÚDecodeMiddleware.handleÈ  sÑ  é € Ø�~�~ˆ~ÙØ!%ˆØ—N•NˆDØ×+Ñ+¨C¯K©K¸Ó>‰IˆDßÜ—‘ÐYØŸK™K×,Ñ,Ç$¨d¯h©h«j¸Ö.>ÈIöWà’Ø*.Ð'�œÜ—‘ÐAÀ3Ç;Á;×CSÑCSÐUXÔZ]Ð^bÓZcÖdØ—‘˜* b×)Ô)Ø%+§Z¡Z°
¸BÓ%?Ä:ÈdÓCSÐBTÕ%TÐW[Ð\fÕWgÕ%g��zÑ"Ü—‘ÐYÐ[^×[fÑ[f×[kÑ[kÔmpÐquð  wAõ  rBó  nC÷  Dñ #÷ ÙØŒÜ�‰ØQØ�K‰K×Ñ˜cŸo™o¨v¯z©z¸.È"Ó/MÈvÏzÉzÐZfÐhjÓOkØ�J‰J�x Ó$ÀfÇjÁjÐQ[Ð]_ÔF`Ó&aÑF`À§u¡u¨Z¸Ö'<ÑF`Ñ&aô	
ô
 	�‰Ð,¨c¯k©k×.>Ñ.>ÀÇÁÔIÙ‹i�Šùò 'bñ 	ùs4   ‚A9I!Á<A7I!Ã8A;I!Å4A?I!Ç3IÈAI!ÉIÉI!rO   N)r‹   rŒ   r�   rŽ   r�   r>  r  r±  rº  rÍ  r×  rG  r‘   rO   rS   rQ   r¥  r¥  ‚  sS   † ÙaØ€Dàôó ðð  ô(ó ð(ð ô
ó ð
õ4:÷ñ rS   r¥  c                  ó*   € ] tR tRtRtRtR R ltRtR# )ÚExtractFieldsMiddlewareiã  z!Copy common push fields onto ctx.zextract-fieldsc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú$ExtractFieldsMiddleware.__annotate__ç  ó   € ÷ ñ  ð ¸Dñ rS   c           	   ƒ  	óÐ   "  € R F)  p\        WVP                  P                  VR4      4       K+  	  VP                  P                  R. 4      Vn        V! 4       G Rj  x€L
  R#  L5i)r&  rÝ   r*  N)r&  r'  r(  r)  r+  r,  )Úsetattrr$  rÉ   r*  )rF  rA  rB  Úfs   &&& rQ   rG  ÚExtractFieldsMiddleware.handleç  sH   é € ÛoˆAÜ�C˜CŸH™HŸL™L¨¨BÓ/Ö0ñ pà—x‘x—|‘| J°Ó3ˆŒÙ‹i�Œùs   ‚AA&ÁA$ÁA&rO   N©r‹   rŒ   r�   rŽ   r�   r>  rG  r‘   rO   rS   rQ   rä  rä  ã  s   † Ù+Ø€D÷ñ rS   rä  c                  ó&   € ] tR tRtRtR R ltRtR# )ÚDedupMiddlewareiî  Údedupc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   ÚDedupMiddleware.__annotate__ñ  rç  rS   c              ƒ  	ó,  "  € VP                   '       dm   VP                  P                  P                  VP                   4      '       d8   \        P                  R VP                  P                  VP                   4       R# V! 4       G Rj  x€L
  R#  L5i)z)[%s] Duplicate message ignored: msg_id=%sN)r+  r   Ú_dedupÚis_duplicaterô   rÞ  r>  rE  s   &&&rQ   rG  ÚDedupMiddleware.handleñ  sZ   é € Ø�:�:ˆ:˜#Ÿ+™+×,Ñ,×9Ñ9¸#¿*¹*×EÒEÜ�L‰LÐDÀcÇkÁk×FVÑFVÐX[×XbÑXbÔcÙÙ‹i�Œùs   ‚ABÁ
ABÂBÂBrO   N©r‹   rŒ   r�   rŽ   r>  rG  r‘   rO   rS   rQ   rî  rî  î  s   † Ø€D÷ñ rS   rî  c                ó   € \        V RR4      # )zAAdapter's SessionStore, or None before ``set_session_store`` ran.Ú_session_storeN)Úgetattr)r   s   &rQ   rø  rø  ø  s   € ä�7Ð,¨dÓ3Ð3rS   c                  óì   € ] tR tRtRtRt]! RR04      tRtR R lt	]
R	 R
 l4       t]R R l4       t]R R l4       tR R lt]
R R l4       t]R R l4       t]R R l4       t]RR R ll4       tRtR# )ÚRecallGuardMiddlewareiý  uÅ   Recall callbacks (Group.CallbackAfterRecallMsg / C2C.CallbackAfterMsgWithDraw).
A: in transcript â†’ redact; B: not in transcript â†’ system note; C: being processed â†’ interrupt + delayed redact.Úrecall_guardúGroup.CallbackAfterRecallMsgzC2C.CallbackAfterMsgWithDrawzM[This message was recalled/withdrawn by the sender; original content removed]c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú"RecallGuardMiddleware.__annotate__  s   € ÷ ñ  ð ¸Dñ rS   c              ƒ  	óÂ   "  € VP                   ;'       g    / P                  R R4      pW0P                  9   d   V P                  W4       R# V! 4       G Rj  x€L
  R#  L5i)r¿  rÝ   N)r$  rÉ   Ú_RECALL_COMMANDSÚ_handle_recall)rF  rA  rB  Úcmds   &&& rQ   rG  ÚRecallGuardMiddleware.handle  sE   é € Ø�x‰x�~ˆ~˜2×"Ñ"Ð#5°rÓ:ˆØ×'Ñ'Ô'Ø×Ñ Ö)á“)�OŒOùs   ‚AAÁAÁAc               ó    € V ^8„  d   QhRRRR/# )rL   r'  rN   r&  rO   )rP   s   "rQ   rR   rÿ    s   € ÷ 
ñ 
¨3ð 
¸cñ 
rS   c                	ó’   € T P                  V'       d   R V 2MRV 2V'       d   RMRT;'       g    RV'       d   RR7      # RR7      # )úgroup:údirect:rZ   ÚdmNÚmain)r-  r.  Úuser_idÚ	thread_id)Úbuild_source)r   r'  r&  s   &&&rQ   Ú_build_sourceÚ#RecallGuardMiddleware._build_source  sZ   € à×#Ñ#ß.8�v˜j˜\Ñ*ÀÈÀ~Ð>Vß!+‘g°Ø ×(Ð( Dß *�fð	 $ó 
ð 	
ð 15ð	 $ó 
ð 	
rS   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r'  rN   r&  rM   rO   )rP   s   "rQ   rR   rÿ    s'   € ÷ lñ l°cð lÈð lÐQTñ lrS   c                	óX   € VP                  V P                  W#V4      4      P                  # rÃ   )Úget_or_create_sessionr  Ú
session_id)r†   Ústorer   r'  r&  s   &&&&&rQ   Ú_resolve_sidÚ"RecallGuardMiddleware._resolve_sid  s'   € à×*Ñ*¨3×+<Ñ+<¸WÐR^Ó+_Ó`×kÑkÐkrS   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   ÚsidrN   Ú
transcriptrq   r·   rf   Úok_msgÚfail_msgrM   ro   rO   )rP   s   "rQ   rR   rÿ    s9   € ÷ 8ñ 8¨#ð 8¸4ð 8Èð 8ÐVYð 8Ðehð 8Ðw{ñ 8rS   c                ó  € V P                   VR&    VP                  W4RR7       \        P                  ! WaP                  .VO5!   R#   \
         d,   p	\        P                  YqP                  T	4        Rp	?	R# Rp	?	ii ; i)zFBlank *entry* in place and persist *transcript* (warns, never raises).ÚcontentT)Úactive_onlyN)Ú	_REDACTEDÚrewrite_transcriptrô   rõ   r>  rù   rý   )
r†   r   r  r  r  r·   r  r  Úok_argsr  s
   &&&&&&&&* rQ   Ú_redactÚRecallGuardMiddleware._redact  sd   € ð Ÿ=™=ˆˆiÑð	8Ø×$Ñ$ SÀ$Ð$ÔGÜ�KŠK˜§¡Ð7¨wÖ7øÜô 	8Ü�N‰N˜8§\¡\°3×7Ò7ûð	8ús   ‘5A ÁA>Á A9Á9A>c               ó$   € V ^8„  d   QhRRRRRR/# )rL   rA  r  r  rN   rM   ro   rO   )rP   s   "rQ   rR   rÿ  "  s&   € ÷ Dñ D .ð D°sð D¸tñ DrS   c           
     	ó\  € VP                   pVP                  ;'       g    / pVR 8X  d   VP                  R4      ;'       g    . pMDVP                  R4      ;'       g    RVP                  R4      rvV'       g	   V'       d   RVRV/.M. pV'       g#   \        P	                  RVP
                  4       R# VP                  R4      ;'       g    RP                  4       pVP                  R4      ;'       g    RP                  4       p	V F   p
V
P                  R4      ;'       g%    \        V
P                  R4      ;'       g    R4      pV'       g   KJ  V P                  W;4      pVe   V P                  W<W¸V	4       Kt  V P                  W;W‰VP                  P                  V4      4       K¢  	  R# )	rý  rÊ  r+  rÝ   rÃ  z2[%s] Recall callback with empty seq_list, skippingNr'  r&  )r   r$  rÉ   rô   rÞ  r>  r\   rN   Ú_find_processing_sessionÚ_interrupt_for_recallÚ_patch_transcriptÚ_msg_content_cache)rF  rA  r  r   r$  Úseq_listÚmidÚseqr'  r&  Ú	seq_entryÚrecalled_idÚ
matched_sks   &&&          rQ   r  Ú$RecallGuardMiddleware._handle_recall"  s_  € Ø—+‘+ˆØ�x‰x�~ˆ~˜2ˆØÐ0Ô0Ø—x‘xÐ 5Ó6×<Ð<¸"‰Hà—x‘x Ó)×/Ð/¨R°·±¸)Ó1D�ß=@ÇC˜ 3¨	°3Ð7Ñ8ÈbˆHßÜ�L‰LÐMÈwÏ|É|Ô\ÙØ—h‘h˜|Ó,×2Ð2°×9Ñ9Ó;ˆ
ØŸ™ Ó0×6Ð6°B×=Ñ=Ó?ˆÛ!ˆIØ#Ÿ-™-¨Ó1×XÐX´S¸¿¹ÀyÓ9Q×9WÐ9WÐUWÓ5XˆKßÙØ×6Ñ6°wÓLˆJØÒ%Ø×*Ñ*¨7ÀÐYeÖfà×&Ñ& w¸ZÐW^×WqÑWq×WuÑWuð  wBó  XCö  Dó "rS   c               ó    € V ^8„  d   QhRRRR/# )rL   r.  rN   rM   r3  rO   )rP   s   "rQ   rR   rÿ  <  s   € ÷ Vñ V°sð V¸}ñ VrS   c                	ód   a a€ \        V V3R  lS P                  P                  4        4       R4      # )c              3  ód   <"  € T F%  w  rVS8X  g   K  VSP                   9   g   K!  Vx € K'  	  R # 5irÃ   )Ú_active_sessions)rq  Úskr+  r   r.  s   &  €€rQ   rt  ÚARecallGuardMiddleware._find_processing_session.<locals>.<genexpr>=  s8   øé € ð OÑ'J™G˜BØ˜{Ñ*ô Ø/1°W×5MÑ5MÑ/M÷ ’RÓ'Jùs   ƒ0“0¦
0N)rv  Ú_processing_msg_idsrÈ   )r   r.  s   ffrQ   r&  Ú.RecallGuardMiddleware._find_processing_session;  s2   ù€ äõ O w×'BÑ'B×'HÑ'HÔ'Jó OØPTóVð 	VrS   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )rL   Úsession_keyrN   r.  r'  r&  rM   ro   rO   )rP   s   "rQ   rR   rÿ  A  s9   € ÷ hñ h¸ð hÈ3ð hÐ\_ð hÐorð hÐw{ñ hrS   c           	     	óÐ  € V'       d   R V 2MRV 2pRV RV R2p\        V\        P                  V P                  WV4      RR7      VP                  V&   VP
                  P                  V4      pVe   VP                  4        \        P                  RVP                  W2R	,          4       VP                  P                  VR
4      p	V	'       d   V P                  WW”V4       R# R# )zgroup zdirect chat with u_   [CRITICAL â€” MESSAGE RECALLED] The user message that triggered your current task (message_id="z") in ud   has been recalled/withdrawn by the sender. IGNORE any prior system note asking you to finish processing tool results â€” the original request is void. Do NOT continue the task, do NOT call more tools, do NOT reference the recalled content. Reply only with a brief acknowledgment such as "The message has been recalled." in the language the user was using.T)re   Úmessage_typer  ÚinternalNz+[%s] Recall interrupt: msg_id=%s session=%sºNé   NrÝ   )r   r   ÚTEXTr  Ú_pending_messagesr4  rÉ   Úsetrô   rõ   r>  Ú_processing_msg_textsÚ_schedule_content_redact)
r†   r   r:  r.  r'  r&  ÚwhereÚrecall_textÚactive_eventÚrecalled_texts
   &&&&&&    rQ   r'  Ú+RecallGuardMiddleware._interrupt_for_recall@  së   € ç)3�&˜˜Ñ%Ð;LÈ\ÈNÐ9[ˆðØ(˜M¨°°ð 8+ð+ð 	ô 2>Ø¬;×+;Ñ+;ÀC×DUÑDUÐV]ÐkwÓDxð  DHô2Iˆ×!Ñ! +Ñ.à×/Ñ/×3Ñ3°KÓ@ˆØÒ#Ø×ÑÔÜ�‰ÐAÀ7Ç<Á<ÐQ\ÐjmÕ^nÔoà×5Ñ5×9Ñ9¸+ÀrÓJˆßØ×(Ñ(¨¸}ÐZfÖgñ rS   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )rL   r:  rN   rH  r'  r&  rM   ro   rO   )rP   s   "rQ   rR   rÿ  Y  s7   € ÷ <ñ <¸Cð <ÐPSð <Ðadð <Ðtwð <ð  }Añ <rS   c                	ó‚   a aaaaa€ R  VV VVVV3R llpSP                  \        P                  ! V! 4       4      4       R# )c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   ÚDRecallGuardMiddleware._schedule_content_redact.<locals>.__annotate__Z  s   € ÷ 	|ñ 	|˜tñ 	|rS   c               “  ó¢  <"  € \        S4      p V '       g   R #  SP                  V SS	S4      p\        ^4       F‹  p\        P
                  ! R4      G R j  x€L
   T P                  T4      pT FR  pTP                  R4      R8X  g   K  TP                  R4      S
8X  g   K3  SP                  SYY5RRSR,          4         R # 	  K�  	  \        P                  R	SP                  SR,          4       R #   \         d     R # i ; i L®  \         d.   p\        P                  RSP                  Y4        R p? R # R p?i\         d     EK  i ; i5i)
Ng      à?z<[%s] Recall redact: transcript unreadable for session %s: %sÚroleÚuserr  z[%s] Recall redact: session %sz[%s] Recall redact failed: %sr>  z?[%s] Recall redact: content not found after polling, session %s)rø  r  rù   rì   r›   rÿ   Úload_transcriptrD   rô   rý   r>  rÉ   r"  rÞ  )r  r  ra   r  r  r·   r   r†   r&  r'  rH  r:  s         €€€€€€rQ   r"  Ú?RecallGuardMiddleware._schedule_content_redact.<locals>._redactZ  s0  øé € Ü" 7Ó+ˆEßÙðØ×&Ñ& u¨g°zÀ<ÓP�ô ˜2–Y�Ü—m’m CÓ(×(Ð(ðØ!&×!6Ñ!6°sÓ!;�Jó (�EØ—y‘y Ó(¨FÖ2°u·y±yÀÓ7KÈ}Ö7\ØŸ™ G¨U¸ÐLlØ$CÀ[ÐQTÕEUôWãó	 (ñ ô& �L‰LÐZÐ\c×\hÑ\hÐjuÐvyÕjzÖ{øô- ô Úðúñ )øô +ô ô —N‘Nð)Ø*1¯,©,¸ôö ûÜ ô Ûðüs|   ƒEšC2 ®'EÁDÁEÁDÁ,EÂ	EÂ!AEÃ2DÃ=EÄ DÄEÄEÄ!D9Ä2EÄ9EÅEÅEÅEÅEN)Ú_track_taskr›   Úcreate_task)r†   r   r:  rH  r'  r&  r"  s   ffffff rQ   rD  Ú.RecallGuardMiddleware._schedule_content_redactX  s,   ý€ ÷	|õ 	|ð: 	×ÑœG×/Ò/±³	Ó:Ö;rS   Nc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rL   r.  rN   r'  r&  Úrecalled_contentr3  rM   ro   rO   )rP   s   "rQ   rR   rÿ  |  s9   € ÷ )dñ )d°Sð )dÀcð )dØ(+ð)dØ?Lð)dØX\ñ)drS   c                	óJ  aa€ \        V4      pV'       g   R #  V P                  WaW44      p TP                  T4      p	\        T3R lT	 4       R 4      p
RpT
f!   S'       d   \        T3R lT	 4       R 4      p
RpT
e   T P                  YYyT
RR	ST4	       R # TP                  TR
RR\        P                  ! \        R7      P                  4       RRS R2/4       \        P                  RTP
                  S4       R #   \         d-   p\        P	                  RTP
                  T4        R p?R # R p?ii ; i  \         d-   p\        P	                  RTP
                  T4        R p?R # R p?i\         d-   p\        P	                  RTP
                  T4        R p?R # R p?ii ; i)Nz*[%s] Recall: failed to resolve session: %sz&[%s] Recall: transcript unreadable: %sz*[%s] Recall: failed to load transcript: %sc              3  óV   <"  € T F  qP                  R 4      S8X  g   K  Vx € K   	  R# 5i)Ú
message_idNr¹  )rq  rá  r.  s   & €rQ   rt  Ú:RecallGuardMiddleware._patch_transcript.<locals>.<genexpr>—  s!   øé € ÐS¡*˜Q·±°lÓ0CÀ{Ñ0R—q’q£*ùs   ƒ)Ÿ
)zbranch A1: id matchc              3  ó†   <"  € T F6  qP                  R 4      R8X  g   K  VP                  R4      S8X  g   K2  Vx € K8  	  R# 5i)rO  rP  r  Nr¹  )rq  rá  rW  s   & €rQ   rt  r[  š  s7   øé € Ðu¡j ·E±E¸&³MÀVÑ4Kœ1ÐPQ×PUÑPUÐV_ÓP`ÐdtÑPtŸ1š1£jùs   ƒAŸA·
Azbranch A2: content matchz$[%s] Recall: redacted msg_id=%s (%s)z*[%s] Recall: rewrite_transcript failed: %srO  Úsystemr¡   r°   r  z[recall] message_id="z2" has been recalled; do not quote or reference it.z1[%s] Recall: system note for msg_id=%s (branch B))rø  r  rù   rô   rý   r>  rQ  rD   rv  r"  Úappend_to_transcriptr   r²   r
   Ú	isoformatrõ   )r†   r   r.  r'  r&  rW  r  r  r  r  rm  Úbranch_labels   &&f&&f      rQ   r(  Ú'RecallGuardMiddleware._patch_transcript{  sv  ù€ ô ˜wÓ'ˆßÙð	Ø×"Ñ" 5°:ÓLˆCð	ð ×.Ñ.¨sÓ3ˆJô ÔS¡*ÓSÐUYÓZˆØ,ˆØŠ>×.ÜÔu¡jÓuÐw{Ó|ˆFØ5ˆLØÒØ�K‰K˜¨¸ÐAgØDÀkÐS_ôaáà×"Ñ" 3Ø�H˜k¬8¯<ª<¼3Ô+?×+IÑ+IÓ+KØÐ.¨{¨mÐ;mÐnð)
ô 	ô 	�‰ÐGÈÏÉÐWbÖcøôE ô 	Ü�N‰NÐGÈÏÉÐWZÔ[Ýûð	ûô #ô 	ô �N‰NÐCÀWÇ\Á\ÐSVÔWÝûÜô 	Ü�N‰NÐGÈÏÉÐWZÔ[Ýûð	ús@   ™C< ¬D6 Ã<D3Ä!D.Ä.D3Ä6F"Å!E(Å(F"Å5F"Å6!FÆF"rO   rÃ   )r‹   rŒ   r�   rŽ   r�   r>  Ú	frozensetr  r  rG  r  r  r�   r  r"  r  r&  r'  rD  r(  r‘   rO   rS   rQ   rû  rû  ý  sÄ   † ñ}à€DÙ Ð"@ÐB`Ð!aÓbÐØ_€Iõð ô
ó ð
ð ôló ðlð ô8ó ð8õDð2 ôVó ðVð ôhó ðhð. ô<ó ð<ðD ö)dó ô)drS   rû  c                  ó@   € ] tR tRtRtRt]R R l4       tR R ltRt	R	# )
ÚSkipSelfMiddlewarei¨  zDrop the bot's own messages.z	skip-selfc               ó$   € V ^8„  d   QhRRRRRR/# )rL   r&  rN   rä   r3  rM   r¹   rO   )rP   s   "rQ   rR   ÚSkipSelfMiddleware.__annotate__­  s!   € ÷ =ñ =¨ð =°mð =Èñ =rS   c                	ó0   € \        V 4      ;'       d    W8H  # rÃ   )r¹   )r&  rä   s   &&rQ   Ú_is_self_referenceÚ%SkipSelfMiddleware._is_self_reference¬  s   € ä�LÓ!×<Ð< lÑ&<Ð<rS   c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rf  °  rç  rS   c              ƒ  	ó
  "  € V P                  VP                  VP                  P                  4      '       d8   \        P                  R VP                  P                  VP                  4       R# V! 4       G Rj  x€L
  R#  L5i)z'[%s] Ignoring self-sent message from %sN)rh  r&  r   Ú_bot_idrô   rÞ  r>  rE  s   &&&rQ   rG  ÚSkipSelfMiddleware.handle°  sV   é € Ø×"Ñ" 3×#3Ñ#3°S·[±[×5HÑ5H×IÒIÜ�L‰LÐBÀCÇKÁK×DTÑDTÐVY×VfÑVfÔgÙÙ‹i�Œùs   ‚A8BÁ:BÁ;BrO   N)
r‹   rŒ   r�   rŽ   r�   r>  r  rh  rG  r‘   rO   rS   rQ   rd  rd  ¨  s&   † Ù&Ø€Dàô=ó ð=÷ñ rS   rd  c                  ó*   € ] tR tRtRtRtR R ltRtR# )ÚChatRoutingMiddlewarei·  z8Derive chat_id / chat_type / chat_name from push fields.zchat-routingc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú"ChatRoutingMiddleware.__annotate__»  s   € ÷ ñ  ð ¸Dñ rS   c              ƒ  	óZ  "  € VP                   '       dC   R VP                    2RVP                  ;'       g    VP                   uVn        Vn        Vn        MARVP
                   2RVP                  ;'       g    VP
                  uVn        Vn        Vn        V! 4       G Rj  x€L
  R#  L5i)r  rZ   r  r	  N)r'  r(  r-  r.  r/  r&  r)  rE  s   &&&rQ   rG  ÚChatRoutingMiddleware.handle»  s›   é € Ø�>�>ˆ>Ø:@ÀÇÁÐ@PÐ8QÐSZÐ\_×\jÑ\j×\|Ð\|Ðnq×n|Ñn|Ð5ˆCŒK˜œ¨­à:AÀ#×BRÑBRÐASÐ8TÐVZÐ\_×\oÑ\o÷  ]Dð  ]DÐsv÷  tDñ  tDÐ5ˆCŒK˜œ¨¬Ù‹i�Œùs   ‚4B+·AB+Á9)B+Â"B)Â#B+rO   Nrì  rO   rS   rQ   ro  ro  ·  s   † ÙBØ€D÷ñ rS   ro  c                  óz   € ] tR tRtRtR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4       tRtR# )ÚAccessPolicyiÃ  zNDM / group access rules shared by inbound middleware and outbound ``send_dm``.ÚYUANBAOc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rL   Ú	dm_policyrN   Údm_allow_fromr   Úgroup_policyÚgroup_allow_fromrM   ro   rO   )rP   s   "rQ   rR   ÚAccessPolicy.__annotate__Ç  s1   € ÷ 2ñ 2 #ð 2°ið 2Èsð 2Ðfoð 2Ðtxñ 2rS   c                	ó6   € Wn         W n        W0n        W@n        R # rÃ   )Ú
_dm_policyÚ_allow_fromÚ_group_policyÚ_group_allow_from)rF  rx  ry  rz  r{  s   &&&&&rQ   r]  ÚAccessPolicy.__init__Ç  s   € Ø#ŒØ(ÔØ)ÔØ!1ÖrS   c               ó    € V ^8„  d   QhRRRR/# ©rL   Ú	sender_idrN   rM   r¹   rO   )rP   s   "rQ   rR   r|  Í  s   € ÷ 6ñ 6 sð 6¨tñ 6rS   c                ó@   € V P                  VP                  4       4      # )u:   Strict DM authorization â€” pairing does not imply access.)Ú_is_dm_allowedr\   ©rF  r…  s   &&rQ   Úis_dm_allowedÚAccessPolicy.is_dm_allowedÍ  s   € à×"Ñ" 9§?¡?Ó#4Ó5Ð5rS   c               ó    € V ^8„  d   QhRRRR/# r„  rO   )rP   s   "rQ   rR   r|  Ñ  s   € ÷ 5ñ 5¨cð 5°dñ 5rS   c                ó$   € V P                  V4      # )z?Whether a DM may reach gateway intake (pairing handshake path).)Ú_is_dm_intake_allowedrˆ  s   &&rQ   Úis_dm_intake_allowedÚ!AccessPolicy.is_dm_intake_allowedÑ  s   € à×)Ñ)¨)Ó4Ð4rS   c               ó    € V ^8„  d   QhRRRR/# )rL   r'  rN   rM   r¹   rO   )rP   s   "rQ   rR   r|  Õ  s   € ÷ :ñ :¨3ð :°4ñ :rS   c                ó‚   € V P                   R8X  d   V P                  4       # V P                  VP                  4       4      # )z¯Unlike the shared rule, an ``open`` group still needs the allow-all opt-in: Yuanbao groups
have no runner-side mention gate, so open-without-opt-in would forward every member.Úopen)r€  Ú_open_dm_opted_inÚ_is_group_allowedr\   ©rF  r'  s   &&rQ   Úis_group_allowedÚAccessPolicy.is_group_allowedÕ  s;   € ð ×Ñ Ô'Ø×)Ñ)Ó+Ð+Ø×%Ñ% j×&6Ñ&6Ó&8Ó9Ð9rS   c               ó   € V ^8„  d   QhRR/# rK   rO   )rP   s   "rQ   rR   r|  Ý  s   € ÷ ñ ˜3ñ rS   c                	ó   € V P                   # rÃ   )r~  rS  s   &rQ   rx  ÚAccessPolicy.dm_policyÜ  s   € à�‰ÐrS   c               ó   € V ^8„  d   QhRR/# rK   rO   )rP   s   "rQ   rR   r|  á  s   € ÷ "ñ "˜cñ "rS   c                	ó   € V P                   # rÃ   )r€  rS  s   &rQ   rz  ÚAccessPolicy.group_policyà  s   € à×!Ñ!Ð!rS   )r  r~  r�  r€  N)r‹   rŒ   r�   rŽ   r�   ÚALLOW_ALL_ENV_PREFIXr]  r‰  rŽ  r–  r£  rx  rz  r‘   rO   rS   rQ   ru  ru  Ã  sG   † ÙXØ$Ðõ2õ6õ5õ:ð ôó ðð ô"ó ô"rS   ru  c                  ó*   € ] tR tRtRtRtR R ltRtR# )ÚAccessGuardMiddlewareiå  z&Platform-level DM/group access filter.zaccess-guardc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú"AccessGuardMiddleware.__annotate__é  s   € ÷ ñ  ð ¸Dñ rS   c              ƒ  	ó,  "  € VP                   P                  pVP                  R 8X  dd   VP                  VP                  4      '       gC   \
        P                  RVP                   P                  VP                  VP                  4       R# VP                  R8X  dd   VP                  VP                  4      '       gC   \
        P                  RVP                   P                  VP                  VP                  4       R# V! 4       G Rj  x€L
  R#  L5i)r	  z'[%s] DM from %s blocked by dm_policy=%sNrZ   z([%s] Group %s blocked by group_policy=%s)r   Ú_access_policyr.  rŽ  r&  rô   rÞ  r>  rx  r–  r'  rz  )rF  rA  rB  Úpolicys   &&& rQ   rG  ÚAccessGuardMiddleware.handleé  s»   é € Ø"Ÿ{™{×9Ñ9ˆØ�=‰=˜DÔ ¨×)DÑ)DÀS×EUÑEU×)VÒ)VÜ�L‰LÐBÀCÇKÁK×DTÑDTÐVY×VfÑVfÐhn×hxÑhxÔyÙØ�=‰=˜GÔ#¨F×,CÑ,CÀCÇNÁN×,SÒ,SÜ�L‰LÐCÀSÇ[Á[×EUÑEUÐWZ×WeÑWeÐgm×gzÑgzÔ{ÙÙ‹i�Œùs    ‚ADÁA3DÂ?ADÄDÄDrO   Nrì  rO   rS   rQ   r   r   å  s   † Ù0Ø€D÷ñ rS   r   c                  ó@   € ] tR tRtRtRtR R lt]R R l4       tRt	R	# )
ÚAutoSetHomeMiddlewareiô  uC  Silently designate the first inbound conversation as home channel (config.yaml + env);
a group home is upgraded by the first DM. Runs after GroupAtGuard so unaddressed group traffic
never claims it; only strictly-authorized senders (allowlist / open opt-in / pairing-approved)
may â€” intake-only pairing forwards must not.zauto-sethomec               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú"AutoSetHomeMiddleware.__annotate__û  ó   € ÷ 	ñ 	 ð 	¸Dñ 	rS   c              ƒ  	ó–  "  € VP                   pVP                  '       g–   VP                  V4      '       d   \        R R4      ;'       g    RpV'       * ;'       g)    VP	                  R4      ;'       d    VP
                  R8H  pVP
                  R8X  d   RVn        V'       d   V P                  W14       V! 4       G Rj  x€L
  R#  L5i)ÚYUANBAO_HOME_CHANNELrÝ   r  r	  TN)r   Ú_auto_sethome_doneÚ_sender_may_designate_homeÚ
_yb_secretÚ
startswithr.  Ú_persist_home)rF  rA  rB  r   Ú	_cur_homeÚ_should_sets   &&&   rQ   rG  ÚAutoSetHomeMiddleware.handleû  sš   é € Ø—+‘+ˆØ×)×)Ð)¨g×.PÑ.PÐQT×.UÒ.UÜ"Ð#9¸2Ó>×DÐDÀ"ˆIØ'œ-×eÐe¨I×,@Ñ,@ÀÓ,J×,dÐ,dÈsÏ}É}Ð`dÑOdˆKØ�}‰} Ô$Ø-1�Ô*ßØ×"Ñ" 7Ô0Ù‹i�Œùs.   ‚5C	¸C	ÁC	ÁC	Á5/C	Â%C	Ã CÃC	c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rª    s   € ÷ Lñ L Nð L°tñ LrS   c                	ó&  €  ^ RI HpHp T! \        P                  \        VP                  4      \        VP                  ;'       g    R4      R7      pV! V4       W@P                  n	        \        4       '       g'   \        VP                  4      \        P                  R&   \        P                  RV P                  VP                  VP                  4       R#   \          d-   p\        P#                  RT P                  T4        Rp?R# Rp?ii ; i)r€  )ÚHomeChannelÚpersist_home_channelÚHome)Úplatformr-  r>  r­  z=[%s] Auto-sethome: designated %s (%s) as Yuanbao home channelz[%s] Auto-sethome failed: %sN)Úgateway.configr¸  r¹  r   rv  rN   r-  r/  ÚconfigÚhome_channelÚ_profile_scopedÚosÚenvironrô   rõ   r>  rù   rý   )r   rA  r¸  r¹  Úhomerá  s   &&    rQ   r²  Ú#AutoSetHomeMiddleware._persist_home  sÒ   € ð	LßHÙ¬×(8Ñ(8Ä#ÀcÇkÁkÓBRÔY\Ð]`×]jÑ]j×]tÐ]tÐntÓYuÔvˆDñ ! Ô&Ø*.�N‰NÔ'ô #×$Ò$Ü58¸¿¹Ó5E”—
‘
Ð1Ñ2Ü�K‰KÐWÐY`×YeÑYeÐgj×grÑgrÐtw÷  uBñ  uBö  CøÜô 	LÜ�N‰NÐ9¸7¿<¹<È×KÒKûð	Lús   ‚AC ÁBC ÃDÃ$!DÄDrO   N)
r‹   rŒ   r�   rŽ   r�   r>  rG  r  r²  r‘   rO   rS   rQ   r¨  r¨  ô  s)   † ñ6ð €Dõ	ð ôLó ôLrS   r¨  c               ó    € V ^8„  d   QhRRRR/# )rL   r*  rq   rM   zIterator[tuple[Any, dict]]rO   )rP   s   "rQ   rR   rR     s   € ÷ 	4ñ 	4 ð 	4Ð*Dñ 	4rS   c              #  ó   "  € T ;'       g    .  FÕ  p\        V\        4      '       d   VP                  R4      R8w  d   K1  VP                  R/ 4      ;'       g    / p\        V\        4      '       d   VP                  RR4      MRpV'       g   K�  \        P                  ! \
        P                  \        4      ;_uu_ 4        \
        P                  ! V4      V3x € RRR4       K×  	  R#   + '       g   i     Kì  ; i5i)z\Yield ``(custom, content)`` for each TIMCustomElem whose ``data`` parses as JSON (any type).rh   ÚTIMCustomElemri   rã   rÝ   N)	rû   rf   rÉ   Ú
contextlibÚsuppressrÞ   ÚJSONDecodeErrorÚ	TypeErrorr­  )r*  Úelemr  Údata_strs   &   rQ   Ú_iter_custom_elemsrÍ    s´   é € à—�˜B’ˆÜ˜$¤×%Ò%¨¯©°*Ó)=ÀÔ)PÙØ—(‘(˜=¨"Ó-×3Ð3°ˆÜ.8¸Ä$×.GÒ.G�7—;‘;˜v rÔ*ÈRˆß‰8Ü×$Ò$¤T×%9Ñ%9¼9×EÕEÜ—j’j Ó*¨GÐ3Ò3÷ FÑEó ÷ F×EÐEüs*   ‚AC>Á2C>Â1C>ÃC*ÃC>Ã*C;Ã5	C>c               ó    € V ^8„  d   QhRRRR/# ©rL   r  rf   rM   rN   rO   )rP   s   "rQ   rR   rR   %  s   € ÷ ;ñ ;˜ð ; ñ ;rS   c                óN  € \        V P                  R4      ;'       g    R4      P                  4       ;'       gm    \        V P                  R4      ;'       g    R4      P                  4       ;'       g3    \        V P                  R4      ;'       g    R4      P                  4       # )z=First non-empty of file_name / fileName / filename, stripped.Ú	file_namerÝ   ÚfileNamerb   ©rN   rÉ   r\   )r  s   &rQ   Ú
_file_namerÔ  %  s�   € ä�—‘˜KÓ(×.Ð.¨BÓ/×5Ñ5Ó7÷ :ð :¼3¸w¿{¹{È:Ó?V×?\Ð?\ÐZ\Ó;]×;cÑ;cÓ;e÷ :ð :Ü�7—;‘;˜zÓ*×0Ð0¨bÓ1×7Ñ7Ó9ð;rS   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r`   rN   r   r>  rM   zdict[str, str]rO   )rP   s   "rQ   rR   rR   +  s(   € ÷ ñ �Sð ˜sð ¨#ð °~ñ rS   c                ó*   € RV RV/pV'       d   W#R&   V# )z:media_refs entry; ``name`` is only emitted when non-empty.r`   r   r>  rO   )r`   r   r>  Úrefs   &&& rQ   Ú
_media_refrØ  +  s   € à! 4¨°Ð4€CßØˆF‰Ø€JrS   c                  óü   € ] tR tRtRtRtRtRt]R R l4       t	]R R	 l4       t
]R
 R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]RR R ll4       tR R ltRtR# )ÚExtractContentMiddlewarei3  zAExtract raw text, media refs and forwarded records from msg_body.zextract-contentéè  z[unsupported message type]c               ó    € V ^8„  d   QhRRRR/# )rL   Úcustomrf   rM   rN   rO   )rP   s   "rQ   rR   Ú%ExtractContentMiddleware.__annotate__:  s   € ÷ 
 ñ 
  Dð 
 ¨Sñ 
 rS   c                óÂ  € V P                  RR4      V P                  RR4      r!V'       d
   RV RV R2MRV R2.p\        P                  p\        R V P                  R4      V P                  R	4      3 4       R
4      pV'       d1   TP	                  R\        V4      V8”  d   VR
V R,           MT 24       V'       d   VP	                  R4       RP                  V4      # )u9   elem_type 1010 (share card) â†’ bracket-placeholder text.ÚtitlerÝ   Úlinkz[share_card: z | Ú]c              3  óh   "  € T F(  q'       g   K  \        V\        4      '       g   K$  Vx € K*  	  R # 5irÃ   )rû   rN   )rq  rÍ   s   & rQ   rt  Ú?ExtractContentMiddleware._format_shared_link.<locals>.<genexpr>?  s%   é € ÐvÑ#Y˜aÓ]^œÔcmÐnoÔqt×cuŸšÓ#Yùs   ‚	2�2¨
2Úcard_contentÚ
wechat_desNz	Preview: z...(truncated)z[visit link for full content]rÜ  )rÉ   rÚ  Ú_CARD_CONTENT_MAX_LENGTHrv  r®  rË   Újoin)rÝ  rà  rá  ÚlinesÚmax_lenÚpreviews   &     rQ   Ú_format_shared_linkÚ,ExtractContentMiddleware._format_shared_link9  sÏ   € ð —j‘j ¨"Ó-¨v¯z©z¸&À"Ó/Eˆtß6:�=   s¨4¨&°Ñ2À-ÐPUÈwÐVWÐ@XÐYˆÜ*×CÑCˆÜÑv F§J¡J¨~Ó$>ÀÇ
Á
È<Ó@XÑ#YÓvÐx|Ó}ˆßØ�L‰L˜9ÌSÐQXË\Ð\cÔMc W¨X¨gÐ%6Ð9IÖ%IÐipÐ$qÐrÔsßØ�L‰LÐ8Ô9Ø�y‰y˜ÓÐrS   c               ó    € V ^8„  d   QhRRRR/# )rL   rÝ  rf   rM   r3  rO   )rP   s   "rQ   rR   rÞ  G  s   € ÷ 
kñ 
k¨4ð 
k°Mñ 
krS   c                óJ  € V P                  R4      pV'       g   R#  \        P                  ! V4      p\        V\        4      '       d   VP                  R4      MRpV'       d   \        V\        4      '       d   RV R2# R#   \        P
                  \        3 d    Rp LEi ; i)uF   elem_type 1007 (link understanding card) â†’ bracket-placeholder text.r  Nrá  z[link: z | visit link for full content])rÉ   rÞ   r­  rû   rf   rÉ  rÊ  rN   )rÝ  r  Úparsedrá  s   &   rQ   Ú_format_link_understandingÚ3ExtractContentMiddleware._format_link_understandingF  s’   € ð —*‘*˜YÓ'ˆßÙð	Ü—Z’Z Ó(ˆFÜ)3°F¼D×)AÒ)A�6—:‘:˜fÔ%ÀtˆD÷ CGÌ:ÐVZÔ\_×K`ÒK`�˜˜Ð=Ð>ÐjÐfjÐjøô ×$Ñ$¤iÐ0ô 	ØŠDð	ús   �?B ÂB"Â!B"c               ó    € V ^8„  d   QhRRRR/# ©rL   r   rN   rM   rO   )rP   s   "rQ   rR   rÞ  T  s   € ÷ ñ  ð ¨ñ rS   c                ó„  €  V '       dG   \         P                  P                  \         P                  P                  V 4      P                  4      M/ pVP                  R4      ;'       g    VP                  R4      ;'       g    . pV'       d!   \        V^ ,          4      P                  4       # R#   \         d     R# i ; i)z=resourceId from a Yuanbao resource URL's query string, or "".Ú
resourceIdÚ
resourceidrÝ   )	ÚurllibÚparseÚparse_qsÚurlparseÚqueryrÉ   rN   r\   rù   )r   rü  Úidss   &  rQ   Ú_parse_resource_idÚ+ExtractContentMiddleware._parse_resource_idS  sŒ   € ð	ßOR”F—L‘L×)Ñ)¬&¯,©,×*?Ñ*?ÀÓ*D×*JÑ*JÔKÐXZˆEØ—)‘)˜LÓ)×JÐJ¨U¯Y©Y°|Ó-D×JÐJÈˆCß*-”3�s˜1•v“;×$Ñ$Ó&Ð5°2Ð5øÜô 	Úð	ús/   ‚B0 ŠAB0 Á*B0 Â
B0 ÂB0 Â.B0 Â0B?Â>B?c               ó    € V ^8„  d   QhRRRR/# rÏ  rO   )rP   s   "rQ   rR   rÞ  ^  s   € ÷ @ñ @ ð @¨#ñ @rS   c                óœ  € V P                  R4      p\        V\        4      '       d   TM. p\        V4      ^8”  d'   \        V^,          \        4      '       d
   V^,          M/V'       d'   \        V^ ,          \        4      '       d
   V^ ,          MRp\        T;'       g    / P                  R4      ;'       g    R4      P                  4       # )zDURL of the medium image (index 1), falling back to index 0, else "".Úimage_info_arrayNr   rÝ   )rÉ   rû   rq   rË   rf   rN   r\   )r  ÚarrÚ
image_infos   &  rQ   Ú_pick_image_urlÚ(ExtractContentMiddleware._pick_image_url]  sž   € ð �k‰kÐ,Ó-ˆÜ ¤T×*Ò*‰c°ˆÜ" 3›x¨!œ|´
¸3¸q½6Ä4×0HÒ0H�S˜–V×X[Ô`jÐknÐopÕkqÔsw×`xÒ`xÈcÐRSÎfð  Cˆ
Ü�J×$Ð$ "×)Ñ)¨%Ó0×6Ð6°BÓ7×=Ñ=Ó?Ð?rS   c               ó    € V ^8„  d   QhRRRR/# )rL   r*  rq   rM   rN   rO   )rP   s   "rQ   rR   rÞ  f  s   € ÷ #ñ # Tð #¨cñ #rS   c                óâ  € . pV EF°  pVP                  RR4      pVP                  R/ 4      pV\        8X  d5   VP                  RR4      '       d   VP                  VR,          4       Ke  Kg  VR9   d”   RRRR	RR
/V,          pVR8X  d   V P                  V4      M1\	        VP                  R4      ;'       g    R4      P                  4       pV P                  V4      pTP                  V'       d
   RV RV R2MRV R24       EK  VR8X  dÇ   VP                  RVP                  RVP                  RR4      4      4      p	T P                  \	        VP                  R4      ;'       g    R4      P                  4       4      pV'       d*   TP                  V	'       d
   RV	 RV R2MRV R24       EK¬  TP                  V	'       d   RV	 R2MR4       EKÎ  VR8X  d4   VP                  V P                  VP                  RR4      4      4       EK  VR8X  d‚   Rp
VP                  RR4      '       dF    \        P                  ! VR,          4      P                  R4      ;'       g    RP                  4       p
TP                  V
'       d   RV
 R2MR4       EK�  V'       g   EK›  VP                  RV R24       EK³  	  RP                  V4      #   \        P                  \        \        3 d     Lzi ; i)zÏPlain text from MsgBody: text elems verbatim; media as ``[kind|ybres:RID]`` / ``[kind]``
(file: ``[file:{name}|ybres:RID]``); TIMFaceElem ``[emoji: name]``; custom elems by
elem_type. Parts are space-joined.rh   rÝ   ri   re   ÚTIMImageElemÚTIMSoundElemÚTIMVideoFileElemÚimageÚvoiceÚvideor   Ú[ú|ybres:râ  ÚTIMFileElemrÑ  rÒ  rb   z[file:z[file|ybres:ú[file: ú[file]rÆ  rã   ÚTIMFaceElemr>  z[emoji: z[emoji]Ú )r	  r
  r  )rÉ   rj   r®  r  rN   r\   rþ  Ú_custom_elem_textrÞ   r­  rÉ  rÊ  ÚAttributeErrorrè  )r†   r*  ÚpartsrË  Ú	elem_typer  r`   r   Úridrb   Ú	face_names   &&         rQ   Ú_extract_textÚ&ExtractContentMiddleware._extract_texte  s}  € ð
 ˆÜˆDØ!ŸX™X j°"Ó5ˆIØ ŸH™H ]°BÓ7ˆGØœOÔ+Ø—;‘;˜v r×*Ò*Ø—L‘L ¨¥Ö1ñ +àÐRÔRØ&¨°ÀÐJ\Ð^eÐfÐgpÕq�Ø6:¸g´o�c×)Ñ)¨'Ô2Ì3ÈwÏ{É{Ð[`ÓOa×OgÐOgÐegÓKh×KnÑKnÓKp�Ø×,Ñ,¨SÓ1�Ø—‘¿˜q   g¨c¨U°!Ñ4À1ÀTÀFÈ!À×MØ˜mÔ+Ø"Ÿ;™; {°G·K±KÀ
ÈGÏKÉKÐXbÐdfÓLgÓ4hÓi�Ø×,Ñ,¬S°·±¸UÓ1C×1IÐ1IÀrÓ-J×-PÑ-PÓ-RÓS�ßØ—L‘LÇX 6¨(¨°7¸3¸%¸qÑ!AÐUaÐbeÐafÐfgÐSh×ià—L‘L¿( 7¨8¨*°AÑ!6È×QØ˜oÔ-Ø—‘˜S×2Ñ2°7·;±;¸vÀrÓ3JÓK×LØ˜mÔ+Ø�	Ø—;‘;˜v r×*Ò*ðÜ%)§Z¢Z°¸µÓ%@×%DÑ%DÀVÓ%L×%RÐ%RÐPR×$YÑ$YÓ$[˜	ð —‘¿	˜x¨	 {°!Ñ4Ày×Qß’Ø—‘˜q  ¨1Ð-×.ñ; ð< �x‰x˜‹Ðøô !×0Ñ0´)¼^ÐLô Ùðús   È/2KÉ"KË K.Ë-K.c               ó    € V ^8„  d   QhRRRR/# )rL   Údata_valrN   rM   rO   )rP   s   "rQ   rR   rÞ  Œ  s   € ÷ gñ g¨ð g°ñ grS   c                óô  € V'       g   V P                   #  \        P                  ! V4      p\        T\        4      '       g   T P                   # TP                  R4      pTR8X  d   TP                  RR4      # TR8X  d   TP                  RR4      # TR8X  d   T P                  T4      # TR8X  d   T P                  T4      MR	;'       g    T P                   #   \        P                  \        3 d    Tu # i ; i)
z¤Text for a TIMCustomElem by elem_type: 1002 mention, 1010 share card, 1007 link card,
1009 forwarded chat-record summary; malformed JSON is passed through verbatim.r  éê  re   z	[mention]éñ  z[chat record]iò  iï  N)
Ú_UNSUPPORTEDrÞ   r­  rÉ  rÊ  rû   rf   rÉ   rì  rñ  )r†   r  rÝ  Úctypes   &&  rQ   r  Ú*ExtractContentMiddleware._custom_elem_text‹  sà   € ÷ Ø×#Ñ#Ð#ð	Ü—Z’Z Ó)ˆFô ˜&¤$×'Ò'Ø×#Ñ#Ð#Ø—
‘
˜;Ó'ˆØ�DŒ=Ø—:‘:˜f kÓ2Ð2Ø�DŒ=Ø—:‘:˜f oÓ6Ð6Ø�DŒ=Ø×*Ñ*¨6Ó2Ð2Ø:?À4¼-�×.Ñ.¨vÔ6ÈT×fÐfÐVY×VfÑVfÐføô ×$Ñ$¤iÐ0ô 	ØŠOð	ús   –C ÃC7Ã6C7c               ó    € V ^8„  d   QhRRRR/# )rL   re   rN   rM   rO   )rP   s   "rQ   rR   rÞ  ¡  s   € ÷ Eñ E Sð E¨Sñ ErS   c                ót   € V P                  4       p V P                  R4      '       d   RV R,          ,           # T # )zSStrip; convert a leading full-width slash (Chinese IME) to ASCII so commands match.u   ï¼�rÖ   :r‡  NN)r\   r±  rk   s   &rQ   Ú_rewrite_slash_commandÚ/ExtractContentMiddleware._rewrite_slash_command   s0   € ð �z‰z‹|ˆØ!%§¡°×!:Ò!:ˆs�T˜"•X�~ÐDÀÐDrS   c               ó    € V ^8„  d   QhRRRR/# )rL   r*  rq   rM   úlist[dict[str, str]]rO   )rP   s   "rQ   rR   rÞ  §  s   € ÷ ñ ¨dð Ð7Kñ rS   c           
     óJ  € . pT ;'       g    .  EF  p\        V\        4      '       g   K  VP                  RR4      pVP                  R/ 4      ;'       g    / p\        V\        4      '       g   Kb  VR8X  d=   \        P	                  V4      pV'       d   VP                  \        RV4      4       K£  K¥  VR8X  g   K®  \        VP                  R4      ;'       g    R4      P                  4       pV'       g   Kê  VP                  \        RV\        V4      4      4       EK  	  V# )	zhInbound image/file refs: ``[{"kind": "image", "url": ...}, {"kind": "file", "url": ..., "name": ...}]``.rh   rÝ   ri   r	  r  r  r   Úfile)
rû   rf   rÉ   rÚ  r  r®  rØ  rN   r\   rÔ  )r*  ÚrefsrË  rh   r  Ú	image_urlÚfile_urls   &      rQ   Ú_extract_inbound_media_refsÚ4ExtractContentMiddleware._extract_inbound_media_refs¦  sè   € ð &(ˆØ—N�N “NˆDÜ˜d¤D×)Ò)ÙØ—x‘x 
¨BÓ/ˆHØ—h‘h˜}¨bÓ1×7Ð7°RˆGÜ˜g¤t×,Ò,ÙØ˜>Ô)Ü4×DÑDÀWÓM�	ßØ—K‘K¤
¨7°IÓ >Ö?ñ à˜]Ö*Ü˜wŸ{™{¨5Ó1×7Ð7°RÓ8×>Ñ>Ó@�ß‘8Ø—K‘K¤
¨6°8¼ZÈÓ=PÓ Q×Rñ #ð ˆrS   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r*  rq   r  rN   rM   r#  rO   )rP   s   "rQ   rR   rÞ  ¼  s!   € ÷ ñ ¨Tð ¸Cð Èñ rS   c           	     óø  € \        V 4       EFU  w  r#\        V\        4      '       d   VP                  R4      R8X  g   K4  VP                  R4      ;'       g    / p\        V\        4      '       d	   V'       g    R# VP	                  4        FÑ  w  rVVP                  R4      '       d   \        V\        4      '       d	   V'       g   K<  \        P                  ! \        P                  \        4      ;_uu_ 4        \        \        P                  ! V4      4      p\        V\        4      '       d'   VP                  R4      ^8X  d   VuuRRR4       u u # RRR4       KÓ  	  EKX  	  R#   + '       g   i     Kí  ; i)zöForwardMsgData for elem_type 1009 (WeChat forward), or None. Payload lives in
``msg_content.ext_map`` (pb field 999) under ``wexin_forward_msg_[id]_[userid]`` keys as
base64 protobuf (NOT JSON); the first entry decoding to ``sub_type == 1`` wins.r  r"  Úext_mapNÚwexin_forward_msg_Úsub_type)rÍ  rû   rf   rÉ   rÈ   r±  rN   rÇ  rÈ  ÚbinasciiÚErrorrú   r7   Úbase64Ú	b64decode)r*  r  rÝ  r  r5  ÚkeyÚvaluerã   s   &&      rQ   Ú_extract_forwarded_recordsÚ3ExtractContentMiddleware._extract_forwarded_records»  sÿ   € ô
  2°(×;‰OˆFÜ˜v¤t×,Ò,°·±¸KÓ1HÈDÔ1PÙØ—k‘k )Ó,×2Ð2°ˆGÜ˜g¤t×,Ò,·GÚØ%Ÿm™mžo‘
�Ø—~‘~Ð&:×;Ò;Ä:ÈeÔUX×CYÒCY×afÙÜ×(Ò(¬¯©¼×DÕDÜ2´6×3CÒ3CÀEÓ3JÓK�DÜ! $¬×-Ò-°$·(±(¸:Ó2FÈ!Ô2KØ#÷ E×D×DÐDô .ñ  <ñ ÷	 E×DÐDús   Ã9AE(	Å(E9c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rÞ  Ï  rç  rS   c              ƒ  	ó$  "  € V P                  V P                  VP                  4      4      Vn        V P	                  VP                  4      Vn        V P                  VP                  VP                  4      Vn        V! 4       G R j  x€L
  R #  L5irÃ   )	r(  r  r*  r0  r1  r1  r>  r&  r2  rE  s   &&&rQ   rG  ÚExtractContentMiddleware.handleÏ  sd   é € Ø×2Ñ2°4×3EÑ3EÀcÇlÁlÓ3SÓTˆŒØ×9Ñ9¸#¿,¹,ÓGˆŒØ $× ?Ñ ?ÀÇÁÈc×N^ÑN^Ó _ˆÔÙ‹i�Œùs   ‚BBÂBÂBrO   Nr  )r‹   rŒ   r�   rŽ   r�   r>  rç  r#  r  rì  rñ  rþ  r  r�   r  r  r(  r1  r>  rG  r‘   rO   rS   rQ   rÚ  rÚ  3  sÚ   † ÙKØ€DØ#ÐØ/€Làô
 ó ð
 ð ô
kó ð
kð ôó ðð ô@ó ð@ð ô#ó ð#ðJ ôgó ðgð( ôEó ðEð
 ôó ðð( öó ð÷&ñ rS   rÚ  c                  ód   € ] tR tRt$ RtRt]! 0 Rm4      tR]R&   ]	RR R ll4       t
R R	 ltR
tR# )ÚPlaceholderFilterMiddlewareiÖ  z>Skip pure placeholder messages (e.g. '[image]' with no media).zplaceholder-filterrb  ÚSKIPPABLE_PLACEHOLDERSc               ó$   € V ^8„  d   QhRRRRRR/# )rL   re   rN   Úmedia_countr|   rM   r¹   rO   )rP   s   "rQ   rR   Ú(PlaceholderFilterMiddleware.__annotate__Ü  s&   € ÷ Oñ O¨Cð O¸cð OÈ$ñ OrS   c                	óV   € V^ 8*  ;'       d    VP                  4       V P                  9   # r  )r\   rE  )r†   re   rG  s   &&&rQ   Úis_skippable_placeholderÚ4PlaceholderFilterMiddleware.is_skippable_placeholderÛ  s&   € à˜aÑ×NÐN D§J¡J£L°C×4NÑ4NÑ$NÐNrS   c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rH  ß  rç  rS   c              ƒ  	ó  "  € V P                  VP                  \        VP                  4      4      '       d8   \        P                  R VP                  P                  VP                  4       R# V! 4       G Rj  x€L
  R#  L5i)z%[%s] Skipping placeholder message: %rN)rJ  r0  rË   r1  rô   rÞ  r   r>  rE  s   &&&rQ   rG  Ú"PlaceholderFilterMiddleware.handleß  sS   é € Ø×(Ñ(¨¯©´s¸3¿>¹>Ó7J×KÒKÜ�L‰LÐ@À#Ç+Á+×BRÑBRÐTW×T`ÑT`ÔaÙÙ‹i�Œùs   ‚A7BÁ9B Á:BrO   N>   õ   [å›¾ç‰‡]õ   [æ–‡ä»¶]õ   [è§†é¢‘]õ   [è¯­éŸ³]r  ú[image]ú[video]ú[voice]r  )r‹   rŒ   r�   rŽ   r�   r>  rb  rE  r  r�   rJ  rG  r‘   rO   rS   rQ   rD  rD  Ö  sB   ‡ ÙHØ€DÙ(1ò  3Nó  )OÐ˜Ió  OàöOó ðO÷ñ rS   rD  c                  ó„   € ] tR tRt$ RtRt]! 0 Rm4      tR]R&   ]	! ]
P                  4      t]R R l4       tR R	 ltR
tR# )ÚOwnerCommandMiddlewareiæ  zdBot-owner slash commands in groups: allowlisted commands skip @Bot; non-owner attempts are rejected.zowner-commandrb  Ú	ALLOWLISTc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rL   r$  rf   r*  rq   r.  rN   r&  rM   z)tuple[Optional[str], Optional[str], bool]rO   )rP   s   "rQ   rR   Ú#OwnerCommandMiddleware.__annotate__í  s<   € ÷ Jñ J¨Dð J¸Dð JÈSð JÐ`cð Jð  iRñ JrS   c               ó¢  € VR8w  g   V P                   '       g   R	# T;'       g    .  Uu. uF   qUP                  R4      \        8X  g   K  VNK"  	  pp\        V4      ^8w  d   R	# T P	                  V^ ,          P                  R4      ;'       g    / P                  RR4      4      pVP                  R4      '       g   R	# VP                  ^R7      ^ ,          P                  4       pW€P                   9  d   R	# \        T;'       g    / P                  R4      ;'       g    R4      P                  4       p	Y‡\        V	4      ;'       d    W”8H  3# u upi )
uS   â†’ (cmd, cmd_line, is_owner); (None, None, False) when not an allowlisted command.rZ   rh   ri   re   rÝ   rÖ   )ÚmaxsplitrÈ  )NNF)rX  rÉ   rj   rË   r(  r±  ÚsplitÚlowerrN   r\   r¹   )
r†   r$  r*  r.  r&  rá  Ú
text_elemsÚcmd_liner  Úowner_ids
   &$$$$     rQ   Ú_detect_owner_commandÚ,OwnerCommandMiddleware._detect_owner_commandì  s"  € ð ˜Ô s§}§} }Ø$Ð$à"*§. .¨b .ÓZ¡.˜A·U±U¸:Ó5FÌ/Ñ5Y—a�a¡.ˆ
ÐZÜˆz‹?˜aÔØ$Ð$Ø×-Ñ-¨z¸!­}×/@Ñ/@ÀÓ/O×/UÐ/UÐSU×.ZÑ.ZÐ[aÐceÓ.fÓgˆØ×"Ñ" 3×'Ò'Ø$Ð$Ø�n‰n aˆnÓ(¨Õ+×1Ñ1Ó3ˆØ—m‘mÔ#Ø$Ð$ô ˜Ÿ
˜
 ×'Ñ'¨Ó7×=Ð=¸2Ó>×DÑDÓFˆØœd 8›n×IÐI°Ñ1IÐIÐIùò [s   ªEÁ
Ec               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rZ     s   € ÷ ñ  ð ¸Dñ rS   c              ƒ  	ó®  "  € VP                   pV P                  VP                  VP                  VP                  VP
                  R 7      w  rEpV'       d‘   V'       g‰   \        P                  RVP                  VP                  VP
                  V4       VP                  \        P                  ! VP                  VP                  \        RVR7      4      RV 2R7      4       R# V'       dT   V'       dL   V'       dD   \        P                  RVP                  VP                  VP
                  V4       WAn        WQn        V! 4       G Rj  x€L
  R#  L5i))r$  r*  r.  r&  z;[%s] Reject non-owner slash command: chat=%s from=%s cmd=%sz%platform.yuanbao.owner_command_denied)Úcommandzyuanbao-owner-cmd-denial-©r>  Nz4[%s] Bot owner slash command: chat=%s from=%s cmd=%s)r   rb  r$  r*  r.  r&  rô   rõ   r>  r-  rS  r›   rT  Úsendr   r4  r0  )rF  rA  rB  r   Úmatched_cmdr`  Úis_owners   &&&    rQ   rG  ÚOwnerCommandMiddleware.handle   s  é € Ø—+‘+ˆØ*.×*DÑ*DØ—‘ C§L¡L¸C¿M¹MÐX[×XhÑXhð +Eó +
Ñ'ˆ˜x÷ ŸxÜ�K‰KÐUÐW^×WcÑWcÐeh×epÑepÐru÷  sCñ  sCð  EPô  QØ×Ñ¤× 3Ò 3Ø—‘˜SŸ[™[¬!Ð,SÐ]hÔ*iÓjØ0°°Ð>ô!@ô Añ ßŸ8¯Ü�K‰KÐNÐPW×P\ÑP\Ð^a×^iÑ^iÐkn×k{Ñk{ð  ~Iô  JØ +ÔØ#ŒLÙ‹i�Œùs,   ‚AEÁBEÃ/EÃ7EÃ?AEÅEÅErO   N>   ú/qú/bgú/btwú/newú/denyú/stopú/undoú/queueú/resetú/retryú/approve)r‹   rŒ   r�   rŽ   r�   r>  rb  rX  r  r  rÚ  r(  r�   rb  rG  r‘   rO   rS   rQ   rW  rW  æ  sS   ‡ ÙnØ€DÙ$ò  &Hó  I€Iˆyó  IÙ)Ð*B×*YÑ*YÓZÐàôJó ðJ÷&ñ rS   rW  c                  ó&   € ] tR tRtRtR R ltRtR# )ÚBuildSourceMiddlewarei  zbuild-sourcec               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú"BuildSourceMiddleware.__annotate__  ó   € ÷ ñ  ð ¸Dñ rS   c           	   ƒ  	óB  "  € VP                   P                  VP                  VP                  VP                  VP
                  ;'       g    R VP                  ;'       g    VP
                  VP                  R8X  d   RMR R7      Vn        V! 4       G R j  x€L
  R #  L5i)NrZ   r
  )r-  r.  r/  r  Ú	user_namer  )r   r  r-  r.  r/  r&  r)  r  rE  s   &&&rQ   rG  ÚBuildSourceMiddleware.handle  su   é € Ø—[‘[×-Ñ-Ø—K‘K¨3¯=©=ÀCÇMÁMØ×$Ñ$×,Ð,¨¸×8KÑ8K×8_Ð8_Ès×O_ÑO_Ø #§¡°Ô 8‘f¸dð .ó 
ˆŒ
ñ
 ‹i�Œùs   ‚ABÁ!5BÂBÂBrO   Nrö  rO   rS   rQ   rx  rx    s   † Ø€D÷ñ rS   rx  c                  ó¤   € ] tR tRtRtRt]R R l4       t]R R l4       t	]R R	 l4       t
]R
 R l4       t]RRRR/R R ll4       tR R ltRtR# )ÚGroupAtGuardMiddlewarei  zaGroup chat: observe non-@bot messages into the transcript; only @Bot (or owner commands) proceed.zgroup-at-guardc               ó$   € V ^8„  d   QhRRRRRR/# )rL   r*  rq   rä   r3  rM   zIterator[dict]rO   )rP   s   "rQ   rR   Ú#GroupAtGuardMiddleware.__annotate__#  s!   € ÷ ñ  Tð °=ð À^ñ rS   c              #  ó²   "  € V'       g   R# \        V 4       F9  w  r#VP                  R4      R8X  g   K  VP                  R4      V8X  g   K5  Vx € K;  	  R# 5i)zYYield @bot elems: TIMCustomElem whose data JSON has elem_type 1002 and user_id == bot_id.Nr  r!  r  )rÍ  rÉ   )r*  rä   rÝ  Ú_contents   &&  rQ   Ú_iter_bot_mentionsÚ)GroupAtGuardMiddleware._iter_bot_mentions"  sE   é € ÷ ÙÜ 2°8Ö <ÑˆFØ�z‰z˜+Ó&¨$Ö.°6·:±:¸iÓ3HÈFÖ3RØ”ó !=ùs   ‚.AµAÁ
Ac               ó$   € V ^8„  d   QhRRRRRR/# )rL   r*  rq   rä   r3  rM   r¹   rO   )rP   s   "rQ   rR   r‚  ,  s&   € ÷ Kñ K $ð K°ð KÀ$ñ KrS   c                	ó¦   € \         ;QJ d+    R  V P                  W4       4       F  '       g   K   R# 	  R# ! R  V P                  W4       4       4      # )c              3  ó&   "  € T F  pR x € K	  	  R# 5i)TNrO   )rq  ra   s   & rQ   rt  Ú4GroupAtGuardMiddleware._is_at_bot.<locals>.<genexpr>-  s   é € ÐJÑ!I˜A•4Ó!Iùs   ‚TF)Úanyr…  ©r†   r*  rä   s   &&&rQ   Ú
_is_at_botÚ!GroupAtGuardMiddleware._is_at_bot+  sA   € ç‹sÑJ ×!7Ñ!7¸Ô!IÓJ�sŒsÐJŠsÐJˆsÑJ ×!7Ñ!7¸Ô!IÓJÓJÐJrS   c               ó$   € V ^8„  d   QhRRRRRR/# ©rL   r*  rq   rä   r3  rM   rN   rO   )rP   s   "rQ   rR   r‚  0  s'   € ÷ @ñ @°ð @¸}ð @ÐQTñ @rS   c                óT   € \        R R V P                  W4       4        4       R4      # )zGDisplay text used to @-mention this bot (e.g. ``@yuanbao-bot``), or "".c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irÃ   rO   )rq  r   s   & rQ   rt  ÚCGroupAtGuardMiddleware._extract_bot_mention_text.<locals>.<genexpr>2  s   é € ÐzÑ t˜1Óxy—Q’QÓ tùó   ‚	�
c              3  ó†   "  € T F7  p\        VP                  R 4      ;'       g    R4      P                  4       x € K9  	  R# 5i)re   rÝ   NrÓ  )rq  Úcs   & rQ   rt  r“  2  s3   é € Ð tÑKsÀa¤ Q§U¡U¨6£]×%8Ð%8°bÓ!9×!?Ñ!?×!AÐ!AÓKsùs
   ‚!A¤ArÝ   )rv  r…  rŒ  s   &&&rQ   Ú_extract_bot_mention_textÚ0GroupAtGuardMiddleware._extract_bot_mention_text/  s*   € ô ÑzÑ tÈ3×KaÑKaÐbjÔKsÔ tÓzÐ|~ÓÐrS   c               ó$   € V ^8„  d   QhRRRRRR/# r�  rO   )rP   s   "rQ   rR   r‚  5  s!   € ÷ 

ñ 

¨dð 

¸Mð 

Ècñ 

rS   c                óf   € \         P                  W4      ;'       g    RpRT;'       g    R RV R2# )zGPer-turn group-chat prompt that highlights which message to respond to.ÚunknownzHYou are handling a Yuanbao group chat message.
- Your identity: user_id=z, @-mention name in this group=zá
- Lines in history prefixed with `[nickname|user_id]` are observed group context and are not necessarily addressed to you.
- Treat only the current new message as a request explicitly directed at you, and answer it directly.)r€  r—  )r*  rä   Úbot_mentions   && rQ   Ú_build_group_channel_promptÚ2GroupAtGuardMiddleware._build_group_channel_prompt4  sI   € ô -×FÑFÀxÓX×eÐeÐ\eˆð(Ø(.×(;Ð(;°)Ð'<Ð<[Ð\gÐ[hð i&ð&ð	
rS   r+  Nr2  c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )rL   Úsender_displayrN   re   rA  r  r+  r3  r2  r#  rM   ro   rO   )rP   s   "rQ   rR   r‚  B  sC   € ÷ Zñ ZÀSð ZÐPSð ZÐ]kð ZØ'4ðZØP^ðZØjnñZrS   c          	     ó(  € \        V4      pV'       g   R#  VP                  V4      p	Tp
V'       d1   \        P                  WuRR7      pV'       d   V'       d   V RV 2MTp
RRRRT R	VP                  ;'       g    R
 RV
 2R\
        P                  ! \        R7      P                  4       RR/pV'       d   WlR&   VP                  V	P                  V4       R#   \         d-   p\        P                  RTP                  T4        Rp?R# Rp?ii ; i)z•Record a group message as ``role: user`` ``[nickname|user_id]\n<content>`` without
invoking the agent, so later @bot turns see the full conversation.NF©rA  Úis_dispatchrÜ  rO  rP  r  r  Ú|r›  ú]
r¡   r°   ÚobservedTrZ  z([%s] Failed to observe group message: %s)rø  r  ÚForwardedRecordsParseMiddlewareÚbuild_forward_textr  r   r²   r
   r_  r^  r  rù   rô   rý   r>  )r†   r   r  r   re   rA  r+  r2  r  Úsession_entryÚ	body_textÚsummaryr·   r  s   &&&&&$$$      rQ   Ú_observe_group_messageÚ-GroupAtGuardMiddleware._observe_group_messageA  sþ   € ô
 ˜wÓ'ˆßÙð	ZØ!×7Ñ7¸Ó?ˆMØˆIß Ü9×LÑLÐM^ÐuzÐLÓ{�ßß8< 4 &¨¨7¨)Ñ 4À'�Ià˜ 	¨Q¨~Ð.>¸aÀÇÁ×@[Ð@[ÐR[Ð?\Ð\_Ð`iÐ_jÐ+kØœXŸ\š\¬SÔ1×;Ñ;Ó=¸zÈ4ðˆE÷ Ø&,�lÑ#Ø×&Ñ& }×'?Ñ'?ÀÖGøÜô 	ZÜ�N‰NÐEÀwÇ|Á|ÐUX×YÒYûð	Zús.   —C ²&C Á"C Á<;C Â8 C ÃDÃ%!DÄDc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   r‚  Z  r«  rS   c           
   ƒ  	ó$  "  € VP                   pVP                  R 8X  dÞ   VP                  '       gÌ   V P                  VP                  VP
                  4      '       g    T P                  Y1P                  VP                  ;'       g    VP                  VP                  VP                  ;'       g    RVP                  VR7       \        P                  RVP                  VP                   VP                  4       R# V! 4       G Rj  x€L
  R#  L5i)rZ   N)r+  r2  rA  z6[%s] Group message observed (no @bot): chat=%s from=%s)r   r.  r4  r�  r*  rl  r¬  r  r)  r&  r0  r+  r2  rô   rõ   r>  r-  )rF  rA  rB  r   s   &&& rQ   rG  ÚGroupAtGuardMiddleware.handleZ  sÉ   é € Ø—+‘+ˆØ�=‰=˜GÔ#¨C×,=×,=Ð,=ÀdÇoÁoÐVY×VbÑVbÐdk×dsÑds×FtÒFtØ×'Ñ'ØŸ™ S×%8Ñ%8×%LÐ%L¸C×<LÑ<LÈcÏlÉlØ—z‘z×)Ð) T¸S×=RÑ=RÐX[ð (ô ô �K‰KÐPÐRY×R^ÑR^Ð`c×`kÑ`kÐmp×m}Ñm}Ô~ÙÙ‹i�Œùs)   ‚/D²+DÁ(DÂ)DÂ1ADÄDÄDrO   )r‹   rŒ   r�   rŽ   r�   r>  r  r…  r�   r�  r—  r�  r¬  rG  r‘   rO   rS   rQ   r€  r€    sŽ   † ÙkØ€Dàôó ðð ôKó ðKð ô@ó ð@ð ô

ó ð

ð ðZØ7;ðZØaeöZó ðZ÷0	ñ 	rS   r€  c                  ó*   € ] tR tRtRtRtR R ltRtR# )ÚGroupAttributionMiddlewareif  zÏGroup @bot turns: build channel_prompt, rewrite raw_text to ``[nickname|user_id]\n<content>``
(matches observed-history format) and clear ``source.user_name`` to suppress the runner's
``[user_name]`` prefix.zgroup-attributionc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú'GroupAttributionMiddleware.__annotate__l  r{  rS   c              ƒ  	óþ  "  € VP                   R 8X  d×   VP                  '       gÅ   \        P                  VP                  VP
                  P                  4      Vn        RVP                  ;'       g    VP                  ;'       g    R RVP                  ;'       g    R RVP                   2Vn
        VP                  e(   \        P                  ! VP                  RR7      Vn        V! 4       G Rj  x€L
  R#  L5i)rZ   r  r›  r¤  r¥  N)r}  )r.  r4  r€  r�  r*  r   rl  r:  r)  r&  r0  r  ÚdataclassesÚreplacerE  s   &&&rQ   rG  Ú!GroupAttributionMiddleware.handlel  sÑ   é € Ø�=‰=˜GÔ#¨C×,=×,=Ð,=Ü!7×!SÑ!SÐTW×T`ÑT`Ðbe×bmÑbm×buÑbuÓ!vˆCÔØ˜s×2Ñ2×SÐS°c×6FÑ6F×SÐSÈ)ÐTÐTUÐVY×VfÑVf×VsÐVsÐjsÐUtÐtwÐx{÷  yEñ  yEð  xFð  GˆCŒLØ�z‰zÒ%Ü(×0Ò0°·±ÀtÔL�”
Ù‹i�Œùs*   ‚#C=¦AC=Á3C=ÂC=ÂAC=Ã4C;Ã5C=rO   Nrì  rO   rS   rQ   r²  r²  f  s   † ñð €D÷ñ rS   r²  c                  ó   € ] tR tRtRtRtR# )ÚYuanbaoMessageTypeiu  Úchat_recordrO   N)r‹   rŒ   r�   rŽ   ÚCHAT_RECORDr‘   rO   rS   rQ   rº  rº  u  s   † Ø„KrS   rº  r	  r
  r  r  c                  ó@   € ] tR tRtRtRt]R R l4       tR R ltRt	R	# )
ÚClassifyMessageTypeMiddlewarei}  zRMessageType (or yuanbao-local YuanbaoMessageType) from text and msg_body elements.zclassify-msg-typec               ó    € V ^8„  d   QhRRRR/# )rL   re   rN   r*  rq   rO   )rP   s   "rQ   rR   Ú*ClassifyMessageTypeMiddleware.__annotate__‚  s   € ÷  ñ  ˜ð   tñ  rS   c                	ó8  € V P                  R 4      '       d   \        P                  # V F»  pVP                  RR4      p\        P                  V4      pVe   Vu # VR8X  g   K;   \
        P                  ! VP                  R4      ;'       g    / P                  RR4      4      p\        V\        4      '       g   K“  VP                  R4      R8X  g   K«  \        P                  u # 	  \        P                  #   \
        P                  \        3 d    Rp Lsi ; i)	rÖ   rh   rÝ   NrÆ  ri   rã   r  r"  )r±  r   ÚCOMMANDrÉ   Ú_ELEM_MESSAGE_TYPESrÞ   r­  rÉ  rÊ  rû   rf   rº  r¼  r@  )re   r*  rË  ÚetypeÚmappedrÝ  s   &&    rQ   Ú	_classifyÚ'ClassifyMessageTypeMiddleware._classify�  sæ   € à�?‰?˜3×ÒÜ×&Ñ&Ð&ÛˆDØ—H‘H˜Z¨Ó,ˆEÜ(×,Ñ,¨UÓ3ˆFØÒ!Ø’Ø˜Ö'ð"Ü!ŸZšZ¨¯©°-Ó)@×)FÐ)FÀB×(KÑ(KÈFÐTVÓ(WÓX�Fô ˜f¤d×+Ô+°·
±
¸;Ó0GÈ4Ö0OÜ-×9Ñ9Ò9ñ ô ×ÑÐøô	 ×,Ñ,¬iÐ8ô "Ø!’Fð"ús   Á&'C9ÂC9Ã9DÄDc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rÀ  “  ó   € ÷ ñ  ð ¸Dñ rS   c              ƒ  	ó†   "  € V P                  VP                  VP                  4      Vn        V! 4       G R j  x€L
  R #  L5irÃ   )rÆ  r0  r*  rh   rE  s   &&&rQ   rG  Ú$ClassifyMessageTypeMiddleware.handle“  s(   é € Ø—~‘~ c§l¡l°C·L±LÓAˆŒÙ‹i�Œùs   ‚6A¸?¹ArO   N)
r‹   rŒ   r�   rŽ   r�   r>  r  rÆ  rG  r‘   rO   rS   rQ   r¾  r¾  }  s&   † Ù\Ø€Dàô ó ð ÷"ñ rS   r¾  c                  óB   € ] tR tRtRtRtR R ltR R ltR R	 ltR
t	R# )ÚQuoteContextMiddlewarei˜  z3Extract quote/reply context from cloud_custom_data.zquote-contextc               ó    € V ^8„  d   QhRRRR/# )rL   r,  rN   rM   z#tuple[Optional[str], Optional[str]]rO   )rP   s   "rQ   rR   Ú#QuoteContextMiddleware.__annotate__œ  s   € ÷ Uñ U¸ð UÐ@cñ UrS   c                ó¼  €  V'       d   \         P                  ! V4      MRp\	        V\
        4      '       d   VP                  R4      MRp\	        V\
        4      '       g   R	# \        VP                  R4      ;'       g    R4      P                  4       ;'       g    Rp\        VP                  R4      ;'       g    R4      P                  4       p\        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      P                  4       pYE'       d   V'       d	   V RV 23# T3# R3#   \         P                  \        3 d    Rp EL8i ; i)
uJ   (quote_id, quote_text) from cloud_custom_data â†’ MessageEvent.reply_to_*.NÚquoteÚidrÝ   Údescr)  r…  rà   r¢  )	rÞ   r­  rÉ  rÊ  rû   rf   rÉ   rN   r\   )rF  r,  rð  rÑ  Úquote_idrÓ  Úsenders   &&     rQ   Ú_extract_quote_contextÚ-QuoteContextMiddleware._extract_quote_contextœ  s  € ð	ß6G”T—Z’ZÐ 1Ô2ÈTˆFô (2°&¼$×'?Ò'?�—
‘
˜7Ô#ÀTˆÜ˜%¤×&Ò&ØÐÜ�u—y‘y “×,Ð,¨"Ó-×3Ñ3Ó5×=Ð=¸ˆÜ�5—9‘9˜VÓ$×*Ð*¨Ó+×1Ñ1Ó3ˆÜ�U—Y‘YÐ0Ó1×QÐQ°U·Y±Y¸{Ó5K×QÐQÈrÓR×XÑXÓZˆØÆd·˜V˜H B t fÐ-ÐTÐT¸TÐTÐTÐPTÐTÐTøô ×$Ñ$¤iÐ0ô 	Ø‹Fð	ús   ‚D: ŠD: Ä:EÅEc               ó    € V ^8„  d   QhRRRR/# )rL   rA  r  rM   úlist[tuple[str, str, str]]rO   )rP   s   "rQ   rR   rÏ  ª  s   € ÷ ñ ¸^ð ÐPjñ rS   c           	   ƒ  ó(  "  € VP                   f   . # VP                  p. p \        V4      pV'       d   VP                  f   . # VP	                  VP                  VP                  4      P                  4      p\        T;'       g    . 4       FŒ  pVP                  RR4      pV'       d   WqP                   8w  d   K/  VP                  RR4      p\        V\        4      '       d5   RV9   d.   VP                  \        \        P                  V4      4      4        V# 	   V#   \         d.   p	\         P#                  R\%        TRR4      T	4        Rp	?	T# Rp	?	i\&         d.   p	\         P#                  R	\%        TRR4      T	4        Rp	?	T# Rp	?	ii ; i5i)
z™``(rid, kind, filename)`` for ybres anchors in the quoted transcript message; [] when
there is no reply_to id, no store/source, or no resolvable anchors.NrZ  rÝ   r  r  z7[%s] quote transcript lookup: transcript unreadable: %sr>  Úyuanbaoz'[%s] quote transcript lookup failed: %s)r5  r   rø  r  rQ  r  r  ÚreversedrÉ   rû   rN   Úextendrc   Ú_YB_RES_REF_REÚfinditerrD   rô   rý   rù  rù   )
rF  rA  r   r1  r  Úhistoryræ   r+  r„  r  s
   &&        rQ   Ú#_extract_media_refs_from_transcriptÚ:QuoteContextMiddleware._extract_media_refs_from_transcriptª  sh  é € ð ×"Ñ"Ò*ØˆIØ—+‘+ˆØ13ˆ
ð	pÜ" 7Ó+ˆEß˜CŸJ™JÒ.Ø�	Ø×+Ñ+¨E×,GÑ,GÈÏ
É
Ó,S×,^Ñ,^Ó_ˆGÜ § ¨2Ö.�Ø—g‘g˜l¨BÓ/�ß˜c×%<Ñ%<Ô<ÙØŸ7™7 9¨bÓ1�Ü˜h¬×,Ò,°¸hÔ1FØ×%Ñ%Ô&6´~×7NÑ7NÈxÓ7XÓ&YÔZØð Ðò# /ð" Ðøô #ô 	ô �N‰NØIÜ˜ ¨Ó3°S÷ð ð Ðûô ô 	pÜ�N‰NÐDÄgÈgÐW]Ð_hÓFiÐkn×oÐoØÐûð	püsf   ‚F¢"D! ÁFÁAD! ÂBD! ÄFÄD! ÄFÄ!FÄ,"EÅFÅFÅ!FÅ""F
ÆFÆ
FÆFc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rÏ  É  s   € ÷ ñ  ð ¸Dñ rS   c              ƒ  	óÀ   "  € V P                  VP                  4      w  Vn        Vn        V P	                  V4      G R j  x€L
 Vn        V! 4       G R j  x€L
  R #  L L5irÃ   )rÖ  r,  r5  r6  rá  r7  rE  s   &&&rQ   rG  ÚQuoteContextMiddleware.handleÉ  sO   é € Ø59×5PÑ5PÐQT×QfÑQfÓ5gÑ2ˆÔ Ô!2Ø%)×%MÑ%MÈcÓ%R×RˆÔÙ‹i�Šñ  SÙùs"   ‚=A¿AÁ AÁAÁAÁArO   N)
r‹   rŒ   r�   rŽ   r�   r>  rÖ  rá  rG  r‘   rO   rS   rQ   rÍ  rÍ  ˜  s   † Ù=Ø€DõUõ÷>ñ rS   rÍ  c                  óŠ   € ] tR tRtRtRtRtR R lt]R R l4       t	]
RR	 R
 ll4       t]
R R l4       t]
R R l4       tRtR# )r§  iÏ  uG  Deep-parse WeChat forwarded chat records (elem_type 1009) on ``ctx.forwarded_records``:
render media as ``[kind|ybres:RID]``, append refs to ``ctx.media_refs`` and rewrite raw_text.
No run-time fallback for earlier forwards â€” GroupAtGuard already rendered summaries at observe
time. On any failure raw_text is left untouched.zforwarded-records-parserÛ  c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   Ú,ForwardedRecordsParseMiddleware.__annotate__×  s   € ÷ ñ  ð ¸Dñ rS   c           	   ƒ  	óZ  "  €  VP                   '       d=   V P                  V4      G R j  x€L
  V P                  VP                   VRR7      Vn        T! 4       G R j  x€L
  R #  L8  \         d7   p\
        P                  R\        TP                  RR4      T4        R p?LOR p?ii ; i LL5i)NTr¢  z,[%s] forwarded-records deep parse failed: %sr>  rÛ  )	r2  Ú_send_loading_heartbeatr¨  r0  rù   rô   rý   rù  r   )rF  rA  rB  r  s   &&& rQ   rG  Ú&ForwardedRecordsParseMiddleware.handle×  s˜   é € ð	yØ×$×$Ð$Ø×2Ñ2°3Ó7×7Ð7Ø#×6Ñ6°s×7LÑ7LÐRUÐcgÐ6Óh�”ñ ‹i�Šñ	 8øäô 	yÜ�N‰NÐIÌ7ÐSV×S^ÑS^Ð`fÐhqÓKrÐtw×xÑxûð	yúáùsJ   ‚B+„&A% ªA#«'A% Á
B+ÁB)ÁB+Á#A% Á%B&Á0,B!ÂB+Â!B&Â&B+c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rè  á  s   € ÷ iñ i¨>ð i¸dñ irS   c              ƒ  ó  "  € \         P                  ! \        4      ;_uu_ 4        V P                  P                  P
                  P                  V P                  \        4      G Rj  x€L
  RRR4       R#  L  + '       g   i     R# ; i5i)z@Best-effort RUNNING heartbeat so the user sees a loading bubble.N)	rÇ  rÈ  rù   r   Ú	_outboundÚ	heartbeatÚsend_heartbeat_oncer-  r.   )rA  s   &rQ   rê  Ú7ForwardedRecordsParseMiddleware._send_loading_heartbeatà  sY   é € ô × Ò ¤×+Õ+Ø—+‘+×'Ñ'×1Ñ1×EÑEÀcÇkÁkÔSgÓh×hÐh÷ ,Ñ+Ùh÷ ,×+Ð+üs/   ‚#B¥AA8Á'A6Á(A8Á,
BÁ6A8Á8B		Â	Bc               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úmediarf   Ú
plain_textrN   rM   z$tuple[str, Optional[dict[str, str]]]rO   )rP   s   "rQ   rR   rè  ç  s'   € ÷ Nñ N $ð N°Cð NÐAeñ NrS   c           
     ó‚  € VP                  RR4      ;'       g    VP                  RR4      P                  4       P                  4       p\        VP                  R4      ;'       g    R4      P                  4       p\        VP                  R4      ;'       g    R4      P                  4       p\        VP                  R4      ;'       g    R4      P                  4       ;'       g    \        P                  V4      pRRRRR	RR
RRR/P                  V4      pV'       dD   V'       d<   V'       d4   RV RV RV 2P                  4       \        YtVR8X  d   V4      3# R4      3# VR8X  d    RT;'       g    T 2P                  4       R3# VR8X  d   RV 2P                  4       R3# VR8X  d    RT;'       g    T 2P                  4       R3# VR8X  dE   RT;'       g%    \        VP                  R4      ;'       g    R4       RV 2P                  4       R3# RT;'       g    R RT;'       g    T 2P                  4       R3# )u¦   One ``multimedia`` entry â†’ ``(marker, ref)``: ``[kind|ybres:RID]`` + media_refs dict when a
RID/URL is usable, else a plain ``[kind] name`` marker and ``ref=None``.ÚtyperÝ   Údoc_typer   rÑ  Úmedia_idr  r-  Údocumentrâ   r  r  r  z] z[image] Nz[file] z[video] z[link] rà  r  ró  )rÉ   r\   r^  rN   rÚ  rþ  rç   rØ  )r†   ró  rô  Ú
media_typer   rÑ  r  r`   s   &&&     rQ   Ú_media_markerÚ-ForwardedRecordsParseMiddleware._media_markeræ  s!  € ð —i‘i ¨Ó+×HÐH¨u¯y©y¸ÀRÓ/H×OÑOÓQ×WÑWÓYˆ
Ü�%—)‘)˜EÓ"×(Ð( bÓ)×/Ñ/Ó1ˆÜ˜Ÿ	™	 +Ó.×4Ð4°"Ó5×;Ñ;Ó=ˆ	ä�%—)‘)˜JÓ'×-Ð-¨2Ó.×4Ñ4Ó6×jÐjÔ:R×:eÑ:eÐfiÓ:jˆØ˜ &¨&°*¸fÀfÈfÐV]Ð_fÐg×kÑkÐlvÓwˆß—CŸCØ�t�f˜G C 5¨¨9¨+Ð6×=Ñ=Ó?ÄÈDÐdhÐlrÔdrÐW`ÓA{Ð{Ð{ÐxzÓA{Ð{Ð{Ø�7Œ?Ø˜i×5Ð5¨:Ð6Ð7×>Ñ>Ó@À$ÐFÐFØ�6Œ>Ø˜Y˜KÐ(×/Ñ/Ó1°4Ð7Ð7Ø�7Œ?Ø˜i×.Ð.¨3Ð/Ð0×7Ñ7Ó9¸4Ð?Ð?Ø˜ÔØ˜Y×GÐG¬#¨e¯i©i¸Ó.@×.FÐ.FÀBÓ*GÐHÈÈ#ÈÐO×VÑVÓXÐZ^Ð^Ð^Ø�:×(Ð( Ð)¨¨C×,<Ð,<°9Ð+=Ð>×EÑEÓGÈÐMÐMrS   c               ó    € V ^8„  d   QhRRRR/# )rL   Úforward_datarf   rM   z/Iterator[tuple[str, str, list[dict[str, str]]]]rO   )rP   s   "rQ   rR   rè  ý  s   € ÷ 8ñ 8¨dð 8Ð7fñ 8rS   c              #  ó  "  € \        V\        4      '       d   VP                  R4      MR;'       g    .  EFÇ  p\        V\        4      '       g   K  VP                  RR4      p. p. pVP                  R. 4      ;'       g    .  EF  p\        V\        4      '       g   K  VP                  R^ 4      pV^8X  d$   VP                  VP                  RR4      4       KX  V^8X  dy   VP                  R. 4      ;'       g    .  FV  p\        V\        4      '       g   K  V P	                  Wƒ4      w  ršVP                  V	4       V
f   KE  VP                  V
4       KX  	  K×  V^8X  d   VP                  R	4       Kñ  V'       g   Kû  VP                  V4       EK  	  R
P                  R V 4       4      ;'       g    Tp\        V4      V P                  8”  d   VRV P                   R,           pVP                  RR4      W´3x € EKÊ  	  R# 5i)uµ   Yield ``(sender, body, refs)`` per ``ForwardMsgData['msg']`` record; body capped at
FORWARD_MSG_TEXT_MAX_CHARS. ``refs`` keeps textual order â€” PatchAnchorsMiddleware relies on it.ræ   NÚ	plainTextrÝ   Ú
msgContentrö  re   Ú
multimediau   [åµŒå¥—è�Šå¤©è®°å½•]z  c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irÃ   rO   )rq  Úps   & rQ   rt  ÚEForwardedRecordsParseMiddleware._walk_forward_msgs.<locals>.<genexpr>  s   é € Ð 7©E q³Q§¢«Eùr”  u   â€¦(å·²æˆªæ–­)rÕ  )rû   rf   rÉ   r®  rû  rè  rË   ÚFORWARD_MSG_TEXT_MAX_CHARS)r†   rþ  ræ   rô  r.  r  ÚmcÚmc_typeró  Úmarkerr×  Úrendereds   &&          rQ   Ú_walk_forward_msgsÚ2ForwardedRecordsParseMiddleware._walk_forward_msgsü  sª  é € ô 0:¸,Ì×/MÒ/M�L×$Ñ$ UÔ+ÐSW×^Ð^Ð\^Ó^ˆCÜ˜c¤4×(Ò(ÙØŸ™ ¨bÓ1ˆJØ)+ˆDØ!ˆEØ—g‘g˜l¨BÓ/×5Ð5°2Ó5�Ü! "¤d×+Ò+ÙØŸ&™& ¨Ó+�Ø˜a”<Ø—L‘L §¡¨°Ó!3Ö4Ø ”\Ø!#§¡¨°bÓ!9×!?Ð!?¸RÒ!?˜Ü% e¬T×2Ô2Ø*-×*;Ñ*;¸EÓ*N™K˜FØ!ŸL™L¨Ô0Ø"œØ $§¡¨CÖ 0ó "@ð  ”\Ø—L‘LÐ!7Ö8ß‘ZØ—L‘L ×,ñ! 6ð" —y‘yÑ 7©EÓ 7Ó7×EÐE¸:ˆHÜ�8‹}˜s×=Ñ=Ô=Ø#Ð$D c×&DÑ&DÐEÐHXÕX�Ø—'‘'˜( BÓ'¨Ð7Õ7ó5 _ùs1   ‚0H³AHÂA:HÃ<HÄ%HÅ6HÅ?4HÆ4AHc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   rþ  rf   rA  r  r£  r¹   rM   rN   rO   )rP   s   "rQ   rR   rè    s*   € ÷ ñ ¨dð ¸Nð ÐY]ð Ðbeñ rS   c               ó¢  € RVP                   ;'       g    R 2R.pV P                  V4       FA  w  rVpVP                  V RV 24       V'       g   K&  VP                  P	                  V4       KC  	  RP                  V4      pV'       dE   VP                  P                  4       '       d%   VRVP                  P                  4        2,          pV# )uÍ   Render ``ForwardMsgData`` as ``å�‘é€�äººï¼šæ­£æ–‡`` lines with media markers. When ``is_dispatch``,
refs go to ``ctx.media_refs`` and a ``ç”¨æˆ·é™„è¨€ï¼š`` footer is added (observe-time callers skip both).u   å½“å‰�ç”¨æˆ·çš„æ˜µç§°ä¸ºu   ç”¨æˆ·u   ä»¥ä¸‹ä¸ºç”¨æˆ·çš„è�Šå¤©è®°å½•u   ï¼šrÜ  u   

ç”¨æˆ·é™„è¨€ï¼š)r)  r  r®  r1  rÝ  rè  r0  r\   )	r†   rþ  rA  r£  ré  rÕ  Úbodyr.  re   s	   &&$$     rQ   r¨  Ú2ForwardedRecordsParseMiddleware.build_forward_text  s¸   € ð ,¨C×,?Ñ,?×,KÐ,KÀ8Ð+LÐMÐOoÐpˆØ"%×"8Ñ"8¸Ö"FÑˆF˜$Ø�L‰L˜F˜8 3 t fÐ-Ô.ß‰{Ø—‘×%Ñ% dÖ+ñ #Gð �y‰y˜Óˆß˜3Ÿ<™<×-Ñ-×/Ò/ØÐ)¨#¯,©,×*<Ñ*<Ó*>Ð)?Ð@Õ@ˆDØˆrS   rO   Nr  )r‹   rŒ   r�   rŽ   r�   r>  r  rG  r  rê  r�   rû  r  r¨  r‘   rO   rS   rQ   r§  r§  Ï  sm   † ñ8ð %€DØ!%Ðõð ôió ðið
 öNó ðNð* ô8ó ð8ð> ôó ôrS   r§  c                  ó„  € ] tR tRt$ RtRt/ tR]R&   R,tR]R&   Rt	R]R	&   ]
R
 R l4       t]
R R l4       t]
R R l4       t]R R l4       t]R R l4       t]R R l4       t]
RRRRRR/R R ll4       t]
R R l4       t]
R R  l4       t]
R! R" l4       t]
R# R$ l4       t]
R% R& l4       t]R' R( l4       tR) R* ltR+tR# )-ÚMediaResolveMiddlewarei+  zÂResolve inbound media references to local cached files. Yuanbao COS hostnames resolve to
private IPs (tripping vision_tools' SSRF guard), so we download ourselves and hand the model
local paths.zmedia-resolvez+ClassVar[dict[str, tuple[str, str, float]]]Ú_resource_cacheúClassVar[int]Ú_RESOURCE_CACHE_TTL_Sé   Ú_RESOURCE_CACHE_MAX_SIZEc               ó    € V ^8„  d   QhRRRR/# )rL   Úresource_idrN   rM   úOptional[tuple[str, str]]rO   )rP   s   "rQ   rR   Ú#MediaResolveMiddleware.__annotate__6  s   € ÷ 	 ñ 	 ¨sð 	 Ð7Pñ 	 rS   c                óD  € V'       d   V P                   P                  V4      MRpVf   R# Vw  r4p\        P                  ! 4       V,
          V P                  8”  g&   \        P
                  P                  V4      '       g   V P                   P                  VR4       R# W43# )z^Cached ``(local_path, mime)`` if unexpired and the file still exists (cache dir may be swept).N)r  rÉ   r¼   r  rÀ  ÚpathÚisfilerÊ   )r†   r  r·   Ú
local_pathÚmimeÚtss   &&    rQ   Ú_get_cached_resourceÚ+MediaResolveMiddleware._get_cached_resource5  s~   € ÷ 9D�×#Ñ#×'Ñ'¨Ô4ÈˆØŠ=ÙØ$Ñˆ
˜"Ü�9Š9‹;˜Õ˜c×7Ñ7Ô7¼r¿w¹w¿~¹~Èj×?YÒ?YØ×Ñ×#Ñ# K°Ô6ÙØÐÐrS   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r  rN   r  r   rM   ro   rO   )rP   s   "rQ   rR   r  B  s/   € ÷ Kñ K¨sð KÀð KÈ3ð KÐSWñ KrS   c                óT  a € V'       g   R# \        S P                  4      S P                  8¼  dU   \        S P                  V 3R lR7      pVRS P                  ^,            F  pS P                  P	                  VR4       K!  	  W#\
        P
                  ! 4       3S P                  V&   R# )z@Cache a download result; evicts the oldest 25% when at capacity.Nc                ó8   <€ SP                   V ,          ^,          # )rL   )r  )rÌ   r†   s   &€rQ   Ú<lambda>Ú=MediaResolveMiddleware._put_cached_resource.<locals>.<lambda>G  s   ø€ ÀC×DWÑDWÐXYÕDZÐ[\ÖD]rS   )r<  )rË   r  r  ÚsortedrÊ   r¼   )r†   r  r  r   Úsorted_keysrÌ   s   f&&&  rQ   Ú_put_cached_resourceÚ+MediaResolveMiddleware._put_cached_resourceA  s†   ø€ ÷ ÙÜˆs×"Ñ"Ó# s×'CÑ'CÔCÜ  ×!4Ñ!4Ô:]Ô^ˆKØ Ð!D 3×#?Ñ#?À1Õ#DÓE�Ø×#Ñ#×'Ñ'¨¨4Ö0ñ Fà,6¼d¿iºi»kÐ+Jˆ×Ñ˜KÓ(rS   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r  rN   Úmedia_pathsr   ÚmimesrM   r¹   rO   )rP   s   "rQ   rR   r  M  s*   € ÷ ñ ¸3ð ÈYð Ð_hð Ðmqñ rS   c                óä   € V P                  V4      pVf   R# \        P                  RVP                  W%^ ,          4       VP	                  V^ ,          4       VP	                  V^,          4       R# )z<Append a cached resource to the output lists; False on miss.Fú'[%s] resource cache hit: rid=%s path=%sT)r"  rô   rÞ  r>  r®  )r†   r   r  r.  r/  Úhits   &&&&& rQ   Ú_append_cached_resourceÚ.MediaResolveMiddleware._append_cached_resourceL  s\   € ð ×&Ñ& {Ó3ˆØŠ;ÙÜ�‰Ð>ÀÇÁÈkÐ_`Õ[aÔbØ×Ñ˜3˜q�6Ô"Ø�‰�S˜•VÔÙrS   c               ó    € V ^8„  d   QhRRRR/# rô  rO   )rP   s   "rQ   rR   r  X  s   € ÷ nñ n sð n¨sñ nrS   c                	óÎ   € \         P                  P                  \        P                  P                  V 4      P                  4      ^,          P                  4       pVR9   d   V# R# )r‡  ú.jpg>   ú.bmpú.gifr7  ú.pngú.heicú.jpegú.tiffú.webp)rÀ  r  Úsplitextrø  rù  rû  r^  )r   Úexts   & rQ   Ú_guess_image_ext_from_urlÚ0MediaResolveMiddleware._guess_image_ext_from_urlW  sM   € ä�g‰g×ÑœvŸ|™|×4Ñ4°SÓ9×>Ñ>Ó?ÀÕB×HÑHÓJˆØÐaÔaˆsÐmÐgmÐmrS   c               ó    € V ^8„  d   QhRRRR/# )rL   r  rN   rM   rO   )rP   s   "rQ   rR   r  ]  s   € ÷ $Hñ $H¸ð $HÀñ $HrS   c              ƒ  ó<  a "  € VP                  4       pV'       g   \        R4      hR V 3R llpT! S P                  4       G Rj  x€L
 R4      pVf   \        R4      hS P                   R2p\        P
                  ! RR	R
7      ;_uu_4       GRj  x€L
 p\        ^4       EF¯  pVP                  VRV/VR7      G Rj  x€L
 pVP                  R8X  dg   V^ 8X  d`   \        P                  S P                  S P                  S P                  4      G Rj  x€L
 pT! YƒR,          ;'       g    R4      pVf    EMK™  VP                  4        VP                  4       p	V	P                  R4      p
V
R9  d"   \        RV
 RV	P                  RR4       24      h\        V	P                  R4      \         4      '       d   V	P                  R4      MT	p\#        T;'       g    / P                  R4      ;'       g&    T;'       g    / P                  R4      ;'       g    R4      P                  4       pV'       d   Tu uuRRR4      GRj  x€L
  # \        R4      h	  RRR4      GRj  x€L
  \        R4      h EL+ ELâ EL¸ ELf L9 L  + GRj  x€L 
 '       g   i     L4; i5i)zœExchange a ``resourceId`` for a direct download URL via ``/api/resource/v1/download``,
with a single 401-retry after token force-refresh. Raises on failure.zmissing resource_idc               ó$   € V ^8„  d   QhRRRRRR/# )rL   Ú
token_datarf   Úfallback_sourcerN   rM   r#  rO   )rP   s   "rQ   rR   Ú@MediaResolveMiddleware._fetch_resource_url.<locals>.__annotate__c  s&   € ÷ 	nñ 	n dð 	n¸Sð 	nÀ^ñ 	nrS   c                ó¸  <€ \        V P                  R 4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g!    SP                  ;'       g    SP                  4      P                  4       pV'       d	   V'       g   R# \        V P                  R4      ;'       g    T4      P                  4       ;'       g    RpRRRVR	VR
V/# )r  rÝ   rä   Nr  ÚwebrÚ   rÛ   zX-IDzX-TokenúX-Source)rN   rÉ   r\   rl  Ú_app_key)rF  rG  r  rä   r  r   s   &&   €rQ   Ú_auth_headersÚAMediaResolveMiddleware._fetch_resource_url.<locals>._auth_headersc  s­   ø€ Ü˜
Ÿ™ wÓ/×5Ð5°2Ó6×<Ñ<Ó>ˆEÜ˜Ÿ™¨Ó1×XÐX°W·_±_×XÐXÈ×HXÑHXÓY×_Ñ_ÓaˆFß§ÙÜ˜Ÿ™¨Ó1×DÐD°_ÓE×KÑKÓM×VÐVÐQVˆFØ"Ð$6¸ÀÈ	ÐSXÐZdÐflÐmÐmrS   NrJ  z-missing token or bot_id for resource downloadz/api/resource/v1/downloadrF   T)rØ   Úfollow_redirectsrö  )Úparamsrß   i‘  rK  râ   z"resource/v1/download failed: code=rå   ræ   rÝ   rã   r   ÚrealUrlz(resource/v1/download missing url/realUrlz)resource/v1/download did not return a URL>   Nr€  )r\   rø   Ú_get_cached_tokenÚ_api_domainré   rê   rì   rÉ   r÷   r“   r  rL  Ú_app_secretÚraise_for_statusrÞ   rû   rf   rN   )r   r  rM  rß   Úapi_urlr  r  ÚresprF  r  râ   rã   Úreal_urls   f&           rQ   Ú_fetch_resource_urlÚ*MediaResolveMiddleware._fetch_resource_url\  s2  øé € ð "×'Ñ'Ó)ˆßÜÐ4Ó5Ð5÷	nð 	nñ   g×&?Ñ&?Ó&A× AÀ5ÓIˆØŠ?ÜÐNÓOÐOØ×(Ñ(Ð)Ð)BÐCˆÜ×$Ò$¨TÀD×I×IÕIÈVÜ  Ÿ8�Ø#ŸZ™Z¨¸À{Ð8SÐ]d˜ZÓe×e�Ø×#Ñ# sÔ*¨w¸!¬|Ü'2×'@Ñ'@À×AQÑAQÐSZ×SfÑSfÐho×h{Ñh{Ó'|×!|�JÙ+¨JÀ
Õ8K×8TÐ8TÈuÓU�GØ’ÚÙØ×%Ñ%Ô'ØŸ)™)›+�Ø—{‘{ 6Ó*�Ø˜yÔ(Ü&Ð)KÈDÈ6ÐQWÐX_×XcÑXcÐdiÐkmÓXnÐWoÐ'pÓqÐqÜ.8¸¿¹ÀVÓ9LÌd×.SÒ.S�w—{‘{ 6Ô*ÐY`�Ü §
 
¨×/Ñ/°Ó6×[Ð[¸4¿:¸:À2×:JÑ:JÈ9Ó:U×[Ð[ÐY[Ó\×bÑbÓd�ßØ#‘O÷# J×IÒIô$ #Ð#MÓNÐNñ# $÷ J×Iô& ÐFÓGÐGò/ !Bò Jâeâ!|÷	 J×I×IÔIüsÉ   ƒAJÁI0ÁAJÂI3ÂJÂ)J Â>I6
Â?AJ ÄI9
ÄJ Ä*B.J ÇJ Ç2	J Ç<J ÈJ È2J È5JÉI<ÉJÉJ ÉJÉ I>É!JÉ3JÉ6J É9J É<JÉ>JÊ J	ÊJ	Ê
J	ÊJ	ÊJc               ó    € V ^8„  d   QhRRRR/# rô  rO   )rP   s   "rQ   rR   r  „  s   € ÷ 	ñ 	°#ð 	¸#ñ 	rS   c              ƒ  ó®   "  € \         P                  V4      pV'       g   V#  \        P                  W4      G Rj  x€L
 #  L  \         d    Tu # i ; i5i)u³   Resolve a Yuanbao resource placeholder URL (``â€¦/api/resource/download?resourceId=â€¦``,
which 401s on direct GET) to a fetchable URL via the business API; passthrough otherwise.N)rÚ  rþ  r  rY  rù   )r   r   r  s   && rQ   Ú_resolve_download_urlÚ,MediaResolveMiddleware._resolve_download_urlƒ  sN   é € ô /×AÑAÀ#ÓFˆßØˆJð	Ü/×CÑCÀGÓY×YÐYÑYøÜô 	ØŠJð	üs7   ‚ A£A »A ¼A ¿AÁ A ÁAÁAÁAÁArÑ  NÚlog_tagrÝ   r  c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
rL   Ú	fetch_urlrN   r`   rÑ  r3  r_  r  rM   r  rO   )rP   s   "rQ   rR   r  �  s>   € ÷ ' ñ ' Ø$'ð' Ø/2ð' à ð' à25ð' àILð' ð 
#ñ' rS   c             ƒ  ó   "  € V'       d@   V P                  V4      pVe+   \        P                  RVP                  Wg^ ,          4       V#  \	        W!P
                  R7      G Rj  x€L
 w  r‰TR8X  dh   T P                  T4      p \        Y‹R7      G Rj  x€L
 p\        RT 24      pTP                  R4      '       g   T	P                  R4      '       d   T	MR	pMÖTR
8X  dC   \        T4      G Rj  x€L
 p\        T4      ;'       g    T	P                  R4      '       d   T	MRpM�T;'       gQ    \        P                  P!                  \"        P$                  P'                  T4      P                  4      ;'       g    Rp \)        Y„4      G Rj  x€L
 p\        T4      ;'       g    T	;'       g    RpT P+                  YlT4       YÍ3#  EL`  \         d.   p
\        P                  RTP                  Y5T
4        Rp
?
R# Rp
?
ii ; i ELo  \         d-   p
\        P                  RTP                  YZ4        Rp
?
R# Rp
?
ii ; i ELQ L¶  \         d-   p
\        P                  RTP                  YZ4        Rp
?
R# Rp
?
ii ; i5i)u˜   Download a Yuanbao resource into the local media cache â†’ ``(local_path, mime)`` or None.
A *resource_id* is checked against the in-memory cache first.Nr1  ©Úmax_size_mbz5[%s] inbound media download failed: kind=%s %s err=%sr  )r@  z,[%s] inbound image cache rejected: %s err=%súimage/ú
image/jpegr  zvideo/z	video/mp4r-  z)[%s] inbound file cache failed: %s err=%súapplication/octet-stream)r"  rô   rÞ  r>  Úmedia_download_urlÚMEDIA_MAX_SIZE_MBrù   rý   rA  r   rú   r+   r±  r   rÀ  r  Úbasenamerø  rù  rû  r   r+  )r†   r   ra  r`   rÑ  r_  r  r2  Ú
file_bytesÚcontent_typer  r@  r  r   s   &&$$$$$       rQ   Ú_download_and_cacheÚ*MediaResolveMiddleware._download_and_cache�  s  é € ÷ Ø×*Ñ*¨;Ó7ˆCØŠÜ—‘ÐFÈÏÉÐVaÐghÕciÔjØ�
ð	Ü-?À	×WpÑWpÔ-q×'qÑ$ˆJð �7Œ?Ø×/Ñ/°	Ó:ˆCðÜ#?À
Ô#T×T�
ô # U¨3¨% =Ó1ˆDØ—?‘? 8×,Ò,Ø'3×'>Ñ'>¸x×'HÒ'H‘|Èl�øØ�WŒ_ä;¸JÓG×GˆJÜ" :Ó.×vÐvÀ<×CZÑCZÐ[c×CdÒCd±<Ðju‰Dà!×fÐf¤R§W¡W×%5Ñ%5´f·l±l×6KÑ6KÈIÓ6V×6[Ñ6[Ó%\×fÐfÐ`fˆIðÜ#BÀ:Ó#Y×Y�
ô # 9Ó-×[Ð[°×[Ð[ÐA[ˆDØ× Ñ  ¸$Ô?ØÐÐò7 (røÜô 	Ü�N‰NÐRÐT[×T`ÑT`ÐbfÐqtÔuÝûð	úò UøÜô Ü—‘ÐMÈwÏ|É|Ð]dÔjÝûðúò Hñ
 ZøÜô Ü—‘ÐJÈGÏLÉLÐZaÔgÝûðüsñ   ‚AI>ÁG Á$GÁ%G Á+I>ÂH ÂHÂH Â;I>ÃI>Ã.H?Ã/I>ÄI>ÄI>Ä+AI>Å9I>Å=I ÆIÆI ÆI>Æ"	I>Æ,I>ÇG ÇG?Ç"G:Ç4I>Ç:G?Ç?I>ÈH ÈH<È!H7È1I>È7H<È<I>ÉI ÉI;É!I6É0I>É6I;É;I>c               ó    € V ^8„  d   QhRRRR/# )rL   r1  r+  rM   útuple[list[str], list[str]]rO   )rP   s   "rQ   rR   r  º  s   € ÷ 'ñ 'Ð<Pð 'ÐUpñ 'rS   c              ƒ  ó¼  a a"  € . p. p. pV EF  p\        VP                  R4      ;'       g    R4      P                  4       P                  4       p\        VP                  R4      ;'       g    R4      P                  4       pV\        9  g	   V'       g   K‹  \
        P                  V4      p	V	'       d   S P                  SW“V4      '       d   KÃ  TP                  T\        VP                  R4      ;'       g    R4      P                  4       T	;'       g    RV34       EK  	  V'       d,   S P                  SVRW4VV 3R lRR R	R
 R R7      G Rj  x€L
  W43#  L5i)u¡   Resolve inbound media refs â†’ (local_paths, mime_types); same bounded-concurrency,
order-preserving, exception-isolated contract as :meth:`_resolve_ybres_refs`.r`   rÝ   r   r>  ró  c                ó(   <€ SP                  SV 4      # rÃ   )r]  )r   r   r†   s   &€€rQ   r'  Ú<MediaResolveMiddleware._resolve_media_urls.<locals>.<lambda>Ì  s   ø€  C×$=Ñ$=¸gÀsÔ$KrS   z8[%s] inbound media resolve failed: kind=%s url=%s err=%sc                ó   € W3# rÃ   rO   ©r`   r   s   &&rQ   r'  rs  Í  s   € ÐrvÑq|rS   z9[%s] inbound media resolve crashed: kind=%s url=%s err=%sc                ó   € WR ,          3# )ºNéP   NrO   ru  s   &&rQ   r'  rs  Î  s   € Ðuyð  @Cõ  |Dñ  uErS   c                ó   € R V R,           2# )zplaceholder_url=rw  rO   )r   s   &rQ   r'  rs  Ï  s   € Ð&6°s¸3µx°jÑ$ArS   ©Úget_urlÚfail_fmtÚ	fail_argsÚ	crash_fmtÚ
crash_argsr_  N)
rN   rÉ   r\   r^  r]   rÚ  rþ  r3  r®  Ú_gather_resolve)
r†   r   r1  r8  r9  Úactiver×  r`   r   r  s
   ff&       rQ   Ú_resolve_media_urlsÚ*MediaResolveMiddleware._resolve_media_urls¹  s3  ùé € ð !#ˆ
Ø!#ˆØ24ˆÜˆCÜ�s—w‘w˜v“×,Ð,¨"Ó-×3Ñ3Ó5×;Ñ;Ó=ˆDÜ�c—g‘g˜e“n×*Ð*¨Ó+×1Ñ1Ó3ˆCØÔ2Ô2¿#ÙÜ*×=Ñ=¸cÓBˆCß�s×2Ñ2°7¸CÈ[×YÒYÙØ�M‰M˜4¤ S§W¡W¨V£_×%:Ð%:¸Ó!;×!AÑ!AÓ!CÀSÇYÀYÈBÐPSÐT×Uñ ÷ Ø×%Ñ%Ø˜ ¨*ÝKØSÑ_|ØUñ  cEÙAð &ó ÷ ð ð Ð&Ð&ñùs;   „)E®?EÁ.'EÂEÂ5AEÃ9EÄEÄ,&EÅEÅEc               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r  Ô  s   € ÷ !
ñ !
Ø_cñ!
rS   c          
   ƒ  ó<  a aaaaaaa"  € \         P                  ! SP                  4      oR VV VVVVV3R llo\        P                  ! 4       p\         P
                  ! V3R lV 4       RR/ G Rj  x€L
 p\        \        P                  ! 4       V,
          R,          4      p^ p\        W-4       F¢  w  w  ppppp\        V\        4      '       d-   \        P                  ! V	SP                  .V
! VV4      OVN5!   Ve   \        V\        4      '       d   V^,          pKr  VP                  V^ ,          4       VP                  V^,          4       K¤  	  \        P                  RSP                  VSP                  \        V4      \        V4      Wþ4       R#  EL'5i)	u4  Resolve ``(kind, filename, rid, key)`` items under bounded concurrency â€” ``await get_url(key)``
then download+cache â€” appending successes in input order. ``return_exceptions=True`` isolates
per-item failures; the batch summary line keeps stable fields (concurrency vs elapsed_ms) for
offline aggregation.c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )rL   r`   rN   rb   r  r<  rM   r  rO   )rP   s   "rQ   rR   Ú<MediaResolveMiddleware._gather_resolve.<locals>.__annotate__Ü  s0   € ÷ 		ñ 		˜Sð 		¨Cð 		°cð 		Àð 		ÐHañ 		rS   c              “  óÈ  <"  € S;_uu_4       GR j  x€L
   S
! V4      G R j  x€L
 pSP	                  SY@T;'       g    R S! T4      TR7      G R j  x€L
 uuR R R 4      GR j  x€L
  #  LU LF  \          dH   p\        P                  ! S	SP                  .S! Y4      OTN5!    R p?R R R 4      GR j  x€L 
  R # R p?ii ; i Lo L`  + GR j  x€L 
 '       g   i     R # ; i5i)N)ra  r`   rÑ  r_  r  )rù   rô   rý   r>  rm  )r`   rb   r  r<  ra  r  r   r†   r}  r|  r{  r_  Ú	semaphores   &&&&  €€€€€€€rQ   Ú_oneÚ4MediaResolveMiddleware._gather_resolve.<locals>._oneÜ  s®   øé € ß —y’yð Ù&-¨c£l× 2�Ið !×4Ñ4Ø yÀx×GWÐGWÐSWÑahÐilÓamÐ{~ð 5ó ÷ ÷ !—y”yá 2øÜ ô  Ü—N’N 8¨W¯\©\ÐV¹IÀdÓ<PÐVÐRUÔVÛ÷ !—y’yûð úñ÷ !—y—y“yüs¥   ƒC"’A(“C"–C˜A,£A*¤A,¨C¾CÁCÁCÁC"Á"CÁ#C"Á*A,Á,B>Á7+B9Â"CÂ&C"Â1B4Â2C"Â9B>Â>CÃC"ÃC	ÃCÃ
C	ÃC	Ã	C"c              3  ó0   <"  € T F  pS! V!  x € K  	  R # 5irÃ   rO   )rq  r°  rŠ  s   & €rQ   rt  Ú9MediaResolveMiddleware._gather_resolve.<locals>.<genexpr>ç  s   øé € Ð(HÁ¸©¨t®Ãùs   ƒÚreturn_exceptionsTNrÛ  zX[%s] media resolve batch: scope=%s concurrency=%d total=%d ok=%d failed=%d elapsed_ms=%d)r›   Ú	SemaphoreÚmedia_resolve_concurrencyr¼   Ú	monotonicÚgatherr|   Úziprû   ÚBaseExceptionrô   rý   r>  r®  rõ   rË   )r†   r   r�  ÚscopeÚ	out_pathsÚ	out_mimesr{  r|  r}  r~  r  r_  Ú_t0ÚresultsÚ_elapsed_msÚ_failedr`   Ú	_filenameÚ_ridr<  r¯  rŠ  r‰  s   ff&&&&ddd$$d         @@rQ   r€  Ú&MediaResolveMiddleware._gather_resolveÓ  s:  ÿé € ô ×%Ò% g×&GÑ&GÓHˆ	÷		ö 		ô �nŠnÓˆÜŸšÔ(HÁÓ(HÐaÐ\`Ña×aˆÜœ4Ÿ>š>Ó+¨cÕ1°TÕ9Ó:ˆØˆÜ47¸Ö4HÑ0Ñ(ˆT�9˜d C¨&Ü˜&¤-×0Ò0Ü—’˜y¨'¯,©,ÐW¹ÀDÈ#Ó9NÐWÐPVÔWØŠ~¤¨F´M×!BÒ!BØ˜1•’à× Ñ  ¨¥Ô+Ø× Ñ  ¨¥Ö+ñ 5Iô 	�‰ØfØ�L‰L˜% ×!BÑ!BÄCÈÃKÔQTÐU^ÓQ_Ðahö	
ò bùs   ŠA(FÁ2FÁ3D'Fc               ó$   € V ^8„  d   QhRRRRRR/# )rL   r.  rÙ  Ú
log_prefixrN   rM   rp  rO   )rP   s   "rQ   rR   r  ø  s(   € ÷ "ñ "Ð6Pð "Ðadð "ð  jEñ "rS   c             ƒ  ó,  a aa"  € . p. pV UUUu. uF2  w  rgpV\         9   g   K  S P                  SWdV4      '       d   K.  WxWf3NK4  	  p	pppV	'       d5   S P                  SV	RWEVV 3R lRV3R lRV3R lV3R lR7      G R	j  x€L
  WE3# u upppi  L5i)
z­Resolve ``(rid, kind, filename)`` ybres tuples to local paths (bounded concurrency,
input order preserved, per-rid failures isolated). Cache hits are served without a fetch.Úybresc                ó(   <€ SP                  SV 4      # rÃ   )rY  )r  r   r†   s   &€€rQ   r'  Ú<MediaResolveMiddleware._resolve_ybres_refs.<locals>.<lambda>  s   ø€  C×$;Ñ$;¸GÀSÔ$IrS   z-[%s] %s resolve failed: rid=%s kind=%s err=%sc                ó   <€ SW3# rÃ   rO   ©r`   r  r   s   &&€rQ   r'  r¤    s   ø€ ÐgqÐsvÑf}rS   z.[%s] %s resolve crashed: rid=%s kind=%s err=%sc                ó   <€ SW3# rÃ   rO   r¦  s   &&€rQ   r'  r¤    s   ø€ ÐjtÐvyñ  jArS   c                ó   <€ S R V  2# )z rid=rO   )r  r   s   &€rQ   r'  r¤    s   ø€  z l°%¸°uÑ$=rS   rz  N)r]   r3  r€  )
r†   r   r.  r   r.  r/  r  r`   rb   r�  s
   ff&d      rQ   Ú_resolve_ybres_refsÚ*MediaResolveMiddleware._resolve_ybres_refs÷  s³   úé € ð "$ˆØˆÙHLõ |ÉÑ1D°¸HØÔ4Ñ4ô -Ø=@×=XÑ=XÐY`ÐbeÐty×=zô -�4 3Ó,Éˆò |çØ×%Ñ%Ø˜ ¨+ÝIØHÔT}ØJô  XAÜ=ð &ó ÷ ð ð Ð!Ð!ùô|ñùs'   …B�B¥BÁ BÁ;BÂBÂBc               ó   € V ^8„  d   QhRR/# )rL   rM   rp  rO   )rP   s   "rQ   rR   r  
  s   € ÷  `ñ  `Ð?Zñ  `rS   c           
   ƒ  ó¾  "  € \        V4      pV'       g   . . 3#  VP                  VP                  V4      P                  4      p. p\        4       p\        T;'       g    . \        ) R 4       FÃ  pTP                  R4      p	\        T	\        4      '       d   RT	9  d   K3  \        \        \!        \"        P%                  T	4      4      4      4       FF  w  r«pY§9  d%   TP'                  T
4       TP)                  Y«T34       \+        T4      \,        8¼  g   KF   M	  \+        T4      \,        8¼  g   KÃ   M	  T'       g   . . 3# T P/                  YRRR1,          RR7      G Rj  x€L
 #   \         d0   p\
        P                  RTP                  T4       . . 3u Rp?# Rp?i\         d0   p\
        P                  RTP                  T4       . . 3u Rp?# Rp?ii ; i Ly5i)	z]Resolve recent observed image/file anchors from the transcript into ``(local_paths, mimes)``.z8[%s] Observed-media hydration: transcript unreadable: %sNz.[%s] Observed-media hydration setup failed: %sr  r  zobserved-media©r   éÿÿÿÿ)rø  rQ  r  r  rD   rô   rý   r>  rù   rB  rÜ  Ú OBSERVED_MEDIA_BACKFILL_LOOKBACKrÉ   rû   rN   rc   rq   rÞ  rß  Úaddr®  rË   Ú,OBSERVED_MEDIA_BACKFILL_MAX_RESOLVE_PER_TURNr©  )r†   r   r  r  rà  r  ÚorderÚseenræ   r  r  r`   rb   s   &&&          rQ   Ú_collect_observed_mediaÚ.MediaResolveMiddleware._collect_observed_media	  s˜  é € ô ˜wÓ'ˆßØ�r�6ˆMð	Ø×+Ñ+¨E×,GÑ,GÈÓ,O×,ZÑ,ZÓ[ˆGð -/ˆÜ“EˆÜ˜WŸ]˜]¨Ô-MÐ,MÐ,NÐOÖPˆCØ—g‘g˜iÓ(ˆGÜ˜g¤s×+Ò+¨yÀÔ/GÙÜ'7¼ÄÄn×F]ÑF]Ð^eÓFfÓAgÓ8hÖ'iÑ#�˜8Ø”?Ø—H‘H˜S”MØ—L‘L #¨XÐ!6Ô7Ü�u“:Ô!MÖMÙñ (jô �5‹zÔIÖIÙñ Q÷ Ø�r�6ˆMØ×,Ñ,¨W¹D¸b¸DµkÐN^Ð,Ó_×_Ð_øô3 #ô 	ä�N‰NÐUÐW^×WcÑWcÐehÔiØ�r�6�MûÜô 	Ü�N‰NÐKÈWÏ\É\Ð[^Ô_Ø�r�6�Mûð	úñ* `ùsw   ‚G›*E& ÁGÁB3GÄGÄ1GÄ=$GÅ!GÅ"GÅ&GÅ1$FÆGÆGÆGÆ(GÆ)$GÇGÇGÇGÇGc               ó    € V ^8„  d   QhRRRR/# )rL   r7  rÙ  rM   rp  rO   )rP   s   "rQ   rR   r  -  s    € ÷ \ñ \ÐC]ð \Ðb}ñ \rS   c              ƒ  óD   "  € V P                  WRR7      G Rj  x€L
 #  L5i)zJResolve ybres anchors of the quoted message (from QuoteContextMiddleware).rÑ  r­  N)r©  )r†   r   r7  s   &&&rQ   Ú_resolve_quote_mediaÚ+MediaResolveMiddleware._resolve_quote_media,  s$   é € ð ×,Ñ,¨WÐSZÐ,Ó[×[Ð[Ñ[ùs   ‚ ™š c               ó    € V ^8„  d   QhRRRR/# )rL   rA  r  rM   rp  rO   )rP   s   "rQ   rR   r  2  s   € ÷ ñ ¨ð Ð;Vñ rS   c                óô  € . p. p\        V P                  RR4      pV P                  '       d$   V'       d   VP                  V P                  4      MRp\        P                  \        V\        4      '       d   TMR4       Fó  pVP                  ^4      ;'       g    RP                  4       P                  4       pVP                  ^4      ;'       g    RP                  4       pV'       d,   Wq9   g&   \        P                  P                  V4      '       g   K˜  VP                  V4       TP                  \        \        P                  P!                  V4      4      ;'       g    VR8X  d   RMR4       Kõ  	  W3# )uê   DM quote fallback: ``(local_paths, mimes)`` for media PatchAnchorsMiddleware already
rewrote to ``[image: /path]`` / ``[file: name â†’ /path]`` on the original turn. Unresolved
anchors were that turn's failure â€” no re-download here.r)  NrÝ   r  rf  rg  )rù  r   r5  rÉ   Ú_YB_LOCAL_MEDIA_RErß  rû   rN   rZ   r\   r^  rÀ  r  Úexistsr®  r+   rj  )rA  Úpathsr/  Úcachere   r_   r`   r  s   &       rQ   Ú_collect_quote_local_mediaÚ1MediaResolveMiddleware._collect_quote_local_media1  s#  € ð
 ˆØˆÜ˜Ÿ™Ð%9¸4Ó@ˆØ58×5L×5LÐ5L×QVˆu�y‰y˜×0Ñ0Ô1Ð\`ˆÜ#×,Ñ,´ZÀÄc×5JÒ5J©TÐPRÖSˆAØ—G‘G˜A“J×$Ð$ "×+Ñ+Ó-×3Ñ3Ó5ˆDØ—G‘G˜A“J×$Ð$ "×+Ñ+Ó-ˆDß˜4œ=´·±·±¸t×0DÒ0DÙØ�L‰L˜ÔØ�L‰Lœ¬¯©×)9Ñ)9¸$Ó)?Ó@÷  Fð  FÐUYÐ]dÔUdÁ\ð  kEö  Gñ Tð ˆ|ÐrS   c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   r  C  s   € ÷ "ñ " ð "¸Dñ "rS   c              ƒ  	ól  aa	"  € VP                   p. o	. oR  VV	3R llpV P                  W1P                  4      G Rj  x€L
 p\        R V^ ,           4       4      pV! V4       VP                  eU   VP
                  '       d+   T! V P                  W1P
                  4      G Rj  x€L
 4       MSV! V P                  V4      4       M;VP                  R8X  d+    T! V P                  W1P                  4      G Rj  x€L
 4       S	Vn        SVn        \"        P%                  VP&                  V4      '       d.   \        P)                  RVP                  VP&                  4       R# V! 4       G Rj  x€L
  R#  EL5 LÑ L  \         d,   p\        P                  RTP                  T4        Rp?LªRp?ii ; i LF5i)c               ó    € V ^8„  d   QhRRRR/# )rL   Ú
pair_listsrp  rM   ro   rO   )rP   s   "rQ   rR   Ú3MediaResolveMiddleware.handle.<locals>.__annotate__J  s   € ÷ 	$ñ 	$Ð*Eð 	$È$ñ 	$rS   c                ó–   <€ \        V !   F:  w  rV'       g   K  VS9  g   K  SP                  V4       SP                  V4       K<  	  R # rÃ   )r“  r®  )rÅ  Úur_   ÚtypesÚurlss   &  €€rQ   Ú_add_unique_pairsÚ8MediaResolveMiddleware.handle.<locals>._add_unique_pairsJ  s5   ø€ Ü˜ZÔ(‘�ß‘1˜ $žØ—K‘K ”NØ—L‘L –Oó )rS   Nc              3  ó8   "  € T F  q'       g   K  ^x € K  	  R# 5i)r‡  NrO   )rq  rÈ  s   & rQ   rt  Ú0MediaResolveMiddleware.handle.<locals>.<genexpr>P  s   é € Ð5¡<˜a³1Ÿš£<ùr”  rZ   z;[%s] observed-image hydration raised, continuing anyway: %sz.[%s] Skip placeholder after media download: %r)r   r‚  r1  Úsumr5  r7  r¸  rÀ  r.  r´  r  rù   rô   rý   r>  r8  r9  rD  rJ  r0  rÞ  )
rF  rA  rB  r   rË  Ú	own_pairsÚ	own_countr  rÉ  rÊ  s
   &&&     @@rQ   rG  ÚMediaResolveMiddleware.handleC  se  ùé € ð —+‘+ˆØˆØˆ÷	$ñ 	$ð
 ×2Ñ2°7¿N¹NÓK×Kˆ	ÜÑ5 9¨Q¦<Ó5Ó5ˆ	Ù˜)Ô$ð ×"Ñ"Ò.Ø×#×#Ð#Ù!¨×(AÑ(AÀ'×K_ÑK_Ó(`×"`Õaá! $×"AÑ"AÀ#Ó"FÕGØ�]‰]˜gÔ%ðqÙ!¨×(DÑ(DÀWÏjÉjÓ(Y×"YÔZð ˆŒØˆŒô '×?Ñ?ÀÇÁÈi×XÒXÜ�L‰LÐIÈ7Ï<É<ÐY\×YeÑYeÔfÙÙ‹i�Šò- Lñ #añ
 #ZøÜô qÜ—‘Ð\Ð^e×^jÑ^jÐlo×pÑpûðqúñ 	ùsv   „9F4½E2¾AF4Â F4Â#E5Â$2F4Ã E9 Ã7E7Ã8E9 Ä 3F4Ä47F4Å+F2Å,F4Å5F4Å7E9 Å9F/Æ!F*Æ%F4Æ*F/Æ/F4rO   i€Q )r‹   rŒ   r�   rŽ   r�   r>  r  r  r  r  r�   r"  r+  r3  r  rA  rY  r]  rm  r‚  r€  r©  r´  r¸  rÀ  rG  r‘   rO   rS   rQ   r  r  +  sa  ‡ ñð €DàCE€OÐ@ÓEØ+7Ð˜=Ó7Ø.1Ð˜mÓ1àô	 ó ð	 ð ôKó ðKð ôó ðð ônó ðnð ô$Hó ð$HðL ô	ó ð	ð ð' à#'ð' à8:ð' àOQö' ó ð' ðR ô'ó ð'ð2 ô!
ó ð!
ðF ô"ó ð"ð" ô `ó ð `ðD ô\ó ð\ð ôó ð÷""ñ "rS   r  c                  ó@   € ] tR tRtRtRt]R R l4       tR R ltRt	R	# )
ÚPatchAnchorsMiddlewareih  zíReplace ``[kind|ybres:RID]`` anchors in raw_text with the local paths MediaResolveMiddleware
produced, so the transcript records usable paths. Only resolved media (paths starting with
``/``) are substituted; other anchors stay untouched.zpatch-anchorsc               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   re   rN   rÊ  r   rÉ  rM   rO   )rP   s   "rQ   rR   Ú#PatchAnchorsMiddleware.__annotate__o  s(   € ÷ ñ �Sð  	ð °)ð Àñ rS   c                	óf  € T p\        W4       EF  w  rEVP                  R 4      '       g   K  \        P                  V4      pV'       g    V# VP	                  ^4      P                  R4      w  rxp	VP                  4       pVR8X  d   VP                  R4      '       d   RV R2p
MVVR8X  d@   RV	P                  4       ;'       g     \        P                  P                  V4       RV R2p
MVR	8X  d   R
V R2p
MKí  VRVP                  4        V
,           W6P                  4       R ,           pEK!  	  V# )rÖ   rY   r  re  z[image: râ  r-  r  u    â†’ r  z[video: N)r“  r±  rÞ  ÚsearchrZ   r[   r\   rÀ  r  rj  ÚstartÚend)re   rÊ  rÉ  ÚpatchedrÈ  r_   Úanchor_matchr`   ra   rb   Úreplacements   &&&        rQ   Ú_patchÚPatchAnchorsMiddleware._patchn  s!  € àˆÜ˜×$‰DˆAØ—<‘< ×$Ò$ÙÜ)×0Ñ0°Ó9ˆLßØð ˆð !-× 2Ñ 2°1Ó 5× ?Ñ ?ÀÓ DÑˆD�XØ—:‘:“<ˆDØ�wŒ 1§<¡<°×#9Ò#9Ø (¨¨¨1˜o‘Ø˜”Ø '¨¯©Ó(8×(OÐ(O¼B¿G¹G×<LÑ<LÈQÓ<OÐ'PÐPUÐVWÐUXÐXYÐZ‘Ø˜”Ø (¨¨¨1˜o‘áØÐ4 × 2Ñ 2Ó 4Ð5¸ÕCÀg×N^ÑN^ÓN`ÐNaÐFbÕb‹Gñ! %ð" ˆrS   c               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   rÖ  „  rÉ  rS   c              ƒ  	óœ   "  € V P                  VP                  VP                  VP                  4      Vn        V! 4       G R j  x€L
  R #  L5irÃ   )rÞ  r0  r8  r9  rE  s   &&&rQ   rG  ÚPatchAnchorsMiddleware.handle„  s.   é € Ø—{‘{ 3§<¡<°·±ÀÇÁÓQˆŒÙ‹i�Œùs   ‚AAÁA
ÁArO   N)
r‹   rŒ   r�   rŽ   r�   r>  r  rÞ  rG  r‘   rO   rS   rQ   rÔ  rÔ  h  s*   † ñ=ð €Dàôó ð÷*ñ rS   rÔ  c                  óV   € ] tR tRtRtRtR R lt]R R l4       t]R R	 l4       t	R
t
R# )ÚDispatchMiddlewarei‰  zTBuild the MessageEvent and dispatch it (groups: serialised per session via a queue).Údispatchc               ó    € V ^8„  d   QhRRRR/# r”  rO   )rP   s   "rQ   rR   ÚDispatchMiddleware.__annotate__�  s   € ÷ &ñ & ð &¸Dñ &rS   c              ƒ  	óº  aaa"  € SP                   oSP                  SP                  4      oR  VVV3R llpSP                  R8X  dÑ   SSP                  9  pSP                  P                  S\        P                  ! 4       4      pVP                  V4       \        P                  RSP                  VP                  4       S;'       g    RR,          4       V'       d8   T P                  SV P                  SS4      RS;'       g    RR,           24       M/T P                  SV! 4       RSP                  ;'       g    R	 24       V! 4       G R
j  x€L
  R
#  L5i)c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   Ú/DispatchMiddleware.handle.<locals>.__annotate__’  s   € ÷ 	0ñ 	0¨tñ 	0rS   c               “  ó2  <"  € \         ;QJ d&    R  SP                   4       F  '       g   K   RM	  RM! R  SP                   4       4      '       d   \        P                  p M<\	        SP
                  \        4      '       d   SP
                  M\        P                  p \        SP                  T SP                  SP                  ;'       g    RSP                  \        SP                  4      \        SP                  4      SP                  SP                  SP                   R7
      pS'       dO   SP                  '       d=   SP                  SP"                  S&   SP                  ;'       g    RSP$                  S&   SP                  '       di   SP                  '       dW   SP&                  pSP                  VSP                  &   \        V4      R\)        ^ \+        V4      ^È,
          4        F  pW# K  	  SP-                  V4      G Rj  x€L
  R#  L5i)c              3  óB   "  € T F  qP                  R4      x € K  	  R# 5i)úapplication/N)rí  ztext/©r±  )rq  Úmts   & rQ   rt  ÚMDispatchMiddleware.handle.<locals>._dispatch_inbound_event.<locals>.<genexpr>“  s   é € ÐVÁoÀ—=‘=Ð!:×;Ð;Ãoùó   ‚TFN)
re   r<  r  rZ  Úraw_messager8  r9  r5  r6  r:  rÝ   )r‹  r9  r   ÚDOCUMENTrû   rh   r@  r   r0  r  r+  r$  rq   r8  r5  r6  r:  r7  rC  r)  ÚmaxrË   Úhandle_message)rh   Úeventr¿  rÌ   Ú_skr   rA  s       €€€rQ   Ú_dispatch_inbound_eventÚ:DispatchMiddleware.handle.<locals>._dispatch_inbound_event’  so  øé € ß‹sÑVÀcÇoÂoÓV�s�sŠsÑVÀcÇoÂoÓV×VÒVô
 '×/Ñ/‘ä+5°c·l±lÄK×+PÒ+P˜3Ÿ<š<ÔVa×VfÑVf�Ü Ø—\‘\°ÀÇÁÐX[×XbÑXb×XjÐXjÐfjØŸH™H´°c·n±nÓ1EÔSWÐX[×XgÑXgÓShØ$'×$;Ñ$;È3×K\ÑK\Ø"×1Ñ1ô	ˆE÷ �s—z—z�zØ36·:±:�×+Ñ+¨CÑ0Ø58·\±\×5GÐ5GÀR�×-Ñ-¨cÑ2Ø�z�zˆz˜cŸlŸl˜lØ×2Ñ2�Ø$'§L¡L��c—j‘jÑ!Ü˜e›Ð%>¤c¨!¬S°«Z¸#Õ-=Ó&>Ó?�AØšñ @à×(Ñ(¨Ó/×/Ô/ùs=   ƒ'H­$HÁA;HÃA5HÅ+HÅ0!HÆHÆ$A*HÈHÈHrZ   z-[%s] Group message enqueued (qsize=%d) for %srÝ   ºNé2   Nzyuanbao-group-consumer-r>  zyuanbao-inbound-r›  N)r   Ú_source_session_keyr  r.  Ú_group_queuesÚ
setdefaultr›   ÚQueueÚ
put_nowaitrô   rõ   r>  ÚqsizeÚ_track_inboundÚ_consume_group_queuer+  )rF  rA  rB  rø  Úis_newÚqueuer÷  r   s   &f&   @@rQ   rG  ÚDispatchMiddleware.handle�  s-  úé € Ø—+‘+ˆà×)Ñ)¨#¯*©*Ó5ˆ÷	0ò 	0ð0 �=‰=˜GÔ#Ø × 5Ñ 5Ñ5ˆFØ×)Ñ)×4Ñ4°S¼'¿-º-»/ÓJˆEØ×ÑÐ4Ô5Ü�K‰KÐGÈÏÉÐW\×WbÑWbÓWdÐgj×gpÐgpÐnpÐruÕfvÔwßØ×#Ñ# G¨T×-FÑ-FÀwÐPSÓ-TÐXoÐqt×qzÐqzÐxzÐ|õ  qAð  pBð  WCô  Døà×Ñ Ñ)@Ó)BÐFVÐWZ×WaÑWa×WnÐWnÐenÐVoÐDpÔqÙ‹i�Œùs*   …CEÃEÃ!&EÄ6EÄ?EÅEÅEc               ó    € V ^8„  d   QhRRRR/# )rL   r>  rN   rM   ro   rO   )rP   s   "rQ   rR   rç  ¶  s   € ÷ ?ñ ?¨Cð ?°Dñ ?rS   c                	ó´   € \         P                  ! WR 7      pV P                  P                  V4       VP	                  V P                  P
                  4       R# )rg  N)r›   rT  Ú_inbound_tasksr°  Úadd_done_callbackÚdiscard)r   Úcoror>  rv   s   &&& rQ   r  Ú!DispatchMiddleware._track_inboundµ  s@   € ä×"Ò" 4Ô3ˆØ×Ñ×"Ñ" 4Ô(Ø×Ñ˜w×5Ñ5×=Ñ=Ö>rS   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r   ÚYuanbaoAdapterr:  rN   rM   ro   rO   )rP   s   "rQ   rR   rç  ¼  s"   € ÷ 9ñ 9¨Nð 9Èð 9ÐQUñ 9rS   c              ƒ  óÌ  "  € V P                   P                  V4      pV'       g   R#    \        P                  ! VP                  4       RR7      G Rj  x€L
 p\
        P                  RT P                  T;'       g    RR,          TP                  4       4        T! 4       G Rj  x€L
  YP                  9   d!   \        P                  ! R4      G Rj  x€L
  K0  K³   L‡  \         d     M:i ; i LI L  \         d%    \
        P                  RT P                  4        Kø  i ; iT P                   P                  TR4       R#   T P                   P                  TR4       i ; i5i)	z^Drain the group queue one dispatch at a time, waiting for each to finish; exits after 2s idle.NrI   r×   z3[%s] Group queue: dispatching for %s (remaining=%d)rÝ   rú  gš™™™™™¹?z[%s] Group queue consumer error)rý  rÉ   r›   Úwait_forÚTimeoutErrorrô   rÞ  r>  r  r4  rÿ   rù   Ú	exceptionrÊ   )r   r:  r  Údispatch_fns   &&  rQ   r  Ú'DispatchMiddleware._consume_group_queue»  s=  é € ð ×%Ñ%×)Ñ)¨+Ó6ˆßÙð	9ØðÜ(/×(8Ò(8¸¿¹»ÈcÔ(R×"R�Kô —‘ÐRÐT[×T`ÑT`Ðcn×ctÐctÐrtÐvyÕbzð  }B÷  }Hñ  }Hó  }Jô  KðVÙ%›-×'Ð'Ø%×)AÑ)AÔAÜ%Ÿmšm¨CÓ0×0Ò0ñ Bñ #SøÜ#ô Ùðúñ (á0øÜ ô VÜ×$Ñ$Ð%FÈÏÉ×UðVúð ×!Ñ!×%Ñ% k°4Ö8øˆG×!Ñ!×%Ñ% k°4Õ8üsŸ   ‚&E$©E «)C ÁCÁC Á#E Á=E Â
C3 Â%C/Â&-C3 ÃC1ÃC3 ÃE ÃC ÃC,Ã)E Ã+C,Ã,E Ã/C3 Ã1C3 Ã3+D"ÄE Ä!D"Ä"E Ä%E$ÅE!Å!E$rO   N)r‹   rŒ   r�   rŽ   r�   r>  rG  r  r  r  r‘   rO   rS   rQ   rä  rä  ‰  s8   † Ù^Ø€Dõ&ðP ô?ó ð?ð
 ô9ó ô9rS   rä  c                  óh   € ] tR tRt$ Rt]]]]]	]
]]]]]]]]]]]]]].tR]R&   ]R R l4       tRtR# )	ÚInboundPipelineBuilderiÒ  z?Assembles the default Yuanbao inbound pipeline (order matters).z
list[type]Ú_DEFAULT_MIDDLEWARESc               ó   € V ^8„  d   QhRR/# re  rO   )rP   s   "rQ   rR   Ú#InboundPipelineBuilder.__annotate__Ý  s   € ÷ ñ �oñ rS   c                	ól   € \        4       pV P                   F  pVP                  V! 4       4       K  	  V# rÃ   )rW  r  rj  )r†   ÚpipelineÚmw_clss   &  rQ   ÚbuildÚInboundPipelineBuilder.buildÜ  s-   € ä"Ó$ˆØ×.Ô.ˆFØ�L‰L™›Ö"ñ /àˆrS   rO   N)r‹   rŒ   r�   rŽ   r�   r¥  rä  rû  rî  rd  ro  r   rÚ  rD  rW  rx  r€  r¨  r²  r¾  rÍ  r§  r  rÔ  rä  r  r  r�   r  r‘   rO   rS   rQ   r  r  Ò  sc   ‡ ÙIàÐ1Ð3HÈ/Ð[mØÐ4Ð6NÐPkØÐ 5Ð7MÐOdØ"Ð$AÐCYØ'Ð)?ÐAWÐYkð(Ð˜*ó ð ôó ôrS   r  c                  óJ  € ] tR tRt$ RtRtR]R&   R3tR R lt]	R 4       t
]	R	 R
 l4       tR R 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tR R 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t]3R' R( lltR) R* ltR+ R, ltR- R. ltR/ R0 ltR1t R2# )4ÚConnectionManageriä  zaWebSocket lifecycle: open/close, AUTH_BIND, ping/pong heartbeat, receive loop, backoff reconnect.g      ø?ÚfloatÚ_DEBOUNCE_WINDOWc               ó    € V ^8„  d   QhRRRR/# ©rL   r   r  rM   ro   rO   )rP   s   "rQ   rR   ÚConnectionManager.__annotate__é  s   € ÷ Bñ B ð B°4ñ BrS   c                	ó¬   € Wn         R V n        R V n        R V n        R V n        / V n        R V n        ^ ;V n        V n        RV n	        / V n
        / V n        R # )NF)Ú_adapterÚ_wsÚ_connect_idÚ_heartbeat_taskÚ
_recv_taskÚ_pending_acksÚ_pending_pongÚ_consecutive_hb_timeoutsÚ_reconnect_attemptsÚ_reconnectingÚ_inbound_bufferÚ_inbound_timers©rF  r   s   &&rQ   r]  ÚConnectionManager.__init__é  s]   € ØŒØˆŒØ*.ˆÔØ7;ˆÔØ26ˆŒØ8:ˆÔØ7;ˆÔØCDÐDˆÔ%¨Ô(@Ø#(ˆÔà02ˆÔØ?AˆÖrS   c                	ó   € V P                   # rÃ   )r)  rS  s   &rQ   ÚwsÚConnectionManager.ws÷  s   € à�x‰xˆrS   c               ó   € V ^8„  d   QhRR/# ©rL   rM   r¹   rO   )rP   s   "rQ   rR   r&  ü  s   € ÷ ñ ˜dñ rS   c                óÔ   € V P                   f   R# \        V P                   RR4      p VRJ ;'       g$    \        V4      ;'       d    \        V! 4       4      #   \         d     R# i ; i)z>``ws.open`` may be a bool (websockets <14) or a method (>=14).NFr’  T)r)  rù  Úcallabler¹   rù   )rF  Ú	open_attrs   & rQ   Úis_connectedÚConnectionManager.is_connectedû  sa   € ð �8‰8ÒÙÜ˜DŸH™H f¨dÓ3ˆ	ð	Ø Ð$×SÐS¬°)Ó)<×)RÐ)RÄÁiÃkÓARÐSøÜô 	Úð	ús   ©
A ´A ÁA ÁA'Á&A'c               ó   € V ^8„  d   QhRR/# r:  rO   )rP   s   "rQ   rR   r&    s   € ÷ "ñ "˜Dñ "rS   c              ƒ  ó,  "  € V P                   p\        '       g:   RpVP                  RVRR7       \        P	                  RVP
                  V4       R# VP                  '       d   VP                  '       g:   RpVP                  RVRR7       \        P                  R	VP
                  V4       R# V P                  '       d#   \        P                  R
VP
                  4       R# VP                  RVP                  R4      '       g   R#  \        P                  RVP
                  VP                  4       VP                  4       G Rj  x€L
 p\        P                  RVP
                  VP                  4       V P!                  V4      G Rj  x€L
 '       g   R# \"        P$                  ! 4       Vn        V P)                  RR7       \        P                  RVP
                  V P*                  VP,                  4       R#  L´ Lr  \.         d$    \        P                  RTP
                  4        M:\0         d.   p\        P                  RTP
                  TRR7        Rp?MRp?ii ; iT P3                  4       G Rj  x€L 
  TP5                  4        R# 5i)uQ   sign-token â†’ WS connect â†’ AUTH_BIND â†’ start loops. Returns True on success.z:Yuanbao startup failed: 'websockets' package not installedÚyuanbao_missing_dependencyT)Ú	retryablez[%s] %s. Run: hermes pm repairFzJYuanbao startup failed: YUANBAO_APP_ID and YUANBAO_APP_SECRET are requiredÚyuanbao_missing_credentialsz[%s] %sz*[%s] Already connected, skipping connect()zyuanbao-app-keyzYuanbao app keyz [%s] Fetching sign token from %sNz[%s] Connecting to %s©Úcancel_existingz%[%s] Connected. connectId=%s botId=%sz[%s] Connection timed outz[%s] connect() failed: %sr™  )r(  ÚWEBSOCKETS_AVAILABLEÚ_set_fatal_errorrô   rý   r>  rL  rT  r›  r>  rÞ  Ú_acquire_platform_lockrõ   rS  rR  Ú_ws_urlÚ_dialr›   Úget_running_loopÚ_loopÚ
_connectedr*  rl  r  rù   Ú_cleanup_wsÚ_release_platform_lock)rF  r   ræ   rF  r  s   &    rQ   r’  ÚConnectionManager.open  sï  é € à—-‘-ˆß#Ó#ØNˆCØ×$Ñ$Ð%AÀ3ÐRVÐ$ÔWÜ�N‰NÐ;¸W¿\¹\È3ÔOÙØ××Ð w×':×':Ð':Ø^ˆCØ×$Ñ$Ð%BÀCÐSXÐ$ÔYÜ�L‰L˜ G§L¡L°#Ô6ÙØ××ÐÜ�L‰LÐEÀwÇ|Á|ÔTÙØ×-Ñ-Ð.?À×AQÑAQÐSd×eÒeÙð	XÜ�K‰KÐ:¸G¿L¹LÈ'×J]ÑJ]Ô^Ø&×8Ñ8Ó:×:ˆJÜ�K‰KÐ/°·±¸w¿¹ÔOØŸ™ JÓ/×/Ö/ÙÜ#×4Ò4Ó6ˆGŒMØ�O‰O¨EˆOÔ2Ü�K‰KÐ?ÀÇÁÈt×O_ÑO_Ðah×apÑapÔqÙñ ;á/øô ô 	DÜ�L‰LÐ4°g·l±lÖCÜô 	XÜ�L‰LÐ4°g·l±lÀCÐRVˆL×WÑWûð	Xúà×ÑÓ × Ñ Ø×&Ñ&Ô(Ùùsš   ‚A#JÁ&JÁ8A
JÃAJÄJÄ>H Å	G>Å
AH ÆH Æ	H ÆJÆA"H Ç<JÇ>H È H È+I&È-JÈ/I&È8I&È9#I!ÉJÉ!I&É&JÉ<I?É=Jc               ó    € V ^8„  d   QhRRRR/# ©rL   rF  rf   rM   r¹   rO   )rP   s   "rQ   rR   r&  *  s   € ÷ ñ  dð ¨tñ rS   c           
   ƒ  ó¨  "  € VP                  R4      '       d"   \        VR,          4      V P                  n        \        P
                  ! \        P                  ! V P                  P                  RR^RR7      \        R7      G Rj  x€L
 V n
        V P                  V4      G Rj  x€L
 '       g   V P                  4       G Rj  x€L
  R# R#  LD L( L5i)ztAdopt the sign-token bot_id, open the WS (built-in ping/pong disabled) and run AUTH_BIND;
cleans up on auth failure.rä   Ng      Ð?)Úping_intervalÚping_timeoutÚclose_timeoutÚhappy_eyeballs_delayr×   FT)rÉ   rN   r(  rl  r›   r  Ú
websocketsÚconnectrJ  ÚCONNECT_TIMEOUT_SECONDSr)  Ú_authenticaterO  )rF  rF  s   &&rQ   rK  ÚConnectionManager._dial*  s¨   é € ð �>‰>˜(×#Ò#Ü$'¨
°8Õ(<Ó$=ˆD�M‰MÔ!Ü ×)Ò)Ü×ÒØ—‘×%Ñ%°TÈÐ\]Ø%)ôô ,ô
÷ 
ˆŒð ×'Ñ'¨
Ó3×3Ö3Ø×"Ñ"Ó$×$Ð$ÙÙñ
ñ 4Ù$ùs<   ‚BCÂCÂCÂ%CÂ&	CÂ0CÃCÃ	CÃCÃCc               ó    € V ^8„  d   QhRRRR/# ©rL   rF  r¹   rM   ro   rO   )rP   s   "rQ   rR   r&  ;  s   € ÷ 1ñ 1¨Tð 1°dñ 1rS   c               óª   € ^ V n         V P                  P                  4        V P                  VR7       \        P                  V P                  4       R# )zvPost-AUTH bookkeeping shared by open() and reconnect: mark connected, (re)start loops,
register as the active adapter.rE  N)r0  r(  Ú_mark_connectedÚ_start_loopsr  Ú
set_active)rF  rF  s   &$rQ   rN  ÚConnectionManager._connected;  s?   € ð $%ˆÔ Ø�‰×%Ñ%Ô'Ø×Ñ¨/ÐÔ:Ü×!Ñ! $§-¡-Ö0rS   c               ó    € V ^8„  d   QhRRRR/# r_  rO   )rP   s   "rQ   rR   r&  C  s   € ÷ {ñ {¨tð {¸ñ {rS   c               ó4  € V P                    F‡  w  r#p\        W4      pV'       d/   V'       d'   VP                  4       '       g   VP                  4        \	        W\
        P                  ! \        W4      ! 4       RV RV P                   2R7      4       K‰  	  R# )zE(Re)start the heartbeat and receive loops for the current connect_id.zyuanbao-Ú-rg  N)Ú_LOOPSrù  rs   rt   ré  r›   rT  r*  )rF  rF  ÚattrÚ	coro_nameÚtagÚolds   &$    rQ   rb  ÚConnectionManager._start_loopsC  so   € à$(§K¤KÑ ˆD˜SÜ˜$Ó%ˆCß§3¨s¯x©x¯zªzØ—
‘
”Ü�D¤× 3Ò 3´G¸DÔ4LÓ4NÐW_Ð`cÐ_dÐdeÐfj×fvÑfvÐewÐUxÔ yÖzó	 %0rS   c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r&  K  s   € ÷ !ñ !˜Tñ !rS   c              ƒ  óà  "  € V P                    F:  w  rp\        W4      pV'       g   K  \        V4      G Rj  x€L
  \        WR4       K<  	  \	        R4      pV P
                  P                  4        F,  pVP                  4       '       d   K  VP                  V4       K.  	  V P
                  P                  4        \        P                  4        V P                  4       G Rj  x€L
  R#  L± L5i)zGCancel background tasks, fail pending futures, and close the WebSocket.NzYuanbaoAdapter disconnected)rh  rù  r$   ré  rø   r-  rr   rs   Úset_exceptionru   r“   rÄ   rO  )rF  ri  Ú
_coro_nameÚ_tagrv   Údisc_excÚfuts   &      rQ   ÚcloseÚConnectionManager.closeK  sº   é € à&*§k¤kÑ"ˆD˜dÜ˜4Ó&ˆDß‰tÜ! $Ó'×'Ð'Ü˜ DÖ)ñ	 '2ô
  Ð =Ó>ˆØ×%Ñ%×,Ñ,Ö.ˆCØ—8‘8—:”:Ø×!Ñ! (Ö+ñ /ð 	×Ñ× Ñ Ô"Ü×ÑÔ!Ø×ÑÓ × Ò ñ (ñ 	!ùs.   ‚#C.ªC.¸C*¹AC.ÂAC.Ã#C,Ã$C.Ã,C.c               ó    € V ^8„  d   QhRRRR/# rS  rO   )rP   s   "rQ   rR   r&  Z  s   € ÷ (ñ (¨dð (°tñ (rS   c              ƒ  ó¢  "  € V P                   pV P                  f   R# VP                  ;'       g    VP                  RR4      p\	        \
        P                  ! 4       4      pV P                  P                  \        RY1P                  R4      ;'       g    RVP                  RR4      T\        \        \        VP                  ;'       g    VP                  R	R4      ;'       g    RR
7	      4      G Rj  x€L
  \        P                  RVP                  WC4        \         P"                  ! 4       P%                  4       \&        ,           p V\         P"                  ! 4       P%                  4       ,
          pV^ 8:  d#   \        P)                  RVP                  4       R# \         P*                  ! V P                  P-                  4       VR7      G Rj  x€L
 p\/        V\0        \2        34      '       g   Kª   \5        \1        V4      4      pTP                  R/ 4      p	T	P                  RR4      \8        R,          8w  g   T	P                  RR4      R8w  d   EK  T P;                  T4      T n        T P<                  '       g#   \        P)                  RTP                  4       R# \        P?                  RTP                  T P<                  4       R#  ELÙ Lÿ  \6         d     EK˜  i ; i  \@         d%    \        P)                  RTP                  4        R# \6         d/   p
\        P)                  RTP                  T
RR7        Rp
?
R# Rp
?
ii ; i5i)zHSend AUTH_BIND and read frames until BIND_ACK; False on failure/timeout.NFrä   rÝ   ÚybBotr  Úbotr  rÔ   )	Úbiz_idÚuidr  r  r+  Úapp_versionÚoperation_systemÚbot_versionrÔ   z&[%s] AUTH_BIND sent (msg_id=%s uid=%s)Tz+[%s] AUTH_BIND timeout waiting for BIND_ACKr×   ÚheadÚcmd_typeÚResponser  z	auth-bindz[%s] BIND_ACK missing connectIdz$[%s] BIND_ACK received: connectId=%sz[%s] AUTH_BIND timeoutz[%s] AUTH_BIND error: %sr™  r®  )!r(  r)  rl  rÉ   rN   ÚuuidÚuuid4rh  r:   rð   rñ   ró   Ú
_route_envrô   rÞ  r>  r›   rL  r¼   ÚAUTH_TIMEOUT_SECONDSr›  r  Úrecvrû   rÐ  Ú	bytearrayr5   rù   r-   Ú_extract_connect_idr*  rõ   r  )rF  rF  r   r|  r+  ÚdeadlineÚ	remainingÚrawræ   r€  r  s   &&         rQ   r\  ÚConnectionManager._authenticateZ  sŠ  é € à—-‘-ˆØ�8‰8ÒÙØ�o‰o×=Ð= §¡°¸"Ó!=ˆÜ”T—Z’Z“\Ó"ˆØ�h‰h�m‰mÔ,Ø ¯N©N¸8Ó,D×,MÐ,MÈÐU_×UcÑUcÐdkÐmoÓUpØ¤|ÔFWÔeqØ×(Ñ(×QÐQ¨J¯N©N¸;ÈÓ,K×QÐQÈrô
ó ÷ 	ð 	ô
 	�‰Ð=¸w¿|¹|ÈVÔYð	WÜ×/Ò/Ó1×6Ñ6Ó8Ô;OÕOˆHØØ$¤w×'?Ò'?Ó'A×'FÑ'FÓ'HÕH�	Ø ”>Ü—L‘LÐ!NÐPW×P\ÑP\Ô]Ù Ü#×,Ò,¨T¯X©X¯]©]«_ÀiÔP×P�Ü! #¬¬yÐ'9×:Ò:ÙðÜ)¬%°«*Ó5�Cð —w‘w˜v rÓ*�Ø—8‘8˜J¨Ó+¬x¸
Õ/CÔCÀtÇxÁxÐPUÐWYÓGZÐ^iÔGiÚØ#'×#;Ñ#;¸CÓ#@�Ô Ø×'×'Ð'Ü—L‘LÐ!BÀGÇLÁLÔQÙ Ü—‘ÐBÀGÇLÁLÐRV×RbÑRbÔcÙò9	ñ Qøô
 !ô Ûðûô ô 	AÜ�L‰LÐ1°7·<±<Õ@ñ ô ô 	WÜ�L‰LÐ3°W·\±\À3ÐQUˆL×VÐVÙûð	Wüsµ   ‚/M²BMÃMÃ&MÃ5KÃ6%MÄB K& ÆMÆ3K& ÇKÇ"K& Ç5K È	A5K& É? K& ÊMÊ!+K& ËMËK& ËK#ËK& Ë"K#Ë#K& Ë&+MÌMÌMÌMÌ#MÍMÍMÍMc               ó    € V ^8„  d   QhRRRR/# )rL   r+  rN   rM   zOptional[asyncio.Future]rO   )rP   s   "rQ   rR   r&  „  s   € ÷ Cñ C 3ð CÐ+Cñ CrS   c                óŠ   € V'       d   V P                   P                  VR4      MRpVe   VP                  4       '       g   V# R# )z<Pop the not-yet-done future registered for *msg_id*, if any.N)r-  rÊ   rs   )rF  r+  rt  s   && rQ   Ú_pop_pendingÚConnectionManager._pop_pending„  s7   € ç6<ˆd× Ñ ×$Ñ$ V¨TÔ2À$ˆØ’o¨c¯h©h¯jªjˆsÐB¸dÐBrS   c               ó    € V ^8„  d   QhRRRR/# )rL   Údecoded_msgrf   rM   r3  rO   )rP   s   "rQ   rR   r&  ‰  s   € ÷ ñ ¨tð ¸ñ rS   c           	     ó®  € VP                  RR4      pV'       g   R#  \        \        V4      4      p\        V^4      pV^ 8w  d9   \        P                  RV P                  P                  V\        V^4      4       R# \        V^4      ;'       g    R#   \         d7   p\        P                  RT P                  P                  T4        Rp?R# Rp?ii ; i)zEconnectId from a decoded BIND_ACK, or None (logs AuthBindRsp errors).rã   rS   Nz*[%s] AuthBindRsp error: code=%d message=%rz$[%s] Failed to extract connectId: %s)rÉ   r1   r4   r3   rô   r›  r(  r>  r2   rù   rý   )rF  r“  rã   Úfdictrâ   r  s   &&    rQ   r‰  Ú%ConnectionManager._extract_connect_id‰  s®   € à!—o‘o f¨cÓ2ˆßÙð		Ü#¤M°$Ó$7Ó8ˆEÜ˜u aÓ(ˆDØ�qŒyÜ—‘ÐIÈ4Ï=É=×K]ÑK]Ð_cÔepÐqvÐxyÓezÔ{ÙÜ˜u aÓ(×0Ð0¨DÐ0øÜô 	Ü�N‰NÐAÀ4Ç=Á=×CUÑCUÐWZÔ[Ýûð	ús$   žAB Á=B ÂB ÂCÂ+CÃCc               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r&  ™  s   € ÷ ñ  tñ rS   c              ƒ  óf  "  € V P                   p VP                  '       Ed%   \        P                  ! \        4      G Rj  x€L
  V P
                  f   KE   \        \        P                  ! 4       4      p\        P                  ! 4       P                  4       ;V n        pW0P                  V&   V P
                  P                  \        V4      4      G Rj  x€L
  \        P!                  RVP"                  V4        \        P$                  ! VRR7      G Rj  x€L
  ^ V n        V P                  P+                  VR4       RV n        EK7  R#  EL	 Lx L8  \(         dÕ    T P                  P+                  TR4       T ;P&                  ^,          un        \        P-                  RTP"                  T P&                  \.        4       T P&                  \.        8¼  dW   \        P-                  RTP"                  4       T P1                  4         T P                  P+                  TR4       RT n        R#  ELi ; i  T P                  P+                  TR4       RT n        i ; i  \2         d.   p\        P!                  RTP"                  T4        Rp?EK}  Rp?ii ; i  \        P4                   d     R# i ; i5i)z_Send PING every HEARTBEAT_INTERVAL_SECONDS; reconnect after HEARTBEAT_TIMEOUT_THRESHOLD misses.Nz[%s] PING sent (msg_id=%s)rG   r×   z[%s] PONG timeout (%d/%d)z7[%s] Heartbeat threshold exceeded, triggering reconnectz[%s] Heartbeat send failed: %s)r(  Ú_runningr›   rÿ   ÚHEARTBEAT_INTERVAL_SECONDSr)  rN   rƒ  r„  rL  Úcreate_futurer.  r-  rh  r;   rô   rÞ  r>  r  r/  r  rÊ   rý   ÚHEARTBEAT_TIMEOUT_THRESHOLDÚschedule_reconnectrù   ÚCancelledError)rF  r   r+  Úpong_futurer  s   &    rQ   Ú_heartbeat_loopÚ!ConnectionManager._heartbeat_loop™  s  é € à—-‘-ˆð	Ø×"×"Ñ"Ü—m’mÔ$>Ó?×?Ð?Ø—8‘8Ò#ÙðVÜ ¤§¢£Ó.�FÜ7>×7OÒ7OÓ7Q×7_Ñ7_Ó7aÐa�DÔ&¨Ø1<×&Ñ& vÑ.ØŸ(™(Ÿ-™-¬°FÓ(;Ó<×<Ð<Ü—L‘LÐ!=¸w¿|¹|ÈVÔTð2Ü%×.Ò.¨{ÀDÔI×IÐIØ89˜Ô5ð ×*Ñ*×.Ñ.¨v°tÔ<Ø-1˜×*ñ/ #Ú?ñ =ñ Jøä'ô #Ø×*Ñ*×.Ñ.¨v°tÔ<Ø×5Ò5¸Õ:Õ5ÜŸ™Ð'BÀGÇLÁLÐRV×RoÑRoô  rMô  NØ×8Ñ8Ô<WÔWÜ"ŸN™NÐ+dÐfm×frÑfrÔsØ ×3Ñ3Ô5Ø"à×*Ñ*×.Ñ.¨v°tÔ<Ø-1˜Ö*ò Xð	#ûð ×*Ñ*×.Ñ.¨v°tÔ<Ø-1˜Õ*ûÜ ô VÜ—L‘LÐ!AÀ7Ç<Á<ÐQT×UÓUûðVûä×%Ñ%ô 	Úð	üsÑ   ‚J1�J £J Á E	ÁJ ÁA=I ÃEÃ%I Ã:E ÄEÄE Ä!#I ÅJ ÅJ1Å	J ÅI ÅE ÅB5H/ÈH2 È#I È)J1È+H2 È.H/È/H2 È2%IÉI ÉJÉ%!JÊJ ÊJÊJ ÊJ.Ê*J1Ê-J.Ê.J1c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r&  º  s   € ÷ &ñ & Tñ &rS   c              ƒ  ó  "  € V P                   p V P                    Rj  x€L
  p\        V\        \        34      '       g   K(  V P                  \        V4      4      G Rj  x€L
  KL   LG LDJR#   \        P                   d     R# \        P                  P                   d    p\        TRR4      p\        P                  RTP                  T\        TRR4      4       T'       dC   T\        9   d8   \        P!                  RTP                  T4       TP#                  4         Rp?R# T P%                  4         Rp?R# Rp?i\&         d=   p\        P                  RTP                  T4       T P%                  4         Rp?R# Rp?ii ; i5i)z_Read WS frames and dispatch by cmd_type; schedule reconnect unless the close code is permanent.Nrâ   z3[%s] WebSocket connection closed: code=%s reason=%sÚreasonrÝ   z7[%s] Close code %d is non-recoverable, NOT reconnectingz[%s] receive_loop exited: %s)r(  r)  rû   rÐ  rˆ  Ú_handle_framer›   rž  rY  Ú
exceptionsÚConnectionClosedrù  rô   rý   r>  ÚNO_RECONNECT_CLOSE_CODESr›  Ú_mark_disconnectedr�  rù   )rF  r   rŒ  Ú	close_excÚ
close_coder  s   &     rQ   Ú_receive_loopÚConnectionManager._receive_loopº  s?  é € à—-‘-ˆð	&Ø!ŸXšX÷ 9ð 9�cÜ˜c¤E¬9Ð#5×6Ô6Ø×,Ñ,¬U°3«ZÓ8×8Ò8ñ9á8ò &øô ×%Ñ%ô 	ÚÜ×$Ñ$×5Ñ5ô 	*Ü  ¨F°DÓ9ˆJÜ�N‰NÐPÐRY×R^ÑR^Ð`jÔlsÐt}ð  @Hð  JLó  mMô  Nß˜jÔ,DÔDÜ—‘ÐVÐX_×XdÑXdÐfpÔqØ×*Ñ*×,Ò,à×'Ñ'×)Ò)ûÜô 	&Ü�N‰NÐ9¸7¿<¹<ÈÔMØ×#Ñ#×%Ò%ûð	&üs�   ‚F�A/ œA, A(¡A,¤A/ ÁA/ Á!A*Á"A/ Á(A,Á*A/ Á,A/ Á-FÁ/F	ÂFÂF	Â$F	Â%A>D?Ä#FÄ)D?Ä9FÄ?F	ÅF	Å1FÅ>FÆF	Æ	Fc               ó    € V ^8„  d   QhRRRR/# )rL   rŒ  rÐ  rM   ro   rO   )rP   s   "rQ   rR   r&  Ï  s   € ÷ 2oñ 2o uð 2o°ñ 2orS   c           	   ƒ  	óJ  "  € V P                   p \        V4      pTP                  R/ 4      pTP                  RR4      pTP                  RR4      pTP                  RR4      pTP                  RR4      p	T\        R	,          8X  Ed(   TR
8X  d„   \        P	                  RTP
                  T4       T P                  e-   T P                  P                  4       '       g   T P                  MT P                  T4      p
T
e   T
P                  R4       R# TR9   d$   \        P	                  RTP
                  Yx4       R# T'       dI   Y€P                  9   d9   T P                  T4      pTe"   RT/pT	'       d   YœR&   TP                  T4       R# \        P	                  RTP
                  Yx4       R# T\        R,          8X  Ed   \        P                  RTP
                  Yx\        T	4      4       TP                  RR4      '       d<   T P                  e.    T P                  P!                  \#        T4      4      G Rj  x€L
  T'       dQ   Y€P                  9   dA   T P                  T4      pTe*    TP                  T	'       d   \%        T	4      MRT/4       R# R# T	'       d=   \        P                  RTP
                  T\        T	4      4       T P)                  T	4       R# \        P	                  RTP
                  YgT4       R#   \         d-   p\        P	                  R TP
                  T4        Rp?R# Rp?ii ; i EL  \         d-   p\        P	                  RTP
                  T4        Rp?EL1Rp?ii ; i  \         d   pTP'                  T4        Rp?R# Rp?ii ; i5i)z[%s] Failed to decode frame: %sNr€  r�  r  rÝ   r+  rã   rS   r‚  Úpingz'[%s] HEARTBEAT_ACK received (msg_id=%s)Tz-[%s] Heartbeat ACK received: cmd=%s msg_id=%sz)[%s] Unmatched Response: cmd=%s msg_id=%sÚPushz0[%s] Push received: cmd=%s msg_id=%s data_len=%dÚneed_ackFz[%s] Failed to send PushAck: %szL[%s] WS received inbound push, decoding and dispatching: cmd=%s, data_len=%dz1[%s] Ignoring frame: cmd_type=%d cmd=%s msg_id=%sr®  >   Úsend_group_heartbeatÚsend_private_heartbeat)r(  r5   rù   rô   rÞ  r>  rÉ   r-   r.  rs   r�  Ú
set_resultr-  rõ   rË   r)  rh  r<   r6   rp  Ú_push_to_inbound)rF  rŒ  r   ræ   r  r€  r�  r  r+  rã   Úpongrt  r¯  Úack_excs   &&            rQ   r¥  ÚConnectionManager._handle_frameÏ  s  é € Ø—-‘-ˆð	Ü! #Ó&ˆCð �w‰w�v˜rÓ"ˆØ—8‘8˜J¨Ó+ˆØ�h‰h�u˜bÓ!ˆØ—‘˜( BÓ'ˆØ—g‘g˜f cÓ*ˆØ”x 
Õ+Õ+Ø�fŒ}Ü—‘ÐFÈÏÉÐV\Ô]Ø-1×-?Ñ-?Ò-KÐTX×TfÑTf×TkÑTk×TmÒTm�t×)Ò)Ðsw÷  tEñ  tEð  FLó  tM�ØÒ#Ø—O‘O DÔ)ñ ð ÐJÔJä—‘ÐLÈgÏlÉlÐ\_Ôhñ ÷ ˜F×&8Ñ&8Ô8Ø×'Ñ'¨Ó/�Ø’?Ø$ d˜^�FßØ)-˜v™Ø—N‘N 6Ô*ñ ô —‘ÐHÈ'Ï,É,ÐX[ÔdÙØ”x Õ'Õ'Ü�K‰KÐJÈGÏLÉLÐZ]ÔgjÐkoÓgpÔqØ�x‰x˜
 E×*Ò*¨t¯x©xÒ/Cð[ØŸ(™(Ÿ-™-¬¸Ó(=Ó>×>Ð>÷ ˜&×$6Ñ$6Ô6Ø×'Ñ'¨Ó/�Ø’?ð/ØŸ™ÇDÔ':¸4Ô'@ÈvÐW[ÈnÔ]ó ßÜ—‘ÐjÐls×lxÑlxÐz}ô  @Cð  DHó  @Iô  JØ×%Ñ% dÔ+ÙÜ�‰ÐHÈ'Ï,É,ÐX`ÐgmÖnøô] ô 	Ü�L‰LÐ:¸G¿L¹LÈ#ÔNÝûð	úò> ?øÜ ô [Ü—L‘LÐ!BÀGÇLÁLÐRY×ZÒZûð[ûô %ô /Ø×)Ñ)¨#×.Ð.Ùûð/üs»   ‚N#�L ›CN#ÃA%N#Å0N#Å5BN#È'L? È;L<È<L? É N#É%N#É.M9 ÊM9 ÊN#Ê A"N#ÌL9Ì!L4Ì.N#Ì4L9Ì9N#Ì<L? Ì?M6Í
!M1Í+N#Í1M6Í6N#Í9N ÎNÎN#ÎN Î N#c               ó    € V ^8„  d   QhRRRR/# )rL   Úraw_datarÐ  rM   rN   rO   )rP   s   "rQ   rR   r&    s   € ÷ +ñ +¨Eð +°cñ +rS   c                óv  € \         P                  ! \        4      ;_uu_ 4        \        P                  ! VP                  R4      4      p\        V\        4      '       d1   \        P                  V4      w  r4V'       d   V RV 2uuRRR4       # RRR4       \         P                  ! \        4      ;_uu_ 4        \        V4      pV'       d2   VP                  RR4       RVP                  RR4       2uuRRR4       #  RRR4       R\        V4       2#   + '       g   i     LŽ; i  + '       g   i     L1; i)zRDebounce key 'from_account:group_code' (JSON or protobuf), else a unique fallback.rÓ  rY   Nr&  rÝ   r'  Ú
__unknown_)rÇ  rÈ  rù   rÞ   r­  r¦  rû   rf   r¥  rº  r6   rÉ   rÒ  )rF  r»  rð  r&  r'  r$  s   &&    rQ   Ú_extract_sender_keyÚ%ConnectionManager._extract_sender_key  sâ   € ä× Ò ¤×+Õ+Ü—Z’Z §¡°Ó 8Ó9ˆFÜ˜&¤$×'Ò'Ü+;×+NÑ+NÈvÓ+VÑ(�ßØ*˜^¨1¨Z¨LÐ9÷ ,×+Ò+ô × Ò ¤×+Õ+Ü& xÓ0ˆDßØŸ(™( >°2Ó6Ð7°q¸¿¹À,ÐPRÓ9SÐ8TÐU÷ ,Ò+à÷ ,ð œB˜x›L˜>Ð*Ð*÷ ,×+ú÷ ,×+ús   £A!DÂ9:D(ÄD%	Ä(D8	c               ó    € V ^8„  d   QhRRRR/# )rL   r»  rÐ  rM   ro   rO   )rP   s   "rQ   rR   r&    s   € ÷ 	Bñ 	B¨ð 	B°4ñ 	BrS   c           	     ó   € V P                  V4      pV P                  P                  VR4      pV'       d   VP                  4        V P                  P                  V. 4      P                  V4       \        P                  RV P                  P                  V\        V P                  V,          4      4       \        P                  ! 4       P                  V P                  V P                   V4      V P                  V&   R# )z¤Debounced dispatch: frames from one sender within _DEBOUNCE_WINDOW run as ONE pipeline
execution, merging multi-part messages (e.g. image + text pushed separately).Nz2[%s] Debounce: buffered frame for key=%s, count=%d)r¾  r3  rÊ   rt   r2  rþ  r®  rô   rÞ  r(  r>  rË   r›   rL  Ú
call_laterr#  Ú_flush_inbound_buffer)rF  r»  r<  Úexisting_timers   &&  rQ   r¶  Ú"ConnectionManager._push_to_inbound  sÙ   € ð ×&Ñ& xÓ0ˆØ×-Ñ-×1Ñ1°#°tÓ<ˆßØ×!Ñ!Ô#Ø×Ñ×'Ñ'¨¨RÓ0×7Ñ7¸ÔAÜ�‰ÐIÈ4Ï=É=×K]ÑK]Ð_bÔdgÐhl×h|Ñh|ð  ~Aõ  iBó  eCô  	DÜ$+×$<Ò$<Ó$>×$IÑ$IÈ$×J_ÑJ_Ðae×a{Ña{ð  ~Aó  %Bˆ×Ñ˜SÓ!rS   c               ó    € V ^8„  d   QhRRRR/# )rL   r<  rN   rM   ro   rO   )rP   s   "rQ   rR   r&    s   € ÷ 	Gñ 	G¨ð 	G°ñ 	GrS   c                ó’  € V P                   P                  VR4       V P                  P                  V. 4      pV'       g   R# V P                  p\        P                  RVP                  V\        V4      4       VP                  \        P                  ! VP                  P                  \        W2R7      4      RV 2R7      4       R# )z4Run the pipeline over the buffered frames for *key*.Nz1[%s] Debounce flush: key=%s, aggregated %d frames)r   r"  zyuanbao-pipeline-rg  )r3  rÊ   r2  r(  rô   rõ   r>  rË   rS  r›   rT  Ú_inbound_pipeliner   r  )rF  r<  Ú	data_listr   s   &&  rQ   rÃ  Ú'ConnectionManager._flush_inbound_buffer  s¬   € à×Ñ× Ñ   dÔ+Ø×(Ñ(×,Ñ,¨S°"Ó5ˆ	ßÙØ—-‘-ˆÜ�‰ÐGÈÏÉÐWZÔ\_Ð`iÓ\jÔkØ×ÑœG×/Ò/Ø×%Ñ%×-Ñ-¬nÀWÔ.cÓdÐm~ð  @Cð  Dð  lEôFö 	GrS   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   Úencoded_conn_msgrÐ  Úreq_idrN   rØ   r"  rM   rf   rO   )rP   s   "rQ   rR   r&  '  s*   € ÷ 
1ñ 
1°uð 
1Àcð 
1ÐTYð 
1Ðuyñ 
1rS   c              ƒ  óÐ  "  € V P                   f   \        R4      h\        P                  ! 4       P	                  4       pW@P
                  V&    V P                   P                  V4      G Rj  x€L
  \        P                  ! \        P                  ! V4      VR7      G Rj  x€L
 V P
                  P                  VR4       #  LT L"  T P
                  P                  TR4       i ; i5i)zbSend a business request and await its response future (pending_acks[req_id]), cleaning up on exit.NúNot connectedr×   )
r)  rø   r›   rL  r›  r-  rh  r  ÚshieldrÊ   )rF  rÌ  rÍ  rØ   Úfutures   &&&& rQ   Úsend_biz_requestÚ"ConnectionManager.send_biz_request'  s¬   é € à�8‰8ÒÜ˜Ó/Ð/Ü!(×!9Ò!9Ó!;×!IÑ!IÓ!KˆØ%+×Ñ˜6Ñ"ð	1Ø—(‘(—-‘-Ð 0Ó1×1Ð1Ü ×)Ò)¬'¯.ª.¸Ó*@È'ÔR×Rà×Ñ×"Ñ" 6¨4Õ0ñ 2ÙRøà×Ñ×"Ñ" 6¨4Õ0üsB   ‚AC&ÁC Á,CÁ-3C Â CÂ!C Â$C&ÃC ÃC ÃC#Ã#C&c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r&  3  s   € ÷ @ñ @ Dñ @rS   c                ó²   € V P                   P                  '       d;   V P                  '       g'   \        P                  ! V P                  4       4       R# R# R# )zBSchedule a reconnect only if running and not already reconnecting.N)r(  r™  r1  r›   rT  Ú_reconnect_with_backoffrS  s   &rQ   r�  Ú$ConnectionManager.schedule_reconnect3  s<   € à�=‰=×!×!Ð!¨$×*<×*<Ð*<Ü×Ò × <Ñ <Ó >Ö?ñ +=Ñ!rS   c               ó   € V ^8„  d   QhRR/# r:  rO   )rP   s   "rQ   rR   r&  8  s   € ÷ 'ñ '¨tñ 'rS   c              ƒ  	óð   "  € V P                   '       d-   \        P                  R V P                  P                  4       R# RV n          V P                  4       G Rj  x€L
 RV n         #  L  RT n         i ; i5i)z,[%s] Reconnect already in progress, skippingFTN)r1  rô   rÞ  r(  r>  Ú_do_reconnectrS  s   &rQ   rÖ  Ú)ConnectionManager._reconnect_with_backoff8  s_   é € Ø××ÐÜ�L‰LÐGÈÏÉ×I[ÑI[Ô\ÙØ!ˆÔð	'Ø×+Ñ+Ó-×-à!&ˆDÕñ .øà!&ˆDÕüs0   ‚AA6Á	A* ÁA(ÁA* Á A6Á(A* Á*	A3Á3A6c               ó   € V ^8„  d   QhRR/# r:  rO   )rP   s   "rQ   rR   r&  B  s   € ÷ ñ  Tñ rS   c              ƒ  ó�  "  € V P                   p\        \        4       EFi  pV^,           V n        \	        ^V,          ^<4      p\
        P                  RVP                  V^,           \        V4       \        P                  ! V4      G Rj  x€L
  V P                  4       G Rj  x€L
   \        P                  VP                  VP                  VP                  VP                   R7      G Rj  x€L
 pV P#                  V4      G Rj  x€L
 '       g,   \
        P%                  RVP                  V^,           4       EK  ^ V n        V P)                  RR7       \
        P                  RVP                  V^,           V P*                  4        R# 	  \
        P1                  R
VP                  \        4       VP3                  4        R#  EL9 EL$ LÜ LÅ  \,         d.    \
        P%                  RTP                  T^,           4        EKæ  \.         d6   p\
        P%                  R	TP                  T^,           T4        Rp?EK   Rp?ii ; i5i)uf   Reconnect loop (under the _reconnecting guard) with exponential backoff 1s, 2s, 4s, â€¦ capped at 60s.z#[%s] Reconnect attempt %d/%d in %dsN©rÔ   z![%s] Re-auth failed on attempt %dTrE  z,[%s] Reconnected on attempt %d. connectId=%sz#[%s] Reconnect attempt %d timed outz$[%s] Reconnect attempt %d failed: %sz*[%s] Giving up after %d reconnect attemptsF)r(  rì   ÚMAX_RECONNECT_ATTEMPTSr0  Úminrô   rõ   r>  r›   rÿ   rO  r“   r  rL  rT  rS  r…  rK  rý   r/  rN  r*  r  rù   r›  r©  )rF  r   r  ÚwaitrF  r  s   &     rQ   rÚ  ÚConnectionManager._do_reconnectB  sÇ  é € à—-‘-ˆÜÔ3×4ˆGØ'.°¥{ˆDÔ$Ü�q˜G•| RÓ(ˆDÜ�K‰KÐ=¸w¿|¹|ÈWÐWXÍ[ÔZpÐrvÔwÜ—-’- Ó%×%Ð%Ø×"Ñ"Ó$×$Ð$ðgÜ#.×#<Ñ#<Ø×$Ñ$ g×&9Ñ&9¸7×;NÑ;NÐZa×ZlÑZlð $=ó $÷ �
ð "ŸZ™Z¨
Ó3×3Ö3Ü—N‘NÐ#FÈÏÉÐV]Ð`aÕVaÔbÚØ01�Ô-Ø—‘°�Ô5Ü—‘ÐJÈGÏLÉLÐZaÐdeÕZeÐgk×gwÑgwÔxÚñ! 5ô* 	�‰ÐAÀ7Ç<Á<ÔQgÔhØ×"Ñ"Ô$Ùò' &Ú$ññ 4øô  ô aÜ—‘ÐDÀgÇlÁlÐT[Ð^_ÕT_×`Ð`Üô gÜ—‘ÐEÀwÇ|Á|ÐU\Ð_`ÕU`Ðbe×fÓfûðgüs˜   ‚BIÂ
GÂIÂ"GÂ#IÂ(AGÃ,G	Ã-GÄGÄ	GÄ(GÄ8IÄ;AGÆ=IÇIÇ	GÇGÇ3IÈ IÈIÈIÈ)H>È7IÈ>IÉIc               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r&  ^  s   € ÷ ñ  4ñ rS   c              ƒ  óF  "  € V P                   pRV n         Ve6    \        P                  ! VP                  4       \        R7      G Rj  x€L
  R# R#  L  \
         d4    \        P                  RT P                  P                  \        4        R# \         d     R# i ; i5i)zeClose and clear the WS, bounded by WS_CLOSE_TIMEOUT_S so an unresponsive server can't stall teardown.Nr×   u>   [%s] WS close handshake exceeded %.1fs â€” dropping connection)r)  r›   r  ru  ÚWS_CLOSE_TIMEOUT_Sr  rô   rÞ  r(  r>  rù   )rF  r7  s   & rQ   rO  ÚConnectionManager._cleanup_ws^  s„   é € à�X‰XˆØˆŒØŠ>ðÜ×&Ò& r§x¡x£zÔ;MÔN×NÒNñ áNøÜô Gä—‘Ð]Ð_c×_lÑ_l×_qÑ_qô  tF÷  GÜô ÚðüsL   ‚B!›-A ÁAÁ	A ÁB!ÁA Á:BÂB!ÂBÂBÂB!ÂBÂB!)r(  r*  r/  r+  r2  r3  r-  r.  r0  r1  r,  r)  N))r+  r   rï  )r,  r¬  r‡  )!r‹   rŒ   r�   rŽ   r�   r#  r  rh  r]  r£  r7  r>  r’  rK  rN  rb  ru  r\  r�  r‰  r   r¬  r¥  r¾  r¶  rÃ  ÚDEFAULT_SEND_TIMEOUTrÒ  r�  rÖ  rÚ  rO  r‘   rO   rS   rQ   r!  r!  ä  s¸   ‡ ÙkØ!Ð�eÓ!Øk€FõBð ñó ðð ôó ðõ"õHõ"1õ{õ!õ(õTCõ
õ õB&õ*2oõh+õ	Bõ	Gð ]q÷ 
1õ@õ
'õ÷8ñ rS   r!  c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
rL   ÚlabelrN   r  Údefault_nameÚdefault_mimerb   r3  rM   útuple[bytes, str, str]rO   )rP   s   "rQ   rR   rR   l  sA   € ÷ 	Kñ 	K Sð 	K°ð 	KÀ3ð 	KÐVYð 	KØ,ð	KØ8Nñ	KrS   c                óÀ  € \         P                  P                  V4      '       g   \        RV 24      h\        P                  RV P                  W4       \        VR4      ;_uu_ 4       pVP                  4       pRRR4       T;'       g*    \         P                  P                  V4      ;'       g    TpXT\        V4      ;'       g    T3#   + '       g   i     L[; i)zJ(bytes, filename, content_type) for a local file; ValueError when missing.zFile not found: z[%s] %s: reading %sÚrbN)rÀ  r  r  rú   rô   rõ   r>  r’  Úreadrj  r+   )r   ré  r  rê  rë  rb   rê  rk  s   &&&&&&  rQ   Ú_read_local_filerð  l  s¥   € ô �7‰7�>‰>˜$×ÒÜÐ+¨D¨6Ð2Ó3Ð3Ü
‡K�KÐ% w§|¡|°UÔAÜ	ˆd�D×	Ô	˜QØ—V‘V“Xˆ
÷ 
à×AÐAœ2Ÿ7™7×+Ñ+¨DÓ1×AÐA°\€HØ�x¤°Ó!:×!JÐ!J¸lÐJÐJ÷ 
×	ús   Á)CÃC	c                  ób   € ] tR tRtRtR R lt]R R l4       t]R R l4       tRR
 R llt	Rt
R	# )ÚMediaSendHandlerix  u¼   Media send strategy: subclasses provide acquire_file() and build_msg_body(); handle() runs
the shared flow (check ws â†’ cancel notifier â†’ validate â†’ COS upload â†’ lock â†’ dispatch).c               ó   € V ^8„  d   QhRR/# r:  rO   )rP   s   "rQ   rR   ÚMediaSendHandler.__annotate__{  s   € ÷ ñ  $ñ rS   c                ó   € R# )z5Override to return False for non-COS media (sticker).TrO   rS  s   &rQ   Úneeds_cos_uploadÚ!MediaSendHandler.needs_cos_upload{  s   € árS   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r   r  Úkwargsr   rM   rì  rO   )rP   s   "rQ   rR   rô  €  s'   € ÷ Xñ X¨.ð XÀCð XÐLbñ XrS   c              ‹  ó   "  € R# 5i)zI(file_bytes, filename, content_type); raise ValueError when unobtainable.NrO   ©rF  r   rù  s   &&,rQ   Úacquire_fileÚMediaSendHandler.acquire_file  s   é ‚ ùrI  c               ó$   € V ^8„  d   QhRRRRRR/# )rL   Úupload_resultrf   rù  r   rM   rq   rO   )rP   s   "rQ   rR   rô  „  s&   € ÷ Iñ I¨Dð I¸Cð IÀDñ IrS   c                ó   € R# )z:Platform-specific MsgBody list from the COS upload result.NrO   ©rF  rÿ  rù  s   &&,rQ   Úbuild_msg_bodyÚMediaSendHandler.build_msg_bodyƒ  s   ‚ rS   Nc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )rL   r   r  r-  rN   Úreply_tor3  Úcaptionrù  r   rM   r   rO   )rP   s   "rQ   rR   rô  ‡  sA   € ÷ !Sñ !S Nð !S¸Sð !SÈMð !SØ+ð!SØ>Að!SØFPñ!SrS   c              ‹  	ó|  "  € VP                   P                  f   \        RRRR7      # VP                  P                  P                  V4        V P                  ! V3/ VB G R j  x€L
 w  rgpV P                  4       '       Ed   \        P                  WgVP                  4      p	V	'       d   \        RV	R7      # VP                  4       G R j  x€L
 p
\        VP                  VP                  V
P                  RR4      YzP                  RR4      ;'       g    VP                   ;'       g    RVP"                  R	7      G R j  x€L
 p\%        WgW‹VR
,          VR,          R7      G R j  x€L
 pV P&                  ! V3/ / VCR\)        V4      RVRV/CB pMV P&                  ! / 3/ VB pV'       d   VP+                  \-        V4      4       VP                  P.                  P1                  W-W5P                  RR4      R7      G R j  x€L
 #  EL  EL< LÊ L§ L  \2         d!   p\        R\5        T4      R7      u R p?# R p?i\6         du   p\8        P;                  RTP<                  \?        T 4      P@                  TRR7       \        R\5        T4      ;'       g    \?        T4      P@                  R7      u R p?# R p?ii ; i5i)NFrÏ  T©Úsuccessr›  rC  ©r	  r›  r  rÝ   rä   )r—   rÓ   r  rb   rä   rÔ   Ú
bucketNameÚregion)rk  rb   rl  ÚcredentialsÚbucketr  Ú	file_uuidrb   rl  r'  ©r'  z[%s] %s.handle() failed: %sr™  )!Ú_connectionr7  r   rî  Úslow_notifierrt   rü  rö  ÚMessageSenderÚvalidate_mediari  rR  r'   rL  rS  rÉ   rl  r…  r(   r  r,   r®  rl   rÕ  Údispatch_msg_bodyrú   rN   rù   rô   r›  r>  rö  r‹   )rF  r   r-  r  r  rù  rk  rb   rl  Úvalidation_errrF  r  rÿ  r*  Úver  s   &&&&&,          rQ   rG  ÚMediaSendHandler.handle‡  s„  é € à×Ñ×!Ñ!Ò)Ü e°?ÈdÔSÐSØ×Ñ×'Ñ'×.Ñ.¨wÔ7ð	SØ7;×7HÒ7HÈÑ7[ÐTZÑ7[×1[Ñ.ˆJ ,Ø×$Ñ$×&Ó&ä!.×!=Ñ!=¸jÐT[×TmÑTmÓ!n�ß!Ü%¨e¸>ÔJÐJØ#*×#<Ñ#<Ó#>×>�
Ü$7Ø#×,Ñ,¸×9LÑ9LÐT^×TbÑTbÐcjÐlnÓToØ%¯n©n¸XÀrÓ.J×.cÐ.cÈgÏoÉo×.cÐ.cÐacÐov÷  pBñ  pBô%÷ �ô '4Ø)È<Ø& |Õ4¸[ÈÕ=Rô'÷ !�ð
  ×.Ò.¨}ñ uð AtØðAtØ)¬7°:Ó+>À
ÈHÐVdÐfrñAtñ u‘ð  ×.Ò.¨rÑ<°VÑ<�ßØ—‘¤
¨7Ó 3Ô4Ø ×*Ñ*×1Ñ1×CÑCÀGÐW_×lvÑlvð  xDð  FHó  mIÐCó  J÷  Jð  Jò- 2\ò ?ññ!ñ JøÜô 	<Ü e´3°r³7Ô;Õ;ûÜô 	SÜ�L‰LÐ6¸¿¹ÄdÈ4Ãj×FYÑFYÐ[^ÐimˆLÔnÜ e´3°s³8×3QÐ3Q¼tÀC»y×?QÑ?QÔRÕRûð	SüsÑ   ‚AJ<ÁH Á%HÁ&AH Â8J<Â9H ÃHÃAH ÄH Ä*H Å HÅ$H Å%HÅ&AH Æ,AH È HÈH ÈJ<ÈH ÈH ÈH ÈH ÈH ÈJ9ÈH7È1J9È2J<È7J9ÉJ9ÉA)J4Ê.J9Ê/J<Ê4J9Ê9J<rO   r¢  )r‹   rŒ   r�   rŽ   r�   rö  r   rü  r  rG  r‘   rO   rS   rQ   rò  rò  x  sE   † ñiõð ôXó ðXð ôIó ðI÷!Só !SrS   rò  c                  ó    € ] tR tRtRtR tRtR# )Ú_ImageHandleri«  z4Shared TIMImageElem body builder for image handlers.c                	ó¬   € \        VR ,          VR,          VR,          VR,          VP                  R^ 4      VP                  R^ 4      VR,          R7      # )r   r  rb   ÚsizeÚwidthÚheightrl  )r   rƒ  rb   r  r  r  Ú	mime_type)r)   rÉ   r  s   &&,rQ   r  Ú_ImageHandler.build_msg_body­  sX   € Ü#Ø˜eÕ$¨6°+Õ+>ÈÐPZÕI[ÐboÐpvÕbwØ×#Ñ# G¨QÓ/¸×8IÑ8IÈ(ÐTUÓ8VÐbhÐiwÕbxô
ð 	
rS   rO   N)r‹   rŒ   r�   rŽ   r�   r  r‘   rO   rS   rQ   r  r  «  s
   † Ù>ö
rS   r  c                  ó    € ] tR tRtRtR tRtR# )ÚImageUrlHandleri´  u5   Image from a URL (download â†’ COS â†’ TIMImageElem).c              ‹  	ór  "  € VR ,          p\         P                  RVP                  V4       \        W1P                  R7      G Rj  x€L
 w  rEVP                  R4      ^ ,          pV'       d   VR8X  d   \        V4      ;'       g    RpT\        P                  P                  V4      ;'       g    RV3#  Ln5i)r/  z$[%s] ImageUrlHandler: downloading %src  NÚ?rg  rf  ú	image.jpg)
rô   rõ   r>  rh  ri  r]  r+   rÀ  r  rj  )rF  r   rù  r/  rk  rl  Ú	path_parts   &&,    rQ   rü  ÚImageUrlHandler.acquire_file¶  s”   é € Ø Õ,ˆ	Ü�‰Ð:¸G¿L¹LÈ)ÔTÜ);¸I×SlÑSlÔ)m×#mÑ ˆ
Ø—O‘O CÓ(¨Õ+ˆ	ß˜|Ð/IÔIÜ*¨9Ó5×EÐE¸ˆLØœ2Ÿ7™7×+Ñ+¨IÓ6×EÐE¸+À|ÐSÐSñ	 $nùs   ‚AB7ÁB5Á>B7Â)B7Â0B7rO   N©r‹   rŒ   r�   rŽ   r�   rü  r‘   rO   rS   rQ   r"  r"  ´  s   † Ù?öTrS   r"  c                  ó    € ] tR tRtRtR tRtR# )ÚImageFileHandleriÀ  u8   Image from a local path (read â†’ COS â†’ TIMImageElem).c              ‹  	ó6   "  € \        VR VR,          RR4      # 5i)r*  Ú
image_pathr%  rf  )rð  rû  s   &&,rQ   rü  ÚImageFileHandler.acquire_fileÂ  s    é € Ü Ð);¸VÀLÕ=QÐS^Ð`lÓmÐmùs   ‚rO   Nr(  rO   rS   rQ   r*  r*  À  s   † ÙBönrS   r*  c                  ó&   € ] tR tRtRtR tR tRtR# )ÚDocumentHandleriÆ  u3   Local file/document (read â†’ COS â†’ TIMFileElem).c           
   ‹  	óV   "  € \        VR VR,          RRVP                  R4      4      # 5i)r/  Ú	file_pathrù  rg  rb   )rð  rÉ   rû  s   &&,rQ   rü  ÚDocumentHandler.acquire_fileÈ  sE   é € Ü Ð):¸FÀ;Õ<OÐQ[Ð]wÐy÷  zDñ  zDð  EOó  zPó  Qð  	Qùs   ‚')c                	óX   € \        VR ,          VR,          VR,          VR,          R7      # )r   rb   r  r  )r   rb   rƒ  r  )r*   r  s   &&,rQ   r  ÚDocumentHandler.build_msg_bodyË  s=   € Ü" }°UÕ';ÀfÈZÕFXÐ_eÐfqÕ_rð  zGð  HNõ  zOô  Pð  	PrS   rO   N)r‹   rŒ   r�   rŽ   r�   rü  r  r‘   rO   rS   rQ   r/  r/  Æ  s   † Ù=òQöPrS   r/  c                  ó2   € ] tR tRtRtR R ltR tR tRtR# )	ÚStickerHandleriÏ  z+Sticker/emoji (TIMFaceElem, no COS upload).c               ó   € V ^8„  d   QhRR/# r:  rO   )rP   s   "rQ   rR   ÚStickerHandler.__annotate__Ñ  s   € ÷ ñ  $ñ rS   c                	ó   € R # )FrO   rS  s   &rQ   rö  ÚStickerHandler.needs_cos_uploadÑ  s   € ÙrS   c              ‹  	ó   "  € R# 5i)rS   )rS   Ústickerrg  rO   rû  s   &&,rQ   rü  ÚStickerHandler.acquire_fileÔ  s   é € Ø9Ð9ùrI  c                	óê   € ^ RI HpHpHpHp VP                  R4      pVe$   V! V4      pVf   \        RV: 24      hV! V4      # VP                  R4      e   V! VR,          R7      # V! V! 4       4      # )r€  )Úget_sticker_by_nameÚget_random_stickerÚbuild_face_msg_bodyÚbuild_sticker_msg_bodyÚsticker_namezSticker not found: Ú
face_index)rD  )Ú)plugins.platforms.yuanbao.yuanbao_stickerr?  r@  rA  rB  rÉ   rú   )	rF  rÿ  rù  r?  r@  rA  rB  rC  r<  s	   &&,      rQ   r  ÚStickerHandler.build_msg_body×  s~   € ÷	
ó 	
ð —z‘z .Ó1ˆØÒ#Ù)¨,Ó7ˆGØŠÜ Ð#6°|Ñ6FÐ!GÓHÐHÙ)¨'Ó2Ð2Ø�:‰:�lÓ#Ò/Ù&°&¸Õ2FÔGÐGÙ%Ñ&8Ó&:Ó;Ð;rS   rO   N)	r‹   rŒ   r�   rŽ   r�   rö  rü  r  r‘   rO   rS   rQ   r6  r6  Ï  s   † Ù5õò:ö<rS   r6  c                  ór   € ] tR tRtRtR R ltR R ltR R ltR	 R
 ltR R lt	RR R llt
R R ltRtR# )ÚHeartbeatManageriæ  zWReply heartbeat lifecycle: RUNNING every 2s, auto-FINISH after 30s idle, explicit stop.c               ó    € V ^8„  d   QhRRRR/# r%  rO   )rP   s   "rQ   rR   ÚHeartbeatManager.__annotate__è  s   € ÷ :ñ : ð :°4ñ :rS   c                	ó.   € Wn         / V n        / V n        R # rÃ   )r(  Ú_reply_heartbeat_tasksÚ_reply_hb_last_activer4  s   &&rQ   r]  ÚHeartbeatManager.__init__è  s   € ØŒØ?AˆÔ#Ø79ˆÖ"rS   c               ó   € V ^8„  d   QhRR/# r:  rO   )rP   s   "rQ   rR   rJ  í  s   € ÷ Xñ X˜ñ XrS   c                	ó”   € V P                   P                  P                  R J;'       d     \        V P                   P                  4      # rÃ   )r(  r  r7  r¹   rl  rS  s   &rQ   Ú_readyÚHeartbeatManager._readyí  s4   € Ø�}‰}×(Ñ(×+Ñ+°4Ð7×WÐW¼DÀÇÁ×AVÑAVÓ<WÐWrS   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r-  rN   Úheartbeat_valr|   rM   ro   rO   )rP   s   "rQ   rR   rJ  ð  s&   € ÷ Sñ S°ð SÀSð SÈTñ SrS   c              ƒ  óN  "  € V P                   pV P                  4       '       g   R#  VP                  R4      '       d&   \        VP                  V\        R4      R VR7      pM'\        VP                  VP                  R4      VR7      pVP                  P                  P                  V4      G Rj  x€L
  \        P                  RVP                  V\        8X  d   RMRV4       R#  L5  \         d-   p\        P                  R	TP                  T4        Rp?R# Rp?ii ; i5i)
z9Send a single heartbeat (RUNNING or FINISH), best effort.Nr  )r&  r'  rï  r  )r&  rÀ  rï  z%[%s] Reply heartbeat %s sent: chat=%sÚRUNNINGÚFINISHz#[%s] send_heartbeat_once failed: %s)r(  rQ  r±  r@   rl  rË   r?   Úremoveprefixr  r7  rh  rô   rÞ  r>  r.   rù   )rF  r-  rT  r   Úencodedr  s   &&&   rQ   rð  Ú$HeartbeatManager.send_heartbeat_onceð  sÿ   é € à—-‘-ˆØ�{‰{�}Š}Ùð		SØ×!Ñ! (×+Ò+Ü5À7Ç?Á?Ð_fÔgjÐksÓgtÐguÐ_vð  CPô  Q‘ä7ÀWÇ_Á_Ðah×auÑauÐvó  bAð  MZô  [�Ø×%Ñ%×(Ñ(×-Ñ-¨gÓ6×6Ð6Ü�L‰LÐ@À'Ç,Á,Ø&3Ô7KÔ&K™ÐQYÐ[bödñ 7øô ô 	SÜ�L‰LÐ>ÀÇÁÈc×RÒRûð	SüsF   ‚%D%¨C+ ¿A4C+ Â3C)Â43C+ Ã'D%Ã)C+ Ã+D"Ã6!DÄD%ÄD"Ä"D%c               ó    € V ^8„  d   QhRRRR/# ©rL   r-  rN   rM   ro   rO   )rP   s   "rQ   rR   rJ   	  s   € ÷ Bñ B 3ð B¨4ñ BrS   c              ƒ  óf  "  € V P                  4       '       g   R# \        P                  ! 4       V P                  V&   V P                  P	                  V4      pV'       d   VP                  4       '       d:   \        P                  ! V P                  V4      RV 2R7      V P                  V&   R# R# 5i)z+Start or renew the periodic RUNNING sender.Nzyuanbao-reply-hb-rg  )	rQ  r¼   rM  rL  rÉ   rs   r›   rT  Ú_worker)rF  r-  Úexistings   && rQ   rÙ  ÚHeartbeatManager.start 	  s‰   é € à�{‰{�}Š}ÙÜ.2¯iªi«kˆ×"Ñ" 7Ñ+Ø×.Ñ.×2Ñ2°7Ó;ˆß˜8Ÿ=™=Ÿ?š?Ü3:×3FÒ3FÀtÇ|Á|ÐT[ÓG\ÐevÐw~Ðvð  dAô  4BˆD×'Ñ'¨Ó0ñ +ùs   ‚AB1Á B1Á6;B1c               ó    € V ^8„  d   QhRRRR/# r\  rO   )rP   s   "rQ   rR   rJ  		  s   € ÷ :ñ : Sð :¨Tñ :rS   c              ƒ  ó‚  "  € Rp V P                  V\        4      G Rj  x€L
   \        P                  ! \        4      G Rj  x€L
  \
        P
                  ! 4       V P                  P                  V^ 4      ,
          \        8”  g#   V P                  P                  P                  f   M V P                  V\        4      G Rj  x€L
  K¥  V'       g   V P                  V\        4      G Rj  x€L
  V P                  P!                  VR4       V P                  P!                  VR4       R#  EL
 Lé Lk  \        P                   d    Rp L€\         d     LŒi ; i Ln  T'       g    T P                  T\        4      G Rj  x€L 
  T P                  P!                  TR4       T P                  P!                  TR4       i ; i5i)u�   Send RUNNING every 2s; after 30s without renewal (or WS loss) send FINISH and exit.
A cancelled worker sends no FINISH â€” stop() decides that.FNT)rð  r.   r›   rÿ   ÚREPLY_HEARTBEAT_INTERVAL_Sr¼   rM  rÉ   ÚREPLY_HEARTBEAT_TIMEOUT_Sr(  r  r7  rž  rù   r/   rL  rÊ   )rF  r-  Ú	cancelleds   && rQ   r^  ÚHeartbeatManager._worker		  s`  é € ð ˆ	ð	:Ø×*Ñ*¨7Ô4HÓI×IÐIØÜ—m’mÔ$>Ó?×?Ð?Ü—I’I“K $×"<Ñ"<×"@Ñ"@ÀÈ!Ó"LÕLÔOhÔhØŸ=™=×4Ñ4×7Ñ7Ò?ØØ×.Ñ.¨wÔ8LÓM×MÒM÷ Ø×.Ñ.¨wÔ8KÓL×LÐLØ×'Ñ'×+Ñ+¨G°TÔ:Ø×&Ñ&×*Ñ*¨7°DÖ9ò Já?ñ NøÜ×%Ñ%ô 	ØŠIÜô 	Ùð	úñ Mø÷ Ø×.Ñ.¨wÔ8KÓL×LÑLØ×'Ñ'×+Ñ+¨G°TÔ:Ø×&Ñ&×*Ñ*¨7°DÕ9üs¥   ‚F?†D0 ŸD) "D0 ÁD,ÁA%D0 Â(E Â)D0 ÃD.ÃD0 Ã	!F?Ã*EÃ+>F?Ä)D0 Ä,D0 Ä.D0 Ä0EÅE Å	EÅEÅE ÅEÅE ÅF?Å"F<Å=F Å>>F<Æ<F?c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r-  rN   Úsend_finishr¹   rM   ro   rO   )rP   s   "rQ   rR   rJ  	  s&   € ÷ Iñ I #ð I°Dð IÀDñ IrS   c              ƒ  ó   "  € V P                   P                  VR4      pV'       d*   VP                  4       '       g   \        V4      G Rj  x€L
  V'       d!   V P	                  V\
        4      G Rj  x€L
  R# R#  L. L
5i)z3Stop the RUNNING sender and optionally send FINISH.N)rL  rÊ   rs   r$   rð  r/   )rF  r-  rh  rv   s   &&& rQ   ÚstopÚHeartbeatManager.stop	  s_   é € à×*Ñ*×.Ñ.¨w¸Ó=ˆß˜Ÿ	™	ŸšÜ˜dÓ#×#Ð#ßØ×*Ñ*¨7Ô4GÓH×HÒHñ ñ $áHùs.   ‚:A>½A>ÁA:ÁA>ÁA>Á1A<Á2	A>Á<A>c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   rJ  '	  s   € ÷ +ñ +˜Tñ +rS   c              ƒ  	ól   "  € \        V P                  4       V P                  P                  4        R # 5irÃ   )rw   rL  rM  ru   rS  s   &rQ   ru  ÚHeartbeatManager.close'	  s%   é € Ü�D×/Ñ/Ô0Ø×"Ñ"×(Ñ(Ö*ùs   ‚24)r(  rM  rL  N)T)r‹   rŒ   r�   rŽ   r�   r]  rQ  rð  rÙ  r^  rj  ru  r‘   rO   rS   rQ   rH  rH  æ  s1   † Ùaõ:õ
XõSõ Bõ:÷,I÷+ñ +rS   rH  c                  óV   € ] tR tRtRtR R ltR R ltR R ltR	 R
 ltR R lt	Rt
R# )ÚSlowResponseNotifieri,	  zaPer-chat timer that sends a courtesy 'please wait' after SLOW_RESPONSE_TIMEOUT_S without a reply.c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r   r  rÕ  r  rM   ro   rO   )rP   s   "rQ   rR   Ú!SlowResponseNotifier.__annotate__.	  s!   € ÷ 2ñ 2 ð 2¸ð 2È$ñ 2rS   c                	ó,   € Wn         W n        / V n        R # rÃ   ©r(  Ú_senderÚ_tasks)rF  r   rÕ  s   &&&rQ   r]  ÚSlowResponseNotifier.__init__.	  s   € ØŒØŒØ/1ˆŽrS   c               ó    € V ^8„  d   QhRRRR/# r\  rO   )rP   s   "rQ   rR   rr  3	  s   € ÷ qñ q 3ð q¨4ñ qrS   c              ƒ  	óž   "  € V P                  V4       \        P                  ! V P                  V4      R V 2R7      V P                  V&   R# 5i)zyuanbao-slow-resp-rg  N)rt   r›   rT  Ú	_notifierrv  ©rF  r-  s   &&rQ   rÙ  ÚSlowResponseNotifier.start3	  s?   é € Ø�‰�GÔÜ&×2Ò2°4·>±>À'Ó3JÐSeÐfmÐenÐQoÔpˆ�‰�GÓùs   ‚AAc               ó    € V ^8„  d   QhRRRR/# r\  rO   )rP   s   "rQ   rR   rr  7	  s   € ÷ \ñ \ sð \¨tñ \rS   c              ƒ  	óÜ  "  €  \         P                  ! \        4      G R j  x€L
  \        P	                  RV P
                  P                  \        \        4      V4       V P                  P                  V\        4       4      G R j  x€L
  R #  Lk L  \         P                   d     R # \         d7   p\        P                  RT P
                  P                  T4        R p?R # R p?ii ; i5i)Nz<[%s] Agent response exceeded %ds for %s, sending wait noticez&[%s] Slow-response notifier failed: %s)r›   rÿ   ÚSLOW_RESPONSE_TIMEOUT_Srô   rõ   r(  r>  r|   ru  Úsend_text_chunkrU   rž  rù   rÞ  )rF  r-  r  s   && rQ   rz  ÚSlowResponseNotifier._notifier7	  s¼   é € ð	\Ü—-’-Ô 7Ó8×8Ð8Ü�K‰KÐVÐX\×XeÑXe×XjÑXjÔloô  qHó  mIð  KRô  SØ—,‘,×.Ñ.¨wÔ8MÓ8OÓP×PÒPñ 9áPøÜ×%Ñ%ô 	ÚÜô 	\Ü�L‰LÐAÀ4Ç=Á=×CUÑCUÐWZ×[Ò[ûð	\üsc   ‚C,„B ¡B¢A$B ÂBÂB ÂC,ÂB ÂB ÂC)Â&C,Â)C)Â2C)Â3+C$ÃC,Ã$C)Ã)C,c               ó    € V ^8„  d   QhRRRR/# r\  rO   )rP   s   "rQ   rR   rr  A	  s   € ÷ ñ ˜cð  dñ rS   c                	ó¢   € V P                   P                  VR 4      pV'       d+   VP                  4       '       g   VP                  4        R # R # R # rÃ   )rv  rÊ   rs   rt   )rF  r-  rv   s   && rQ   rt   ÚSlowResponseNotifier.cancelA	  s3   € Ø�{‰{�‰˜w¨Ó-ˆß˜Ÿ	™	ŸšØ�K‰KŽMñ $‰4rS   c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   rr  F	  ó   € ÷ !ñ !˜Tñ !rS   c              ƒ  	ó8   "  € \        V P                  4       R # 5irÃ   )rw   rv  rS  s   &rQ   ru  ÚSlowResponseNotifier.closeF	  s   é € Ü�D—K‘KÖ ùs   ‚rt  N)r‹   rŒ   r�   rŽ   r�   r]  rÙ  rz  rt   ru  r‘   rO   rS   rQ   rp  rp  ,	  s%   † Ùkõ2õ
qõ\õ÷
!ñ !rS   rp  c                  ó¤  € ] tR tRt$ Rt]! 0 R-m4      tR]R&   RtR]R&   ]	P                  ! R]	P                  4      tR	 R
 ltR R ltR.R R lltR/R R lltR0R R lltR.R R llt]R R l4       tR1R R lltR R ltR R ltR2R R lltR0R  R! llt]R" R# l4       t]R3R$ R% ll4       t]R4R& R' ll4       t]R( R) l4       tR* R+ ltR,tR# )5r  iJ	  z¨Outbound dispatcher: per-chat locks (serial ordering), chunked text with retry, C2C/group
encoding, media handler strategies, and send_direct for the send_message tool.zClassVar[frozenset]Ú
IMAGE_EXTSrÛ  r  ÚCHAT_DICT_MAX_SIZEz!(?:(?<=\s)|(?<=^))@(\S+?)(?=\s|$)c               ó    € V ^8„  d   QhRRRR/# r%  rO   )rP   s   "rQ   rR   ÚMessageSender.__annotate__R	  s   € ÷ 
ñ 
 ð 
°4ñ 
rS   c           	     	ó¤   € Wn         \        P                  ! 4       V n        R \	        4       R\        4       R\        4       R\        4       /V n        R# )r/  Ú
image_filerù  r<  N)	r(  ÚcollectionsÚOrderedDictÚ_chat_locksr"  r*  r/  r6  Ú_media_handlersr4  s   &&rQ   r]  ÚMessageSender.__init__R	  sK   € ØŒÜGR×G^ÒG^ÓG`ˆÔàœÓ*¨LÔ:JÓ:LÈjÔZiÓZkÐmvô  yGó  yIð=
ˆÖrS   c               ó    € V ^8„  d   QhRRRR/# )rL   r-  rN   rM   r˜   rO   )rP   s   "rQ   rR   r�  Y	  s   € ÷ )ñ ) Sð )¨\ñ )rS   c           
     óº  a € VS P                   9   d   S P                   P                  V4       M›\        S P                   4      S P                  8¼  dV   S P                   P	                  \        V 3R lS P                    4       \        \        S P                   4      4      4      4       \        P                  ! 4       S P                   V&   S P                   V,          # )zHPer-chat-id lock with LRU eviction (prefers evicting an unlocked entry).c              3  óz   <"  € T F0  pSP                   V,          P                  4       '       d   K,  Vx € K2  	  R # 5irÃ   )r’  Úlocked)rq  rÌ   rF  s   & €rQ   rt  Ú.MessageSender.get_chat_lock.<locals>.<genexpr>_	  s,   øé € Ð*kÑ6F°Èd×N^ÑN^Ð_`ÕNa×NhÑNh×Nj¯1ª1Ó6Fùs   ƒ);±
;)	r’  Úmove_to_endrË   r‹  rÊ   rv  Úiterr›   rœ   r{  s   f&rQ   Úget_chat_lockÚMessageSender.get_chat_lockY	  sµ   ø€ à�d×&Ñ&Ô&Ø×Ñ×(Ñ(¨Õ1ä�4×#Ñ#Ó$¨×(?Ñ(?Ô?Ø× Ñ ×$Ñ$¤TÔ*k°d×6FÒ6FÓ*kÔmqÔrvÐw{÷  xHñ  xHó  sIó  nJó  &Kô  LÜ(/¯ª«ˆD×Ñ˜WÑ%Ø×Ñ Õ(Ð(rS   Nc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	rL   r-  rN   r  r  r3  r'  rM   r   rO   )rP   s   "rQ   rR   r�  c	  s1   € ÷ (ñ ( sð (°Sð (ÀMð (Ðfið (Ðs}ñ (rS   c              ƒ  ó8  "  € V P                   pVP                  P                  f   \        RRRR7      # VP                  P
                  P                  V4       V P                  V4      ;_uu_4       GRj  x€L
  V P                  V4      pV P                  WeP                  4      p\        P                  RVP                  \        V4      VP                  \        V4      V Uu. uF  p\        V4      NK  	  up4       \        V4       FR  w  ršT P!                  YV	^ 8X  d   TMRVR7      G Rj  x€L
 pVP"                  '       d   K>  Tu uuRRR4      GRj  x€L
  # 	  RRR4      GRj  x€L
  \$        P&                  ! \(        4      ;_uu_ 4        VP                  P*                  P-                  V\.        4      G Rj  x€L
  RRR4       \        RR7      #  ELdu upi  L± LŠ Ly  + GRj  x€L 
 '       g   i     L�; i LB  + '       g   i     LH; i5i)	z@Send text with auto-chunking and per-chat-id ordering guarantee.NFrÏ  Tr  zJ[%s] truncate_message: input=%d chars, max=%d, output=%d chunk(s) sizes=%sr  )r	  )r(  r  r7  r   rî  r  rt   rœ  Ústrip_cron_wrapperÚtruncate_messageÚMAX_TEXT_CHUNKrô   rõ   r>  rË   rw  r€  r	  rÇ  rÈ  rù   rï  rð  r/   )rF  r-  r  r  r'  r   Úcontent_to_sendÚchunksr–  rr  Úchunkr¯  s   &&&&&       rQ   Ú	send_textÚMessageSender.send_textc	  s™  é € à—-‘-ˆØ×Ñ×!Ñ!Ò)Ü e°?ÈdÔSÐSØ×Ñ×'Ñ'×.Ñ.¨wÔ7Ø×%Ñ% g×.×.Õ.Ø"×5Ñ5°gÓ>ˆOØ×*Ñ*¨?×<RÑ<RÓSˆFÜ�K‰KÐdØŸ™¤c¨/Ó&:¸G×<RÑ<RÔTWÐX^ÓT_ÑrxÓayÑrxÐmnÔbeÐfgÖbhÑrxÑayô{ä% fÖ-‘�Ø#×3Ñ3°GÐPQÐUVÔPVÁHÐ\`ÐmwÐ3Óx×x�Ø—~—~’~Ø!‘M÷ /×.Ò.ñ
 .÷ /×.ô × Ò ¤×+Õ+Ø×#Ñ#×-Ñ-×AÑAÀ'ÔK^Ó_×_Ð_÷ ,ä $Ô'Ð'ò /ùò bzáx÷ /×.×.Ô.úñ `÷ ,×+üs»   ‚A5HÁ7GÁ8HÁ;A+G)Ã&GÃ:7G)Ä1G#
Ä2G)Å
G)ÅHÅG%ÅHÅ G)Å"HÅ-G'Å.&HÆ.HÇHÇHÇHÇG)Ç%HÇ'HÇ)H	Ç/G2Ç0
H	Ç;H	Ç=HÈHÈH	ÈHc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   r-  rN   Úhandler_namer  r3  r  rù  r   rM   r   rO   )rP   s   "rQ   rR   r�  v	  sA   € ÷ jñ j¨ð j¸3ð jÈ-ð jØ"/ðjØBEðjØJTñjrS   c              ‹  	óÂ   "  € V P                   P                  V4      pVf   \        RRV: 2R7      # VP                  ! V P                  V3RVRV/VB G R j  x€L
 #  L5i)NFzUnknown media handler: r
  r  r  )r“  rÉ   r   rG  r(  )rF  r-  r©  r  r  rù  ra  s   &&&&&, rQ   Ú
send_mediaÚMessageSender.send_mediav	  sb   é € à×&Ñ&×*Ñ*¨<Ó8ˆØŠ?Ü eÐ5LÈ\ÑL\Ð3]Ô^Ð^Ø—^’^ D§M¡M°7ÑiÀXÐiÐW^ÐiÐbhÑi×iÐiÑiùs   ‚AAÁAÁAc               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r-  rN   ÚmessageÚmedia_filesz Optional[list[tuple[str, bool]]]rM   r¸   rO   )rP   s   "rQ   rR   r�  }	  s4   € ÷ rñ r¨ð r°sð rÐIið rð  vDñ rrS   c              ƒ  ó2  "  € V P                   pRpVP                  4       '       d=   VP                  W4      G Rj  x€L
 pVP                  '       g   RRVP                   2/# T;'       g    .  F„  w  rg\        V4      P                  P                  4       V P                  9   d   VP                  MVP                  pV! W4      G Rj  x€L
 pVP                  '       d   Ks  RRVP                   2/u # 	  Vf   RR/# RRRR	R
VRVP                  /#  L× LK5i)z_send_message tool entry: text first, then each media file by extension, on the running adapter.Nr›  zYuanbao send failed: zYuanbao media send failed: z6No deliverable text or media remained after processingr	  Tr»  rÛ  r-  rZ  )r(  r\   rh  r	  r›  r   Úsuffixr^  rŠ  Úsend_image_fileÚsend_documentrZ  )	rF  r-  r®  r¯  r   Úlast_resultÚ
media_pathÚ	_is_voicerh  s	   &&&&     rQ   Úsend_directÚMessageSender.send_direct}	  s  é € à—-‘-ˆØ,0ˆØ�=‰=�?Š?Ø '§¡¨WÓ >×>ˆKØ×&×&Ð&ØÐ#8¸×9JÑ9JÐ8KÐ!LÐMÐMØ%0×%6Ð%6°BÒ%6Ñ!ˆJÜ.2°:Ó.>×.EÑ.E×.KÑ.KÓ.MÐQU×Q`ÑQ`Ô.`�7×*Ò*Ðfm×f{Ñf{ˆDÙ $ WÓ 9×9ˆKØ×&×&Ò&ØÐ#>¸{×?PÑ?PÐ>QÐ!RÐSÒSñ	 &7ð
 ÒØÐUÐVÐVØ˜4 ¨Y¸	À7ÈLÐZe×ZpÑZpÐqÐqñ ?ñ
 :ùs4   ‚9D»D¼DÁDÁ,ADÃ	DÃ
DÃ"2DÄDc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rL   r-  rN   r*  rq   r  r3  r'  rM   r   rO   )rP   s   "rQ   rR   r�  Ž	  s5   € ÷ ,ñ ,¨sð ,¸dð ,Èmð ,Ðpsð ,ð  ~Hñ ,rS   c              ƒ  ó  "  € V P                  V4      ;_uu_4       GRj  x€L
  V P                  WW44      G Rj  x€L
 pRRR4      GRj  x€L
  V P                  X4      #  L? L' L  + GRj  x€L 
 '       g   i     L0; i5i)z5Lock + dispatch an arbitrary MsgBody to C2C or group.N)rœ  Ú_send_msg_bodyÚ_to_send_result)rF  r-  r*  r  r'  r¯  s   &&&&& rQ   r  ÚMessageSender.dispatch_msg_bodyŽ	  s]   é € à×%Ñ% g×.×.Õ.Ø×.Ñ.¨wÀ(ÓW×WˆF÷ /×.à×#Ñ# FÓ+Ð+ñ /ÙW÷ /×.×.Ò.üsY   ‚B A ¡B¤A&ºA"»A&¿BÁ
A$ÁBÁ"A&Á$BÁ&A?	Á,A/Á-
A?	Á8A?	Á:Bc               ó    € V ^8„  d   QhRRRR/# )rL   rŒ  rf   rM   r   rO   )rP   s   "rQ   rR   r�  •	  s   € ÷ Rñ R˜Tð R jñ RrS   c                	ó¢   € V P                  R 4      '       d   \        RV P                  R4      R7      # \        RV P                  RR4      R7      # )r	  TrÅ  )r	  rZ  Fr›  úUnknown errorr
  )rÉ   r   )rŒ  s   &rQ   r¼  ÚMessageSender._to_send_result”	  s?   € à�7‰7�9×ÒÜ d°s·w±w¸yÓ7IÔJÐJÜ %¨s¯w©w°wÀÓ/PÔQÐQrS   c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   r-  rN   re   r  r3  Úretryr|   r'  rM   r   rO   )rP   s   "rQ   rR   r�  š	  sE   € ÷ Vñ V¨Sð V¸ð VÀ}ð VÐdgð VÐy|ð Vð  GQñ VrS   c           	   ƒ  ó6  "  € V P                   pRp\        V4       Fø  p VP                  R4      '       d   V P                  W!\	        R4      R 4      p	M\        V4      .p	V P                  WW54      G Rj  x€L
 p
V
P                  R4      '       d   V P                  V
4      u # V
P                  RR4      p\        P                  RVP                  V^,           WG4       W„^,
          8  g   KÓ  \        P                  ! ^V,          4      G Rj  x€L
  Kú  	  \        P!                  RVP                  WG4       \#        R	R
V 2R7      #  LÒ  \         d?   p\        T4      p\        P                  RTP                  T^,           YG4        Rp?L¯Rp?ii ; i L‡5i)zFSend a single text chunk with retry (exponential backoff: 1s, 2s, 4s).rÀ  r  Nr	  r›  z-[%s] send_text_chunk attempt %d/%d failed: %sz0[%s] send_text_chunk attempt %d/%d exception: %sz>[%s] send_text_chunk max retries (%d) exceeded. Last error: %sFzMax retries exceeded: r
  )r(  rì   r±  Ú_build_msg_body_with_mentionsrË   rl   r»  rÉ   r¼  rô   rý   r>  rù   rN   r›   rÿ   r›  r   )rF  r-  re   r  rÃ  r'  r   Ú
last_errorr  r*  rŒ  r  s   &&&&&&      rQ   r€  ÚMessageSender.send_text_chunkš	  sp  é € à—-‘-ˆØ)ˆ
Ü˜U–|ˆGðAØ×%Ñ% h×/Ò/Ø#×AÑAÀ$ÔPSÐT\ÓP]ÐP^ÐH_Ó`‘Hä *¨4Ó 0Ð1�HØ ×/Ñ/°À8ÓX×X�Ø—7‘7˜9×%Ò%Ø×/Ñ/°Ó4Ò4Ø ŸW™W W¨oÓ>�
Ü—‘ÐNÐPW×P\ÑP\Ð^eÐhiÕ^iÐkpÔ}ð  �Ö"Ü—m’m A¨¥LÓ1×1Ò1ñ $ô  	�‰ÐUÐW^×WcÑWcÐejÔwÜ %Ð1GÈ
À|Ð/TÔUÐUñ Yøô
 ô AÜ  ›X�
Ü—‘ÐQÐSZ×S_ÑS_ÐahÐklÕalÐns÷  Añ  AûðAúñ 2ùse   ‚F AEÁ6E	Á7EÂEÂ"FÂ%;EÃ 
FÃ/ FÄFÄ9FÅ	EÅFÅ4FÆ
FÆFÆFc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rL   r-  rN   r*  rq   r  r3  r'  rM   rf   rO   )rP   s   "rQ   rR   r�  ±	  s8   € ÷ nñ n¨Cð n¸4ð nÈ=ð nÐfið nÐnrñ nrS   c              ƒ  óà   "  € VP                  R4      '       d'   V P                  V\        R4      R W#4      G Rj  x€L
 # V P                  VP	                  R4      W$R7      G Rj  x€L
 #  L. L5i)zYRoute a MsgBody to group (``group:<code>``) or C2C (``direct:<account>`` / bare account).r  Nr  r  )r±  Úsend_group_msg_bodyrË   Úsend_c2c_msg_bodyrX  )rF  r-  r*  r  r'  s   &&&&&rQ   r»  ÚMessageSender._send_msg_body±	  sd   é € à×Ñ˜h×'Ò'Ø×1Ñ1°'¼#¸h»-¸.Ð2IÈ8Ó^×^Ð^Ø×+Ñ+¨G×,@Ñ,@ÀÓ,KÈXÐ+Óm×mÐmñ _Ùmùs!   ‚9A.»A*¼)A.Á%A,Á&A.Á,A.c               ó$   € V ^8„  d   QhRRRRRR/# )rL   re   rN   r'  rM   rq   rO   )rP   s   "rQ   rR   r�  ·	  s!   € ÷ !.ñ !.°#ð !.À3ð !.È4ñ !.rS   c                óü  € V P                   P                  P                  V4      pV'       dV   \        P                  ! 4       V^ ,          ,
          V P                   P                  8¼  d   V P                   P                  V RpV'       d   V^,          '       g   \        V4      .# / pV^,           Fy  pVP                  R4      ;'       g    VP                  R4      ;'       g    RpVP                  R4      ;'       g    RpV'       g   K\  V'       g   Kf  Wg3WFP                  4       &   K{  	  . p^ p	V P                  P                  V4       Fã  p
WV
P                  4        P                  4       pV'       d   VP                  \        V4      4       V
P                  ^4      pVP                  VP                  4       4      pV'       d:   Vw  rçVP                  RRRR	\        P                  ! R
RRRV 2RV/4      //4       MVP                  \        RV 24      4       V
P                  4       p	Kå  	  WR P                  4       pV'       d   VP                  \        V4      4       T;'       g    \        V4      .# )z¥Parse @nickname patterns against the (unexpired) member cache into mixed TIMTextElem +
TIMCustomElem(elem_type 1002) msg_body; plain text when no members are cached.NÚnicknamerÂ  rÝ   r  rh   rÆ  ri   rã   r  r!  re   Ú@)r(  Ú_member_cacherÉ   r¼   ÚMEMBER_CACHE_TTL_Srl   r^  Ú_AT_USER_RErß  rÙ  r\   r®  rZ   rÞ   ÚdumpsrÚ  )rF  re   r'  r  Únickname_to_uidr_   Únickr|  r*  Úlast_idxÚmatchÚsegrÏ  r·   Ú	real_nickÚtails   &&&             rQ   rÅ  Ú+MessageSender._build_msg_body_with_mentions·	  s  € ð —‘×,Ñ,×0Ñ0°Ó<ˆß”d—i’i“k F¨1¥IÕ-°·±×1QÑ1QÔQØ—‘×+Ñ+¨JÐ7ØˆFß˜V AŸYœYÜ˜tÓ$Ð%Ð%ØˆØ˜—�ˆAØ—5‘5˜Ó$×@Ð@¨¯©¨kÓ(:×@Ð@¸bˆDØ—%‘%˜	Ó"×(Ð( bˆCß‰tŸ™Ø15°�§
¡
£Ó-ñ	 ð
 ˆØˆØ×%Ñ%×.Ñ.¨tÖ4ˆEØ §¡£Ð.×4Ñ4Ó6ˆCßØ—‘¤
¨3£Ô0Ø—{‘{ 1“~ˆHØ#×'Ñ'¨¯©Ó(8Ó9ˆEßØ!&‘�	Ø—‘ ¨_Ø!.°¼¿ºÀ[ÐRVÐX^ÐbcÐdmÐcnÐ`oÐqzÐ|ð  EAó  :Bð  1Cð!Dõ Eð —‘¤
¨Q¨x¨j¨>Ó :Ô;Ø—y‘y“{ŠHñ 5ð �Iˆ×$Ñ$Ó&ˆßØ�O‰OœJ tÓ,Ô-Ø×-Ð-œJ tÓ,Ð-Ð-rS   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   rÀ  rN   r*  rq   r'  rM   rf   rO   )rP   s   "rQ   rR   r�  Ú	  s*   € ÷ ñ °#ð Àð ÐSVð Ð`dñ rS   c              ƒ  	óÆ   "  € R \        4        2pT P                  V P                  \        YV P                  P                  ;'       g    RWCR7      V4      G Rj  x€L
 #  L5i)Úc2c_rÝ   )rÀ  r*  r&  r+  r'  N)rC   Ú_dispatch_encodedr(  r=   rl  )rF  rÀ  r*  r'  rÍ  s   &&&& rQ   rË  ÚMessageSender.send_c2c_msg_bodyÚ	  s\   é € Øœ›�Ð'ˆØ×+Ñ+¨D¯M©MÔ;RØ!À4Ç=Á=×CXÑCX×C^ÐC^Ð\^Ðgmô<
àó÷ ð 	ñ ùs   ‚AA!ÁAÁA!c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   r'  rN   r*  rq   r  r3  rM   rf   rO   )rP   s   "rQ   rR   r�  à	  s*   € ÷ ñ °Cð À4ð ÐS`ð Ðlpñ rS   c              ƒ  	óÚ   "  € R \        4        2pT P                  V P                  \        YV P                  P                  ;'       g    RYC;'       g    RR7      V4      G Rj  x€L
 #  L5i)Úgrp_rÝ   )r'  r*  r&  r+  Ú
ref_msg_idN)rC   rà  r(  r>   rl  )rF  r'  r*  r  rÍ  s   &&&& rQ   rÊ  Ú!MessageSender.send_group_msg_bodyà	  sq   é € Øœ›�Ð'ˆØ×+Ñ+¨D¯M©MÔ;TØ!À4Ç=Á=×CXÑCX×C^ÐC^Ð\^Ðgm÷  {Ið  {Ið  GIô<
àó÷ ð 	ñ ùs   ‚AA+ÁA+Á$A)Á%A+c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   r   r  rY  rÐ  rÍ  rN   rM   rf   rO   )rP   s   "rQ   rR   r�  ç	  s*   € ÷ 9ñ 9¨ð 9À%ð 9ÐQTð 9ÐY]ñ 9rS   c              ƒ  ó  "  €  V P                   P                  WR7      G Rj  x€L
 pRRRVP                  RR4      /#  L  \         d    RRR	R
\         R2/u # \
         d   pRRR	\        T4      /u Rp?# Rp?ii ; i5i)uG   Send pre-encoded bytes via WS â†’ ``{"success", "msg_key" | "error"}``.©rÍ  Nr	  TrÅ  r+  rÝ   Fr›  zRequest timeout after Ús)r  rÒ  rÉ   r  rç  rù   rN   )r   rY  rÍ  r  r  s   &&&  rQ   rà  ÚMessageSender._dispatch_encodedæ	  s�   é € ð	9Ø$×0Ñ0×AÑAÀ'ÐAÓY×YˆHØ˜t Y°·±¸XÀrÓ0JÐKÐKñ Zøäô 	aØ˜u gÐ1GÔH\ÐG]Ð]^Ð/_Ð`Ò`Üô 	9Ø˜u g¬s°3«xÐ8Õ8ûð	9üsS   ‚B„A  £>¤A  ½B¾A  Á A>ÁBÁA>Á$A>Á%A9Á3A>Á4BÁ9A>Á>Bc               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   rk  zOptional[bytes]rb   rN   rd  r|   rM   r3  rO   )rP   s   "rQ   rR   r�  ò	  s*   € ÷ ñ  ?ð ¸cð ÐPSð Ð]jñ rS   c                ó¤   € V '       g   RV 2# \        V 4      VR,          R,          8”  d%   RV R\        V 4      R,          R,          R RV R2# R# )	z,Pre-upload check; error description or None.zEmpty file: i   zFile too large: z (z.1fzMB > zMB)N)rË   )rk  rb   rd  s   &&&rQ   r  ÚMessageSender.validate_mediañ	  s^   € ÷ Ø! ( Ð,Ð,Üˆz‹?˜[¨4Õ/°$Õ6Ô6Ø% h Z¨r´#°j³/ÀDÕ2HÈ4Õ2OÐPSÐ1TÐTYÐZeÐYfÐfiÐjÐjÙrS   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rL   r  rN   Ú
max_lengthr|   r}   r~   rM   r   rO   )rP   s   "rQ   rR   r�  û	  s*   € ÷ #ñ # #ð #°3ð #ÐGeð #Ðqzñ #rS   c                óÖ   € T;'       g    \         ! V 4      V8:  d   V .# \        P                  WVR7       Uu. uF  p\        P	                  RV4      NK  	  ppT;'       g    V .# u upi )zVTable/fence-aware chunking via MarkdownProcessor, stripping ``(1/3)`` page indicators.)r}   rÝ   )rË   ry   r‡   Ú_INDICATOR_REÚsub)r  rð  r}   r–  r¤  s   &&&  rQ   r¡  ÚMessageSender.truncate_messageú	  sl   € ð �MˆM”cˆM˜7Ó# zÔ1Ø�9ÐÜ4E×4YÑ4YÐZaÐv|Ð4YÔ4}Ó~Ñ4}¨q”-×#Ñ# B¨Ö*Ñ4}ˆÐ~Ø×"Ð"˜'˜Ð"ùò s   ¸A&c               ó    € V ^8„  d   QhRRRR/# )rL   r  rN   rM   rO   )rP   s   "rQ   rR   r�  
  s   € ÷ 
Qñ 
Q Cð 
Q¨Cñ 
QrS   c                ó0  € V P                  \        4      '       g   V # \        p\        pV P	                  V4      pV P                  V4      pV^ 8  g   V^ 8  g   WC8:  g   RV RV 9  d   V # W\        V4      ,           V P                  4       ;'       g    T # )zYStrip the scheduler's cron header/footer wrapper; unchanged when the shape doesn't match.z

(job_id: N)r±  ÚCRON_WRAPPER_HEADER_PREFIXÚCRON_WRAPPER_DIVIDERÚCRON_WRAPPER_FOOTER_PREFIXÚfindÚrfindrË   r\   )r  ÚdividerÚfooter_prefixÚdivider_posÚ
footer_poss   &    rQ   r   Ú MessageSender.strip_cron_wrapper
  sŽ   € ð ×!Ñ!Ô"<×=Ò=ØˆNÜ&ˆÜ2ˆØ—l‘l 7Ó+ˆØ—]‘] =Ó1ˆ
Ø˜Œ?˜j¨1œn°
Ô0IÈ]ÐbiÐjvÐkvÐbwÔMwØˆNØ¤S¨£\Õ1°*Ð=×CÑCÓE×PÐPÈÐPrS   c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r�  
  r†  rS   c              ƒ  	óB   "  € V P                   P                  4        R # 5irÃ   )r’  ru   rS  s   &rQ   ru  ÚMessageSender.close
  s   é € Ø×Ñ×ÑÖ ùrñ  )r(  r’  r“  >   r8  r9  r7  r:  r<  r>  rÕ  r¢  rÃ   )Né   rÝ   r  )é   r‰   ) r‹   rŒ   r�   rŽ   r�   rb  rŠ  r  r‹  ÚreÚcompileÚ	MULTILINErÓ  r]  rœ  r¦  r«  r·  r  r  r¼  r€  r»  rÅ  rË  rÊ  rà  r  r¡  r   ru  r‘   rO   rS   rQ   r  r  J	  sç   ‡ ñVá&/Ò0bÓ&c€JÐ#ÓcØ(,Ð˜Ó,à—*’*ÐAÀ2Ç<Á<ÓP€Kõ
õ)÷(÷&j÷r÷",ð ôRó ðR÷
Võ.nõ!.÷F÷ð ô9ó ð9ð öó ðð ö#ó ð#ð ô
Qó ð
Q÷!ñ !rS   r  c                  ó2   € ] tR tRtRtR R ltR R ltRtR# )	ÚOutboundManageri
  z“Composes MessageSender, HeartbeatManager and SlowResponseNotifier (sender cancels the notifier
before a send and emits the FINISH heartbeat after).c               ó    € V ^8„  d   QhRRRR/# r%  rO   )rP   s   "rQ   rR   ÚOutboundManager.__annotate__
  s   € ÷ ^ñ ^ ð ^°4ñ ^rS   c                	ó†   € Wn         \        V4      V n        \        V4      V n        \        WP                  4      V n        R # rÃ   )r(  r  rÕ  rH  rï  rp  r  r4  s   &&rQ   r]  ÚOutboundManager.__init__
  s2   € ØŒÜ%2°7Ó%;ˆŒÜ+;¸GÓ+DˆŒÜ3GÈ×Q\ÑQ\Ó3]ˆÖrS   c               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r  
  s   € ÷ )ñ )˜Tñ )rS   c              ƒ  	óæ   "  € V P                   P                  4       G R j  x€L
  V P                  P                  4       G R j  x€L
  V P                  P                  4       G R j  x€L
  R #  LJ L* L
5irÃ   )rÕ  ru  rï  r  rS  s   &rQ   ru  ÚOutboundManager.close
  sT   é € Ø�k‰k×ÑÓ!×!Ð!Ø�n‰n×"Ñ"Ó$×$Ð$Ø× Ñ ×&Ñ&Ó(×(Ò(ñ 	"Ù$Ù(ùs3   ‚A1 A+¡!A1ÁA-Á!A1Á$A/Á%A1Á-A1Á/A1)r(  rï  rÕ  r  N)r‹   rŒ   r�   rŽ   r�   r]  ru  r‘   rO   rS   rQ   r
  r
  
  s   † ñ<õ^÷)ñ )rS   r
  c                  óÔ  a € ] tR tRt$ Rt]P                  tRtR]	R&   Rt
^2tR]	R&   RtR	tR
]	R&   / tR]	R&   ]R R l4       t]R R l4       tR V 3R lltR R lt]R R l4       tR R ltRR/R R lltR R ltR=R  R! lltR" R# ltR>R$ R% lltR& R' ltR( V 3R) lltR* R+ ltR, R- ltR?R. R/ llt R@R0 R1 llt!RAR2 R3 llt"RAR4 R5 llt#RAR6 R7 llt$RBR8 R9 llt%R: R; lt&R<t'V ;t(# )Cr  i"
  zCYuanbao AI Bot adapter backed by a persistent WebSocket connection.rŠ   r|   r¢  Tri  i'  Nz"ClassVar[Optional[YuanbaoAdapter]]Ú_active_instancez#ClassVar[dict[str, YuanbaoAdapter]]Ú_active_instancesc               ó   € V ^8„  d   QhRR/# )rL   rM   úOptional[YuanbaoAdapter]rO   )rP   s   "rQ   rR   ÚYuanbaoAdapter.__annotate__2
  s   € ÷ <ñ <Ð3ñ <rS   c                	ó|   € ^ RI HpHp V! 4       f   V P                  # V P                  P                  V! 4       4      # )r€  ©Úget_hermes_home_overrideÚhermes_home_key)Úhermes_constantsr  r  r  r  rÉ   )r†   r  r  s   &  rQ   Ú
get_activeÚYuanbaoAdapter.get_active1
  s4   € çNá#Ó%Ò-Ø×'Ñ'Ð'Ø×$Ñ$×(Ñ(©Ó):Ó;Ð;rS   c               ó    € V ^8„  d   QhRRRR/# )rL   r   r  rM   ro   rO   )rP   s   "rQ   rR   r  :
  s   € ÷ ?ñ ?Ð!9ð ?¸dñ ?rS   c                	ó¬   € ^ RI HpHp V! 4       f	   Wn        R# Vf$   V P                  P                  V! 4       R4       R# WP                  V! 4       &   R# )r€  r  N)r  r  r  r  r  rÊ   )r†   r   r  r  s   &&  rQ   rc  ÚYuanbaoAdapter.set_active9
  sC   € çNá#Ó%Ò-Ø#*Ö ØŠ_Ø×!Ñ!×%Ñ%¡oÓ&7¸Ö>à7>×!Ñ!¡/Ó"3Ó4rS   c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r½  r   rù  r   rM   ro   rO   )rP   s   "rQ   rR   r  D
  s&   € ÷ &iñ &i˜~ð &i¸ð &iÀñ &irS   c                	óž  <a€ \         SV `  V\        P                  4       VP                  ;'       g    / oSP                  R 4      ;'       g    RP                  4       V n        SP                  R4      ;'       g    RP                  4       V n        SP                  R4      ;'       g    RV n	        SP                  R4      ;'       g    \        P                  4       V n        SP                  R4      ;'       g    \        P                  R4      V n        SP                  R4      ;'       g    RP                  4       V n         \!        SP                  R	\"        4      4      p\)        \*        \-        \.        V4      4      V n        \3        V 4      V n        \7        V 4      V n        \;        4       V n        \;        4       V n        / V n         R
V n!        \E        RR7      V n#        / V n$        / V n%        / V n&        / V n'        R V3R llp\Q        . V! R4      OV! R4      O5!  V n)        \T        PW                  4       V n,        \[        RR4      ;'       g+    VP\                  '       d   VP\                  P^                  MRp\a        V4      ;'       d    VPc                  R4      '       * V n2        R#   \$        \&        3 d    \"        p ELei ; i)Úapp_idrÝ   r¢   rä   NÚws_urlrÓ   rÖ   rÔ   r�  g     Àr@i,  )Úttl_secondsc               ó    € V ^8„  d   QhRRRR/# )rL   r`   rN   rM   ztuple[str, list[str]]rO   )rP   s   "rQ   rR   Ú-YuanbaoAdapter.__init__.<locals>.__annotate__b
  s   € ÷ 	Lñ 	L˜#ð 	LÐ"7ñ 	LrS   c                óÎ  <€ SP                  V  R 24      ;'       g(    \        RV P                  4        R24      ;'       g    RP                  4       P	                  4       pSP                  V  R24      ;'       g    \        RV P                  4        R2R4      pYP                  R4       Uu. uF*  q3P                  4       '       g   K  VP                  4       NK,  	  up3# u upi )Ú_policyÚYUANBAO_Ú_POLICYÚpairingr  Ú_ALLOW_FROMrÝ   Ú,)rÉ   r°  Úupperr\   r^  r]  )r`   r¥  rŒ  ÚxÚ_extras   &   €rQ   r*  Ú(YuanbaoAdapter.__init__.<locals>._policyb
  s¹   ø€ Ø—j‘j D 6¨Ð!1Ó2×oÐo´jÀ8ÈDÏJÉJËLÈ>ÐY`ÐAaÓ6b×oÐoÐfo×vÑvÓx×~Ñ~ó  AˆFØ—*‘* ˜v [Ð1Ó2×jÐj´jÀ8ÈDÏJÉJËLÈ>ÐYdÐAeÐgiÓ6jˆCØ¯y©y¸¬~ÓK©~¨!ÇÁÇœI˜AŸG™GžI©~ÑKÐKÐKùÒKs   Â.C"Ã
C"r	  rZ   r­  r  )3Úsuperr]  r   rv  ÚextrarÉ   r\   rL  rT  rl  ÚDEFAULT_WS_GATEWAY_URLrJ  ÚDEFAULT_API_DOMAINrç   rS  r…  r|   Ú_DEFAULT_RESOLVE_CONCURRENCYrÊ  rú   rô  Ú_MIN_RESOLVE_CONCURRENCYrà  Ú_MAX_RESOLVE_CONCURRENCYr�  r!  r  r
  rî  rB  r	  Ú_background_tasksrÑ  rÒ  r#   ró  rý  r7  rC  r)  ru  r¤  r  r  rÈ  r°  r¾  r-  r¹   r±  r®  )rF  r½  rù  Ú_raw_concurrencyr*  Ú_existing_homer2  rR  s   &&,   @€rQ   r]  ÚYuanbaoAdapter.__init__D
  s=  ù€ Ü‰Ñ˜¤×!1Ñ!1Ô2Ø—‘×#Ð# ˆØ$Ÿj™j¨Ó2×8Ð8°b×?Ñ?ÓAˆŒØ!'§¡¨LÓ!9×!?Ð!?¸R× FÑ FÓ HˆÔØ&,§j¡j°Ó&:×&BÐ&B¸dˆŒØ#ŸZ™Z¨Ó1×KÐKÔ5K×RÑRÓTˆŒØ!'§¡¨LÓ!9×!OÐ!OÔ=O× WÑ WÐX[Ó \ˆÔØ &§
¡
¨;Ó 7× =Ð =¸2×DÑDÓFˆŒð	<Ü" 6§:¡:Ð.IÔKgÓ#hÓiÐô /2Ô2JÌCÔPhÐjzÓL{Ó.|ˆÔ&Ü.?ÀÓ.EˆÔÜ*9¸$Ó*?ˆŒÜ14³ˆÔÜ47³EˆÔà<>ˆÔØ).ˆÔÜ)°cÔ:ˆŒØ79ˆÔð 46ˆÔ Ø57ˆÔ"Ø24ˆÔ÷	Lð 	Lô +ÐM©G°D«MÐM¹GÀGÓ<LÓMˆÔÜ2H×2NÑ2NÓ2PˆÔä#Ð$:¸BÓ?×ÐÐci×cv×cvÐcvÀF×DWÑDW×D_ÒD_Ð|~ˆÜ(,¨^Ó(<×(hÐ(hÀ^×E^ÑE^Ð_gÓEhÔAhˆÖøô5 œ:Ð&ô 	<Ü;Óð	<ús   ÅJ1 Ê1KËKc               ó    € V ^8„  d   QhRRRR/# )rL   rv   zasyncio.TaskrM   rO   )rP   s   "rQ   rR   r  l
  s   € ÷ ñ  ð °ñ rS   c                ó†   € V P                   P                  V4       VP                  V P                   P                  4       V# )z@Register a fire-and-forget task so it won't be GC'd prematurely.)r;  r°  r
  r  )rF  rv   s   &&rQ   rS  ÚYuanbaoAdapter._track_taskl
  s5   € à×Ñ×"Ñ" 4Ô(Ø×Ñ˜t×5Ñ5×=Ñ=Ô>ØˆrS   c               ó   € V ^8„  d   QhRR/# r:  rO   )rP   s   "rQ   rR   r  s
  s   € ÷ ñ ¨Dñ rS   c                ó   € R# )zZIntake gating lives in ``AccessPolicy`` (composed, not inherited), so the flag stays here.TrO   rS  s   &rQ   Úenforces_own_access_policyÚ)YuanbaoAdapter.enforces_own_access_policyr
  s   € ñ rS   c               ó    € V ^8„  d   QhRRRR/# )rL   rA  r  rM   r¹   rO   )rP   s   "rQ   rR   r  w
  s   € ÷ Lñ L¨nð LÀñ LrS   c                óŽ  € V P                   p\        VP                  ;'       g    R4      P                  4       pV'       g   R# VP                  R8X  db   VP                  V4      '       d   R# VP                  R8X  d6   ^ RIHp V! 4       P                  \        P                  P                  V4      # R# \        VP                  ;'       g    R4      P                  4       pVP                  R8w  g	   V'       g   R# VP                  R8X  d   VP                  V4      # VP                  R	8H  ;'       d    VP!                  4       # )
zˆSender may persist YUANBAO_HOME_CHANNEL: strict allowlist, open opt-in, or pairing-approved
(intake-only pairing forwards are excluded).rÝ   Fr	  Tr-  )ÚPairingStorerZ   Ú	allowlistr’  )r¤  rN   r&  r\   r.  r‰  rx  Úgateway.pairingrH  Úis_approvedr   rv  r=  r'  rz  r–  r“  )rF  rA  r¥  rÕ  rH  r'  s   &&    rQ   r¯  Ú)YuanbaoAdapter._sender_may_designate_homew
  sü   € ð  $×2Ñ2ˆÜ�S×%Ñ%×+Ð+¨Ó,×2Ñ2Ó4ˆßÙØ�=‰=˜DÔ Ø×#Ñ# F×+Ò+ÙØ×Ñ 9Ô,Ý8Ù#“~×1Ñ1´(×2BÑ2B×2HÑ2HÈ&ÓQÐQÙÜ˜Ÿ™×-Ð-¨2Ó.×4Ñ4Ó6ˆ
Ø�=‰=˜GÔ#¯:ÙØ×Ñ +Ô-Ø×*Ñ*¨:Ó6Ð6Ø×"Ñ" fÑ,×KÐK°×1IÑ1IÓ1KÐKrS   Úis_reconnectFc               ó    € V ^8„  d   QhRRRR/# )rL   rM  r¹   rM   rO   )rP   s   "rQ   rR   r  Œ
  s   € ÷ ñ ¨Tð ¸dñ rS   c             ƒ  	óˆ   "  € V P                   P                  4       G R j  x€L
 pV'       d   V P                  R 4       V#  L5irÃ   )r  r’  Ú_wire_plugin_handlers)rF  rM  Úoks   &$ rQ   rZ  ÚYuanbaoAdapter.connectŒ
  s7   é € Ø×#Ñ#×(Ñ(Ó*×*ˆßØ×&Ñ& tÔ,Øˆ	ñ +ùs   ‚A A ¡A­Ac               ó   € V ^8„  d   QhRR/# rÁ   rO   )rP   s   "rQ   rR   r  ’
  s   € ÷ 4ñ 4 $ñ 4rS   c              ƒ  óê  "  € \         P                  V J d   R\         n        \        \         P                  P	                  4       4       F  w  rW J g   K  \         P                  V K  	  RV n        V P                  4        V P                  4        V P                  P                  4       G Rj  x€L
  V P                  P                  4       G Rj  x€L
  \        V P                  4       F+  pVP                  4       '       d   K  VP                  4        K-  	  V P                  P                  4        V P                  P                  4        \         P#                  RV P$                  4       R#  LÀ L 5i)z;Cancel background tasks and close the WebSocket connection.NFz[%s] Disconnected)r  r  rq   r  rÈ   r™  r©  rP  r  ru  rî  r	  rs   rt   ru   rý  rô   rõ   r>  )rF  Úhome_keyr�  rv   s   &   rQ   Ú
disconnectÚYuanbaoAdapter.disconnect’
  s	  é € ä×*Ñ*¨dÓ2Ø.2ŒNÔ+Ü $¤^×%EÑ%E×%KÑ%KÓ%MÖ NÑˆHØ�~Ü"×4Ñ4°XÒ>ñ !Oð ˆŒØ×ÑÔ!Ø×#Ñ#Ô%Ø×Ñ×$Ñ$Ó&×&Ð&Ø�n‰n×"Ñ"Ó$×$Ð$Ü˜×,Ñ,Ö-ˆDØ—9‘9—;”;Ø—‘–ñ .ð 	×Ñ×!Ñ!Ô#Ø×Ñ× Ñ Ô"Ü�‰Ð'¨¯©Ö3ñ 	'Ù$ùs2   ‚AE3ÁAE3Â.E/Â/!E3ÃE1Ã/E3ÄA+E3Å1E3c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )rL   r-  rN   r  r  r3  ÚmetadatazOptional[dict[str, Any]]r'  rM   r   rO   )rP   s   "rQ   rR   r  ¥
  sA   € ÷ hñ h #ð h°ð h¸}ð hØ5ðhØJMðhØWañhrS   c              ƒ  	ól   "  € V P                   P                  P                  WW5R 7      G Rj  x€L
 #  L5i)r  N)rî  rÕ  r¦  )rF  r-  r  r  rY  r'  s   &&&&&&rQ   rh  ÚYuanbaoAdapter.send¥
  s+   é € à—^‘^×*Ñ*×4Ñ4°WÀxÐ4Óg×gÐgÑgùs   ‚+4­2®4c               ó    € V ^8„  d   QhRRRR/# )rL   r-  rN   rM   r¸   rO   )rP   s   "rQ   rR   r  ©
  s   € ÷ \ñ \¨3ð \°>ñ \rS   c              ƒ  	óJ   "  € R TRVP                  R4      '       d   R/# R/# 5i)r>  rö  r  rZ   r	  rî  r{  s   &&rQ   Úget_chat_infoÚYuanbaoAdapter.get_chat_info©
  s-   é € Ø˜ °G×4FÑ4FÀx×4PÒ4P¨Ð[Ð[ÐVZÐ[Ð[ùs   ‚!#c               ó$   € V ^8„  d   QhRRRRRR/# )rL   r-  rN   rY  r#  rM   ro   rO   )rP   s   "rQ   rR   r  ¬
  s"   € ÷ :ñ :¨ð :¸ð :ÐRVñ :rS   c              ƒ  óê   "  € \         P                  ! \        4      ;_uu_ 4        V P                  P                  P                  V4      G Rj  x€L
  RRR4       R#  L  + '       g   i     R# ; i5i)z*Start the RUNNING heartbeat (best effort).N)rÇ  rÈ  rù   rî  rï  rÙ  )rF  r-  rY  s   &&&rQ   Úsend_typingÚYuanbaoAdapter.send_typing¬
  sJ   é € ä× Ò ¤×+Õ+Ø—.‘.×*Ñ*×0Ñ0°Ó9×9Ð9÷ ,Ñ+Ù9÷ ,×+Ð+üs.   ‚#A3¥)AÁAÁAÁ
A3ÁAÁA0	Á*	A3c               ó    € V ^8„  d   QhRRRR/# r\  rO   )rP   s   "rQ   rR   r  ±
  s   € ÷ Lñ L¨ð L°ñ LrS   c              ƒ  óî   "  € \         P                  ! \        4      ;_uu_ 4        V P                  P                  P                  VRR7      G Rj  x€L
  RRR4       R#  L  + '       g   i     R# ; i5i)ut   Stop RUNNING without FINISH â€” send() emits FINISH after delivery so ordering is
RUNNINGâ€¦ â†’ message â†’ FINISH.F)rh  N)rÇ  rÈ  rù   rî  rï  rj  r{  s   &&rQ   Ústop_typingÚYuanbaoAdapter.stop_typing±
  sQ   é € ô × Ò ¤×+Õ+Ø—.‘.×*Ñ*×/Ñ/°ÀUÐ/ÓK×KÐK÷ ,Ñ+ÙK÷ ,×+Ð+üs.   ‚#A5¥+A!ÁAÁA!Á
A5ÁA!Á!A2	Á,	A5c               ó    € V ^8„  d   QhRRRR/# )rL   r:  rN   rM   ro   rO   )rP   s   "rQ   rR   r  ·
  s   € ÷ Bñ BÀCð BÈDñ BrS   c              ƒ  ó(  <"  € VP                   P                  pV P                  P                  P	                  V4      G Rj  x€L
   \
        SV `  W4      G Rj  x€L
  V P                  P                  P                  V4       VP                  pV'       d]   V P                  P                  V4      V8X  d;   V P                  P                  VR4       V P                  P                  VR4       R# R# R#  L³ L�  T P                  P                  P                  T4       TP                  pT'       d[   T P                  P                  T4      T8X  d:   T P                  P                  TR4       T P                  P                  TR4       i i i ; i5i)z9Wrap base class processing with a slow-response notifier.N)r  r-  rî  r  rÙ  r4  Ú_process_message_backgroundrt   rZ  r7  rÉ   rÊ   rC  )rF  rö  r:  r-  r+  rR  s   &&&  €rQ   rj  Ú*YuanbaoAdapter._process_message_background·
  s=  øé € à—,‘,×&Ñ&ˆØ�n‰n×*Ñ*×0Ñ0°Ó9×9Ð9ð		BÜ‘'Ñ5°eÓI×IÐIà�N‰N×(Ñ(×/Ñ/°Ô8ð ×%Ñ%ˆFß˜$×2Ñ2×6Ñ6°{ÓCÀvÔMØ×(Ñ(×,Ñ,¨[¸$Ô?Ø×*Ñ*×.Ñ.¨{¸DÖAñ N‰vñ 	:áIøà�N‰N×(Ñ(×/Ñ/°Ô8ð ×%Ñ%ˆFß˜$×2Ñ2×6Ñ6°{ÓCÀvÔMØ×(Ñ(×,Ñ,¨[¸$Ô?Ø×*Ñ*×.Ñ.¨{¸DÕAð Nˆvüs=   ƒ?FÁC6ÁFÁC: ÁC8ÁC: ÁBFÃ8C: Ã:BFÆFc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rL   ré  rN   r'  rY  rÐ  Úemptyrf   rM   r#  rO   )rP   s   "rQ   rR   r  Æ
  s1   € ÷ ñ  Sð °cð ÀEð Ð^bð Ðguñ rS   c              ƒ  óÌ  "  € V P                   P                  f   R#  V P                   P                  V\        V4      R,          R,          R7      G Rj  x€L
 pVP	                  R/ 4      P	                  R^ 4      pV^ 8w  d$   \
        P                  RV P                  W4       R# VP	                  RR4      ;'       g    VP	                  R	R4      pV'       d   \        V\        4      '       d	   V! V4      # T#  L¤  \         d&    \
        P                  R
T P                  Y4        R# \         d-   p	\
        P                  RT P                  Y4        Rp	?	R# Rp	?	ii ; i5i)zdSend an encoded group query over WS; return decoded biz payload, *empty* when none, None on failure.Nr€  r+  ré  Ústatusz[%s] %s failed: status=%drã   rS   r  z[%s] %s timeout: group=%sz[%s] %s failed: %s)r  r7  rÒ  r5   rÉ   rô   rý   r>  rû   rÐ  r  rù   )
rF  ré  r'  rY  Ú
decode_rsprm  r  ro  Úbiz_datar  s
   &&&&&&    rQ   Ú	_ws_queryÚYuanbaoAdapter._ws_queryÆ
  s'  é € à×Ñ×ÑÒ&Ùð	HØ!×-Ñ-×>Ñ>¸wÌÐ_fÓOgÐhnÕOoÐpxÕOyÐ>Óz×zˆHØ—\‘\ &¨"Ó-×1Ñ1°(¸AÓ>ˆFØ˜Œ{Ü—‘Ð:¸D¿I¹IÀuÔUÙØ—|‘| F¨CÓ0×MÐM°H·L±LÀÈÓ4MˆHß+3¼
À8ÌU×8SÒ8S‘:˜hÓ'Ð^ÐY^Ð^ñ {øô ô 	VÜ�N‰NÐ6¸¿	¹	À5ÕUñ ô ô 	HÜ�N‰NÐ/°·±¸E×GÐGÙûð	Hüsw   ‚E$ž7C< ÁC:ÁAC< Â$E$Â&C< Â?C< ÃC< Ã7E$Ã8C< Ã9E$Ã:C< Ã<,E!Ä(E$Ä+E!Ä4E!Ä5!EÅE$ÅE!Å!E$c               ó    € V ^8„  d   QhRRRR/# )rL   r'  rN   rM   r#  rO   )rP   s   "rQ   rR   r  Ø
  s   € ÷ ]ñ ]°ð ]¸ñ ]rS   c              ƒ  óf   "  € V P                  RV\        V4      \        RV/4      G Rj  x€L
 #  L5i)u;   Group info (name, owner, member countâ€¦); None on failure.Úquery_group_infor'  N)rr  rA   r8   r•  s   &&rQ   rv  ÚYuanbaoAdapter.query_group_infoØ
  s=   é € à—^‘^Ð$6¸
ÔD[Ð\fÓDgÜ$?À,ÐPZÐA[ó]÷ ]ð 	]ñ ]ùs   ‚(1ª/«1c               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r'  rN   rn  r|   ÚlimitrM   r#  rO   )rP   s   "rQ   rR   r  Ý
  s*   € ÷ ñ °cð À3ð ÐSVð Ðaoñ rS   c              ƒ  ó
  "  € V P                  RV\        WVR7      \        R. R^ RR/4      G Rj  x€L
 pV'       dC   VP                  R4      '       d,   \        P                  ! 4       VR,          3V P
                  V&   V#  LP5i)zXGroup member list; None on failure. Populates ``_member_cache`` for @mention resolution.Úget_group_member_list)rn  ry  ÚmembersÚnext_offsetÚis_completeTN)rr  rB   r9   rÉ   r¼   rÑ  )rF  r'  rn  ry  r¯  s   &&&& rQ   r{  Ú$YuanbaoAdapter.get_group_member_listÝ
  sy   é € à—~‘~Ø# ZÔ1MÈjÐotÔ1uÜ,¨y¸"¸mÈQÐP]Ð_cÐ.dó
÷ 
ˆ÷ �f—j‘j ×+Ò+Ü.2¯iªi«k¸6À)Õ;LÐ-MˆD×Ñ˜zÑ*Øˆñ
ùs   ‚.B°B±B½BÁ.Bc               ó(   € V ^8„  d   QhRRRRRRRR/# )rL   r  rN   re   r'  rM   r   rO   )rP   s   "rQ   rR   r  ç
  s.   € ÷ Qñ Q Sð Q°ð QÀð QÈjñ QrS   c              ƒ  ó  "  € V P                   P                  V4      '       g   \        RRR7      # \        V4      V P                  8”  d    VRV P                   \        R4      ,           pV P                  RV 2W#R7      G Rj  x€L
 #  L5i)zWProactive C2C DM (text capped at DM_MAX_CHARS); group_code marks a group-originated DM.FzDM access denied for this userr
  Nz platform.shared.truncated_suffixr  r  )r¤  r‰  r   rË   ÚDM_MAX_CHARSr   rh  )rF  r  re   r'  s   &&&&rQ   Úsend_dmÚYuanbaoAdapter.send_dmç
  sz   é € à×"Ñ"×0Ñ0°×9Ò9Ü eÐ3SÔTÐTÜˆt‹9�t×(Ñ(Ô(ØÐ*˜×*Ñ*Ð+¬aÐ0RÓ.SÕSˆDØ—Y‘Y ¨¨	Ð2°D�YÓP×PÐPÑPùs   ‚BB
ÂBÂB
c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )rL   r-  rN   r/  r  r3  r  rY  r#  rù  r   rM   r   rO   )rP   s   "rQ   rR   r  ð
  sJ   € ÷ Oñ O¨ð O¸ð OÀmð OØ#0ðOØCQðOØdgðOØlvñOrS   c           	   ‹  	óz   "  € V P                   P                  P                  ! VR 3RVRVR V/VB G Rj  x€L
 #  L5i)r/  r  r  N©rî  rÕ  r«  )rF  r-  r/  r  r  rY  rù  s   &&&&&&,rQ   Ú
send_imageÚYuanbaoAdapter.send_imageð
  s`   é € à—^‘^×*Ñ*×5Ò5°g¸{ñ  OÐU]ð  OÐgnð  Oð  {Dð  Oð  HNñ  O÷  Oð  	Oñ  Oùó   ‚2;´9µ;c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )rL   r-  rN   r,  r  r3  r  rY  r#  rù  r   rM   r   rO   )rP   s   "rQ   rR   r  ô
  sJ   € ÷ Rñ R¨Sð R¸cð RÈMð RØ(5ðRØHVðRØilðRØq{ñRrS   c           	   ‹  	óz   "  € V P                   P                  P                  ! VR 3RVRVRV/VB G Rj  x€L
 #  L5i)r�  r  r  r,  Nr‡  )rF  r-  r,  r  r  rY  rù  s   &&&&&&,rQ   r²  ÚYuanbaoAdapter.send_image_fileô
  s`   é € à—^‘^×*Ñ*×5Ò5°g¸|ñ  RÐV^ð  RÐhoð  Rð  }Gð  Rð  KQñ  R÷  Rð  	Rñ  RùrŠ  c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )rL   r-  rN   rC  r3  rD  zOptional[int]r  rù  r   rM   r   rO   )rP   s   "rQ   rR   r  ø
  sB   € ÷ Yñ Y¨#ð Y¸]ð YÐ_lð YØ%2ðYØEHðYØMWñYrS   c           	   ‹  	óz   "  € V P                   P                  P                  ! VR 3RVRVRV/VB G Rj  x€L
 #  L5i)r<  r  rC  rD  Nr‡  )rF  r-  rC  rD  r  rù  s   &&&&&,rQ   Úsend_stickerÚYuanbaoAdapter.send_stickerø
  s`   é € à—^‘^×*Ñ*×5Ò5°g¸yñ  YÐS[ð  YÐjvð  Yð  DNð  Yð  RXñ  Y÷  Yð  	Yñ  YùrŠ  c               ó8   € V ^8„  d   QhRRRRRRRRRRRR	R
RRR/# )rL   r-  rN   r1  rb   r3  r  r  rY  r#  rù  r   rM   r   rO   )rP   s   "rQ   rR   r  ü
  sI   € ÷ 
ñ 
¨3ð 
¸3ð 
È-ð 
Ðivð 
Ø&3ð
ØFTð
Øgjð
Øoyñ
rS   c              ‹  	ó~   "  € V P                   P                  P                  ! VR 3RVRVRVRV/VB G Rj  x€L
 #  L5i)rù  r  r  r1  rb   Nr‡  )rF  r-  r1  rb   r  r  rY  rù  s   &&&&&&&,rQ   r³  ÚYuanbaoAdapter.send_documentü
  sY   é € à—^‘^×*Ñ*×5Ò5Ø�Zñ
Ø*2ð
Ø<Cð
ØOXð
Øckð
Øouñ
÷ 
ð 	
ñ 
ùs   ‚4=¶;·=c               ó   € V ^8„  d   QhRR/# )rL   rM   rf   rO   )rP   s   "rQ   rR   r    s   € ÷ yñ y¨ñ yrS   c              ƒ  ó    "  € \         P                  V P                  V P                  V P                  V P
                  R7      G Rj  x€L
 #  L5i)z.Current valid sign token (module-level cache).rÞ  N)r“   r  rL  rT  rS  r…  rS  s   &rQ   rR  Ú YuanbaoAdapter._get_cached_token  s<   é € ä ×*Ñ*¨4¯=©=¸$×:JÑ:JÈD×L\ÑL\Ðhl×hwÑhwÐ*Óx×xÐxÑxùs   ‚AAÁAÁA)rÒ  r¤  rS  rL  rT  r®  r;  rl  r  ró  rý  rÈ  r	  rÑ  r)  rî  r7  rC  r…  r™  rJ  r�  )NNrÝ   rÃ   )r€  rá   r  )NNN)NNNN))r‹   rŒ   r�   rŽ   r�   r   rv  ÚPLATFORMr¢  r  Úsplits_long_messagesri  r‚  r  r  r�   r  rc  r]  rS  r£  rD  r¯  rZ  rV  rh  r^  rb  rf  rj  rr  rv  r{  rƒ  rˆ  r²  r�  r³  rR  r‘   Ú__classcell__)rR  s   @rQ   r  r  "
  s  ø‡ ÙMØ×Ñ€HØ€N�CÓØÐØÐ�sÓØ€LØ;?ÐÐ8Ó?ð >@ÐÐ:Ó?àô<ó ð<ð ô?ó ð?÷&ið &iõPð ôó ðõLð*°E÷ õ4÷&hõ\÷:õ
L÷Bð Bõõ$]÷
÷Q÷O÷R÷Y÷
÷yó yrS   r  >   é¬  é­  é®  é²  é³  éµ  >   r-  r  r  r  rÃ   )Ír�   Ú
__future__r   r›   r:  r8  r�  rÇ  r¶  r§   r¤   rÞ   ÚloggingrÀ  r  rî   Úsysr¼   Úurllib.parserø  rƒ  Úabcr   r   r   r   r;  r   r   r	   r
   Úenumr   Úpathlibr   Útypingr   r   r   r   r   r   r   r   ré   rY  Úwebsockets.exceptionsrG  ÚImportErrorr¼  r   r   Ú
agent.i18nr   Úgateway.platforms.baser   r   r   r   r   Úgateway.platforms.eventr   r   Úgateway.platformsr    r„   Úgateway.platforms._sharedr!   r°  r"   r¿  Úgateway.platforms.helpersr#   r$   Ú%gateway.platforms.access_policy_mixinr%   Ú'plugins.platforms.yuanbao.yuanbao_mediar&   rh  r'   r(   r)   r*   r+   r,   Ú'plugins.platforms.yuanbao.yuanbao_protor-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   Úgateway.session_transcriptrD   Ú	getLoggerr‹   rô   Úhermes_cli.version_inforE   Úbase_versionrð   ró   rN   rò   r»  rñ   r6  r7  rš  r[  r†  rß  rç  rå  r¨  rœ  rc  rd  r  rU   r÷  rø  rù  r  rÞ  r¼  rb  r]   rò  rj   r¯  r±  r8  r9  r:  rc   rl   rw   ry   r“   r  r=  rW  r¥  rä  rî  rø  rû  rd  ro  ru  r   r¨  rÍ  rÔ  rØ  rÚ  rD  rW  rx  r€  r²  rº  ÚPHOTOÚVOICEÚVIDEOró  rÃ  r¾  rÍ  r§  r  rÔ  rä  r  r!  rð  rò  r  r"  r*  r/  r6  rH  rp  r  r
  r  rO   rS   rQ   Ú<module>r»     s€  ðñõ #ã Û Û Û Û Û Û Û Û Û Û 	Û 	Û Û 
Û Û Û ß #ß 4ß 7Ó 7Ý Ý ß Q× QÓ Qã ðÛÛ ØÐ÷
 4Ý ÷õ ÷ >Ý 1ß hß FÝ F÷÷ ñ ÷÷ ÷ ÷ ÷ ÷ ñ õ ;à	×	Ò	˜8Ó	$€õ 5á.Ó0×=Ñ=Ð =€ˆ|ÙÐ-Ó.Ð Ø—L‘LÐ àKÐ Ø6Ð Ø!Ð ØÐ ØÐ ØÐ ØÐ ð Ð Ú?Ð ØÐ Ø Ð Ø Ð ØÐ õ6ð 2Ð Ø,Ð ØjÐ ð —“ÐaÓb€à—Z“ZÐ AÓBÐ Ù#Ò$>Ó?Ð Ø—
“
Ð-Ó.€Ø€à#%Ð  Ø/1Ð ,ð  !Ð ØÐ ØÐ õ=õHõ
÷vñ v÷u)ñ u)ðp ÷)ð )ó ð)ô>A˜ô A÷7ñ 7ôt^Ð(ô ^ôBÐ/ô ôÐ'ô ò4ô
hdÐ-ô hdôVÐ*ô ô	Ð-ô 	ô"Ð'ô "ôDÐ-ô ô"LÐ-ô "LõJ	4õ;÷ô`Ð0ô `ôFÐ"3ô ô )Ð.ô )ôX	Ð-ô 	ôEÐ.ô EôPÐ!2ô ô ˜ô  ð & {×'8Ò'8¸.È+×J[ÒJ[Ø)¨;×+<Ò+<¸mÈ[×MaÒMaðcÐ ôÐ$5ô ô64Ð.ô 4ônYÐ&7ô YôxzÐ.ô zôz	Ð.ô ôBF9Ð*ô F9÷Rñ ÷$Eñ E÷P	Kô0S�sô 0Sôf
Ð$ô 
ô	T�mô 	Tôn�}ô nôPÐ&ô Pô<Ð%ô <÷.C+ñ C+÷L!ñ !÷<F!ñ F!÷R)ñ )ôbyÐ(ö byøðuO ô Ø ÐØƒJðús   Â
O4 Ï4PÐP