+
    „WÝjGð  ã            !       óº	  a€ ER t˜0 t R 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Ht ^ RIHt ^ RIHtHt ^ RIHtHt ^ RIHtHt ^ RIHt ^ RIHtH t  ^ R	I!H"t" ^ R
I#H$t$H%t% ^ RI&H't' ^ RI(H)t) ^ RI*H+t+H,t,H-t-H.t.H/t/H0t0H1t1H2t2 ^ RI3H4t4H5t5H6t6H7t7 ^ RI8H9t9H:t:H;t;H<t<H=t= ]P|                  ! R4      t?]! 4       t@]%! RR4      tA]%! RR4      tB]%! RR4      tC]%! RR4      tD]%! RR4      tE]%! RR4      tF]%! RR4      tG]%! RR4      tH]%! RR4      tI]%! RR4      tJ]%! RR4      tK]%! R R4      tL]%! R!R"4      tM]%! R#R"4      tN]%! R$R4      tO]%! R%R4      tP]%! R&R'4      tQ]$! R(4      tRR)R*R+R,R-/3R.R/R0/ 3R1R2R3/ 3R4R5R6R7R8/3R9R:R;R7R8/3R<R=R>R7R8/3R?R@RA/ 3RBRCRD/ 3RERFRGRHR8/3RIRJRK/ 3RLRMRN/ 3RORPRPR,RQ/3RRRSRSRHR8/3RTRURV/ 3RWRXRYRHR8/3RZR[R\/ 3R]R^R_RHR8/3R`RaRb/ 3RcRdRe/ 3RfRgRhRHR8/3RiRjRk/ 3RlRmRnRHR8/3RoRpRq/ 3RrRsRt/ 3RuRvRwRHR8/3RxRyRzRHR8/3R{R|R}RHR8/3R~RR€/ 3R�R‚RƒRHR8/33 U UUUu/ uF  w  rr#V R„VR…V/VCbK  	  upppp tS] ^ k R† R‡ ltTRˆ R‰ ltU]P¬                  ! RŠ4      tWR‹ RŒ ltXR� RŽ ltYR� R� ltZR‘ R’ lt[ERR“ R” llt\R• R– lt]]P¼                  R— R˜ l4       t_R™t`0 ERmtaRštb]
PÆ                  ! 4       tdR› Rœ lteR� Rž ltfRŸ R  ltgR¡ R¢ lthR£ R¤ ltiR¥ R¦ ltjR§ R¨ ltkR© Rª ltlR«RR¬]a/R­ R® lltmR¯ R° ltnR± R² ltoR³ R´ ltpRµ R¶ ltqR· R¸ ltrR¹ Rº ltsR» R¼ lttR½ R¾ ltuR¿ RÀ ltv]@Pï                  RÁ4      ERRÂ RÃ ll4       txRÄ RÅ lty]@Põ                  RÆ4      RÇ RÈ l4       t{]@Pï                  RÉ4      ERRÊ RË ll4       t|RÌ RÍ lt}]@Pý                  RÆ4      RÎ RÏ l4       tRÐt€RÑt�RÒ RÓ lt‚RÔ RÕ ltƒ]P¬                  ! RÖ4      t„R× RØ lt…RÙ RÚ lt†RÛ RÜ lt‡RÝRRÞR/Rß Rà lltˆ]@Pï                  Rá4      Râ Rã l4       t‰]@Põ                  Rä4      Rå Ræ l4       tŠ]@Pï                  Rç4      ERRè Ré ll4       t‹]@Pý                  Rä4      Rê Rë l4       tŒ]@Põ                  Rì4      ERRí Rî ll4       t�Rï Rð ltŽ]@EP                  Rñ4      ERRò Ró l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–]@Pï                  ER 4      ERER ER ll4       t—R# u upppp i (  züMessaging dashboard routes: WhatsApp/Telegram onboarding and per-platform enable/config/test.

Extracted from ``hermes_cli.web_server``; helpers/state that tests monkeypatch on
``web_server`` stay there and are resolved late at call time (cycle-safe).
N)ÚdatetimeÚtimezoneÚUTC©ÚPath)ÚAnyÚOptional)Ú	APIRouterÚHTTPException)Úresolve_gateway_livenessÚretained_gateway_state)Úwindows_hide_flags)ÚOPTIONAL_ENV_VARSÚget_env_path)Úget_process_hermes_home)Ú	LateStateÚlate)Ú_restart_gateway_after)Ú_backup_whatsapp_session)Ú_TelegramOnboardingPairingÚ_WhatsAppOnboardingSessionÚ_messaging_platform_catalogÚ"_telegram_onboarding_error_messageÚ_telegram_onboarding_lockÚ_telegram_onboarding_pairingsÚ_whatsapp_onboarding_payloadÚ_whatsapp_onboarding_sessions)Ú REDACTED_CREDENTIAL_WRITE_DETAILÚhttp_failureÚis_redacted_credential_previewÚredacted_credential_preview)ÚMessagingPlatformUpdateÚTelegramOnboardingApplyÚTelegramOnboardingStartÚWhatsAppOnboardingApplyÚWhatsAppOnboardingStartzhermes_cli.web_serverÚ_config_profile_scopezhermes_cli.web_server_profilesÚ_profile_scopeÚ_resolve_profile_dirÚ*_restart_gateway_after_whatsapp_onboardingzhermes_cli.web_server_messagingÚ!_telegram_onboarding_request_syncÚ_whatsapp_session_pathÚ_write_platform_enabledÚload_envzhermes_cli.configÚload_configÚread_runtime_statuszgateway.statusÚremove_env_valueÚsave_env_valueÚ_gateway_subcommandzhermes_cli.web_server_gatewayÚ_probe_gateway_healthÚget_running_pid_cachedÚget_runtime_status_running_pidÚserved_profile_runtimezgateway.status_servedÚ_GATEWAY_HEALTH_URLÚSIGNAL_HTTP_URLz8signal-cli REST API base URL, e.g. http://127.0.0.1:8080zSignal bridge URLÚurlz0https://github.com/bbernhard/signal-cli-rest-apiÚSIGNAL_ACCOUNTz6Signal account phone number registered with the bridgezSignal accountÚSIGNAL_ALLOWED_USERSz3Comma-separated Signal users allowed to use the botzAllowed Signal usersÚWHATSAPP_ENABLEDz#Enable the WhatsApp gateway adapterzEnable WhatsAppÚadvancedTÚWHATSAPP_MODEzWhatsApp bridge modezWhatsApp modeÚWHATSAPP_DM_POLICYz+How WhatsApp direct messages are authorizedzWhatsApp DM policyÚWHATSAPP_ALLOWED_USERSz5Comma-separated WhatsApp users allowed to use the botzAllowed WhatsApp usersÚEMAIL_ADDRESSz&Email address to send and receive fromzEmail addressÚEMAIL_PASSWORDz&Email account password or app passwordzEmail passwordÚpasswordÚEMAIL_IMAP_HOSTz&IMAP server host (e.g. imap.gmail.com)z	IMAP hostÚEMAIL_SMTP_HOSTz&SMTP server host (e.g. smtp.gmail.com)z	SMTP hostÚTWILIO_ACCOUNT_SIDzTwilio Account SIDzhttps://www.twilio.com/consoleÚTWILIO_AUTH_TOKENzTwilio Auth TokenÚWECOM_BOT_IDzWeCom group bot IDzWeCom Bot IDÚWECOM_SECRETzWeCom group bot secretzWeCom SecretÚWECOM_CALLBACK_CORP_IDzWeCom corp IDzWeCom Corp IDÚWECOM_CALLBACK_CORP_SECRETzWeCom app corp secretzWeCom Corp SecretÚWECOM_CALLBACK_AGENT_IDzWeCom app agent IDzWeCom Agent IDÚWECOM_CALLBACK_TOKENz!WeCom callback verification tokenzWeCom TokenÚWECOM_CALLBACK_ENCODING_AES_KEYzWeCom callback AES encoding keyzWeCom AES KeyÚWEIXIN_ACCOUNT_IDzFiLink Bot account ID obtained through QR login in hermes gateway setupziLink Bot account IDÚWEIXIN_TOKENzAiLink Bot token obtained through QR login in hermes gateway setupziLink Bot tokenÚWEIXIN_BASE_URLzMiLink API base URL saved by QR login (default: https://ilinkai.weixin.qq.com)ziLink API base URLÚFEISHU_APP_IDzFeishu / Lark app IDzApp IDÚFEISHU_APP_SECRETzFeishu / Lark app secretz
App secretÚFEISHU_ENCRYPT_KEYzFeishu / Lark encrypt keyzEncrypt keyÚFEISHU_VERIFICATION_TOKENz Feishu / Lark verification tokenzVerification tokenÚDINGTALK_CLIENT_IDzDingTalk client ID (App key)z	Client IDÚDINGTALK_CLIENT_SECRETz#DingTalk client secret (App secret)zClient secretÚdescriptionÚpromptc                ót   € V ^8„  d   QhR\         R\        \         \        \        \         3,          3,          /# ©é   Úplatform_idÚreturn)ÚstrÚdictÚtupler   )Úformats   "ÚTC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\web_routers\messaging.pyÚ__annotate__rd   g   s,   € ÷ 3ñ 3¤#ð 3¬$¬s´E¼#¼s¸(µOÐ/CÕ*Dñ 3ó    c                ó  € ^ RI Hp ^ RIHp VP	                  V 4      pVe(   VP
                  '       d   \        VP
                  4      # \        V! V R4      RR4      ;'       g    / p\        VP	                  R4      ;'       g    / 4      # )a  ``{env key: (accepts(value), 400 detail)}`` declared on the platform plugin's PlatformEntry
(``env_value_rules``; e.g. Telegram/Slack reject credentials clearly in the wrong field).

Resolve this in the target profile's scope, right after :func:`_require_platform`: the catalog build
there has just materialized that profile's plugin entries, so the lookup imports nothing, whereas in
a scope whose catalog was never built the registry's overlay may not hold the entry and every rule
would silently stop applying. Without rules on the entry (the dashboard's own profile disabled the
plugin, a user plugin overrides it) a bundled platform's ``dashboard_card.py`` answers, read from
its file: the rules guard the edited profile's values whatever the dashboard's profile loads.)Úbundled_sibling©Úplatform_registryNÚdashboard_cardÚDASHBOARD_CARDÚenv_value_rules)Úgateway.platform_envrg   Úgateway.platform_registryri   Úgetrl   r`   Úgetattr)r]   rg   ri   ÚentryÚcards   &    rc   Ú_env_value_rulesrs   g   sz   € õ 5Ý;Ø×!Ñ! +Ó.€EØÒ˜U×2×2Ð2Ü�E×)Ñ)Ó*Ð*Ü‘? ;Ð0@ÓAÐCSÐUYÓZ×`Ð`Ð^`€DÜ�—‘Ð*Ó+×1Ð1¨rÓ2Ð2re   c                ó„   € V ^8„  d   QhR\         \        \        \        \        3,          3,          R\        R\        RR/# )r\   ÚrulesÚkeyÚvaluer^   N)r`   r_   ra   r   )rb   s   "rc   rd   rd   z   s<   € ÷ =ñ =¬¬c´5¼¼c¸µ?Ð.BÕ)Cð =Ì#ð =ÔVYð =Ð^bñ =re   c                 ó¢   € V P                  V4      pV'       d6   V'       d,   V^ ,          ! V4      '       g   \        RV^,          R7      hR# R# R# )é    é�  ©Ústatus_codeÚdetailN)ro   r
   )ru   rv   rw   Úrules   &&& rc   Ú_validate_messaging_env_valuer   z   s:   € Ø�9‰9�S‹>€Dß—˜d 1žg eŸnšnÜ¨°D¸µGÔ<Ð<ñ -‘�ure   z_ALLOWED(?:_[A-Z]+)?$c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# ©r\   rv   r^   ©r_   r`   r   )rb   s   "rc   rd   rd   †   s"   € ÷ ñ œSð ¤T¬#¬s¨(¥^ñ re   c                 óÆ  € \         P                  ! V 4      ;'       g     \        P                  V 4      ;'       g    / p\        VP                  R R4      4      pRVP                  RR4      RVP                  RV 4      RVP                  RR4      RVP                  R4      RTRV'       * ;'       d    \        \        P                  V 4      4      R	VP                  R	R4      /# )
rC   FrX   Ú rY   Úhelpr9   Úis_passwordÚis_listr=   )r   ro   Ú_MESSAGING_ENV_FALLBACKSÚboolÚ_ALLOWLIST_KEY_REÚsearch)rv   Úinfor†   s   &  rc   Ú_messaging_env_infor�   †   s¿   € Ü× Ò  Ó%×PÐPÔ)A×)EÑ)EÀcÓ)J×PÐPÈb€DÜ�t—x‘x 
¨EÓ2Ó3€Kà�t—x‘x ¨rÓ2Ø�$—(‘(˜8 SÓ)Ø�—‘˜ Ó$Øˆt�x‰x˜‹Ø�{Ø�{”?×JÐJ¤tÔ,=×,DÑ,DÀSÓ,IÓ'JØ�D—H‘H˜Z¨Ó/ðð re   c                ó`   € V ^8„  d   QhR\         R\        \         \        3,          R,          /# )r\   r]   r^   Nr‚   )rb   s   "rc   rd   rd   ”   s+   € ÷ \ñ \¤ð \¬¬c´3¨h­¸$Õ)>ñ \re   c                 ó@   a € \        V 3R  l\        4        4       R4      # )c              3   óF   <"  € T F  qR ,          S8X  g   K  Vx € K  	  R# 5i)ÚidN© )Ú.0Úer]   s   & €rc   Ú	<genexpr>Ú"_catalog_lookup.<locals>.<genexpr>•   s   øé € ÐTÑ9�q¸t½WÈÑ=S—’Ó9ùs   ƒ!—
!N)Únextr   )r]   s   frc   Ú_catalog_lookupr˜   ”   s   ø€ ÜÔTÔ7Ô9ÓTÐVZÓ[Ð[re   c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# r[   r‚   )rb   s   "rc   rd   rd   ˜   s"   € ÷ ñ ¤3ð ¬4´´S°­>ñ re   c                 óL   € \        V 4      pV'       g   \        R RV  2R7      hV# )é”  zUnknown messaging platform: r{   )r˜   r
   )r]   rq   s   & rc   Ú_require_platformrœ   ˜   s+   € Ü˜KÓ(€EßÜ¨Ð6RÐS^ÐR_Ð4`ÔaÐaØ€Lre   c                óÒ   € V ^8„  d   QhR\         R\        \         \        3,          R\        \         \         3,          R\        R\        \        \        \        R,          3,          /# )r\   r]   rq   Úenv_on_diskÚscopedr^   N©r_   r`   r   r‰   ra   )rb   s   "rc   rd   rd   Ÿ   sT   € ÷  -ñ  -Üð -Ü!¤#¤s (�^ð -Ü:>¼sÄC¸x½.ð -ÜRVð -ä
Œ4””t˜d•{Ð"Õ#ñ -re   c                ó8  a€ VR,          pV'       dø   \        V4      ;'       d;    \        ;QJ d    V3R lV 4       F  '       d   K   RM	  RM! V3R lV 4       4      p \        4       P                  R4      ;'       g    / P                  V 4      p\	        V\
        4      '       d   TM/ pVP                  R4      pVP                  R4      pVRJ d   RM\        V4      ;'       g    Tp	\	        V\
        4      '       d   TMRp
W•V
3#  ^ R	IHpH	p V! 4       pV! V 4      pVP                  P                  V4      p\        T;'       d    VP                  4      p	\        T;'       d    VP                  Wï4      4      pV'       d-   VP                  '       d   VP                  P                  4       MRp
W•V
3#   \         d    RRr© LÄi ; i  \         dA    RRr©\        ;QJ d    T3R
 lT 4       F  '       d   K   RM	  RM! T3R
 lT 4       4      p Lbi ; i)ué   (enabled, configured, home_channel). Profile-scoped: derive from the profile's
config.yaml + .env only â€” load_gateway_config()'s env-override layer reads
os.environ and would leak the root install's tokens into the profile's state.Úrequired_envc              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5i©N)ro   ©r“   rv   rž   s   & €rc   r•   Ú'_platform_enablement.<locals>.<genexpr>§   s   øé € Ð+UÉHÀS¨K¯O©O¸C×,@Ð,@ËHùs   ƒ!FTÚ	platformsÚhome_channelÚenabledN)ÚPlatformÚload_gateway_configc              3   ó„   <"  € T F5  pSP                  V4      ;'       g    \        P                  ! VR 4      x € K7  	  R# 5i©r„   N©ro   ÚosÚgetenvr¥   s   & €rc   r•   r¦   ¾   s0   øé € ÐXÉxÈ˜Ÿ™¨Ó-×CÐC´·²¸3ÀÓ1CÔCËxùs
   ƒA   A )r‰   Úallr.   ro   Ú
isinstancer`   Ú	ExceptionÚgateway.configrª   r«   r§   r©   Ú_is_platform_connectedr¨   Úto_dict)r]   rq   rž   rŸ   ÚrequiredÚ
configuredÚplat_cfgÚhcÚraw_enabledr©   r¨   rª   r«   Úgateway_configÚplatformÚplatform_configs   &&f&            rc   Ú_platform_enablementr¿   Ÿ   s¼  ø€ ð �^Õ$€HßÜ˜(“^×UÐU¯«Ô+UÉHÓ+U¯¯ªÔ+UÉHÓ+UÓ(Uˆ
ð		0Ü#›×)Ñ)¨+Ó6×<Ð<¸"×AÑAÀ+ÓNˆHÜ#-¨h¼×#=Ò#=‘xÀ2ˆHØ—‘˜nÓ-ˆBà"Ÿ,™, yÓ1ˆKØ*¨eÓ3‘e¼¸kÓ9J×9XÐ9XÈjˆGÜ!+¨B´×!5Ò!5™2¸4ˆLð  LÐ0Ð0ðYß@á,Ó.ˆÙ˜KÓ(ˆØ(×2Ñ2×6Ñ6°xÓ@ˆÜ�×BÐB¨?×+BÑ+BÓCˆÜ˜/×nÐn¨n×.SÑ.SÐT\Ó.nÓoˆ
ßAPÐUd×Uq×UqÐUq�×3Ñ3×;Ñ;Ô=Ðw{ˆð  Ð,Ð,øô ô 	0Ø$)¨4’\ð	0ûô ô YØ % t�ß“SÔXÉxÓX—S—S’SÔXÉxÓXÓXŠ
ðYúsO   Á!F: ÂA'F: Ã)F: Ä?G ÅG Å*G ÆG ÆG Æ:GÇ
GÇ-HÇ>HÈHc                óê   € V ^8„  d   QhR\         \        \        3,          R\         \        \        3,          R\         R,          R\        R\        \
        ,          R\         \        \        3,          /# )r\   rq   rž   ÚruntimeNrŸ   Úprofile_homer^   )r`   r_   r   r‰   r   r   )rb   s   "rc   rd   rd   Â   sf   € ÷ Sñ SÜ””S��>ðSÜ(,¬S´#¨X­ðSÜAEÈÅðSäðSä(0´­ðSô 
Œ#Œsˆ(…^ñSre   c                 ó�  aa€ V R ,          p\        V\        4      '       d   TM/ pVP                  R4      p\        V\        4      '       d   VP                  V/ 4      M/ p\        V\        4      '       g   / p\        YB\        '       d   \
        MR\        \        \        R7      P                  p	V	'       g   / pR VV3R llp
. pV R,           F^  pV
! V4      \        V4      ríTP                  RTRWÀR	,          9   R
\        V4      R\        V4      RVR,          '       d   TMR/VC4       K`  	  \        WPSS4      w  pppV	'       d   VP                  R4      '       d   RRppVP                  R4      pV'       g   RpMBV'       g   RpM7V	'       d   V'       g   RpM$V	'       g   V'       g   \        V4      R8X  d   RMRpVP                  R4      pVP                  R4      pVR8X  d(   T;'       g    RpT;'       g    VP                  R4      pR TRV R,          RV R,          RV R,          RTRTRT	RTRTRTRVP                  R4      R TRTR!V	'       d   VP                  R!4      MR/pVR"8X  dQ   V
! R#4      P!                  4       pR$VR*9   d   TMR%R&\        V
! R'4      P!                  4       4      R(\        V4      /VR)&   V# )+r‘   r§   N)Úprofile_dirrÁ   Úhealth_probeÚ	pid_probeÚruntime_readerÚruntime_pid_probec                ó0   € V ^8„  d   QhR\         R\         /# r�   ©r_   )rb   s   "rc   rd   Ú1_messaging_platform_payload.<locals>.__annotate__Þ   s   € ÷ Nñ N”sð Nœsñ Nre   c                 óx   <€ SP                  V 4      ;'       g"    S'       d   R # \        P                  ! V R 4      # ©r„   r®   )rv   rž   rŸ   s   &€€rc   Ú	env_valueÚ._messaging_platform_payload.<locals>.env_valueÞ   s.   ø€ ð �‰˜sÓ#×MÐM¯f¨ÐM¼"¿)º)ÀCÈÓ:LÐMre   Úenv_varsrv   r·   r¢   Úis_setÚredacted_valuerw   r‡   Úmirrored_fromTÚstateÚdisabledÚnot_configuredÚpending_restartÚstartup_failedÚgateway_stoppedÚ
error_codeÚerror_messageÚexit_reasonÚnamerX   Údocs_urlr©   r¸   Úgateway_runningÚ
updated_atr¨   Úingress_urlÚwhatsappr>   Úmoder„   Úallowed_users_setr@   Úhome_channel_setÚwhatsapp_setup>   Úbotú	self-chat)r²   r`   ro   r   r7   r3   r4   r/   r5   Úrunningr�   Úappendr‰   r    r¿   r   Ústrip)rq   rž   rÁ   rŸ   rÂ   r]   ÚrtÚruntime_platformsÚruntime_platformrß   rÎ   rÐ   rv   rw   rŒ   r©   r¸   r¨   rÔ   rÚ   rÛ   ÚpayloadÚwhatsapp_modes   &f&f&                  rc   Ú_messaging_platform_payloadrñ   Â   sË  ù€ ð ˜•+€KÜ˜w¬×-Ò-‰°2€BØŸ™˜{Ó+ÐÜAKÐL]Ô_c×AdÒAdÐ(×,Ñ,¨[¸"Ô=ÐjlÐÜÐ&¬×-Ò-ØÐô /Ø ß.AÓ.AÕ*ÀtÜ(Ô9LÜ8ô	÷
 �gð ÷ ð
 Ð÷Nñ Nð
 €HØ�Z× Ð ˆÙ “nÔ&9¸#Ó&>ˆtØ�‰Ø�3˜
 C°Õ+@Ñ$@À(ÌDÐQVËKØÔ9¸%Ó@Ø˜d 9Ÿoœo‘U°4ð
ð <@ð
ö 	ñ !ô )=¸[ÐQ\Ð^dÓ(eÑ%€GˆZ˜ßÐ+×/Ñ/°×@Ò@ð # D�ˆà× Ñ  Ó)€EßØ‰ßØ ‰ß	§Ø!‰ß§Uô %;¸2Ó$>ÐBRÔ$RÑ ÐXiˆà!×%Ñ% lÓ3€JØ$×(Ñ(¨Ó9€MØÐ Ô Ø×3Ð3Ð#3ˆ
Ø%×>Ð>¨¯©°Ó)>ˆð 	ˆk˜6 5¨¥=°-ÀÀ}ÕAUØ�E˜*Õ% y°'¸<ÈØ˜?¨G°U¸LÈ*Ø˜¨Ð6F×6JÑ6JÈ<Ó6XØ˜ j°(à¿oÐ'×+Ñ+¨MÔ:ÐSWð€Gð �jÔ Ù! /Ó2×8Ñ8Ó:ˆà ]Ð6JÔ%J‘MÐPRØ¤¡iÐ0HÓ&I×&OÑ&OÓ&QÓ!RØ¤ \Ó 2ð%
ˆÐ Ñ!ð
 €Nre   c                ó~   € V ^8„  d   QhR\         \        ,          R\        \        \        \
        3,          ,          /# )r\   Ú
scoped_dirr^   )r   r   Úlistr`   r_   r   )rb   s   "rc   rd   rd     s+   € ÷ "ñ "¤8¬D¥>ð "¼tÄDÌÌcÈÅNÕ?Sñ "re   c                óì   € \        4       pV e   \        V R,          R7      M	\        4       pV e   T M	\        4       p\        WC4      ;'       g    TpV Uu. uF  p\	        WRW0RJV R7      NK  	  up# u upi )z¢Payloads for ``entries``; call inside ``_profile_scope`` (load_env honors the
HERMES_HOME contextvar; the gateway status readers do not, hence the explicit path).Nzgateway_state.json)Úpath)rŸ   rÂ   )r-   r/   r   r6   rñ   )ró   Úentriesrž   rÁ   Úown_homerq   s   &&    rc   Ú_platform_payloadsrù     s€   € ô “*€KØMWÒMcÔ! zÐ4HÕ'HÕIÔi|Ói~€Gð (Ò3‰zÔ9PÓ9R€HÜ$ XÓ7×BÐB¸7€Gá ó"Ù �ô (¨¸GÐ^bÐLbÐq{×|Ù ñ"ð "ùò "s   ÁA1c                ó0   € V ^8„  d   QhR\         R\         /# )r\   Úlog_msgr}   rÊ   )rb   s   "rc   rd   rd   *  s   € ÷ Eñ E¤Sð E´#ñ Ere   c              #  óä   "  €  Rx € R#   \          d    h \         d   p\        R\        T4      R7      ThRp?i\         d)   p\        P                  T 4       \        RTR7      ThRp?ii ; i5i)z•Map onboarding env/config write failures: ValueError -> 400 (its text),
anything else -> logged + fixed 500 ``detail``; HTTPException passes through.Nrz   r{   éô  )r
   Ú
ValueErrorr_   r³   Ú_logÚ	exception)rû   r}   Úexcs   && rc   Ú_onboarding_save_errorsr  )  sb   é € ðEÝøÜô ØÜô GÜ¨´C¸³HÔ=À3ÐFûÜô EÜ�‰�wÔÜ¨°FÔ;ÀÐDûðEüs9   ‚A0„
 ˆA0ŠA-ŸA- 7·A-ÁA-Á#A(Á(A-Á-A0éX  z8WhatsApp setup session was not found. Start a new setup.c                ó0   € V ^8„  d   QhR\         R\        /# ©r\   rw   r^   ©r   r_   )rb   s   "rc   rd   rd   @  s   € ÷ ñ ¬sð ´sñ re   c                 ó�   € \        T ;'       g    R 4      P                  4       P                  4       pVR9  d   \        RRR7      hV# )rç   rz   z+WhatsApp mode must be 'bot' or 'self-chat'.r{   >   rç   rè   )r_   rë   Úlowerr
   )rw   rã   s   & rc   Ú#_normalize_whatsapp_onboarding_moder	  @  s@   € Üˆu�~ˆ~˜Ó×$Ñ$Ó&×,Ñ,Ó.€DØÐ'Ô'Ü¨Ð4aÔbÐbØ€Kre   c                ó0   € V ^8„  d   QhR\         R\        /# r  r  )rb   s   "rc   rd   rd   G  s   € ÷ Vñ V¬Sð V´Sñ Vre   c                 óª   € \        T ;'       g    R 4      P                  4       pV'       g   R # RP                  R VP                  R4       4       4      # )r„   Ú,c              3   ót   "  € T F.  qP                  4       '       g   K  VP                  R R4      x € K0  	  R# 5i)Ú r„   N)rë   Úreplace)r“   Úparts   & rc   r•   Ú4_normalize_whatsapp_allowed_users.<locals>.<genexpr>K  s'   é € ÐU±n¨dÏ
É
ÏÔ)�D—L‘L  b×)Ð)³nùs   ‚8ž8)r_   rë   ÚjoinÚsplit)rw   Úraws   & rc   Ú!_normalize_whatsapp_allowed_usersr  G  s>   € Ü
ˆe�kˆk�rÓ
×
 Ñ
 Ó
"€CßÙØ�8‰8ÑU°c·i±iÀ´nÓUÓUÐUre   c                ó>   € V ^8„  d   QhR\         R\        R,          /# ©r\   rw   r^   Nr  )rb   s   "rc   rd   rd   N  s   € ÷ ñ ¬3ð ´3¸µ:ñ re   c                 ó   € \        T ;'       g    R 4      P                  4       pV'       g   R# \        P                  ! RR VP	                  R^4      ^ ,          P	                  R^4      ^ ,          4      pT;'       g    R# )r„   Nz\D+Ú@Ú:)r_   rë   ÚreÚsubr  )rw   r  Údigitss   &  rc   Ú_whatsapp_phone_from_identifierr  N  sa   € Ü
ˆe�kˆk�rÓ
×
 Ñ
 Ó
"€CßÙÜ�VŠV�F˜B §	¡	¨#¨qÓ 1°!Õ 4× :Ñ :¸3ÀÓ BÀ1Õ EÓF€FØ�>ˆ>�TÐre   c                ód   € V ^8„  d   QhR\         R\        \        R3,          R\        R,          /# )r\   Ú	candidateÚkeys.r^   N)r   ra   r_   )rb   s   "rc   rd   rd   V  s2   € ÷ ]ñ ]œ#ð ]¤U¬3°¨8¥_ð ]¼¸t½ñ ]re   c                 ón   a € \        S \        4      '       g   R # \        R V 3R lV 4        4       R 4      # )Nc              3   ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir¤   r’   ©r“   Úvs   & rc   r•   Ú_first_str.<locals>.<genexpr>Y  s   é € ÐUÑO�qÓST—’ÓOùó   ‚	�
c              3   óˆ   <"  € T F7  p\        SP                  V4      ;'       g    R 4      P                  4       x € K9  	  R# 5ir­   ©r_   ro   rë   )r“   Úkr   s   & €rc   r•   r&  Y  s3   øé € ÐOÉ$ÀQœS §¡¨qÓ!1×!7Ð!7°RÓ8×>Ñ>×@Ð@Ë$ùs
   ƒ!A¥A)r²   r`   r—   )r   r!  s   f&rc   Ú
_first_strr+  V  s-   ø€ Ü�i¤×&Ò&ÙÜÑUÔOÉ$ÔOÓUÐW[Ó\Ð\re   c                ó†   € V ^8„  d   QhR\         R\        \        R,          \        R,          \        R,          3,          /# )r\   Úsession_pathr^   N)r   ra   r_   )rb   s   "rc   rd   rd   \  s<   € ÷ Qñ Q¼ð QÄÄsÈTÅzÔSVÐY]ÕS]Ô_bÐeiÕ_iÐGiÕAjñ Qre   c                 óL  €  \         P                  ! V R ,          P                  RR7      4      pTP	                  R4      TP	                  R4      T3p\        R R T 4        4       R4      p\        R R	 T 4        4       R4      pY4\        T4      3#   \         d    R
u # i ; i)ú
creds.jsonz	utf-8-sig)ÚencodingNÚmeÚaccountc              3   ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir¤   r’   r$  s   & rc   r•   Ú8_whatsapp_linked_account_from_session.<locals>.<genexpr>b  s   é € ÐaÑ"[˜QÓ_`—q’qÓ"[ùr'  c              3   ó:   "  € T F  p\        VR4      x € K  	  R# 5i)r‘   N)r‘   ÚjidÚlid©r+  ©r“   Úcs   & rc   r•   r4  b  s   é € Ð"[ÑPZÈ1¤:¨aÐ1E×#FÐ#FÓPZùó   ‚c              3   ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir¤   r’   r$  s   & rc   r•   r4  c  s   é € Ð}Ñ$w˜qÓ{|ŸšÓ$wùr'  c              3   ó:   "  € T F  p\        VR4      x € K  	  R# 5i)rÝ   N)rÝ   ÚverifiedNameÚnotifyÚpushNamer8  r9  s   & rc   r•   r4  c  s   é € Ð$wÑlvÐgh¤Z°Ð3a×%bÐ%bÓlvùr;  )NNN)ÚjsonÚloadsÚ	read_textr³   ro   r—   r  )r-  rï   Ú
candidatesÚ
account_idÚaccount_names   &    rc   Ú%_whatsapp_linked_account_from_sessionrG  \  s«   € ð Ü—*’*˜l¨\Õ9×DÑDÈkÐDÓZÓ[ˆð —+‘+˜dÓ# W§[¡[°Ó%;¸WÐE€JÜÑaÑ"[ÑPZÔ"[ÓaÐcgÓh€JÜÑ}Ñ$wÑlvÔ$wÓ}ð  @Dó  E€LØÔ%DÀZÓ%PÐPÐPøô ô  ØÒð ús   ‚-B ÂB#Â"B#c                ó(   € V ^8„  d   QhR\         RR/# )r\   Ú
bridge_dirr^   Nr   )rb   s   "rc   rd   rd   g  s   € ÷ "xñ "x´Tð "x¸dñ "xre   c                ó†  € V R,          P                  4       '       d   R# ^ RIHpHp ^ RIHp ^ RIpV! R4      p V! 4       pVfh   VP                  RRR7      P                  pVP                  R4      pVe   VP                  f   VP                  RR4      h\        VP                  4      p\        P                  ! VR	R
.\        V 4      RRRRV! RR4      V\        4       RR7
      pTP&                  ^ 8w  ds   RP)                  TP*                  ;'       g    TP,                  ;'       g    RP/                  4       P1                  4       RR 4      p
\#        RRT
;'       g    R 2R7      hR#   \        P                    d   p	\#        RRR7      T	hRp	?	iTP                  \$        3 d   p	\#        RRT	 2R7      T	hRp	?	ii ; i)zDInstall bridge dependencies when the dashboard is the setup surface.Únode_modulesN©Úfind_node_executableÚwith_hermes_node_path)Úenv_intÚnpmT©Úexplicitz'npm binary is missing after preparationÚinstallz--silentúutf-8r  ÚWHATSAPP_NPM_INSTALL_TIMEOUTé,  F)	ÚcwdÚcapture_outputÚtextr0  ÚerrorsÚtimeoutÚenvÚcreationflagsÚcheckrý   z2Installing WhatsApp bridge dependencies timed out.r{   z0Failed to install WhatsApp bridge dependencies: Ú
r„   z(npm install failed for WhatsApp bridge: z	no outputiöÿÿÿ)ÚexistsÚhermes_constantsrM  rN  ÚutilsrO  ÚpmÚensurer\  Úinstalled_packageÚbinaryÚInstallErrorr_   Ú
subprocessÚrunr   ÚTimeoutExpiredr
   ÚOSErrorÚ
returncoder  ÚstderrÚstdoutrë   Ú
splitlines)rI  rM  rN  rO  rc  rP  r\  Ú	installedÚresultr  r}   s   &          rc   Ú$_ensure_whatsapp_bridge_dependenciesrr  g  s©  € à�^Õ#×+Ñ+×-Ò-ÙçLÝÛá
˜uÓ
%€CðwÙ#Ó%ˆØŠ;Ø—)‘)˜E¨D�)Ó1×5Ñ5ˆCØ×,Ñ,¨UÓ3ˆIØÒ  I×$4Ñ$4Ò$<Ø—o‘o eÐ-VÓWÐWÜ�i×&Ñ&Ó'ˆCô —’Ø�)˜ZÐ(¬c°*«oÈdÐY]Ø Y¹Ð@^Ð`cÓ8dØÔ#5Ó#7Øô	
ˆð ×Ñ˜AÔØ—‘˜FŸM™M×@Ð@¨V¯]©]×@Ð@¸b×GÑGÓI×TÑTÓVÐWZÐW[Ð\Ó]ˆÜ¨Ð6^Ð_e×_tÐ_tÐitÐ^uÐ4vÔwÐwñ øô ×$Ñ$ô sÜ¨Ð4hÔiÐorÐrûØ�O‰OœWÐ%ô wÜ¨Ð6fÐgjÐfkÐ4lÔmÐsvÐvûðwús*   »B-E- Å-G ÆFÆG Æ)G Æ*F;Æ;G c                óP   € V ^8„  d   QhR\         R\        R\        P                  /# )r\   r-  rã   r^   )r   r_   rh  ÚPopen)rb   s   "rc   rd   rd   Œ  s'   € ÷ ñ ´$ð ¼cð Äj×FVÑFVñ re   c                 óê  € ^ RI Hp ^ RIHpHp V! 4       pVR,          pVP                  4       '       g   \        RRV R2R7      h\        V4       V! R4      pV'       gc   ^ R	Ip VP                  RR
R7       VP                  R4      p	V	e   V	P                  f   VP                  RR4      h\        V	P                  4      pV P                  R
R
R7       V! 4       pWR&   RVR&   \        P                   ! V\        V4      RRR\        V 4      .\        V4      \        P"                  \        P$                  R
RRR
V\'        4       R7
      #   TP                   d   p
\        RRT
 2R7      T
hR	p
?
ii ; i)ry   )Úresolve_whatsapp_bridge_dirrL  z	bridge.jsrý   z(WhatsApp bridge script was not found at Ú.r{   ÚnodeNTrQ  z+Node.js binary is missing after preparationzNode.js preparation failed: )ÚparentsÚexist_okr>   Úpairingr?   z--pair-onlyz--pair-jsonz	--sessionrT  r  )	rW  rn  rm  rY  r0  rZ  Ústart_new_sessionr\  r]  )Ú!gateway.platforms.whatsapp_commonrv  ra  rM  rN  r`  r
   rr  rc  rd  re  rf  rg  r_   Úmkdirrh  rt  ÚPIPEÚSTDOUTr   )r-  rã   rv  rM  rN  rI  Úbridge_scriptrx  rc  rp  r  r\  s   &&          rc   Ú_spawn_whatsapp_pairing_processr‚  Œ  sk  € ÝMßLá,Ó.€JØ Õ,€MØ×Ñ×!Ò!Ü¨Ð6^Ð_lÐ^mÐmnÐ4oÔpÐpÜ(¨Ô4Ù Ó'€DßÛð	gØ�I‰I�f tˆIÔ,Ø×,Ñ,¨VÓ4ˆIØÒ  I×$4Ñ$4Ò$<Ø—o‘o fÐ.[Ó\Ð\Ü�y×'Ñ'Ó(ˆDð ×Ñ˜t¨dÐÔ3á
Ó
!€CØˆÑØ )€CÐÑÜ×ÒØ	Œs�=Ó! =°-ÀÌcÐR^ÓN_Ð`Ü�
‹O¤J§O¡O¼J×<MÑ<MÐTXØ ¸dÈÜ(Ó*ô	ð øð �‰ô 	gÜ¨CÐ:VÐWZÐV[Ð8\Ô]ÐcfÐfûð	gús   Á&AE ÅE2ÅE-Å-E2c                óJ   € V ^8„  d   QhR\         P                  R,          RR/# )r\   ÚprocNr^   )rh  rt  )rb   s   "rc   rd   rd   ®  s%   € ÷ 	!ñ 	!¤j×&6Ñ&6¸Õ&=ð 	!À$ñ 	!re   c                 ód  € V e   V P                  4       e   R #  V P                  4        V P                  ^R7       R #   \         dg    \        P
                  ! \        4      ;_uu_ 4        T P                  4        T P                  ^R7       R R R 4        R #   + '       g   i      R # ; ii ; i)N©r[  )ÚpollÚ	terminateÚwaitr³   Ú
contextlibÚsuppressÚkill©r„  s   &rc   Ú_terminate_whatsapp_pairingrŽ  ®  sx   € Ø‚|�t—y‘y“{Ò.Ùð!Ø�‰ÔØ�	‰	˜!ˆ	ÖøÜô !Ü× Ò ¤×+Õ+Ø�I‰IŒKØ�I‰I˜aˆIÔ ÷ ,×+×+Ô+úð!ús'   š"> ¾-B/Á+#BÂB/ÂB+Â$B/Â+B/r„  Úunlessc                ó4   € V ^8„  d   QhR\         R\         RR/# )r\   Ú
pairing_idÚerrorr^   NrÊ   )rb   s   "rc   rd   rd   º  s"   € ÷ !ñ !¤sð !´3ð !Ðx|ñ !re   c               óü   € \         ;_uu_ 4        \        P                  ! V 4      pV'       d3   Ve   VP                  VJ d   VP                  V9  d   RVn        Wn        RRR4       R#   + '       g   i     R# ; i)zŠMark the session errored unless its status is in ``unless`` (or, when
``proc`` is given, it has since been superseded by another process).Nr’  )Ú_whatsapp_onboarding_lockr   ro   r„  Ústatusr’  )r‘  r’  r„  r�  Úrecords   &&$$ rc   Ú_fail_whatsapp_pairingr—  º  sS   € ÷ 
#Ö	"Ü.×2Ò2°:Ó>ˆß�t’| v§{¡{°dÓ':ÀÇÁÐU[Ô@[Ø#ˆFŒMØ ŒL÷	 
#×	"×	"Ò	"ús   �AA*Á*A;	c                ó(   € V ^8„  d   QhR\         RR/# )r\   rï   r^   N)r`   )rb   s   "rc   rd   rd   Ä  s   € ÷ "ñ "¬$ð "°4ñ "re   c                 óx  € \        VP                  R 4      ;'       g    R4      P                  4       pVR8X  dS   \        VP                  R4      ;'       g    R4      P                  4       pV'       d   W0n        RV n        RV n        R# R# VR8X  dÌ   VP                  R4      p\        V\        4      '       d•   \        VP                  R4      ;'       g    R4      P                  4       pT;'       g    RV n        \        VP                  R4      ;'       g    R4      P                  4       ;'       g    RV n	        \        V4      V n        RV n        RV n        R# VR	8X  d3   R	V n        \        VP                  R	4      ;'       g    R
4      V n        R# VR8X  d   V P                  R8X  d
   RV n        R# R# R# )Úeventr„   ÚqrÚwaitingNÚ	connectedÚuserr‘   rÝ   r’  zWhatsApp pairing failed.ÚdisconnectedÚstarting)r_   ro   rë   Ú
qr_payloadr•  r’  r²   r`   rE  rF  r  Úaccount_phone)r–  rï   rš  r›  rž  rE  s   &&    rc   Ú_apply_pairing_eventr£  Ä  s_  € Ü�—‘˜GÓ$×*Ð*¨Ó+×1Ñ1Ó3€EØ�„}Ü�—‘˜TÓ"×(Ð( bÓ)×/Ñ/Ó1ˆßØ "ÔØ%ˆFŒMØˆFŽLñ ð 
�+Ô	Ø�{‰{˜6Ó"ˆÜ�dœD×!Ò!Ü˜TŸX™X d›^×1Ð1¨rÓ2×8Ñ8Ó:ˆJØ *× 2Ð 2¨dˆFÔÜ"% d§h¡h¨vÓ&6×&<Ð&<¸"Ó"=×"CÑ"CÓ"E×"MÐ"MÈˆFÔÜ#BÀ:Ó#NˆFÔ Ø#ˆŒØˆŽØ	�'Ô	ØˆŒÜ˜7Ÿ;™; wÓ/×MÐMÐ3MÓNˆŽØ	�.Ô	  V§]¡]°jÔ%@Ø!ˆŽñ &AÑ	 re   c                óH   € V ^8„  d   QhR\         R\        P                  RR/# )r\   r‘  r„  r^   N)r_   rh  rt  )rb   s   "rc   rd   rd   Ü  s,   € ÷ Añ A¬ð A´:×3CÑ3Cð AÈñ Are   c                 óš  €  VP                   ;'       g    R F¡  pVP                  4       pV'       g   K   \        P                  ! V4      p\
        ;_uu_ 4        \        P                  ! T 4      pT'       d   TP                  TJd    R R R 4        R # TP                  R9  d   \        YT4       R R R 4       K£  	  VP                  4       p\        Y^ 8X  d   RMRT R2T0 RmR7       R #   \        P                   d     Kì  i ; i  + '       g   i     EK  ; i  \         d#   p\        T \        T4      TR7        R p?R # R p?ii ; i)	Nr�  ú9WhatsApp pairing process exited before pairing completed.z*WhatsApp pairing process exited with code rw  )r„  r�  r’   >   ÚexpiredÚ	cancelled>   r§  r¨  r�  )rn  rë   rA  rB  ÚJSONDecodeErrorr”  r   ro   r„  r•  r£  r‰  r³   r—  r_   )r‘  r„  Úliner  rï   r–  rl  r  s   &&      rc   Ú_watch_whatsapp_pairingr«  Ü  s  € ðØ—K‘K×%Ð% 2Ò%ˆDØ—*‘*“,ˆCßÙðÜŸ*š* S›/�÷ +Ö*Ü6×:Ò:¸:ÓF�ß §¡°DÓ!8Ø÷ +Ò*ð —=‘=Ð(@Ô@Ü(¨Ô9÷ +Ñ*ñ &ð —Y‘Y“[ˆ
ô
 ØÐabÔSbÑOØ9¸*¸ÀQÐGØÒ?÷Aøô ×'Ñ'ô Úðúç*×*Ñ*ûô ô Ü˜z¬3¨s«8¸$Õ?Ýûðúsc   ‚D • D ¶C,ÁD Á0DÂ
	D ÂDÂ1D Ã,DÄD ÄDÄD ÄDÄ
D ÄE
Ä(EÅE
c                ó@   € V ^8„  d   QhR\         R\        R\         RR/# )r\   r‘  r-  rã   r^   N)r_   r   )rb   s   "rc   rd   rd   ÷  s(   € ÷ 2ñ 2¤cð 2¼ð 2ÄSð 2ÈTñ 2re   c           	      óf  € \         ;_uu_ 4        \        P                  ! V 4      pV'       d   VP                  \        9   d   V'       d   \        V4        R R R 4       R # RVn        RVn        R R R 4         \        W4      p\         ;_uu_ 4        RXn        YCn        TP                  \        9   d@   \        T4        R R R 4       \         ;_uu_ 4        RTn        \        T4       R R R 4       R # RTn        R R R 4       \        Y4       \         ;_uu_ 4        RXn        \        T4       R R R 4       R #   + '       g   i     LÒ; i  \         d^   p\        T \        T4      4        R p?\         ;_uu_ 4        RXn        \        T4       R R R 4       R #   + '       g   i     R # ; iR p?ii ; i  + '       g   i     R # ; i  + '       g   i     LØ; i  + '       g   i     R # ; i  \         ;_uu_ 4        RXn        \        T4       R R R 4       i   + '       g   i     i ; i; i)NÚ
installingTFr   )r”  r   ro   r•  Ú&_WHATSAPP_ONBOARDING_TERMINAL_STATUSESÚ_release_whatsapp_reservationÚstarting_processr‚  r³   r—  r_   r„  rŽ  r«  )r‘  r-  rã   r–  r„  r  s   &&&   rc   Ú_run_whatsapp_pairingr²  ÷  s†  € ß	"Ö	"Ü.×2Ò2°:Ó>ˆß˜Ÿ™Ô*PÔPßÜ-¨fÔ5Ø÷ 
#Ñ	"ð %ˆŒØ"&ˆÔ÷ 
#ð2ð	Ü2°<ÓFˆD÷
 'Ö&Ø&+ˆFÔ#ØŒKØ�}‰}Ô FÔFÜ+¨DÔ1Ø÷ '÷ 'Ö&Ø&+ˆFÔ#Ü)¨&Ô1÷ 'Ñ&ð	 'ˆFŒM÷ 'ô 	  
Ô1ç&Ö&Ø&+ˆFÔ#Ü)¨&Ô1÷ 'Ñ&÷5 
#×	"ûô ô 	Ü" :¬s°3«xÔ8Û÷ 'Ö&Ø&+ˆFÔ#Ü)¨&Ô1÷ '×&×&Ò&þð	ú÷ '×&Ð&ú÷ '×&ú÷ '×&Ð&û×&Ö&Ø&+ˆFÔ#Ü)¨&Ô1÷ '×&×&Ð&ýs§   �;D9ÁD9Á!D9Á9E ÂG2 Â/GÃG2 ÃF7Ã4GÃ;G2 ÄGÄ9E		ÅF4ÅF/Å,G2 Å>FÆF,	Æ/F4Æ4G2 Æ7G	ÇG	ÇG2 ÇG/	Ç2H0ÈH	È	H0ÈH-È(H0c                ó(   € V ^8„  d   QhR\         RR/# ©r\   r–  r^   N©r   )rb   s   "rc   rd   rd     s   € ÷ %ñ %Ô*Dð %Èñ %re   c                óˆ  € V P                   '       d   V P                  '       d   R# V P                  f   V P                  \        9  d   R# V P                  e   V P                  P                  4       f   R# ^ RIHp V! RV P                  4       RV n         V P                  e   V P                  P                  4        R# R# )zDCall under the onboarding lock. A live writer keeps its reservation.N)Úrelease_scoped_lockúwhatsapp-sessionF)Úsession_reservedr±  r„  r•  r¯  r‡  Úgateway.status_scoped_locksr·  r-  Úexpiry_timerÚcancel)r–  r·  s   & rc   r°  r°    s“   € à×"×"Ð" f×&=×&=Ð&=ÙØ‡{�{Ò˜vŸ}™}Ô4ZÔZÙØ‡{�{Ò 6§;¡;×#3Ñ#3Ó#5Ò#=ÙÝ?áÐ*¨F×,?Ñ,?Ô@Ø#€FÔØ×ÑÒ&Ø×Ñ×"Ñ"Ö$ñ 're   c                ó(   € V ^8„  d   QhR\         RR/# r´  rµ  )rb   s   "rc   rd   rd   '  s   € ÷ .ñ .Ô%?ð .ÀDñ .re   c                 ó  € \         ;_uu_ 4        V P                  \        9  g   V P                  '       d$   R V n        RV n        \        V P                  4       \        V 4       RRR4       R#   + '       g   i     R# ; i)r§  z-WhatsApp QR setup expired. Start a new setup.N)r”  r•  r¯  r¹  r’  rŽ  r„  r°  ©r–  s   &rc   Ú_expire_whatsapp_pairingrÀ  '  sQ   € ß	"Ö	"Ø�=‰=Ô FÔFÈ&×Ja×JaÐJaØ%ˆFŒMØJˆFŒLÜ'¨¯©Ô4Ü% fÔ-÷ 
#×	"×	"Ò	"ús   �'A/·.A/Á/B 	c                ó   € V ^8„  d   QhRR/# ©r\   r^   Nr’   )rb   s   "rc   rd   rd   0  s   € ÷ <ñ <¨Tñ <re   c                  óP  € \         P                   ! 4       p . p\        P                  ! 4        FÕ  w  r#\        V4       VP                  \
        9  pV'       d9   VP                  e+   VP                  P                  4       e   RVn        RVn        VP                  V 8:  d   \        V4       VP                  \
        9   g   K–  VP                  '       d   Kª  VP                  R,           V 8:  g   KÄ  VP                  V4       K×  	  V F  p\        P                  ! VR 4       K  	  R # )Nr’  r¦  rV  )Útimer   Úitemsr°  r•  r¯  r„  r‡  r’  Úexpires_at_tsrÀ  r¹  rê   Úpop)ÚnowÚ
remove_idsr‘  r–  Úlives        rc   Ú#_prune_whatsapp_onboarding_sessionsrË  0  sé   € Ü
�)Š)‹+€CØ€JÜ;×AÒAÖCÑˆ
Ü% fÔ-Ø�}‰}Ô$JÑJˆß�F—K‘KÒ+°·±×0@Ñ0@Ó0BÒ0NØ#ˆFŒMØVˆFŒLØ×Ñ 3Ô&Ü$ VÔ,Ø�=‰=ÔBÖBÈ6×Kb×KbÒKbÐgm×g{Ñg{ð  Bõ  hBð  FIö  hIØ×Ñ˜jÖ)ñ Dó !ˆ
Ü%×)Ò)¨*°dÖ;ó !re   c                ó0   € V ^8„  d   QhR\         R\        /# )r\   r-  r^   )r   r_   )rb   s   "rc   rd   rd   A  s   € ÷ ñ ¬Tð ¼cñ re   c                ó’  € \         P                  ! ^4      p\        ;_uu_ 4        \        4        \        P
                  ! 4        FY  pVP                  \        V 4      8X  g   K  VP                  \        9  g   K6  RVn        RVn
        \        VP                  4       K[  	  V\        V&   RRR4       V#   + '       g   i     T# ; i)zStore ``record`` under a fresh pairing id, cancelling any live session on
the same session dir (superseded by the newer setup).r¨  z-Superseded by a newer WhatsApp setup session.N)ÚsecretsÚtoken_urlsafer”  rË  r   Úvaluesr-  r_   r•  r¯  r’  rŽ  r„  )r-  r–  r‘  Úexistings   &&  rc   Ú_register_whatsapp_sessionrÒ  A  s—   € ô ×&Ò& rÓ*€Jß	"Ö	"Ü+Ô-Ü5×<Ò<Ö>ˆHØ×$Ñ$¬¨LÓ(9Ö9¸h¿o¹oÔU{Ö>{Ø"-�”Ø!P�”Ü+¨H¯M©MÖ:ñ	 ?ð
 5;Ô% jÑ1÷ 
#ð Ð÷ 
#Ö	"ð Ðús   ¥:B5Á$B5Á;0B5Â5C	c                ó(   € V ^8„  d   QhR\         RR/# r´  rµ  )rb   s   "rc   rd   rd   P  s   € ÷ #ñ #Ô&@ð #ÀTñ #re   c                ó8  € ^ RI Hp Rp\        P                  ! 4        F’  pVP                  V P                  8X  g   K   VP
                  \        9  gS   VP                  '       gA   VP                  '       g/   VP                  f   Ki  VP                  P                  4       e   K‡  \        RRR7      h	  V! RV P                  RR	/R
7      w  rEV'       d2   V'       d7   VP                  R4      \        P                  ! 4       8X  d   \        RVR7      hRV n        R# )zMReserve before moving keys or launching a writer, including its queued start.)Úacquire_scoped_lockzXWhatsApp is in use. Disable WhatsApp and restart the gateway, then try re-pairing again.Né™  ú^Another WhatsApp QR setup is still active. Cancel it or wait for it to stop before re-pairing.r{   r¸  Ú
owner_kindÚprocess)ÚmetadataÚpidT)Úgateway.statusrÕ  r   rÐ  r-  r•  r¯  r¹  r±  r„  r‡  r
   ro   r¯   Úgetpid)r–  rÕ  ÚbusyrÑ  ÚacquiredÚpreviouss   &     rc   Ú_reserve_whatsapp_sessionrá  P  sÛ   € å2àe€DÜ1×8Ò8Ö:ˆØ× Ñ  F×$7Ñ$7Ö7Ø�O‰OÔ#IÔIØ×(×(Ð(¨H×,E×,EÐ,EØ—‘Ô)¨h¯m©m×.@Ñ.@Ó.BÔ.Jä¨Cð  9Yô  Zð  Zñ ;ñ -Ð-?À×ATÑATÐ`lÐnwÐ_xÔyÑ€Hß—x H§L¡L°Ó$7¼2¿9º9»;Ô$Fô ¨°DÔ9Ð9Ø"€FÖre   c                ó@   € V ^8„  d   QhR\         R\        R\        RR/# )r\   r‘  r–  r-  r^   N)r_   r   r   )rb   s   "rc   rd   rd   d  s+   € ÷ 2ñ 2¬ð 2Ô6Pð 2Ô`dð 2Ðimñ 2re   c                 óŠ  € ^ RI Hp \        P                  ! \        \
        V3R7      Vn        RVP                  n        Rp VP                  P                  4        V! \        RWVP                  3R7      P                  4        RpV'       g   RVn        \        V4       R# R#   T'       g   RTn        \        T4       i i ; i)	ry   )Úspawn_context_thread)ÚargsTFzwhatsapp-pairing)rÝ   rå  r’  N)Úagent.memory_providerrä  Ú	threadingÚTimerÚ _WHATSAPP_ONBOARDING_TTL_SECONDSrÀ  r»  ÚdaemonÚstartr²  rã   r•  r°  )r‘  r–  r-  rä  Úlauncheds   &&&  rc   Ú_launch_whatsapp_pairingrí  d  s    € Ý:ä#Ÿ/š/Ô*JÔLdÐlrÐktÔu€FÔØ!%€F×ÑÔØ€Hð2Ø×Ñ×!Ñ!Ô#ÙÔ2Ð9KØ#-¸V¿[¹[Ð"Iô	KßKPÉ5Ì7ØˆçØ#ˆFŒMÜ)¨&Ö1ñ ø�xØ#ˆFŒMÜ)¨&Õ1ð ús   ÁAB% Â%Cz(/api/messaging/whatsapp/onboarding/startc                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r\   ÚbodyÚprofile)r%   r   r_   )rb   s   "rc   rd   rd   v  s    € ÷ %<ñ %<Ô*Að %<ÌHÔUXÍMñ %<re   c              ƒ   ó6  a"  € \        V P                  4      p\        V P                  4      pV P                  ;'       g    Tp\        V4      ;_uu_ 4        \        ;_uu_ 4        \        4        \        4       o\        ;QJ d2    V3R  l\        P                  ! 4        4       F  '       g   K   RM'	  RM#! V3R  l\        P                  ! 4        4       4      '       d   \        RRR7      h\        P                  ! 4       \        ,           p\        RW#\!        S4      \"        P$                  ! V\&        4      P)                  4       P+                  RR4      WTR	7      pV P,                  '       * ;'       d    SR
,          P/                  4       pV'       d#   \1        S4      w  r‰p
VP3                  RW‰V
R7       \5        R/ VB pV'       d   \7        SV4      pM_\9        V4       Rp V P,                  '       d   \;        S4       \7        SV4      p\=        WËS4       RpV'       g   RVn        \A        V4       RRR4       RRR4       \C        XX4      #   T'       g   RTn        \A        T4       i i ; i  + '       g   i     LD; i  + '       g   i     LO; i5i)c              3   óz   <"  € T F0  qP                   \        S4      8H  ;'       d    VP                  x € K2  	  R # 5ir¤   )r-  r_   r¹  )r“   Úrr-  s   & €rc   r•   Ú,start_whatsapp_onboarding.<locals>.<genexpr>~  s0   øé € ÐzÑSyÈa�~‰~¤ \Ó!2Ñ2×IÐI°q×7IÑ7IÔIÓSyùs   ƒ";¦;TFrÖ  r×  r{   Nz+00:00ÚZ)r„  rã   Úallowed_usersr-  Ú
expires_atrÆ  rð  r/  r�  )r•  rE  rF  r¢  r’  r’   )"r	  rã   r  rö  rð  r&   r”  rË  r+   Úanyr   rÐ  r
   rÄ  ré  r`   r_   r   Úfromtimestampr   Ú	isoformatr  Úreset_sessionr`  rG  Úupdater   rÒ  rá  r   rí  r•  r°  r   )rï  rð  rã   rö  Útarget_profilerÆ  ÚfieldsÚalready_linkedrE  rF  r¢  r–  r‘  rì  r-  s   &&            @rc   Ústart_whatsapp_onboardingr   u  sò  øé € ä.¨t¯y©yÓ9€DÜ5°d×6HÑ6HÓI€Mà—\‘\×,Ð, W€NÜ	˜~×	.Õ	.×0IÖ0IÜ+Ô-Ü-Ó/ˆß‹3ÔzÔSp×SwÒSwÔSyÓz�3�3Š3ÔzÔSp×SwÒSwÔSyÓz×zÒzÜ¨Cð  9Yô  Zð  ZÜŸ	š	›Ô&FÕFˆÜ!%Ø˜DÌCÐP\ÓL]Ü×-Ò-¨m¼SÓA×KÑKÓM×UÑUÐV^Ð`cÓdØ'ô"
ˆð
 "×/Ñ/Ô/×ZÐZ°\ÀLÕ5P×4XÑ4XÓ4ZˆßÜ6[Ð\hÓ6iÑ3ˆJ mØ�M‰M ¸Ðn{ˆMÔ|ä+Ñ5¨fÑ5ˆßÜ3°LÀ&ÓI‰Jä% fÔ-ØˆHð	:Ø×%×%Ð%Ü,¨\Ô:Ü7¸ÀfÓM�
Ü(¨¸\ÔJØ�çØ$+�F”MÜ1°&Ô9÷? 1J×	.ô@ (¨
°FÓ;Ð;ø÷  Ø$+�F”MÜ1°&Õ9ð  ú÷; 1J×0Iú×	.×	.üsc   ƒAJÁJÁ&AI3	Â00I3	Ã!B4I3	ÆAI3	Ç&7IÈI3	È7JÈ?JÉI0É0I3	É3JÉ>JÊJ	ÊJc                ó$   € V ^8„  d   QhR\         /# ©r\   r‘  rÊ   )rb   s   "rc   rd   rd   ž  ó   € ÷ ñ ¬ñ re   c                óx   € \        4        \        P                  ! V 4      pV'       g   \        R\        R7      hV# )z-Call with ``_whatsapp_onboarding_lock`` held.r›   r{   )rË  r   ro   r
   Ú_WHATSAPP_SESSION_NOT_FOUND©r‘  r–  s   & rc   Ú_whatsapp_record_or_404r  ž  ó.   € ä'Ô)Ü*×.Ò.¨zÓ:€FßÜ¨Ô4OÔPÐPØ€Mre   z//api/messaging/whatsapp/onboarding/{pairing_id}c                ó$   € V ^8„  d   QhR\         /# r  rÊ   )rb   s   "rc   rd   rd   ¨  s   € ÷ @ñ @´Sñ @re   c              ƒ   óô   "  € \         ;_uu_ 4        \        V 4      pVP                  R 8X  d"   \        RVP                  ;'       g    RR7      h\        W4      uuRRR4       #   + '       g   i     R# ; i5i)r§  éš  zWhatsApp setup expired.r{   N)r”  r  r•  r
   r’  r   r  s   & rc   Úget_whatsapp_onboarding_statusr  §  sQ   é € ç	"Ö	"Ü(¨Ó4ˆØ�=‰=˜IÔ%Ü¨C¸¿¹×8aÐ8aÐHaÔbÐbÜ+¨JÓ?÷	 
#×	"×	"Ó	"üs"   ‚A8‘5A$ÁA$ÁA8Á$A5	Á/	A8z5/api/messaging/whatsapp/onboarding/{pairing_id}/applyc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# ©r\   r‘  rï  rð  )r_   r$   r   )rb   s   "rc   rd   rd   ±  s.   € ÷ zñ z´ð zÔ;Rð zÔ]eÔfiÕ]jñ zre   c           	   ƒ   ó¶  "  € \        V 4      G R j  x€L
  \        ;_uu_ 4        \        V 4      pVP                  R8w  d   \	        RRR7      h\        VP                  ;'       g    VP                  4      p\        VP                  f   VP                  MVP                  4      pVR8X  d3   V'       g+   VP                  ;'       g    VP                  ;'       g    RpVP                  pR R R 4       VP                  ;'       g    T;'       g    Xp\        RR4      ;_uu_ 4        \        V4      ;_uu_ 4        \        R	X4       \        R
R4       X'       d   \        RV4       \        RR4       \        RR4       R R R 4       R R R 4       \        ;_uu_ 4        XP                   e   VP                   P#                  4       e   \$        P&                  ! V R 4       R R R 4       \)        V4      pRRRRRVR,          '       * /VC#  ELø  + '       g   i     EL*; i  + '       g   i     L¨; i  + '       g   i     L³; i  + '       g   i     Ln; i5i)Nr�  rÖ  ú$WhatsApp setup is not connected yet.r{   rè   r„   z WhatsApp onboarding apply failedzFailed to save WhatsApp setup.r>   r?   r{  r@   r<   Útruerâ   TÚokr½   Úneeds_restartÚrestart_started)Ú_wait_whatsapp_pairing_flushr”  r  r•  r
   r	  rã   r  rö  r¢  rE  rð  r  r&   r1   r,   r„  r‡  r   rÇ  r)   )	r‘  rï  rð  r–  rã   rö  Úrecord_profileÚeffective_profileÚrestart_results	   &&&      rc   Úapply_whatsapp_onboardingr  °  sÑ  é € ä
& zÓ
2×2Ð2ß	"Ö	"Ü(¨Ó4ˆØ�=‰=˜KÔ'Ü¨CÐ8^Ô_Ð_Ü2°4·9±9×3KÐ3KÀÇÁÓLˆÜ9ÐRV×RdÑRdÒRl¸&×:NÒ:NÐrv÷  sEñ  sEó  FˆØ�;Ô§}Ø"×0Ñ0×KÐK°F×4EÑ4E×KÐKÈˆMØŸ™ˆ÷ 
#ð Ÿ™×AÐA¨×AÐA°>ÐÜ	 Ð!CÐEe×	fÕ	fÜ"Ð#4×5Õ5Ü˜?¨DÔ1ÜÐ/°Ô;÷ ÜÐ7¸ÔGÜÐ-¨vÔ6Ü# J°Ô5÷ 6÷ 
g÷ 
#Ö	"ð �;‰;Ò &§+¡+×"2Ñ"2Ó"4Ò"@Ü)×-Ò-¨j¸$Ô?÷	 
#ô @Ð@QÓR€NØ�$˜
 J°À^ÐTeÕEfÔAfÐyÐjxÐyÐyò= 3ß	"×	"Ð	"ú÷ 6×5ú÷ 
g×	fú÷ 
#×	"üs–   ‚I‘H	’I¤AHÁ&AHÂ5HÃHÃHÃ+IÄ	IÄIÄ'H3Ä;AH 	Æ H3ÆIÆAIÇ *IÈH	È	IÈ H0È+H3È3I	È>IÉI	ÉIc                ó(   € V ^8„  d   QhR\         RR/# )r\   r‘  r^   NrÊ   )rb   s   "rc   rd   rd   Ó  s   € ÷ Nñ N´3ð N¸4ñ Nre   c              ƒ   óf  "  € \         ;_uu_ 4        \        V 4      pVP                  R 8w  d   \        RRR7      h RRR4       XP                  '       dD   VP
                  e6    \        P                  ! VP
                  P                  ^R7      G Rj  x€L
  \         ;_uu_ 4        \        V4       VP                  '       d   \        RRR7      h RRR4       R#   + '       g   i     L©; i L[  \        P                   d   p\        RRR7      ThRp?ii ; i  + '       g   i     R# ; i5i)r�  rÖ  r  r{   Nr†  zYWhatsApp is still saving its linked device. Wait a moment and try Save and restart again.zRWhatsApp is still finishing pairing. Wait a moment and try Save and restart again.)r”  r  r•  r
   r¹  r„  ÚasyncioÚ	to_threadr‰  rh  rj  r°  )r‘  r–  r  s   &  rc   r  r  Ó  s  é € ß	"Ö	"Ü(¨Ó4ˆØ�=‰=˜KÔ'Ü¨CÐ8^Ô_Ð_ð (÷ 
#ð ××Ð 6§;¡;Ò#:ð	^Ü×#Ò# F§K¡K×$4Ñ$4¸aÔ@×@Ð@÷ 
#Ö	"Ü% fÔ-Ø×"×"Ð"Ü¨Cð  9Mô  Nð  Nð #÷ 
#Ñ	"÷ 
#×	"úñ AøÜ×(Ñ(ô 	^Ü¨Cð  9Tô  Uð  [^ð  ^ûð	^úç	"×	"Ð	"üso   ‚D1‘*C¼D1ÁD1Á%/C2 ÂC0ÂC2 ÂD1Â'+DÃ
D1ÃC-	Ã(D1Ã0C2 Ã2DÄDÄDÄD1ÄD.	Ä(	D1c                ó$   € V ^8„  d   QhR\         /# r  rÊ   )rb   s   "rc   rd   rd   ä  s   € ÷ ñ ´ñ re   c              ƒ   óœ  "  € \         ;_uu_ 4        \        P                  ! V 4      pV'       d{   R Vn        \	        VP
                  4       \        V4       VP                  '       gB   VP
                  e   VP
                  P                  4       e   \        P                  ! V R4       RRR4       RR/#   + '       g   i     RR/# ; i5i)r¨  Nr  T)
r”  r   ro   r•  rŽ  r„  r°  r±  r‡  rÇ  r  s   & rc   Úcancel_whatsapp_onboardingr   ã  s—   é € ç	"Ö	"Ü.×2Ò2°:Ó>ˆßØ'ˆFŒMÜ'¨¯©Ô4Ü)¨&Ô1ð ×*×*Ð*°·±Ò0CÀvÇ{Á{×GWÑGWÓGYÒGeÜ-×1Ò1°*¸dÔC÷ 
#ð �$ˆ<Ð÷ 
#Ö	"ð �$ˆ<Ðüs   ‚C‘BB6Â*CÂ6C		ÃCz8Telegram setup session was not found. Start a new setup.z7Telegram setup service returned an incomplete response.c                ó0   € V ^8„  d   QhR\         R\        /# r  )r_   Úfloat)rb   s   "rc   rd   rd   ø  s   € ÷ !ñ !œCð !¤Eñ !re   c                 óò   €  \         P                  ! V 4      pVP                  f   VP                  \        R7      pVP                  4       #   \         d     \        P                  ! 4       R,           u # i ; i)N)Útzinfor  )r   Úfromisoformatr$  r  r   Ú	timestampr³   rÄ  )rw   Úparseds   & rc   Ú_parse_expiry_tsr(  ø  s`   € ð!Ü×'Ò'¨Ó.ˆØ�=‰=Ò Ø—^‘^¬3�^Ó/ˆFØ×ÑÓ!Ð!øÜô !Ü�yŠy‹{˜SÕ Ò ð!ús   ‚A	A Á'A6Á5A6c                ó   € V ^8„  d   QhRR/# rÂ  r’   )rb   s   "rc   rd   rd     s   € ÷ <ñ <¨Tñ <re   c                  óð   € \         P                   ! 4       p \        P                  ! 4        UUu. uF  w  rVP                  V 8:  g   K  VNK  	  upp F  p\        P                  ! VR 4       K  	  R # u uppi r¤   )rÄ  r   rÅ  rÆ  rÇ  )rÈ  rÛ  r–  r‘  s       rc   Ú#_prune_telegram_onboarding_pairingsr+    sX   € Ü
�)Š)‹+€CÜ.K×.QÒ.QÔ.SÔsÑ.S™{˜sÐW]×WkÑWkÐorÑWr—s�sÑ.SÕsˆ
Ü%×)Ò)¨*°dÖ;ó tùÓss   ®A2ÁA2z\d+c                ó>   € V ^8„  d   QhR\         R\        R,          /# r  r  )rb   s   "rc   rd   rd     s"   € ÷ Nñ N¤sð N¬s°T­zñ Nre   c                 ó†   € \        T ;'       g    R 4      P                  4       p\        P                  V4      '       d   V# R# r­   )r_   rë   Ú_TELEGRAM_USER_ID_REÚ	fullmatch)rw   Ú
normalizeds   & rc   Ú_normalize_telegram_user_idr1    s6   € Ü�U—[�[˜bÓ!×'Ñ'Ó)€JÜ-×7Ñ7¸
×CÒCˆ:ÐMÈÐMre   c                ó$   € V ^8„  d   QhR\         /# r  rÊ   )rb   s   "rc   rd   rd     r  re   c                óx   € \        4        \        P                  ! V 4      pV'       g   \        R\        R7      hV# )z-Call with ``_telegram_onboarding_lock`` held.r›   r{   )r+  r   ro   r
   Ú_TELEGRAM_SESSION_NOT_FOUNDr  s   & rc   Ú_telegram_record_or_404r5    r  re   c                óF   € V ^8„  d   QhR\         \        \        3,          /# )r\   r^   )r`   r_   r   )rb   s   "rc   rd   rd     s   € ÷ ñ ¤t¬C´¨H¥~ñ re   c                 óR   € R RRV P                   RV P                  RV P                  /# )r•  ÚreadyÚbot_usernameÚowner_user_idr÷  )r9  r:  r÷  r¿  s   &rc   Ú_telegram_ready_payloadr;    s0   € à�'˜>¨6×+>Ñ+>Ø˜×-Ñ-¨|¸V×=NÑ=Nðð re   rï  Úbearer_tokenc                ó^   € V ^8„  d   QhR\         R\         R\        \         \        3,          /# )r\   Úmethodrö   r^   r‚   )rb   s   "rc   rd   rd      s3   € ÷ zñ z¬sð z¼#ð zÔcgÔhkÔmpÐhpÕcqñ zre   c             ƒ   óX   "  € \         P                  ! \        WW#R 7      G Rj  x€L
 #  L5i))rï  r<  N)r  r  r*   )r>  rö   rï  r<  s   &&$$rc   Ú_telegram_onboarding_requestr@     s"   é € Ü×"Ò"Ô#DÀfÐY]Ôy×yÐyÑyùs   ‚!*£(¤*z(/api/messaging/telegram/onboarding/startc                ó$   € V ^8„  d   QhR\         /# )r\   rï  )r#   )rb   s   "rc   rd   rd   %  s   € ÷ ñ Ô*Añ re   c              ƒ   óT  a"  € V P                   ;'       g    R P                  4       ;'       g    R p\        RRRV/R7      G Rj  x€L
 oR V3R llp\        VR4      w  r4rVV'       d   V'       d   V'       d	   V'       g   \	        R\
        R7      h\        ;_uu_ 4        \        4        \        WE\        V4      R7      \        V&   RRR4       RTRV! R4      R
TR\        SP                  R4      ;'       g    T4      P                  4       R	V/#  LÍ  + '       g   i     LT; i5i)zHermes AgentÚPOSTz/v1/telegram/pairingsÚbot_name)rï  Nc                ó0   € V ^8„  d   QhR\         R\         /# r�   rÊ   )rb   s   "rc   rd   Ú/start_telegram_onboarding.<locals>.__annotate__)  s   € ÷ 3ñ 3”3ð 3œ3ñ 3re   c                 óh   <€ \        SP                  V 4      ;'       g    R 4      P                  4       # rÍ   r)  )rv   rï   s   &€rc   ÚfieldÚ(start_telegram_onboarding.<locals>.field)  s(   ø€ Ü�7—;‘;˜sÓ#×)Ð) rÓ*×0Ñ0Ó2Ð2re   r‘  r÷  Ú	deep_linkéö  r{   )Ú
poll_tokenr÷  rÆ  Úsuggested_usernamer¡  )r‘  rL  r÷  rJ  )rD  rë   r@  Úmapr
   Ú_TELEGRAM_INCOMPLETE_RESPONSEr   r+  r   r(  r   r_   ro   )rï  rD  rH  r‘  rL  r÷  rJ  rï   s   &      @rc   Ústart_telegram_onboardingrP  $  sý   øé € à—‘×/Ð/ ×6Ñ6Ó8×JÐJ¸N€HÜ0°Ð9PÐXbÐdlÐWmÔn×n€G÷3ð 3ô 58¸Ð?vÓ4wÑ1€J˜JßŸZ¯zÇÜ¨Ô4QÔRÐRç	"Ö	"Ü+Ô-Ü4NØ!ÔHXÐYcÓHdô5fÔ% jÑ1÷ 
#ð 	�jÐ"6¹Ð>RÓ8SÐU`ÐbkØ”c˜'Ÿ+™+ lÓ3×@Ð@°yÓA×GÑGÓIÈ<ÐYcðð ñ o÷ 
#×	"üsF   ƒ+D(¯D(ÁDÁ+D(Á2D(Á:D(ÂD(Â!(DÃ	1D(Ã;D(ÄD%	Ä D(z//api/messaging/telegram/onboarding/{pairing_id}c                ó$   € V ^8„  d   QhR\         /# r  rÊ   )rb   s   "rc   rd   rd   <  s   € ÷ #fñ #f´Sñ #fre   c           	   ƒ   ó”  "  € \         ;_uu_ 4        \        V 4      pVP                  '       d   \        V4      uuR R R 4       # VP                  pR R R 4       \        RR\        P                  P                  V RR7       2XR7      G R j  x€L
 p\        VP                  R4      ;'       g    R4      P                  4       pVR8X  dJ   \         ;_uu_ 4        \        P                  ! V 4      pV'       d   VP                  MRpR R R 4       RRRX/# VR	8X  Ed   \        VP                  R
4      ;'       g    R4      P                  4       pV'       g   \        R\        R7      h\         ;_uu_ 4        \        P                  ! V 4      pV'       g   \        R\         R7      hWqn        \        VP                  R4      ;'       g    R4      P                  4       ;'       g    R Vn        \%        VP                  R4      4      Vn        \        V4      uuR R R 4       # VR9   dF   \         ;_uu_ 4        \        P(                  ! V R 4       R R R 4       \        R\+        VR4      R7      h\        RRR7      h  + '       g   i     EL0; i EL   + '       g   i     EL“; i  + '       g   i     L”; i  + '       g   i     Lr; i5i)NÚGETz/v1/telegram/pairings/r„   )Úsafe)r<  r•  rœ  r÷  r8  ÚtokenrK  r{   r›   r9  r:  r  z9Telegram setup is no longer available. Start a new setup.z2Telegram setup service returned an unknown status.>   Úclaimedr§  )r   r5  Ú	bot_tokenr;  rL  r@  ÚurllibÚparseÚquoter_   ro   rë   r   r÷  r
   rO  r4  r9  r1  r:  rÇ  r   )r‘  r–  rL  rï   r•  Úcurrentr÷  rW  s   &       rc   Úget_telegram_onboarding_statusr\  ;  s(  é € ç	"Ö	"Ü(¨Ó4ˆØ××ÐÜ*¨6Ó2÷ 
#Ò	"ð ×&Ñ&ˆ
÷	 
#ô 1ØÐ'¬¯©×(:Ñ(:¸:ÈBÐ(:Ó(OÐ'PÐQÐ`jôl÷ l€Gä�—‘˜XÓ&×,Ð,¨"Ó-×3Ñ3Ó5€FØ�Ôß&Ö&Ü3×7Ò7¸
ÓCˆGß/6˜×+Ò+¸BˆJ÷ 'ð ˜) \°:Ð>Ð>à�ÕÜ˜Ÿ™ GÓ,×2Ð2°Ó3×9Ñ9Ó;ˆ	ßÜ¨CÔ8UÔVÐVß&Ö&Ü2×6Ò6°zÓBˆFßÜ#°Ô<WÔXÐXØ(ÔÜ"% g§k¡k°.Ó&A×&GÐ&GÀRÓ"H×"NÑ"NÓ"P×"XÐ"XÐTXˆFÔÜ#>¸w¿{¹{È?Ó?[Ó#\ˆFÔ Ü*¨6Ó2÷ 'Ò&ð Ð'Ô'ß&Ö&Ü)×-Ò-¨j¸$Ô?÷ 'ä¨Ô4VØÐOó5Qô Rð 	Rô  CÐ0dÔ
eÐe÷E 
#×	"Ð	"úòl÷ '×&Ð&ú÷ '×&ú÷ '×&üsš   ‚K‘(I7¹KÁI7Á;KÂJÂ KÂ-*KÃ-JÄ2KÄ7KÅKÅ3AJ"ÇJ"Ç"1J"È KÈ3J5É,KÉ7J	Ê
KÊJ	Ê	KÊ"J2	Ê-KÊ5K	Ë Kz5/api/messaging/telegram/onboarding/{pairing_id}/applyc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# r  )r_   r"   r   )rb   s   "rc   rd   rd   c  s)   € ÷ $ñ $´ð $Ô;Rð $Ô]eÔfiÕ]jñ $re   c           	   ƒ   ót  a	a
a"  € VP                    Uu. uF  p\        V4      NK  	  pp\        V4      '       g   \        R RR7      h\	        \
        P                  V4      4      o	S	'       g   \        R RR7      h\        ;_uu_ 4        \        V 4      pVP                  o
VP                  pS
'       g   \        RRR7      h RRR4       VP                  ;'       g    ToV	V
V3R lp\        RR	4      ;_uu_ 4        \        P                  ! V4      G Rj  x€L
  RRR4       \        ;_uu_ 4        \        P                   ! V R4       RRR4       \#        SR
R
R7      pRRRRRXRVR,          '       * /VC# u upi   + '       g   i     LÂ; i Lx  + '       g   i     L~; i  + '       g   i     Lc; i5i)rz   z*Allowed Telegram user IDs must be numeric.r{   z*Add at least one allowed Telegram user ID.rÖ  z Telegram setup is not ready yet.Nc                  óÎ   <€ \        S4      ;_uu_ 4        \        R S4       \        RRP                  S 4      4       \        RR4       RRR4       R#   + '       g   i     R# ; i)ÚTELEGRAM_BOT_TOKENÚTELEGRAM_ALLOWED_USERSr  ÚtelegramTN)r'   r1   r  r,   )Úallowed_user_idsrW  r  s   €€€rc   Ú_applyÚ)apply_telegram_onboarding.<locals>._applyt  sH   ø€ ÜÐ-×.Õ.ÜÐ/°Ô;ÜÐ3°S·X±XÐ>NÓ5OÔPÜ# J°Ô5÷ /×.×.Ò.ús   •4AÁA$	z Telegram onboarding apply failedzFailed to save Telegram setup.zTelegram onboarding)ÚwhatÚlabelr  Tr½   rb  r9  r  r  )rc  r1  r±   r
   rô   r`   Úfromkeysr   r5  rW  r9  rð  r  r  r  r   rÇ  r   )r‘  rï  rð  Úraw_idÚnormalized_idsr–  r9  rd  r  rc  rW  r  s   &&&      @@@rc   Úapply_telegram_onboardingrk  b  so  úé € àHL×H]ÒH]Ó^ÑH]¸fÔ1°&Ö9ÑH]€NÐ^Üˆ~×ÒÜ¨Ð4`ÔaÐaÜœDŸM™M¨.Ó9Ó:ÐßÜ¨Ð4`ÔaÐaç	"Ö	"Ü(¨Ó4ˆØ×$Ñ$ˆ	Ø×*Ñ*ˆßÜ¨CÐ8ZÔ[Ð[ð ÷	 
#ð Ÿ™×/Ð/¨Ð÷6ô 
!Ð!CÐEe×	fÕ	fÜ×Ò Ó'×'Ð'÷ 
g÷ 
#Ö	"Ü%×)Ò)¨*°dÔ;÷ 
#ô ,Ð,=ÐDYÐavÔw€Nàˆd�J 
¨N¸LØ˜^Ð,=Õ>Ô>ðàBPðð ùòA _÷ 
#×	"úñ  	(÷ 
g×	fú÷ 
#×	"üsp   …F8”E8¨A!F8Â	9E=ÃF8ÃF8Ã=FÄFÄFÄF8Ä2F%Å
3F8Å=F	ÆF8ÆFÆF"	ÆF8Æ%F5	Æ0F8c                ó$   € V ^8„  d   QhR\         /# r  rÊ   )rb   s   "rc   rd   rd   ‹  s   € ÷ ñ ´ñ re   c              ƒ   óš   "  € \         ;_uu_ 4        \        P                  ! V R 4       R R R 4       RR/#   + '       g   i     RR/# ; i5i)Nr  T)r   r   rÇ  )r‘  s   &rc   Úcancel_telegram_onboardingrn  Š  s<   é € ç	"Ö	"Ü%×)Ò)¨*°dÔ;÷ 
#à�$ˆ<Ð÷ 
#Ö	"à�$ˆ<Ðüs   ‚A‘5©AµA	Á Az/api/messaging/platformsc                ó:   € V ^8„  d   QhR\         \        ,          /# )r\   rð  )r   r_   )rb   s   "rc   rd   rd   •  s   € ÷ )ñ )¬8´C­=ñ )re   c              ƒ   óX   a "  € V 3R  lp\         P                  ! V4      G Rj  x€L
 #  L5i)c                  óö   <€ \        S4      ;_uu_ 4       p R \        \        4       4      RRP                  R.\	        SR4      O4      R\        V \        4       4      /uuRRR4       #   + '       g   i     R# ; i)Úenv_pathÚgateway_start_commandr  Úhermesrë  r§   N)r'   r_   r   r  r2   rù   r   )ró   rð  s    €rc   Ú_runÚ%get_messaging_platforms.<locals>._run—  sc   ø€ ô
 ˜G×$Ô$¨
àœC¤£Ó/Ø'¨¯©°8Ð2dÔ>QÐRYÐ[bÓ>cÐ2dÓ)eØÔ/°
Ô<WÓ<YÓZð÷ %×$×$Ó$ús   •AA'Á'A8	N)r  r  )rð  ru  s   f rc   Úget_messaging_platformsrw  ”  s$   øé € õ
ô ×"Ò" 4Ó(×(Ð(Ñ(ùs   ƒ *£(¤*c                óh   € V ^8„  d   QhR\         R\        \         ,          R\        \         ,          /# )r\   r]   Úrequested_profiler^   ©r_   r   )rb   s   "rc   rd   rd   ¦  s-   € ÷ &ñ &´#ð &Ì(ÔSVÍ-ð &Ô\dÔehÕ\iñ &re   c                ó  € ^ RI Hp W9  d   R# T;'       g    RP                  4       pV'       d   VP                  4       R8X  d   ^ RIHp V! 4       pM\        V4       TpVR9   d   R# ^ RIHp V! 4       '       g   R# RV  RV R	V R
2# )aç  Reason enabling ``platform_id`` on the target profile is pointless under a multiplexed
gateway, or ``None`` when allowed.

With ``gateway.multiplex_profiles`` on, the default profile's listener already mirrors
``api_server`` and ``webhook`` at ``/p/<profile>/`` for every profile, so a SECONDARY must not
enable a second one. Every other inbound-port platform (Twilio, LINE, Teams, ...) IS allowed on a
secondary: the gateway serves it on the shared listener at ``/p/<profile>/<path>``.
)Ú SHARED_LISTENER_MIRROR_PLATFORMSNr„   r[  )Úget_active_profile_name)Údefault_gateway_multiplexeszCannot enable 'z' on profile 'zq': gateway.multiplex_profiles is on and the default profile's listener already serves it for every profile at /p/z`/. Configure it on the default profile instead (disabling or clearing it here is still allowed).)ÚdefaultÚcustom)	r´   r|  rë   r  Úhermes_cli.profilesr}  r(   Ú!hermes_cli.gateway_multiplex_moder~  )r]   ry  r|  Ú	requestedr}  Útargetr~  s   &&     rc   Ú _multiplex_port_binding_conflictr…  ¦  sœ   € õ @àÔ:Ùà"×(Ð( b×/Ñ/Ó1€Iß˜	Ÿ™Ó)¨YÔ6Ý?ñ )Ó*‰ä˜YÔ'ØˆØÐ&Ô&Ùõ
 NÙ&×(Ò(Ùð ˜+˜ n°V°Hð =PØPVÈxð X[ð	[ðre   z&/api/messaging/platforms/{platform_id}c                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r\   r]   rï  rð  )r_   r!   r   )rb   s   "rc   rd   rd   Ð  s3   € ÷ @Oñ @O´ð @OÔ<Sð @OÔ^fÔgjÕ^kñ @Ore   c              ƒ   óx  a aaaa	a
a"  € SP                   ;'       g    ToV V3R  lp\        P                  ! V4      G Rj  x€L
 w  o	o
SP                  '       d[   \        P                  ! \        S S4      G Rj  x€L
 pV'       d/   \
        P                  RS S;'       g    R4       \        RVR7      h\        S	R,          4      oR VV	3R lloVVV
V V3R	 lp\        R
S  R2RRR7      ;_uu_ 4        \        P                  ! V4      G Rj  x€L
  \
        P                  RS S;'       g    RSP                  \        SP                  4      \        SP                  4      4       \        P                  ! \        S4      G Rj  x€L
 pRRRS RV/uuRRR4       #  EL\ EL& L“ L  + '       g   i     R# ; i5i)c                  ó”   <€ \        S4      ;_uu_ 4        \        S 4      \        S 4      3uuR R R 4       #   + '       g   i     R # ; ir¤   )r'   rœ   rs   )r]   rý  s   €€rc   Ú_resolveÚ+update_messaging_platform.<locals>._resolveÓ  s2   ø€ ô ˜N×+Õ+Ü$ [Ó1Ô3CÀKÓ3PÐP÷ ,×+×+Ó+ús	   •6¶A	Nz\Rejected messaging platform update: platform=%s profile=%s (multiplex port-binding conflict)r[  rÖ  r{   rÐ   c                ó(   € V ^8„  d   QhR\         RR/# )r\   rv   r^   NrÊ   )rb   s   "rc   rd   Ú/update_messaging_platform.<locals>.__annotate__ç  s   € ÷ jñ jœCð j Dñ jre   c                 óH   <€ V S9  d   \        R V  RSR,           2R7      hR# )rz   z is not configurable for rÝ   r{   N)r
   )rv   Úallowed_envrq   s   &€€rc   Ú_check_allowedÚ1update_messaging_platform.<locals>._check_allowedç  s1   ø€ Ø�kÔ!Ü¨C¸3¸%Ð?XÐY^Ð_eÕYfÐXgÐ8hÔiÐiñ "re   c                  ó\  <€ \        S4      ;_uu_ 4        / p SP                   F  pS! V4       K  	  SP                  P                  4        FY  w  rS! V4       VP	                  4       pV'       g   K'  \        V4      '       d   \        R \        R7      h\        SW4       W0V&   K[  	  SP                   F  p\        V4       K  	  V P                  4        F  w  r\        W4       K  	  SP                  e   \        SSP                  4       RRR4       R#   + '       g   i     R# ; i)rz   r{   N)r'   Ú	clear_envr\  rÅ  rë   r   r
   r   r   r0   r1   r©   r,   )	Úupdatesrv   rw   Útrimmedr�  rï  rl   r]   rý  s	       €€€€€rc   rd  Ú)update_messaging_platform.<locals>._applyë  sà   ø€ Ü˜N×+Õ+Ø&(ˆGð —~”~�Ù˜sÖ#ñ &à"Ÿh™hŸn™nÖ.‘
�Ù˜sÔ#ØŸ+™+›-�ßÙÜ1°'×:Ò:Ü'°CÔ@`ÔaÐaÜ-¨o¸sÔLØ&˜“ñ /ð —~”~�Ü  Ö%ñ &à%Ÿm™mžo‘
�Ü˜sÖ*ñ .ð �|‰|Ò'Ü'¨°T·\±\ÔB÷- ,×+×+Ò+ús   •C;DÄD+	zPUT /api/messaging/platforms/z failedrý   zInternal server error)r}   zYMessaging platform updated: platform=%s profile=%s enabled=%s env_keys=%s cleared_keys=%sr  Tr½   Ú
hot_served)rð  r  r  r©   r…  rÿ   rŒ   r
   Úsetr   Úsortedr\  r’  Ú_notify_multiplexer_hot_serve)r]   rï  rð  r‰  Úconflictrd  r–  r�  rŽ  rq   rl   rý  s   ff&    @@@@@rc   Úupdate_messaging_platformr›  Ï  su  þé € à—\‘\×,Ð, W€NöQô $+×#4Ò#4°XÓ#>×>Ñ€Eˆ?Ø‡|‡|€|Ü ×*Ò*Ô+KÈ[ÐZhÓi×iˆßô �I‰Ið4Ø5@À.×B]ÐB]ÐT]ôô  ¨C¸ÔAÐAä�e˜JÕ'Ó(€K÷jñ j÷Cñ Cô2 
Ð5°k°]À'ÐJÈCÐXo×	pÖ	pÜ×Ò Ó'×'Ð'ô 	�	‰	ð*à˜×4Ð4¨9°d·l±lÄFÈ4Ï8É8ÓDTÔV\Ð]a×]kÑ]kÓVlô	
ô #×,Ò,Ô-JÈNÓ[×[ˆ
Ø�d˜J¨°\À:ÐN÷ 
qÒ	pòW ?âiñT 	(ñ \÷ 
q×	pÐ	püsy   ‰7F:Á FÁF:ÁF:Á9FÁ:F:ÂF:Â AF:Ã4F&ÄF"ÄF&Ä-AF&ÆF$ÆF&ÆF:ÆF:Æ"F&Æ$F&Æ&F7	Æ1	F:c                óF   € V ^8„  d   QhR\         \        ,          R\        /# )r\   rð  r^   )r   r_   r‰   )rb   s   "rc   rd   rd     s"   € ÷ 	Añ 	A¬8´C­=ð 	A¼Tñ 	Are   c                óÂ   € ^ RI HpHp ^ RIHp T ;'       g    RP                  4       ;'       g    V! 4       pV'       d   VR8X  g   V! V4      '       g   R# V! V4      RJ# )a  True when a live multiplexer serves the written profile and was told to rebuild its adapters.
Unscoped (no ``?profile=``) means THIS process's profile: Desktop routes a pooled
``hermes --profile X serve`` without the query (#109088), so X must resolve here too.)Ú_current_profile_nameÚ+named_profile_served_by_running_multiplexer)Ú#notify_multiplexer_profiles_changedr„   r  FN)Úhermes_cli.gatewayrž  rŸ  Ú#hermes_cli.gateway_multiplex_servedr   rë   )rð  rž  rŸ  r   rÝ   s   &    rc   r™  r™    sT   € ÷ fÝWØ�MˆM�r× Ñ Ó"×=Ð=Ñ&;Ó&=€Dß�4˜9Ô$Ñ,WÐX\×,]Ò,]ÙÙ.¨tÓ4¸DÐ@Ð@re   c                ó0   € V ^8„  d   QhR\         R\         /# ©r\   rÝ   r^   rÊ   )rb   s   "rc   rd   rd     s   € ÷ #ñ #”Cð #œCñ #re   c                ó   € ^ RI Hp V! V 4      # )zEPer-profile allow/deny gate env read, always stripped (gateway seam).)Úplatform_gate_env)Úgateway.platforms._sharedr¦  )rÝ   r¦  s   & rc   Ú	_gate_envr¨    s   € å;á˜TÓ"Ð"re   c                óR   € V ^8„  d   QhR\         R\        \         \         3,          /# r[   )r_   ra   )rb   s   "rc   rd   rd   &  s"   € ÷ ñ ¬3ð ´5¼¼c¸µ?ñ re   c                óZ  € R;r\         P                  ! \        4      ;_uu_ 4        ^ RIHp ^ RIHp VP                  V 4      pVe   \        VRR4      RJ d   R
uuRRR4       # V! V RV4      ;'       g    RpV! V R	V4      ;'       g    RpRRR4       W3#   + '       g   i     Y3# ; i)zï``(allowed_users_env, allow_all_env)`` for a platform, honoring plugin registry
entries. Empty strings mean "this platform has no per-user authorization surface"
(webhook-style trusted inbound or unknown), so no posture is computed for it.r„   rh   )Úauthz_fieldNÚtrusted_inboundFTÚallowed_users_envÚallow_all_env)r„   r„   )	rŠ  r‹  r³   rn   ri   rm   r«  ro   rp   )r]   ÚallowedÚ	allow_allri   r«  rq   s   &     rc   Ú_platform_authz_env_namesr±  &  s¨   € ð Ð€GÜ	×	Ò	œY×	'Õ	'Ý?å4à!×%Ñ% kÓ2ˆØÒ¤¨Ð0AÀ5Ó!IÈTÓ!QØ÷ 
(Ò	'ñ ˜kÐ+>ÀÓF×LÐLÈ"ˆÙ ¨_¸eÓD×JÐJÈˆ	÷ 
(ð ÐÐ÷ 
(Ö	'ð ÐÐús   ¦4BÁ%BÁ6BÂ
BÂB*	c                ó0   € V ^8„  d   QhR\         R\         /# r[   rÊ   )rb   s   "rc   rd   rd   8  s   € ÷ ñ ¤Sð ¬Sñ re   c                óÜ  € \         P                  ! \        4      ;_uu_ 4        \        4       P	                  R4      ;'       g    / P	                  V 4      p\        V\        4      '       de   \        VP	                  R/ 4      P	                  R4      ;'       g    R4      P                  4       P                  4       pV'       d   VuuRRR4       # RRR4       R#   + '       g   i     R# ; i)a8  Effective ``dm_policy`` for the ACTIVE profile's ``platforms.<id>`` config
(``open``/``allowlist``/``disabled``/``pairing``). The default here is NOT the adapter
default: adapters without a config key never consult ``dm_policy`` in
``_principal_authorized``, so a policy-shaped key only matters where one exists.r§   ÚextraÚ	dm_policyr„   N)
rŠ  r‹  r³   r.   ro   r²   r`   r_   rë   r  )r]   r¹   Úpolicys   &  rc   Ú_platform_dm_policyr·  8  s¥   € ô
 
×	Ò	œY×	'Õ	'Ü“M×%Ñ% kÓ2×8Ð8°b×=Ñ=¸kÓJˆÜ�h¤×%Ò%Ü˜Ÿ™ g¨rÓ2×6Ñ6°{ÓC×IÐIÀrÓJ×PÑPÓR×XÑXÓZˆFßØ÷ 
(×	'Ò	'ñ ÷ 
(Ö	'ñ ús   £A5CÂ*CÃCÃC+	c                ó0   € V ^8„  d   QhR\         R\        /# r  )r_   Úint)rb   s   "rc   rd   rd   F  s   € ÷ Lñ L”cð Lœcñ Lre   c                 ó¢   € \        T ;'       g    R P                  R4       Uu. uF  qP                  4       '       g   K  VNK  	  up4      # u upi )r„   r  )Úlenr  rë   )rw   r  s   & rc   Ú
_count_csvr¼  F  s:   € Ü %§+ +¨2×!4Ñ!4°SÔ!9ÓJÑ!9˜¿Z¹Z¿\—�Ñ!9ÑJÓKÐKùÒJs
   £A¿Ac                óÈ   € V ^8„  d   QhR\         R\        \         \        3,          R\        R\        \         \         3,          R\        \         \        3,          R,          /# )r\   r]   rq   rŸ   Ú	authz_envr^   Nr    )rb   s   "rc   rd   rd   J  sY   € ÷ P4ñ P4ÜðP4Ü!¤#¤s (�^ðP4Ü59ðP4ÜFKÌCÔQTÈHÅoðP4ä	Œ#Œsˆ(…^�dÕñP4re   c                óÈ  a€ Vw  rEV'       g   R# R V3R llpV'       d/   V! V4      P                  4       R!9   d   RRRVR,           RV R	2/# V! R
4      P                  4       R!9   d   RRRR/# YF! V4      RV! R4      RV R8X  d	   V! R4      MRRV R8X  d	   V! R4      MR/pVP                  4        FA  w  r‰V	P                  4       '       g   K  \        V	4      p
RRRRT
 RV
^8w  d   RMR RV R2/u # 	  \	        V 4      R8X  d   RRRR/# ^ ;r¼\
        P                  ! \        4      ;_uu_ 4        ^ RIH	p V! 4       p\        VP                  V 4      4      p\        VP                  V 4      4      pRRR4       V'       d   RRRRT RV^8w  d   RMR R2/# VR,           RV R2pV'       d   TRT RV^8w  d   RMR R2,          pRR RV/#   + '       g   i     Ld; i)"u�  Auth-posture verdict for a CONNECTED platform (must be called inside the profile
scope, after the connectivity chain has already reported ``connected``).

Mirrors the decision ladder of ``AuthorizationMixin._principal_authorized``
(gateway/authz_mixin.py) for the "can any user reach the bot" question, evaluated
against the ACTIVE profile's env/config only â€” never the dashboard process's
``os.environ`` (which carries the ROOT profile's credentials, #66030):

- allow-all flags: ``{PLATFORM}_ALLOW_ALL_USERS`` then ``GATEWAY_ALLOW_ALL_USERS``
- allowlists: the platform's ``{PLATFORM}_ALLOWED_USERS``, ``GATEWAY_ALLOWED_USERS``,
  plus the Telegram group vars (a group-only grant still authorizes real users)
- pairing grants: approved users in the profile's pairing store (the gateway honors
  the store as a UNION with the allowlists)
- adapter/config-enforced policy (``dm_policy: allowlist`` with an ``allow_from``):
  the own-policy adapters (WeCom, Weixin, QQBot, WhatsApp, Yuanbao) gate at intake

Everything failing â†’ deny-all: the connection is up but no sender can get through,
which the Channels "Test" button must not render as a plain green "connected".
Returns ``None`` when the platform has no per-user authorization surface at all.
*authz_env* is :func:`_platform_authz_env_names`, resolved OUTSIDE the profile scope (see
:func:`_env_value_rules`: the scope's registry overlay may not hold the entry).
Nc                ó0   € V ^8„  d   QhR\         R\         /# r¤  rÊ   )rb   s   "rc   rd   Ú1_messaging_platform_posture.<locals>.__annotate__j  s   € ÷ ñ ”sð œsñ re   c                 ó^   <€ S'       d   \        4       P                  V R 4      # \        V 4      # rÍ   )r-   ro   r¨  )rÝ   rŸ   s   &€rc   Úgate_envÚ-_messaging_platform_posture.<locals>.gate_envj  s#   ø€ ßÜ“:—>‘> $¨Ó+Ð+Ü˜‹Ðre   ÚpostureÚopenÚmessagerÝ   z
 is open: z is set.ÚGATEWAY_ALLOW_ALL_USERSz0Gateway is open: GATEWAY_ALLOW_ALL_USERS is set.ÚGATEWAY_ALLOWED_USERSÚTELEGRAM_GROUP_ALLOWED_USERSrb  r„   ÚTELEGRAM_GROUP_ALLOWED_CHATSÚ	allowlistzConnected. z userÚsz allowlisted via rw  zAConnected. Access restricted by the configured allow_from policy.)ÚPairingStorer{  z paired.u7    is connected, but no users are authorized yet â€” set z=, approve a pairing request, or enable pairing for new users.r  z pairing requestz pending approval.Údeny_all)r  Ú1Úyes)r  rÅ  rë   r¼  r·  rŠ  r‹  r³   Úgateway.pairingrÎ  r»  Úlist_approvedÚlist_pending)r]   rq   rŸ   r¾  rŽ  r®  rÃ  Ú
allowlistsÚenv_namerw   ÚnÚapprovedÚpendingrÎ  ÚstoreÚbases   &&f&            rc   Ú_messaging_platform_posturerÜ  J  s8  ø€ ð2 "+Ñ€KßÙ÷
ð ÷
 ™ -Ó0×6Ñ6Ó8Ð<PÔPØ˜6 9°°vµ°¸zÈ-ÈÐX`Ð.aÐbÐbÙÐ)Ó*×0Ñ0Ó2Ð6JÔJØ˜6 9Ð.`ÐaÐað 	�X˜kÓ*Ø¡Ð*AÓ!BØ&ÐT_ÐcmÔTm©Ð1OÔ(PÐsuØ&ÐT_ÐcmÔTm©Ð1OÔ(PÐsuð	€Jð &×+Ñ+Ö-‰ˆØ�;‰;�=Œ=Ü˜5Ó!ˆAà˜;Ø˜[¨¨¨5¸¸Q¼±ÀBÐ0GÐGXÐYaÐXbÐbcÐdðò ñ .ô ˜;Ó'¨;Ô6Ø˜;¨	Ð3vÐwÐwð Ð€HÜ	×	Ò	œY×	'Õ	'Ý0á“ˆÜ�u×*Ñ*¨;Ó7Ó8ˆÜ�e×(Ñ(¨Ó5Ó6ˆ÷ 
(÷ à�yØ˜ X J¨e¸8Àq¼=±CÈbÐ3QÐQYÐZð
ð 	
ð ��=ˆ/ð ØˆmÐXð	Zð 	÷ Ø�!�G�9Ð,°G¸q´L©SÀbÐ,IÐI[Ð\Õ\ˆØ�z 9¨dÐ3Ð3÷% 
(×	'ús   Ä3AGÇG!	z+/api/messaging/platforms/{platform_id}/testc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r\   r]   rð  rz  )rb   s   "rc   rd   rd   ž  s"   € ÷ (zñ (z¬sð (z¼XÄc½]ñ (zre   c           	   ƒ   óÐ  a aa"  € V V3R  lp\         P                  ! V4      G Rj  x€L
 w  popR V3R llpSR,          '       g   V! RVR,           R24      # SR,          '       gj   SR	,           Uu. uF-  qfR
,          '       g   K  VR,          '       d   K$  VR,          NK/  	  ppT! RV'       d   RRP                  V4       24      # R4      # SR,          '       g
   V! RR4      # SR,          R8X  d7   Vf   V! RVR,           R24      # RRRSR,          RVR,          RVR,          /# SP                  R4      '       d   V! RSR,          4      # V! RR4      #  EL8u upi 5i)c                  ó   <€ \        S4      ;_uu_ 4       p \        S4      p\        S4      p\        W.4      ^ ,          pRpVR,          R8X  d   \	        SWRJV4      pWV3uuRRR4       #   + '       g   i     R# ; i)ry   NrÔ   r�  )r'   rœ   r±  rù   rÜ  )ró   rq   r¾  rï   rÅ  r]   rð  s        €€rc   ru  Ú%test_messaging_platform.<locals>._runŸ  su   ø€ Ü˜G×$Ô$¨
Ü% kÓ2ˆEÜ1°+Ó>ˆIÜ(¨°WÓ=¸aÕ@ˆGØˆGØ�wÕ ;Ô.ô 6°kÀ5Ð\`ÐJ`ÐbkÓl�Ø 7Ð*÷ %×$×$Ó$ús   •AA,Á,A=	Nc                ó^   € V ^8„  d   QhR\         R\        R\        \        \        3,          /# )r\   r  rÇ  r^   )r‰   r_   r`   r   )rb   s   "rc   rd   Ú-test_messaging_platform.<locals>.__annotate__®  s.   € ÷ Iñ I”4ð I¤#ð I¬$¬s´C¨x­.ñ Ire   c                 ó"   <€ R V RSR,          RV/# )r  rÔ   rÇ  r’   )r  rÇ  rï   s   &&€rc   rq  Ú'test_messaging_platform.<locals>.result®  s   ø€ Ø�b˜' 7¨7Õ#3°YÀÐHÐHre   r©   FrÝ   z2 is disabled. Enable it, then restart the gateway.r¸   rÐ   r·   rÑ   rv   zMissing required setup: z, zPlatform setup is incomplete.rß   zEGateway is not running. Restart the gateway to connect this platform.rÔ   r�  Tz is connected.r  rÇ  Úauth_posturerÅ  rÛ   z]Setup looks complete, but the gateway has not reported a connection yet. Restart the gateway.)r  r  r  ro   )	r]   rð  ru  rq   rÅ  rq  rH  Úmissingrï   s	   ff      @rc   Útest_messaging_platformrç  �  sw  úé € ö+ô %,×$5Ò$5°dÓ$;×;Ñ€Eˆ7�G÷Ið Ið �9×ÔÙ�e  f¥˜Ð.`ÐaÓbÐbØ�<× Ô Ø-4°ZÖ-@ÓnÑ-@ EÈ*×DUÑDU”<Ð^cÐdl×^mÑ^m”<�5˜—<�<Ñ-@ˆÐnÙ�e×PWÐ7¸¿	¹	À'Ó8JÐ7KÐLÓ}Ð}Ð]|Ó}Ð}ØÐ$×%Ô%Ù�eÐdÓeÐeØˆwÕ˜;Ô&ð Š?Ù˜$ 5¨¥= /°Ð @ÓAÐAà�$Ø�W˜WÕ%Ø�w˜yÕ)Ø˜G IÕ.ð	
ð 	
ð ‡{�{�?×#Ò#Ù�e˜W _Õ5Ó6Ð6Ù�%ÐxÓyÐyò5 <ùò oùsF   …!E&¦E§E&Á!E&Á)E&Á4E!Â	E!ÂE!Â'9E&Ã!A#E&ÅE&Å!E&c                ó„   € V ^8„  d   Qh/ ^ \         9   d,   \        \        \        \        \        3,          3,          ;R&   # )r\   rˆ   )Ú__conditional_annotations__r`   r_   r   )rb   s   "rc   rd   rd      s6   € ÷ ñ ÷D!ò !œ$œs¤D¬¬c¨¥NÐ2Õ3ñ !òEre   )FN>   r’  r§  r¨  r�  r¤   )™ré  Ú__doc__r  rŠ  rA  Úloggingr¯   r  rÎ  rh  rç  rÄ  Úurllib.parserX  r   r   r   Úpathlibr   Útypingr   r   Úfastapir	   r
   rÜ  r   r   Úhermes_cli._subprocess_compatr   Úhermes_cli.configr   r   ra  r   Úhermes_cli.web_depsr   r   Úhermes_cli.web_server_gatewayr   Úhermes_cli.web_whatsapp_sessionr   Úhermes_cli.web_server_messagingr   r   r   r   r   r   r   r   Úhermes_cli.web_routers._commonr   r   r   r    Úhermes_cli.web_modelsr!   r"   r#   r$   r%   Ú	getLoggerrÿ   Úrouterr&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   rˆ   rs   r   ÚcompilerŠ   r�   r˜   rœ   r¿   rñ   rù   Úcontextmanagerr  ré  r¯  r  ÚRLockr”  r	  r  r  r+  rG  rr  r‚  rŽ  r—  r£  r«  r²  r°  rÀ  rË  rÒ  rá  rí  Úpostr   r  ro   r  r  r  Údeleter   r4  rO  r(  r+  r.  r1  r5  r;  r@  rP  r\  rk  rn  rw  r…  Úputr›  r™  r¨  r±  r·  r¼  rÜ  rç  rd   )rv   rX   rY   r´  ré  s   0000@rc   Ú<module>r      sÝ  øð÷ó Û Û Û Û 	Û 	Û Û Û Û Û ß ,Ñ ,Ý ß  ç ,ç KÝ <ß =Ý 4ß /Ý @Ý D÷÷ ó ÷ó ÷õ ð
 ×ÒÐ0Ó1€Ù	‹€ñ Ð4Ð6VÓWÐ ÙÐ&Ð(HÓI€ÙÐ2Ð4TÓUÐ Ù-1Ð2^ð  aBó  .CÐ *Ù$(Ð)LÐNoÓ$pÐ !ÙÐ6Ð8YÓZÐ ÙÐ8Ð:[Ó\Ð Ù�
Ð/Ó0€Ù�=Ð"5Ó6€ÙÐ0Ð2BÓCÐ ÙÐ*Ð,?Ó@Ð ÙÐ&Ð(;Ó<€ÙÐ0Ð2QÓRÐ ÙÐ4Ð6UÓVÐ ÙÐ6Ð8HÓIÐ Ù!%Ð&FÐHXÓ!YÐ ÙÐ6Ð8OÓPÐ ÙÐ 5Ó6Ð ð 
ÐVÐXkÐnsð  vhð  nið  	jØ	ÐSÐUeÐgiÐjØ	Ð!VÐXnÐprÐsØ	ÐBÐDUÐXbÐdhÐWiÐjØ	Ð0°/ÀJÐPTÐCUÐVØ	ÐLÐNbÐeoÐquÐdvÐwØ	!Ð#ZÐ\tÐvxÐyØ	ÐBÀOÐUWÐXØ	ÐCÐEUÐXbÐdhÐWiÐjØ	ÐDÀkÐSUÐVØ	ÐDÀkÐSUÐVØ	Ð3Ð5IÈEÐSsÐKtÐuØ	Ð1Ð3FÈÐUYÐHZÐ[Ø	Ð-¨~¸rÐBØ	Ð1°>ÀJÐPTÐCUÐVØ	! ?°OÀRÐHØ	%Ð'>Ð@SÐV`ÐbfÐUgÐhØ	"Ð$8Ð:JÈBÐOØ	Ð!DÀmÐUWÐXØ	*Ð,MÈÐakÐmqÐ`rÐsØ	ÐfÐh~ð  ACð  	DØ	Ð\Ð^oÐr|ð  Cð  rDð  	EØ	Ðkð  nBð  DFð  	GØ	Ð0°(¸BÐ?Ø	Ð8¸,ÈÐUYÐHZÐ[Ø	Ð:¸MÈJÐX\ÐK]Ð^Ø	$Ð&HÐJ^ÐakÐmqÐ`rÐsØ	Ð=¸{ÈBÐOØ	!Ð#HÈ/Ð\fÐhlÐ[mÐnñ;,ö!7ñ,Ñ'ˆ˜&ð ˆ-˜ h°Ð	@¸%Ð	@Ò@ñ,ô!7Ð ó !õH3õ&=ð —J’JÐ7Ó8Ð õõ\õõ -÷FSð Sõl"ð" ×ÑôEó ðEð  $'Ð  Û)WÐ &ØXÐ Ø%ŸOšOÓ-Ð õõVõõ]õQõ"xõJõD	!ð!Àð !ÐMs÷ !õ"õ0Aõ62õ@%õ .õ<õ"õ#õ(2ð" ‡�Ð7Ó8÷%<ó 9ð%<õPð ‡�Ð=Ó>ô@ó ?ð@ð ‡�ÐDÓE÷zó FðzõDNð  ‡�Ð@ÓAôó Bðð  YÐ Ø YÐ õ!õ<ð —z’z &Ó)Ð õNõ
õðzÀtð zÐZ^÷ zð ‡�Ð7Ó8ôó 9ðð, ‡�Ð=Ó>ô#fó ?ð#fðL ‡�ÐDÓE÷$ó Fð$ðN ‡�Ð@ÓAôó Bðð ‡�Ð&Ó'÷)ó (ð)õ"&ðR ‡‚Ð4Ó5÷@Oó 6ð@OõF	Aõ#õõ$õLõP4ðf ‡�Ñ:Ó;÷(zñ (zó <ò(zùõw"!7s   È$S
