+
    kHàj¾¿  ã                  ó2  € 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
Ht ^ RIHtHt ^ RIHt ^ RIHtHtHtHt ^ RIHt  ^ RIHt R	tR R lt]! 4       tR;t;t;t ;t!t"R;t#;t$t%R;t&;t't(R;t);t*;t+;t,;t-t.]/t0^ RI1H2t2H3t3 ^ RI4H5t5 ^ RI6H7t7H8t8H9t9H:t:H;t;H<t< ^ RI=H>t>H?t? ^ RI@HAtA ^ RIBHCtCHDtD ^ RIEHFtFHGtHHItJHKtLHMtM ]Pœ                  ! ]O4      tPRtQRtRRtSRtTRtU]V! RR04      tW]P°                  ! R4      tYRtZR R lt[RR
/R R  llt\R! R" lt]R# R$ lt^ ! R% R&4      t_R' R( lt`R) R* ltaR+ R, ltbR- R. ltcR/ R0 ltdR1RR2RR3R
/R4 R5 llteR6RjR7RkR8RlR9RmR:RnR;RoR<RpR=RqR>Rr/	tf]R? R@ l4       tgRA RB lthRCRDRERFRGRG/tiRH]DPÔ                  3RI]DPÖ                  3RJ]DPØ                  3RK]DPÚ                  33tnRLRMRNRORPRQRRRR/toRMRSRORTRQRURRRV/tpRW RX ltqRQR
/RY RZ lltr ! R[ R\]84      tsR]R^/ 3R_R`RaR	/3RbRc/ 33ttRstuRd Re ltvRf Rg ltwRh Ri ltxR#   ] d	    R
tRt ELÅi ; i)taþ  Microsoft Teams adapter: microsoft-teams-apps SDK for auth/activity processing, an aiohttp
webhook server for inbound, ``App.send()`` for proactive sends.

Requires the ``teams`` extra (auto-installed by the gateway on first start, or
``<hermes-venv>/bin/pip install microsoft-teams-apps aiohttp``) and credentials via env
(TEAMS_CLIENT_ID / TEAMS_CLIENT_SECRET / TEAMS_TENANT_ID, optional TEAMS_PORT) or
``platforms.teams.extra`` in config.yaml (``client_id`` / ``client_secret`` / ``tenant_id`` / ``port``).
)ÚannotationsN)Údeque)ÚcontextmanagerÚsuppress)ÚPath)ÚAnyÚDictÚIteratorÚOptional)Úurlparse©ÚwebTFc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚbool© )Úformats   "ÚD/home/ubuntu/.hermes/hermes-agent/plugins/platforms/teams/adapter.pyÚ__annotate__r   $   s   € ÷ 	5ñ 	5 Dñ 	5ó    c                 óÎ   €  \         P                  P                  p V ! R4      RJ;'       d    V ! R4      RJ#   \        \        \
        3 d    R\        P                  9   u # i ; i)u?  True when ``microsoft_teams.apps`` is on sys.path, without importing it: the SDK loads a cwd
``.env`` at import, so ``check_teams_requirements()`` binds symbols behind a dotenv no-op.
Sibling packages share the namespace, so probe the parent first â€” ``find_spec`` of the child
raises on 3.11+ if the parent is absent.Úmicrosoft_teamsNúmicrosoft_teams.apps)Ú	importlibÚutilÚ	find_specÚ
ValueErrorÚModuleNotFoundErrorÚImportErrorÚsysÚmodules)r   s    r   Ú_probe_teams_sdk_availabler#   $   sa   € ð
5Ü—N‘N×,Ñ,ˆ	ÙÐ*Ó+°4Ð7×iÐi¹IÐF\Ó<]ÐeiÐ<iÐiøÜÔ+¬[Ð9ô 5Ø%¬¯©Ñ4Ò4ð5ús   ‚*8 ­
8 ¸)A$Á#A$)ÚPlatformÚPlatformConfig)ÚMessageDeduplicator)Úgateway_trust_envÚBasePlatformAdapterÚExecApprovalPromptÚ
SendResultÚcache_image_from_urlÚcache_media_bytes_async)Úapproval_timeout_secondsÚformat_approval_deadline_line)Út)ÚMessageEventÚMessageType)Úcoerce_portÚextra_or_secretÚget_scoped_secretÚseed_extra_from_envÚ
send_erroriŠ  i   z/api/messagesz&https://smba.trafficmanager.net/teams/zsmba.trafficmanager.netz!smba.infra.gov.teams.microsoft.usz^[A-Za-z0-9:@\-_.]+$z%https://api.botframework.com/.defaultc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú	tenant_idÚstrÚ	client_idÚclient_secretr   ztuple[str, dict]r   )r   s   "r   r   r   X   s)   € ÷ ñ  ð °ð ÀSð ÐM]ñ r   c           	     ó*   € RV  R2RRRVRVR\         /3# )zF(token URL, client-credentials form) for a Bot Framework bearer token.z"https://login.microsoftonline.com/z/oauth2/v2.0/tokenÚ
grant_typeÚclient_credentialsr:   r;   Úscope)Ú_BF_TOKEN_SCOPE)r8   r:   r;   s   &&&r   Ú_bf_token_requestrA   X   s3   € ð -¨Y¨KÐ7IÐJØ	Ð+¨[¸)À_ÐVcÐelÔn}Ð~ðð r   Ú
check_portc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úurlr9   rB   r   r   r   )r   s   "r   r   r   `   s!   € ÷ ñ  ð °Dð ÀTñ r   c               ó¼   €  \        V 4      pVP                  R8w  g   V'       d   VP                  R9  d   R# VP                  \        9   #   \
         d     R# i ; i)zMhttps + host in ``_ALLOWED_TEAMS_SERVICE_HOSTS`` (+ default port when asked).ÚhttpsF)Ni»  )r   ÚschemeÚportÚhostnameÚ_ALLOWED_TEAMS_SERVICE_HOSTSÚ	Exception)rD   rB   Úparseds   &$ r   Ú_is_allowed_https_hostrM   `   sN   € ðÜ˜#“ˆØ�=‰=˜GÔ#¯
°v·{±{È+Ô7UÙØ�‰Ô">Ñ>Ð>øÜô Úðús   ‚#A ¦A ¹A ÁAÁAc               ó    € V ^8„  d   QhRRRR/# )r   rD   r9   r   r   r   )r   s   "r   r   r   k   s   € ÷ 8ñ 8¨ð 8°ñ 8r   c                ó   € \        V RR7      # )zWTrue if ``url`` is a Bot Framework connector attachment host (may carry the bot token).T)rB   )rM   )rD   s   &r   Ú_is_botframework_attachment_urlrP   k   s   € ä! #°$Ô7Ð7r   c               ó    € V ^8„  d   QhRRRR/# )r   Úrawr9   r   úOptional[str]r   )r   s   "r   r   r   p   s   € ÷ 3ñ 3 Sð 3¨]ñ 3r   c                ó|   € V '       d   \        V 4      '       g   R# V P                  R4      '       d   V # V R,           # )zMNormalized (trailing-slash) service URL, or ``None`` if not on the allowlist.NÚ/)rM   Úendswith)rR   s   &r   Ú_validate_teams_service_urlrW   p   s0   € çÔ,¨S×1Ò1ÙØ—,‘,˜s×#Ò#ˆ3Ð2¨¨s­Ð2r   c                  óV   € ] tR t^wt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# )Ú_AiohttpBridgeAdapterz¤HttpServerAdapter bridging SDK route registrations into our aiohttp app; without it
``App()`` unconditionally imports fastapi/uvicorn and allocates a ``FastAPI()``.c               ó   € V ^8„  d   QhRR/# )r   Úaiohttp_appzweb.Applicationr   )r   s   "r   r   Ú"_AiohttpBridgeAdapter.__annotate__{   s   € ÷ (ñ ( Oñ (r   c                	ó   € Wn         R # ©N©Ú_aiohttp_app)Úselfr[   s   &&r   Ú__init__Ú_AiohttpBridgeAdapter.__init__{   s   € Ø'Ör   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   ÚmethodÚ
HttpMethodÚpathr9   ÚhandlerÚHttpRouteHandlerr   ÚNoner   )r   s   "r   r   r\   ~   s0   € ÷ 	Kñ 	K Zð 	K°sð 	KÐEUð 	KÐZ^ñ 	Kr   c                	óf   a€ R  V3R llpV P                   P                  P                  WV4       R# )c               ó    € V ^8„  d   QhRRRR/# )r   Úrequestzweb.Requestr   zweb.Responser   )r   s   "r   r   Ú:_AiohttpBridgeAdapter.register_route.<locals>.__annotate__   s   € ÷ 	/ñ 	/¨Kð 	/¸Lñ 	/r   c              “  ór  <"  € S! \        V P                  4       G R j  x€L
 \        V P                  4      R7      4      G R j  x€L
 pVP	                  R^È4      pVP	                  R4      pVe.   \
        P                  ! V\        P                  ! V4      RR7      # \
        P                  ! VR7      #  L” Lq5i)N)ÚbodyÚheadersÚstatusrp   úapplication/json)rr   rp   Úcontent_type)rr   )ÚHttpRequestÚjsonÚdictrq   Úgetr   ÚResponseÚdumps)rm   Úresultrr   Ú	resp_bodyrh   s   &   €r   Ú_aiohttp_handlerÚ>_AiohttpBridgeAdapter.register_route.<locals>._aiohttp_handler   sŠ   øé € Ù)0´ÈÏÉË×BVÔ`dÐel×etÑetÓ`uÔ1vÓ)w×#wˆFØ—Z‘Z ¨#Ó.ˆFØŸ
™
 6Ó*ˆIØÒ$Ü—|’|¨6¼¿
º
À9Ó8MÐ\nÔoÐoÜ—<’< vÔ.Ð.ñ CWÑ#wùs"   ƒB7žB3Ÿ$B7ÁB5ÁA0B7Â5B7N)r`   ÚrouterÚ	add_route)ra   re   rg   rh   r}   s   &&&f r   Úregister_routeÚ$_AiohttpBridgeAdapter.register_route~   s,   ø€ ÷	/ð 	/ð 	×Ñ× Ñ ×*Ñ*¨6Ð9IÖJr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rg   r9   Ú	directoryr   rj   r   )r   s   "r   r   r\   ‰   s!   € ÷ ñ  ð °ð ¸ñ r   c                	ó   € R # r^   r   )ra   rg   r„   s   &&&r   Úserve_staticÚ"_AiohttpBridgeAdapter.serve_static‰   s   € Ùr   c               ó    € V ^8„  d   QhRRRR/# )r   rH   Úintr   rj   r   )r   s   "r   r   r\   Œ   s   € ÷ Nñ N ð N¨ñ Nr   c              ƒ  	ó    "  € \        R 4      h5i)z(aiohttp server is managed by the adapter)ÚNotImplementedError)ra   rH   s   &&r   ÚstartÚ_AiohttpBridgeAdapter.startŒ   s   é € Ü!Ð"LÓMÐMùs   ‚c               ó   € V ^8„  d   QhRR/# ©r   r   rj   r   )r   s   "r   r   r\   �   s   € ÷ ñ ˜Dñ r   c              ƒ  	ó   "  € R # 5ir^   r   ©ra   s   &r   ÚstopÚ_AiohttpBridgeAdapter.stop�   s   é € Ùùs   ‚r_   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rb   r�   r†   rŒ   r’   Ú__static_attributes__r   r   r   rY   rY   w   s(   † ñXõ(õ	KõõN÷ñ r   rY   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   “   s   € ÷ 5ñ 5˜Dñ 5r   c                 ó*   € \         ;'       d    \        # )zPPASSIVE probe (registry ``check_fn``): SDK + aiohttp importable? Never installs.)ÚTEAMS_SDK_AVAILABLEÚAIOHTTP_AVAILABLEr   r   r   Úcheck_requirementsrž   “   s   € ä×4Ð4Ô#4Ð4r   c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, str, str]r   )r   s   "r   r   r   ˜   s   € ÷ Mñ MÐ0ñ Mr   c                ó  € \        V R/ 4      ;'       g    / pVP                  R4      ;'       g    \        RR4      VP                  R4      ;'       g    \        RR4      VP                  R4      ;'       g    \        RR4      3# )	aª  (client_id, client_secret, tenant_id): ``config.extra`` first, then the profile-scoped env.

client_id/tenant_id are read through the same scoped reader as the secret: under multiplex,
``os.environ`` holds the DEFAULT profile's app identity, and pairing it with a secondary's
secret requests a Bot Framework token for the wrong app. ``extra`` wins so a per-profile
config.yaml identity is never overridden by the process env.
Úextrar:   ÚTEAMS_CLIENT_IDÚ r;   ÚTEAMS_CLIENT_SECRETr8   ÚTEAMS_TENANT_ID)Úgetattrrx   Ú_get_scoped_secret)Úconfigr¡   s   & r   Ú_credentialsr©   ˜   s~   € ô �F˜G RÓ(×.Ð.¨B€Eà�	‰	�+Ó×KÐKÔ"4Ð5FÈÓ"KØ�	‰	�/Ó"×SÐSÔ&8Ð9NÐPRÓ&SØ�	‰	�+Ó×KÐKÔ"4Ð5FÈÓ"KðMð Mr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   §   s   € ÷ +ñ +˜tñ +r   c                ó<   € \        \        \        V 4      4      4      # r^   )r   Úallr©   ©r¨   s   &r   Úvalidate_configr®   §   s   € Ü””L Ó(Ó)Ó*Ð*r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   «   s   € ÷ #ñ #˜Dñ #r   c                ó   € \        V 4      # r^   )r®   r­   s   &r   Úis_connectedr±   «   s   € Ü˜6Ó"Ð"r   c               ó   € V ^8„  d   QhRR/# )r   r   zdict | Noner   )r   s   "r   r   r   ¯   s   € ÷ ñ ˜ñ r   c                 ó¾   a € \        R	R
RRR\        3R3RR7      o \        ;QJ d    V 3R lR 4       F  '       d   K   RM	  RM! V 3R lR 4       4      '       g   R# S # )a’  ``env_enablement_fn``: seed ``PlatformConfig.extra`` from the profile's env before adapter construction
so ``gateway status`` reflects env-only setups without the SDK; ``None`` when not minimally configured.
Every identity/endpoint is per-profile (the app the secret belongs to, its regional service URL, the
cron home conversation), so a secondary is never seeded with the default profile's Teams app.NÚ
TEAMS_PORTrH   ÚTEAMS_HOME_CHANNEL)Úhome_envc              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir^   )rx   )Ú.0ÚkÚseeds   & €r   Ú	<genexpr>Ú"_env_enablement.<locals>.<genexpr>¸   s   øé € ÐPÑ$O˜qˆt�x‰x˜�{ˆ{Ó$Oùs   ƒ!FT)r¢   r:   N)r¤   r;   N)r¥   r8   N)ÚTEAMS_SERVICE_URLÚservice_urlN)r:   r;   r8   )Ú_seed_extra_from_envr‰   r¬   )rº   s   @r   Ú_env_enablementrÀ   ¯   s[   ø€ ô
  Ø.Ð0^Ø.°¸vÄsÐ0KÐMwð!ð %ô&€D÷ ‹3ÔPÑ$OÓP�3�3Š3ÔPÑ$OÓP×PÒPÙØ€Kr   Ú	thread_idÚmedia_filesÚforce_documentc               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   Úchat_idr9   ÚmessagerÁ   rS   rÂ   zOptional[list]rÃ   r   r   zdict[str, Any]r   )r   s   "r   r   r   ¾   sF   € ÷ 7@ñ 7@Øð7@Ø$'ð7@àð7@à2@ð7@àY]ð7@ð ñ7@r   c             ƒ  ó>  "  € \        V R/ 4      ;'       g    / p\        V 4      w  rxp	V'       d   V'       d	   V	'       g   \        R4      # VP                  R4      ;'       g    \	        RR4      ;'       g    \
        p
\        V
4      pVRJ R\        \        4       23V'       * R3\        P                  T;'       g    R4      '       * R	3\        P                  V	4      '       * R
3\        '       * R33 F  w  rÍV'       g   K  \        RV 24      u # 	  \        W—V4      w  rïV RV R2p ^ RIpVP                  RR7      pVP                  \!        4       R7      ;_uu_4       GRj  x€L
 pVP#                  WïRR/VR7      ;_uu_4       GRj  x€L
 pVP$                  R8¼  d_   VP'                  4       G Rj  x€L
 p\        RVP$                   RVR,           24      uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  # VP)                  4       G Rj  x€L
 pRRR4      GRj  x€L
  XP                  R4      pV'       g   \        R4      uuRRR4      GRj  x€L
  # VP#                  VRRRVRR/R R!V 2RR"/VR#7      ;_uu_4       GRj  x€L
 pVP$                  R8¼  d_   VP'                  4       G Rj  x€L
 p\        R$VP$                   RVR,           24      uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  # VP)                  4       G Rj  x€L
 pRRR4      GRj  x€L
  RRR4      GRj  x€L
  R%R&R'XP                  R(4      /#  ELè ELÄ ELž ELn EL_ ELI EL<  + GRj  x€L 
 '       g   i     ELT; i EL' Lõ LÎ L� L� Lv Lh  + GRj  x€L 
 '       g   i     L; i Lv  + GRj  x€L 
 '       g   i     L�; i  \*        P,                   d    h \.         d0   p\0        P3                  R)R&R*7       \        R+T 24      u Rp?# Rp?ii ; i5i),ud  Acquire a Bot Framework bearer token and POST a single message activity; used by
``send_message_tool._send_via_adapter`` when the gateway runner is not in this process
(``hermes cron``). ``TEAMS_SERVICE_URL`` is allowlisted and ``chat_id`` charset-checked
(SSRF/path traversal). ``media_files`` / ``force_document`` are signature parity only â€” text-only.r¡   zaTeams standalone send: TEAMS_CLIENT_ID, TEAMS_CLIENT_SECRET, and TEAMS_TENANT_ID are all requiredr¾   r½   r£   NzNTEAMS_SERVICE_URL host is not on the Bot Framework allowlist; expected one of z%chat_id (conversation ID) is requiredzIchat_id contains characters outside the Bot Framework conversation ID setz<TEAMS_TENANT_ID contains characters outside the expected setzaiohttp not installedzTeams standalone send: zv3/conversations/z/activitiesç      .@)Útotal)Ú	trust_envzContent-Typez!application/x-www-form-urlencoded)Údatarq   Útimeouti�  z-Teams standalone send: token request failed (z): :Ni,  NÚaccess_tokenz:Teams standalone send: token response missing access_tokenÚtyperÆ   ÚtextÚ
textFormatÚmarkdownÚAuthorizationúBearer rs   )rv   rq   rÌ   z-Teams standalone send: activity post failed (ÚsuccessTÚ
message_idÚidzTeams standalone send raised©Úexc_infozTeams standalone send failed: )r¦   r©   r6   rx   r§   Ú_DEFAULT_TEAMS_SERVICE_URLrW   ÚsortedrJ   Ú_TEAMS_CONV_ID_REÚmatchr�   rA   ÚaiohttpÚClientTimeoutÚClientSessionr'   Úpostrr   rÏ   rv   ÚasyncioÚCancelledErrorrK   ÚloggerÚdebug)ÚpconfigrÅ   rÆ   rÁ   rÂ   rÃ   r¡   r:   r;   r8   Úraw_service_urlr¾   ÚfailedÚerrorÚ	token_urlÚ
token_formÚactivities_urlÚ_aiohttpÚper_request_timeoutÚsessionÚ
token_resprp   Útoken_payloadrÍ   Ú	send_respÚsend_payloadÚes   &&&$$$                     r   Ú_standalone_sendrô   ¾   sì  é € ô �G˜W bÓ)×/Ð/¨R€EÜ*6°wÓ*?Ñ'€I˜ißŸ-¯IÜÐ}Ó~Ð~Ø—i‘i Ó.×{Ð{Ô2DÐEXÐZ\Ó2]×{Ð{Ôa{€OÜ-¨oÓ>€Kà	˜Ð	ð !1Ü17Ô8TÓ1UÐ0VðXð 	YàŒÐ=Ð>Ü×$Ñ$ W§] ]°Ó3Ô	3ð  6Að  	BÜ×$Ñ$ YÓ/Ô	/Ð1oÐpÜÔ	Ð 7Ð8ó:‰ˆ÷ ‰6ÜÐ 7¸°wÐ?Ó@Ò@ñ:ô .¨iÀMÓRÑ€IØ#�}Ð$5°g°Y¸kÐJ€Nð@Û"à&×4Ñ4¸4Ð4Ó@ÐØ×)Ñ)Ô4EÓ4GÐ)×H×HÔHÈGØ—|‘|Ø°^ÐEhÐ4iØ+ð $÷ ÷ ô ð Ø×$Ñ$¨Ô+Ø!+§¡Ó!2×2�DÜ%Ð(UÐV`×VgÑVgÐUhÐhkÐlpÐquÕlvÐkwÐ&xÓy÷÷ ñ ÷ I×HÒHð '1§o¡oÓ&7× 7�÷÷ ð )×,Ñ,¨^Ó<ˆLßÜ!Ð"^Ó_÷ I×HÒHð —|‘|Ø f¨i¸ÀÈ,ÐXbÐ%cØ(¨G°L°>Ð*BÀNÐTfÐgØ+ð $÷ ÷ ô ð Ø×#Ñ# sÔ*Ø!*§¡Ó!1×1�DÜ%Ð(UÐV_×VfÑVfÐUgÐgjÐkoÐptÕkuÐjvÐ&wÓx÷÷ ñ ÷ I×HÒHð( &/§^¡^Ó%5×5�÷÷ ÷ I×Hð* ˜4 ¨|×/?Ñ/?ÀÓ/EÐFÐFò+ Iòò
 3òò Iò !8÷÷ ÷ ô úò Iññ 2ññ Iñ(  6÷÷ ÷ ò ú÷ I×H×HÒHûô, ×!Ñ!ô ØÜô @Ü�‰Ð3¸dˆÔCÜÐ:¸1¸#Ð>Ó?Õ?ûð@üs4  ‚5P¸PÁ "PÁ#PÁ7APÂ>A PÄ(PÄ,<O Å(MÅ)O Å,#N/ÆMÆN/Æ%M%	Æ8MÆ9%M%	ÇN/Ç+M
Ç,N/Ç0O Ç=MÇ>O ÈPÈM%	ÈMÈM%	ÈN/È&M"È'N/É
N/ÉO ÉNÉO É PÉ!.N/ÊNÊN/Ê%N	Ê8NÊ9%N	ËN/Ë+N	
Ë,N/Ë0O Ë=NË>O ÌPÌN	ÌNÌN	ÌN/Ì&NÌ'N/Ì+O Ì6N-Ì7O ÍPÍO ÍN/ÍM%	ÍN/ÍO ÍM%	Í"N/Í%M?Í+M.Í,
M?Í7M?Í9	N/ÎO ÎN/ÎN	Î	N/ÎO ÎN	ÎN/ÎN*ÎNÎ
N*Î#N*Î%N/Î-O Î/O	Î5N8Î6
O	ÏO	ÏO ÏPÏ*PÏ+$PÐPÐPÐPÐPr   z"microsoft_teams.common.http.clientzmicrosoft_teams.apiz%microsoft_teams.api.activities.typingz3microsoft_teams.api.activities.invoke.adaptive_cardz(microsoft_teams.api.models.adaptive_cardz*microsoft_teams.api.models.invoke_responsez!microsoft_teams.apps.http.adapterzmicrosoft_teams.cardsc               ó   € V ^8„  d   QhRR/# )r   r   zIterator[None]r   )r   s   "r   r   r     s   € ÷ 'ñ ' nñ 'r   c               #  ó¨   "  €  ^ RI p \        V RR4      pVf   Rx € R# R V n         Rx € Wn        R#   \         d    Rp  L;i ; i  Yn        i ; i5i)zÕNo-op ``dotenv.load_dotenv`` while importing the Teams SDK: ``microsoft_teams.apps.app`` loads a
cwd-discovered ``.env`` at import, mutating process-global ``os.environ``. Hermes owns dotenv loading.

See #62935.
NÚload_dotenvc                 ó   € R # )Fr   )ÚargsÚkwargss   *,r   Ú<lambda>Ú._suppress_third_party_dotenv.<locals>.<lambda>  s   € ±%r   )Údotenvr    r¦   r÷   )Ú_dotenvÚoriginals     r   Ú_suppress_third_party_dotenvr   
  s]   é € ðÛ ô �w ¨tÓ4€HØÒÛÙÙ7€GÔð'Ûà&Öøô ô ØŠðûð 'Õüs;   ‚A„4 ˆA¨A ¬A´AÁAÁAÁAÁAÁAc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r      s   € ÷ 8ñ 8 $ñ 8r   c                 ój   € \         e   \        '       d   R# R R lp ^ RIHp V! RV \	        4       4      # )uÓ  Ensure the Teams SDK is importable, lazy-installing it on first use.

Lazy-installs ``microsoft-teams-apps`` via
``pm.ensure_import("teams")`` if not present, then rebinds
all module-level SDK globals on success. Returns True once the SDK (and
aiohttp) are importable, False if they couldn't be installed/imported.

``App is not None`` means symbols are already bound â€” ``TEAMS_SDK_AVAILABLE``
alone can be True from ``find_spec`` without an import having run yet.
Tc               ó   € V ^8„  d   QhRR/# )r   r   rw   r   )r   s   "r   r   Ú.check_teams_requirements.<locals>.__annotate__.  s   € ÷ ñ �Tñ r   c                 óf  € ^ RI Hp  RV RR/p\        4       ;_uu_ 4        \        P	                  4        F2  w  r#\
        P                  ! V4      pV F  p \        WE4      W&   K  	  K4  	  RRR4       RVR&   V#   \         d   p\        RT: RT: 24      ThRp?ii ; i  + '       g   i     L>; i)	é    r   r   r�   Tzcannot import name z from Nrœ   )
rÝ   r   r   Ú_SDK_IMPORTSÚitemsr   Úimport_moduler¦   ÚAttributeErrorr    )Ú_webÚbindingsÚmodule_nameÚnamesÚmoduleÚnameÚexcs          r   Ú_importÚ)check_teams_requirements.<locals>._import.  s¯   € Ý'Ø Ð':¸DÐAˆÜ)×+Õ+Ü&2×&8Ñ&8Ö&:Ñ"�Ü"×0Ò0°Ó=�Û!�DðhÜ)0°Ó)>˜›ó "ñ ';÷ ,ð +/ˆÐ&Ñ'Øˆøô *ô hÜ)Ð,?À¹xÀvÈkÉ_Ð*]Ó^ÐdgÐgûðhú÷ ,×+ús/   Ÿ5B ÁA9Á"B Á9BÂBÂBÂB Â B0	)Úensure_and_bindÚteams)ÚAppr�   Ú	pm.extrasr  Úglobals)r  r  s     r   Úcheck_teams_requirementsr     s-   € ô ‚×,Ó,Ùõõ *á˜7 G¬W«YÓ7Ð7r   ÚpersonalÚdmÚ	groupChatÚgroupÚchannelÚdocumentÚimageÚvideoÚaudioÚapprove_onceÚonceÚapprove_sessionrî   Úapprove_alwaysÚalwaysÚdenyz%platform.teams.approval.resolved_oncez(platform.teams.approval.resolved_sessionz'platform.teams.approval.resolved_alwaysz%platform.teams.approval.resolved_denyc               ó$   € V ^8„  d   QhRRRRRR/# )r   rÏ   r9   Úlimitr‰   r   r   )r   s   "r   r   r   O  s!   € ÷ ?ñ ?�Cð ? ð ?¨ñ ?r   c                ó>   € \        V 4      V8”  d   V R V R,           # T # )Nz...)Úlen)rÏ   r*  s   &&r   Ú	_truncater-  O  s#   € Ü#& t£9¨uÔ#4ˆ4��ˆ<˜%ÕÐ>¸$Ð>r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úcmdr9   Údescr'  r   r   Úlistr   )r   s   "r   r   r   S  s(   € ÷ ñ ˜ð  3ð °4ð ÀDñ r   c               ó2  € . pV '       g	   V'       dJ   VP                  \        R\        R4       2RRR7      4       VP                  \        RV  R2RR7      4       V'       g	   V'       d,   VP                  \        \        R	4       R
V 2RRR7      4       V# )znAdaptive Card body blocks for an approval prompt; unless ``always``, empty ``cmd``/``desc`` omit their blocks.u   âš ï¸� zgateway.exec_approval.headerTÚBolder©rÏ   ÚwrapÚweightz```
z
```©rÏ   r5  z"gateway.exec_approval.reason_labelz: )rÏ   r5  ÚisSubtle)ÚappendÚ	TextBlockr/   )r/  r0  r'  rp   s   &&$ r   Ú_approval_bodyr;  S  s‚   € à€Dß
�fØ�‰”I W¬QÐ/MÓ-NÐ,OÐ#PÐW[ÐdlÔmÔnØ�‰”I U¨3¨%¨uÐ#5¸DÔAÔBß�vØ�‰”I¤aÐ(LÓ&MÐ%NÈbÐQUÐPVÐ#WÐ^bÐmqÔrÔsØ€Kr   c                  óø  a € ] tR tRt$ RtRtR]R&   RtRtR V 3R llt	]
R	 R
 l4       tRR/R R lltR R ltR R ltRJR R lltR R l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4       t]
R# R$ l4       tR% R& lt]
R' R( l4       tR)tR*R+R,R-R.R/R0R0/tR1R2R3R4/tR5 R6 ltRKR7 R8 lltRLR9 R: lltRMR; R< llt RNR= R> llt!RKR? R@ llt"RNRA RB llt#RNRC RD llt$RORE RF llt%RG RH lt&RIt'V ;t(# )PÚTeamsAdapteri^  z;Microsoft Teams adapter using the microsoft-teams-apps SDK.Tr   Úserves_profile_prefixé`m  c               ó   € V ^8„  d   QhRR/# )r   r¨   r%   r   )r   s   "r   r   ÚTeamsAdapter.__annotate__f  s   € ÷ 2ñ 2˜~ñ 2r   c                	ó®  <€ \         SV `  V\        R 4      4       VP                  ;'       g    / V n        \        V4      w  V n        V n        V n        RV n	        RV n
        \        V P                  P                  R4      ;'       g    \        R\        \        4      4      \        4      V n        V P                  P                  R4      ;'       g    \        RR4      ;'       g    \"        pV'       d   \        V4      MRV n        RV n        RV n        \+        RR7      V n        / V n        V P1                  V4      V n        \5        R	R
7      V n        R# )r  NrH   r´   ÚhostÚ
TEAMS_HOSTr£   iè  )Úmax_sizeiô  )Úmaxlen)Úsuperrb   r$   r¡   Ú_extrar©   Ú
_client_idÚ_client_secretÚ
_tenant_idÚ_bf_token_cacheÚ_bf_token_lockr2   rx   r§   r9   Ú_DEFAULT_PORTÚ_portÚ_DEFAULT_HOSTÚ_hostÚ_appÚ_runnerr&   Ú_dedupÚ
_conv_refsÚ_parse_require_mentionÚ_require_mentionr   Ú	_sent_ids)ra   r¨   Ú	_raw_hostÚ	__class__s   && €r   rb   ÚTeamsAdapter.__init__f  s  ø€ Ü‰Ñ˜¤¨'Ó!2Ô3à&,§l¡l×&8Ð&8°bˆŒÜ@LÈVÓ@TÑ=ˆŒ˜Ô,¨d¬oð 15ˆÔØ6:ˆÔÜ  §¡§¡°Ó!8×!pÐ!pÔ<NÈ|Ô]`ÔanÓ]oÓ<pÔró  AˆŒ
Ø—K‘K—O‘O FÓ+×dÐdÔ/AÀ,ÐPRÓ/S×dÐdÔWdˆ	ß6?¤C¨	¤NÀTˆŒ
Ø#'ˆŒ	Ø04ˆŒÜ)°4Ô8ˆŒà*,ˆŒØ&*×&AÑ&AÀ&Ó&IˆÔä %¨SÔ 1ˆŽr   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   rA  |  s   € ÷ Rñ R¨$ñ Rr   c                ó¶   € \        V P                  RRR4      p\        V\        4      '       d   V# \	        V4      P                  4       P                  4       R9  # )ua  TEAMS_REQUIRE_MENTION (scoped) â†’ ``require_mention`` in config.extra â†’ false (opt-in, same
default as TELEGRAM_REQUIRE_MENTION). Without RSC Teams only delivers mention activities to a
group bot anyway, so the gate changes nothing until the app gains ChannelMessage.Read.Group /
ChatMessage.Read.Chat and starts receiving every conversation message.Úrequire_mentionÚTEAMS_REQUIRE_MENTIONF>   Ú0ÚnoÚoffÚfalse)Ú_extra_or_secretr¡   Ú
isinstancer   r9   ÚstripÚlower)r¨   Ú
configureds   & r   rV  Ú#TeamsAdapter._parse_require_mention{  sP   € ô & f§l¡lÐ4EÐG^Ð`eÓfˆ
Ü�j¤$×'Ò'ØÐÜ�:‹×$Ñ$Ó&×,Ñ,Ó.Ð6QÑQÐQr   Úis_reconnectFc               ó    € V ^8„  d   QhRRRR/# )r   rj  r   r   r   )r   s   "r   r   rA  †  s   € ÷ 4ñ 4¨Tð 4¸dñ 4r   c          
   ƒ  	óN  a "  € \        4        \        P                   R 2p\        RJ ;'       g	    \        RJ RRV R23\
        '       * RRV R23S P                  '       * ;'       g+    S P                  '       * ;'       g    S P                  '       * RR33 F$  w  r4pV'       g   K  S P                  WER	R
7        R	# 	   \        P                  ! \        R7      pVP                  P                  RR 4       \        S P                  S P                  S P                  \        V4      \	        RR/R7      R7      S n        S P                   P"                  R V 3R ll4       pS P                   P$                  R V 3R ll4       pS P'                  S P                   4       S P                   P)                  4       G Rj  x€L
  ^ RIHp	 V	! S VS P.                  S P0                  \2        4      G Rj  x€L
 S n        RS n        S P9                  4        S P4                  e;   \:        P=                  RS P.                  ;'       g    RS P0                  \2        4       R#  Lœ Ll  \>         d;   p
S P                  RRT
 2RR
7       \:        PA                  RT
RR7        Rp
?
R	# Rp
?
ii ; i5i)z -m pip installNÚMISSING_SDKz2microsoft-teams-apps could not be installed. Run: z microsoft-teams-appszaiohttp not installed. Run: z aiohttpÚMISSING_CREDENTIALSzJTEAMS_CLIENT_ID, TEAMS_CLIENT_SECRET, and TEAMS_TENANT_ID are all requiredF)Ú	retryable)Úclient_max_sizez/healthc                ó0   € \         P                  ! R R7      # )Úok©rÏ   )r   ry   )Ú_s   &r   rû   Ú&TeamsAdapter.connect.<locals>.<lambda>š  s   € ¼C¿LºLÈdÕ<Sr   ú
User-AgentÚHermes©rq   )r:   r;   r8   Úhttp_server_adapterÚclientc               ó   € V ^8„  d   QhRR/# )r   Úctxú ActivityContext[MessageActivity]r   )r   s   "r   r   Ú*TeamsAdapter.connect.<locals>.__annotate__¢  s   € ÷ ,ñ ,Ð+Kñ ,r   c              “  óF   <"  € SP                  V 4      G R j  x€L
  R #  L5ir^   )Ú_on_message©r|  ra   s   &€r   Ú_handle_messageÚ-TeamsAdapter.connect.<locals>._handle_message¡  s   øé € à×&Ñ& sÓ+×+Ô+ùs   ƒ!˜™!c               ó    € V ^8„  d   QhRRRR/# ©r   r|  z+ActivityContext[AdaptiveCardInvokeActivity]r   ú1InvokeResponse[AdaptiveCardActionMessageResponse]r   )r   s   "r   r   r~  ¦  s   € ÷ 7ñ 7Ø@ð7àBñ7r   c              “  óB   <"  € SP                  V 4      G R j  x€L
 #  L5ir^   )Ú_on_card_actionr�  s   &€r   Ú_handle_card_actionÚ1TeamsAdapter.connect.<locals>._handle_card_action¥  s   øé € ð "×1Ñ1°#Ó6×6Ð6Ñ6ùs   ƒ˜™)Úbind_listenerTz+[teams] Webhook server listening on %s:%d%sz* (all interfaces, IPv4+IPv6)ÚCONNECT_FAILEDzTeams connection failed: z[teams] Failed to connect: %sr×   )!r  r!   Ú
executabler  ÚClientOptionsr�   rI  rJ  rK  Ú_set_fatal_errorr   ÚApplicationÚ_MAX_BODY_BYTESr   Úadd_getrY   rR  Ú
on_messageÚon_card_actionÚ_wire_plugin_handlersÚ
initializeÚ gateway.platforms.shared_ingressr‹  rQ  rO  Ú_WEBHOOK_PATHrS  Ú_runningÚ_mark_connectedrã   ÚinforK   rè   )ra   rj  Úpiprç   ÚcoderÆ   r[   r‚  r‰  r‹  ró   s   f$         r   ÚconnectÚTeamsAdapter.connect†  sQ  øé € ä Ô"Ü—‘Ð  Ð0ˆä�Dˆ[×1Ð1œM¨TÐ1°=ØAÀ#ÀÐF[Ð\ð^ä"Ô" MÐ5QÐRUÐQVÐV^Ð3_Ð`Ø—‘Ô ×RÐR¨×(;Ñ(;Ô$;×RÐRÀ4Ç?Á?Ô?RÐTiØYð[ó	&\Ñ!ˆF˜'÷ ‰vØ×%Ñ% d¸uÐ%ÔEÚñ&\ð'	ô Ÿ/š/¼/ÔJˆKØ×Ñ×&Ñ& yÑ2SÔTÜØŸ/™/¸×9LÑ9LÐX\×XgÑXgÜ$9¸+Ó$FÜ$¨l¸HÐ-EÔFôHˆDŒIð �Y‰Y×!Ñ!÷,ó "ð,ð �Y‰Y×%Ñ%÷7ó &ð7ð
 ×&Ñ& t§y¡yÔ1Ø—)‘)×&Ñ&Ó(×(Ð(åFÙ!.¨t°[À$Ç*Á*ÈdÏjÉjÔZgÓ!h×hˆDŒLØ ˆDŒMØ× Ñ Ô"Ø�|‰|Ò'Ü—‘ØAØ—J‘J×AÐAÐ"AÀ4Ç:Á:Ì}ô^ñ ñ )ñ iøô ô 	Ø×!Ñ!Ð"2Ð6OÐPQÈsÐ4SÐ_cÐ!ÔdÜ�L‰LÐ8¸!ÀdˆLÔKÝûð	üsn   ƒA$J%Á(J%Â!J%Â'J%Ã C<I Æ<IÆ=1I Ç.IÇ/AI É I ÉJ%ÉI ÉI ÉJ"É(/JÊJ%ÊJ"Ê"J%c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   rA  ¼  s   € ÷ ,ñ , $ñ ,r   c              ƒ  	óî   "  € R V n         V P                  '       d#   V P                  P                  4       G Rj  x€L
  R;V n        V n        V P	                  4        \
        P                  R4       R#  L95i)FNz[teams] Disconnected)r™  rS  ÚcleanuprR  Ú_mark_disconnectedrã   r›  r‘   s   &r   Ú
disconnectÚTeamsAdapter.disconnect¼  sW   é € ØˆŒØ�<�<ˆ<Ø—,‘,×&Ñ&Ó(×(Ð(Ø#'Ð'ˆŒ�t”yØ×ÑÔ!Ü�‰Ð*Ö+ñ )ùs   ‚7A5¹A3º:A5c               ó   € V ^8„  d   QhRR/# ©r   r   r9   r   )r   s   "r   r   rA  Ä  s   € ÷ +ñ +¨sñ +r   c           
   ƒ  ój  "  € ^ RI p^ RIpV P                  f   \        P                  ! 4       V n        V P                  ;_uu_4       GRj  x€L
  V P
                  pV'       d?   V^,          VP                  4       R,           8”  d   V^ ,          uuRRR4      GRj  x€L
  # V P                  '       d%   V P                  '       d   V P                  '       g   \        R4      h\        V P                  V P                  V P                  4      w  rEVP                  RR7      ;_uu_4       GRj  x€L
 pVP                  WER7      G Rj  x€L
 pVP                  4        VP                  4       pRRR4      GRj  x€L
  \!        XP#                  RR4      ;'       g    R4      p	VR	,          VP                  4       V	,           3V n        V P
                  ^ ,          uuRRR4      GRj  x€L
  #  EL¡ ELS LÃ L« L}  + GRj  x€L 
 '       g   i     L”; i L-  + GRj  x€L 
 '       g   i     R# ; i5i)
zÿBot Framework bearer token (client credentials), cached until ~5 min before expiry; connector
attachments are NOT pre-authenticated, unlike SharePoint downloadUrls. The lock is created lazily
because ``asyncio.Lock()`` in __init__ may bind the wrong loop.Ni,  z<Missing TEAMS_CLIENT_ID/SECRET/TENANT_ID for attachment authrÈ   )rÌ   )rË   Ú
expires_ini  rÍ   )ÚtimeÚhttpxrM  rá   ÚLockrL  Ú	monotonicrI  rJ  rK  r   rA   ÚAsyncClientrà   Úraise_for_statusrv   Úfloatrx   )
ra   rª  r«  Úcachedré   rê   rz  ÚrespÚpayloadr©  s
   &         r   Ú_get_botframework_tokenÚ$TeamsAdapter._get_botframework_tokenÄ  s�  é € ó 	ÛØ×ÑÒ&Ü")§,¢,£.ˆDÔØ×&×&×&Ó&Ø×)Ñ)ˆFß˜& �) d§n¡nÓ&6¸Õ&<Ô<Ø˜a•y÷ '×&Ò&ð —O—O�O¨×(;×(;Ð(;ÀÇÇÀÜ Ð!_Ó`Ð`Ü$5°d·o±oÀtÇÁÐX\×XkÑXkÓ$lÑ!ˆIØ×(Ñ(°Ð(×6×6Ô6¸&Ø#Ÿ[™[¨˜[ÓD×D�Ø×%Ñ%Ô'ØŸ)™)›+�÷ 7×6ô ˜wŸ{™{¨<¸Ó>×FÐFÀ$ÓGˆJØ$+¨NÕ$;¸T¿^¹^Ó=MÐPZÕ=ZÐ#[ˆDÔ Ø×'Ñ'¨Õ*÷ '×&×&Ð&ñ 7ÙD÷ 7×6×6Ò6ú÷ '×&×&Ó&üsæ   ‚A	H3ÁG,ÁH3ÁA HÂH3ÂG/ÂH3Â"HÂ4HÃHÃAHÄ.G2Ä/HÄ2G8	ÅG4Å	$G8	Å-HÅ8G6Å9!HÆ>HÇH3Ç&HÇ'H3Ç/H3Ç2HÇ4G8	Ç6HÇ8HÇ>HÇ?
HÈ
HÈHÈH3ÈH0	ÈHÈ
H0	È(H0	È*	H3c               ó$   € V ^8„  d   QhRRRRRR/# )r   rD   r9   rÌ   r°  r   Úbytesr   )r   s   "r   r   rA  Û  s'   € ÷ \ñ \°ð \¸uð \ÐPUñ \r   c           
   ƒ  óâ  "  € ^ RI HpHp ^ RIHpHp V! V4      '       g   \        R4      hRR/p\        V4      '       d     RV P                  4       G Rj  x€L
  2VR&   V! VR
RV./R7      ;_uu_4       GRj  x€L
 p	V	P                  RWR7      ;_uu_4       GRj  x€L
 p
V
P                  4        V! V
RR7      G Rj  x€L
 uuRRR4      GRj  x€L
  uuRRR4      GRj  x€L
  #  L’  \         d!   p\        P                  R	T4        Rp?L±Rp?ii ; i Lž L| L\ LM L=  + GRj  x€L 
 '       g   i     M; iRRR4      GRj  x€L 
  R#   + GRj  x€L 
 '       g   i     R# ; i5i)z²Download attachment bytes with SSRF protection. Connector URLs get the bot's bearer token;
redirects and body size go through the shared guards (as the cache_*_from_url helpers).)Úcreate_ssrf_safe_async_clientÚis_safe_url)Ússrf_redirect_guardÚ_read_httpx_body_with_limitz/Blocked unsafe attachment URL (SSRF protection)rv  z)Mozilla/5.0 (compatible; HermesAgent/1.0)rÓ   NrÒ   z@[teams] Could not acquire Bot Framework token for attachment: %sTÚresponse)rÌ   Úfollow_redirectsÚevent_hooksÚGETrx  Ú
attachment)Ú
media_type)Útools.url_safetyr¹  rº  Úgateway.platforms.baser»  r¼  r   rP   r´  rK   rã   ÚwarningÚstreamr¯  )ra   rD   rÌ   r¹  rº  r»  r¼  rq   ró   rz  r½  s   &&&        r   Ú_fetch_attachment_bytesÚ$TeamsAdapter._fetch_attachment_bytesÛ  sO  é € ÷ 	Pß[Ù˜3×ÒÜÐNÓOÐOØÐ!LÐMˆÜ*¨3×/Ò/ðfØ-4¸4×;WÑ;WÓ;Y×5YÐ4ZÐ+[�˜Ñ(ñ 1Ø¨dÀÐNaÐMbÐ@c÷e÷ eõ eØhnØ—}‘} U¨C�}×A×AÔAÀXØ×)Ñ)Ô+á8¸ÈlÔ[×[÷ B×AÑA÷e÷ eò eñ 6ZøÜô fÜ—‘ÐaÐcd×eÑeûðfúñeáAñ \ñ BñeçA×A×AÐAú÷e÷ e÷ e÷ e÷ eô eüsû   ‚?E/ÁC+ ÁC)Á	C+ Á E/Á:DÁ;E/Á> EÂDÂEÂ"D#	Ã DÃD#	ÃEÃD
ÃEÃE/Ã#D!Ã$E/Ã)C+ Ã+DÃ6DÄE/ÄDÄE/ÄEÄD#	ÄEÄ!E/Ä#D<Ä)D,Ä*
D<Ä5D<Ä7EÄ?E/Å
EÅE/ÅE,	ÅEÅ
E,	Å$E,	Å&	E/c               ó    € V ^8„  d   QhRRRR/# )r   r|  r}  r   rj   r   )r   s   "r   r   rA  ï  s   € ÷ )`ñ )`Ð%Eð )`È$ñ )`r   c              ƒ  	ó  a"  € VP                   p\        \        VR R4      RR4      pV P                  '       d   V P                  P                  MRV3 Uu0 uF'  p\	        V\
        4      '       g   K  V'       g   K%  VkK)  	  ppT\        V4       Uu0 uF   qDP                  R4      '       d   K  RV 2kK"  	  up,          p\        VP                  RR4      V9   d   R# \        VRR4      pV'       d$   V P                  P                  V4      '       d   R# VP                  p\        VRR4      pV'       d   VP                  V P                  V&   \        VR4      '       d   VP                  '       d   VP                  MRp	V P                   '       d_   \        VRR4      R8w  dM   V P#                  W%V	4      '       g5   \        VRR4      V P$                  9  d   \&        P)                  R	W†4       R# R
V	9   d'   \*        P,                  ! RRV	4      P/                  4       p	VP                  p
\        V
RR4      ;'       g    \        V
RR4      pT P1                  VP                  \        VRR4      ;'       g    R\2        P5                  \        VRR4      ;'       g    RR4      \        V4      \        V
RR4      ;'       g    R\        VRR4      ;'       g    V P6                  VR7      p\        VRR4      ;'       g    .  Uu. uF  qÐP9                  V4      G Rj  x€L
 NK  	  up Uu. uF  qî'       g   K  VNK  	  ppV UUu. uF	  w   ppVNK  	  uppo\;        V3R l\<         4       \>        P@                  4      pT PC                  \E        YœTTV UUu. uF	  w  p pVNK  	  uppV UUu. uF	  w  pppVNK  	  uppR7      4      G Rj  x€L
  R# u upi u upi  LÂu upi u upi u uppi u uppi u uppi  L.5i)Ú	recipientNrÖ   z28:rÏ   r£   Úconversation_typer  Úreply_to_idzM[teams] Dropping non-personal message without a bot mention (chat=%s, msg=%s)ú<at>z<at>[^<]*</at>\s*Úaad_object_idr  r  r8   )rÅ   Ú	chat_nameÚ	chat_typeÚuser_idÚ	user_nameÚguild_idrÕ   Úattachmentsc              3  ó>   <"  € T F  w  rVS9   g   K  Vx € K  	  R # 5ir^   r   )r¸   Úkindr/   Úmedia_kindss   &  €r   r»   Ú+TeamsAdapter._on_message.<locals>.<genexpr>  s   øé € ÐXÑ*@™w˜tÀDÈKÑDWŸšÓ*@ùs   ƒ“
)rÏ   ÚsourceÚmessage_typerÕ   Ú
media_urlsÚmedia_types)#Úactivityr¦   rR  rÖ   re  r9   ÚtupleÚ
startswithÚfrom_rT  Úis_duplicateÚconversationÚconversation_refrU  ÚhasattrrÏ   rW  Ú_activity_mentions_botrX  rã   rä   ÚreÚsubrf  Úbuild_sourceÚ_CHAT_TYPESrx   rK  Ú_cache_attachmentÚnextÚ_MEDIA_KIND_PRECEDENCEr1   ÚTEXTÚhandle_messager0   )ra   r|  rÞ  Úrecipient_idÚiÚbot_idsÚmsg_idÚconvÚconv_idrÏ   Úfrom_accountrÒ  rÚ  ÚaÚmÚmediart  r×  Úmsg_typerg   ÚmtrØ  s   &&                   @r   r€  ÚTeamsAdapter._on_messageï  sv  øé € Ø—<‘<ˆô œw x°¸dÓCÀTÈ4ÓPˆØ/3¯y¯y¨y˜tŸy™yŸ|š|¸dÀLÑQÓnÑQ˜ÔU_Ð`aÔcf×Ug”1Ôlm—1�1ÑQˆÐnØ¤u¨W¤~ÓQ¡~ !¿\¹\È%×=P”I�c˜!˜“I¡~ÑQÕQˆÜ�8—>‘> 4¨Ó.°'Ô9ÙÜ˜ 4¨Ó.ˆß�d—k‘k×.Ñ.¨v×6Ò6ÙØ×$Ñ$ˆÜ˜$  dÓ+ˆßØ'*×';Ñ';ˆD�O‰O˜GÑ$Ü '¨°&× 9Ò 9¸h¿m¿m¸mˆx�}Š}ÐQSˆØ× × Ð ¤W¨TÐ3FÈÓ%MÐQ[Ô%[ð ×.Ñ.¨xÀ$×GÒGÌGÐT\Ð^kÐmqÓLrÐz~÷  {Iñ  {Iô  MIÜ—‘ÐlÐnuÔ~ÙØ�TŒ>Ü—6’6Ð.°°DÓ9×?Ñ?ÓAˆDØ—~‘~ˆÜ˜,¨¸Ó>×aÐaÄ'È,ÐX\Ð^`ÓBaˆØ×"Ñ"Ø—G‘GÜ˜d F¨DÓ1×7Ð7°RÜ!—o‘o¤g¨dÐ4GÈÓ&N×&TÐ&TÐRTÐVZÓ[Ü˜“LÜ˜l¨F°DÓ9×?Ð?¸RÜ˜T ;°Ó5×HÐH¸¿¹Øð #ó ˆô MTÐT\Ð^kÐmqÓLr×LxÐLxÐvxÐLxÓ"yÑLxÀq×)?Ñ)?ÀÓ)B×#BÒ#BÑLxÒ"yÓÑ"y˜QÓ}~—q�qÑ"yˆÐÙ.3Ô4©e¡
  1 d“t©eÒ4ˆÜÔXÕ*@ÓXÔZe×ZjÑZjÓkˆØ×!Ñ!¤,Ø°8ÈÙ/4Ô5©u¡  q¨!›©uÒ5ÑW\ÔC]ÑW\É8È1ÈbÐRSÃBÑW\ÒC]ô#_ó `÷ 	`ò 	`ùòE oùÚQñ< $CùÒ"yùÒùÛ4ùó 6ùÓC]ñ	`ùsÐ   ƒAP ÁOÁ3OÁ=OÂP ÂOÂ0	OÂ9AP ÄAP Å6P ÆB*P É7P É9$P Ê$P ËP Ë&P Ì P ÌO"ÌO 
ÌO"Ì&P Ì+	O'Ì9O'Ì?P ÍO,ÍAP ÎO2Î(P Î0O8Î?P ÏO>ÏP Ï O"Ï"P c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rÞ  r   rò  ÚsetrÏ   r9   r   r   r   )r   s   "r   r   rA    s.   € ÷ gñ g¨ð g°sð gÀ#ð gÈ$ñ gr   c                ó  a€ \        V RR4      ;'       g    .  Uu. uF  p\        VRR4      R8X  g   K  VNK  	  ppV'       g   RV9   # \        ;QJ d    V3R lV 4       F  '       g   K   R# 	  R# ! V3R lV 4       4      # u upi )	a  True when a ``mention`` entity points at the bot (``mentioned.id`` is ``28:<app id>`` on the
wire; ``bot_ids`` carries both spellings). A payload with no mention entities at all falls back
to the rendered ``<at>`` tag; one that mentions only other people does not.ÚentitiesNrÎ   ÚmentionrÎ  c           
   3  ól   <"  € T F)  p\        \        \        VR R4      RR4      4      S9   x € K+  	  R# 5i)Ú	mentionedNrÖ   r£   )r9   r¦   )r¸   ró   rò  s   & €r   r»   Ú6TeamsAdapter._activity_mentions_bot.<locals>.<genexpr>"  s0   øé € ÐfÑ]eÐXY”3”wœw q¨+°tÓ<¸dÀBÓGÓHÈGÖSÓ]eùs   ƒ14TF)r¦   Úany)rÞ  rò  rÏ   ró   Úmentionss   &f&  r   ræ  Ú#TeamsAdapter._activity_mentions_bot  sƒ   ø€ ô
  ' x°¸TÓB×HÐHÀbÐHÓrÑH˜!ÌGÐTUÐW]Ð_cÓLdÐhqÑLq—A�AÑHˆÐrßØ˜T‘>Ð!ß‹sÔfÑ]eÓf�sŒsÐfŠsÐfˆsÔfÑ]eÓfÓfÐfùò ss
   ›B´Bc               ó    € V ^8„  d   QhRRRR/# )r   Úattr   r   zOptional[tuple]r   )r   s   "r   r   rA  $  s   € ÷ 6ñ 6¨3ð 6°?ñ 6r   c              ƒ  ó¦  "  € \        VRR4      p\        VRR4      ;'       g    RP                  4       p\        VRR4      ;'       g    RpVR9   d	   V'       d   VP                  R4      '       d   R# VR8X  Ed=   \        VRR4      p\        V\        4      '       g   \        VR	R4      ;'       g    / pVP                  R
4      ;'       g    VP                  R4      pVP                  R4      ;'       g    VP                  R4      ;'       g    RP                  R4      pV'       g   R# T;'       g    V'       d   RV 2MRp V P                  V4      G Rj  x€L
 p	\        W˜RR7      G Rj  x€L
 p
V
'       g   \        P                  RV4       R# V
P                  V
P                  V
P                  3# V'       Ed   VP                  R4      '       dê    \        V4      '       d·   V P                  V4      G Rj  x€L
 p	VP!                  R4      R,          P!                  R4      ^ ,          ;'       g    Rp\        Y”;'       g    RV 2VR7      G Rj  x€L
 p
V
'       g#   \        P                  RT;'       g    T4       R# V
P                  V
P                  R3# \#        V4      G Rj  x€L
 pV'       d   WÓR3# R# V'       d]    V P                  V4      G Rj  x€L
 p	\        W”VR7      G Rj  x€L
 p
V
'       d$   V
P                  V
P                  V
P                  3# R# R#  ELÌ ELº  \         d"   p\        P                  RY‹4        Rp?R# Rp?ii ; i EL^ EL L³  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i L´ L¡  \         d-   p\        P                  RT;'       g    TY;4        Rp?R# Rp?ii ; i5i)uU   Download + cache one inbound attachment â†’ ``(path, media_type, kind)`` or ``None``.Úcontent_urlNrt   r£   r  zapplication/vnd.microsoft.cardz2application/vnd.microsoft.teams.file.download.infoÚcontentÚ__dict__ÚdownloadUrlÚdownload_urlÚfileTypeÚ	file_typeÚ.z	document.r  )ÚfilenameÚ	mime_typez?[teams] Unsupported document type for attachment '%s', skippingz0[teams] Failed to cache file attachment '%s': %szimage/rU   Ú;Úpngzimage.zZ[teams] Bot Framework attachment '%s' returned data that failed image validation, skippingr   z,[teams] Failed to cache image attachment: %sz0[teams] Failed to cache attachment '%s' (%s): %s)z	text/htmlz
text/plainéÿÿÿÿ)r¦   rg  rà  re  rw   rx   ÚlstriprÇ  r,   rã   rÅ  rg   rÂ  r×  rK   rP   Úsplitr+   )ra   r	  r  rt   Úatt_namer  r  r  r  rË   r±  ró   Úextrg   s   &&            r   rë  ÚTeamsAdapter._cache_attachment$  sX  é € ä˜c =°$Ó7ˆÜ  ^°TÓ:×@Ð@¸b×GÑGÓIˆÜ˜3 ¨Ó-×3Ð3°ˆð Ð7Ô7ÇÐP\×PgÑPgð  iI÷  QJò  QJÙØÐOÕOä˜c 9¨dÓ3ˆGÜ˜g¤t×,Ò,Ü! '¨:°tÓ<×BÐBÀ�Ø"Ÿ;™; }Ó5×TÐT¸¿¹À^Ó9TˆLØ Ÿ™ ZÓ0×RÐR°G·K±KÀÓ4L×RÐRÐPR×ZÑZÐ[^Ó_ˆIßÙØ×YÐY¿y i°	¨{Ñ$;ÈjˆHð`Ø!×9Ñ9¸,ÓG×G�Ü6°tÐZ\Ô]×]�ßÜ—N‘NÐ#dÐfnÔoÙØ—{‘{ F×$5Ñ$5°v·{±{ÐBÐB÷ ˆ;˜<×2Ñ2°8×<Ò<ðRÜ2°;×?Ò?à!%×!=Ñ!=¸kÓ!J×J�DØ&×,Ñ,¨SÓ1°"Õ5×;Ñ;¸CÓ@ÀÕC×LÐLÀu�CÜ#:¸4×JdÐJdÐX^Ð_bÐ^cÐVdÐp|Ô#}×}�Fß!ÜŸ™ØxØ$×3Ð3¨ô5ñ  $Ø!Ÿ;™;¨×(9Ñ(9¸7ÐBÐBÜ1°+Ó>×>�ß8<˜¨GÐ4ÐFÀ$ÐF÷ ð}Ø!×9Ñ9¸+ÓF×F�Ü6°tÐZfÔg×g�ßHN˜Ÿ™ V×%6Ñ%6¸¿¹ÐDÐXÐTXÐXñ òE HÚ]øô
 ô `Ü—‘ÐQÐS[×_Ð_Ùûð`úò Kâ}ñ ?øäô RÜ—‘ÐMÈq×QÐQÙûðRúñ
 GÙgøäô }Ü—‘ÐQÐS[×SjÐSjÐ_jÐlx×|Ð|Ùûð}üs«  ‚AOÁ	OÁOÁ2A OÂ3OÃ)OÃ8OÄOÄ+
OÄ6OÄ?OÅL- ÅL'ÅL- Å0L*Å1L- Å=L- ÆOÆ"L- Æ7	OÇOÇ%M$ Ç>MÇ?8M$ È8M$ É	M$ ÉMÉM$ É%M$ É>M$ ÊOÊM$ ÊOÊ M$ Ê.M"Ê/M$ Ê;M$ Ê>OÊ?M$ Ë OË
N ËNËN Ë3NË4N Ì "N Ì"OÌ#N Ì$OÌ'L- Ì*L- Ì-MÌ8MÍOÍMÍOÍM$ ÍM$ Í"M$ Í$NÍ/NÎOÎNÎOÎN ÎN ÎOÎ"!O	ÏOÏ	OÏOc               ó$   € V ^8„  d   QhRRRRRR/# )r   rÅ   r9   ÚcardÚAdaptiveCardr   r   r   )r   s   "r   r   rA  \  s&   € ÷ cñ c¨ð c°<ð cÀCñ cr   c              ƒ  óž   "  € ^ RI Hp V P                  '       g   R# V P                  W! 4       P	                  V4      V4      G Rj  x€L
 #  L5i)zJSend an AdaptiveCard, using a stored ConversationReference when available.)ÚMessageActivityInputN)Úmicrosoft_teams.apir!  rR  Ú_send_via_conv_refÚadd_card)ra   rÅ   r  r!  s   &&& r   Ú
_send_cardÚTeamsAdapter._send_card\  s@   é € å<Ø�y�yˆyÙØ×,Ñ,¨WÐ6JÓ6L×6UÑ6UÐVZÓ6[Ð]aÓb×bÐbÑbùs   ‚AAÁAÁAc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rÅ   r9   rÞ  r   Úfallbackr   r   )r   s   "r   r   rA  c  s)   € ÷ ñ °ð ¸sð Ècð ÐVYñ r   c              ƒ  ó   "  € V P                   P                  V4      pV'       d/   V P                  P                  P	                  W$4      G Rj  x€L
 pM#V P                  P	                  W4      G Rj  x€L
 pV P                  V4       V#  L; L5i)zXSend ``activity`` through the cached ConversationReference, else ``App.send(fallback)``.N)rU  rx   rR  Úactivity_senderÚsendÚ_remember_sent)ra   rÅ   rÞ  r(  Úconv_refr{   s   &&&&  r   r#  ÚTeamsAdapter._send_via_conv_refc  sj   é € à—?‘?×&Ñ& wÓ/ˆßØŸ9™9×4Ñ4×9Ñ9¸(ÓM×M‰FàŸ9™9Ÿ>™>¨'Ó<×<ˆFØ×Ñ˜FÔ#Øˆñ	 Ná<ùs$   ‚ABÁB
Á#BÁ2BÁ3BÂBc               ó    € V ^8„  d   QhRRRR/# )r   r{   r   r   rj   r   )r   s   "r   r   rA  m  s   € ÷ +ñ + Sð +¨Tñ +r   c                óš   € \        VRR4      p\        V\        4      '       d(   V'       d   V P                  P	                  V4       R# R# R# )zVTrack an outbound activity id (bounded deque) for the require_mention reply exemption.rÖ   N)r¦   re  r9   rX  r9  )ra   r{   Úsent_ids   && r   r,  ÚTeamsAdapter._remember_sentm  s9   € ä˜& $¨Ó-ˆÜ�gœs×#Ò#¯Ø�N‰N×!Ñ! 'Ö*ñ )0Ñ#r   c               ó    € V ^8„  d   QhRRRR/# )r   rÏ   r9   r   r†  r   )r   s   "r   r   rA  t  s   € ÷ ^ñ ^˜cð ^Ð&Wñ ^r   c                	ó0   € \        ^È\        V R7      R7      # )éÈ   ©Úvalue©rr   rp   )ÚInvokeResponseÚ!AdaptiveCardActionMessageResponsers  s   &r   Ú_invoke_messageÚTeamsAdapter._invoke_messages  s   € ä SÔ/PÐW[Ô/\Ô]Ð]r   c               ó    € V ^8„  d   QhRRRR/# )r   rp   r1  r   r†  r   )r   s   "r   r   rA  x  s   € ÷ [ñ [˜4ð [Ð$Uñ [r   c                	ó€   € \        4       P                  R 4      P                  V 4      p\        ^È\	        VR7      R7      # )ú1.4r6  r8  )r  Úwith_versionÚ	with_bodyr9  ÚAdaptiveCardActionCardResponse)rp   r  s   & r   Ú_invoke_cardÚTeamsAdapter._invoke_cardw  s3   € ä‹~×*Ñ*¨5Ó1×;Ñ;¸DÓAˆÜ SÔ/MÐTXÔ/YÔZÐZr   c               ó    € V ^8„  d   QhRRRR/# r…  r   )r   s   "r   r   rA  |  s   € ÷ 'ñ 'Ø>ð'à	:ñ'r   c              ƒ  	ó\  "  € ^ RI HpHp VP                  P                  P
                  P                  ;'       g    / pVP                  RR4      pVP                  RR4      pV'       d	   V'       g   V P                  \        R4      4      # V P                  VP                  P                  4      pV'       d   V P                  V4      # \        P                  V4      pV'       g   V P                  \        R4      4      # V! V4      '       g'   V P                  \        \        R4      RR7      .4      # V! Wh4       \        VP                  R	R4      VP                  R
R4      4      p	V	P!                  \        \        \"        V,          4      RRR7      4       V P                  V	4      # 5i)r  )Úresolve_gateway_approvalÚhas_blocking_approvalÚhermes_actionr£   Úsession_keyz&platform.teams.approval.unknown_actionz platform.shared.approval_expiredTr7  r/  r0  r3  r4  )Útools.approvalrG  rH  rÞ  r7  ÚactionrË   rx   r;  r/   Ú_card_action_deniedrá  Ú_APPROVAL_CHOICESrC  r:  r;  r9  Ú_APPROVAL_LABEL_KEYS)
ra   r|  rG  rH  rË   rI  rJ  ÚdeniedÚchoicerp   s
   &&        r   rˆ  ÚTeamsAdapter._on_card_action|  sK  é € ÷ 	Sà�|‰|×!Ñ!×(Ñ(×-Ñ-×3Ð3°ˆØŸ™ °"Ó5ˆØ—h‘h˜}¨bÓ1ˆß§KØ×'Ñ'¬Ð*RÓ(SÓTÐTØ×)Ñ)¨#¯,©,×*<Ñ*<Ó=ˆßØ×'Ñ'¨Ó/Ð/Ü"×&Ñ& }Ó5ˆßØ×'Ñ'¬Ð*RÓ(SÓTÐTÙ$ [×1Ò1Ø×$Ñ$¤i´QÐ7YÓ5ZÐaeÔ&fÐ%gÓhÐhÙ  Ô5Ü˜dŸh™h u¨bÓ1°4·8±8¸FÀBÓ3GÓHˆØ�‰”I¤1Ô%9¸&Õ%AÓ#BÈÐV^Ô_Ô`Ø× Ñ  Ó&Ð&ùs&   ‚A(F,Á+F,Á3AF,Â:-F,Ã('F,ÄBF,c               ó    € V ^8„  d   QhRRRR/# )r   rö  r   r   rS   r   )r   s   "r   r   rA  ”  s   € ÷ ñ ¨#ð °-ñ r   c                ó  € \        RR4      P                  4       P                  4       R9   d   R# \        RR4      P                  4       pV'       g!   \        P	                  R4       \        R4      # \        V RR4      ;'       g    \        V RR4      pVP                  R	4       Uu0 uF*  q3P                  4       '       g   K  VP                  4       kK,  	  ppR
V9  d(   W$9  d"   \        P	                  RV4       \        R4      # R# u upi )zæDefault-deny gate for approval clicks: require TEAMS_ALLOWED_USERS or an explicit
TEAMS_ALLOW_ALL_USERS=true opt-in, else anyone who can message the bot could approve.
Returns the user-facing denial text, or ``None`` when allowed.ÚTEAMS_ALLOW_ALL_USERSr£   NÚTEAMS_ALLOWED_USERSus   [teams] card action rejected: TEAMS_ALLOWED_USERS not configured and TEAMS_ALLOW_ALL_USERS not set â€” default denyz*platform.teams.approval.requires_allowlistrÏ  rÖ   Ú,Ú*u3   [teams] Unauthorized card action by %s â€” ignoringzplatform.shared.not_authorized>   Ú1ÚyesÚtrue)r§   rf  rg  rã   rÅ  r/   r¦   r  )rö  Úallowed_csvÚ
clicker_idÚuidÚallowed_idss   &    r   rM  Ú TeamsAdapter._card_action_denied“  sæ   € ô Ð5°rÓ:×@Ñ@ÓB×HÑHÓJÐNbÔbÙÜ(Ð)>ÀÓC×IÑIÓKˆßÜ�N‰NðEôFô ÐAÓBÐBÜ˜\¨?¸DÓA×dÐdÄWÈ\Ð[_ÐacÓEdˆ
Ø.9×.?Ñ.?ÀÔ.DÓTÑ.D sÏ	É	Ï”{�s—y‘y–{Ñ.DˆÐTØ�kÔ! jÔ&CÜ�N‰NÐPÐR\Ô]ÜÐ5Ó6Ð6Ùùò	 Us   Â'D	ÃD	iÐ  r$  r#  rî   r%  r'  r&  r(  ÚprimaryÚpositiveÚdangerÚdestructivec               ó    € V ^8„  d   QhRRRR/# )r   Úpromptr)   r   r*   r   )r   s   "r   r   rA  ¬  s   € ÷ Kñ KÐ7Ið KÈjñ Kr   c              ƒ  óz  "  € V P                   '       g   \        RRR7      # RVP                  R\        VP                  ^È4      RVP
                  /p. pVP                   F\  w  rEpV'       d   RV P                  V,          /M/ pVP                  \        RRVR	R
R/ VCRV P                  V,          /C/VB 4       K^  	  \        V P                  VP                  V P                  4      VP
                  RR7      pVP                  \        \        \!        4       4      RR7      4       VP"                  '       d5   VP                  \        V P$                  P'                  4       RR7      4       \)        4       P+                  R4      P-                  V4      P/                  V4      p	 V P1                  VP2                  V	4      G Rj  x€L
 p
\        RV
'       d   \5        V
RR4      R7      # RR7      #  L+  \6         d:   p\8        P;                  RTRR7       \        R\=        T4      RR7      u Rp?# Rp?ii ; i5i)zYAdaptive Card: the shared text is split into its header / fenced command / reason blocks.FúTeams app not initialized©rÔ   rè   rJ  r/  r0  ÚstyleÚtitleÚverbÚhermes_approverË   rI  T)r'  r7  r?  NrÖ   ©rÔ   rÕ   z%[teams] send_exec_approval failed: %sr×   ©rÔ   rè   ro  r   )rR  r*   rJ  r-  ÚcommandÚdescriptionÚactionsÚ_EA_CARD_STYLESr9  ÚExecuteActionÚ_EA_CARD_ACTIONSr;  Ú_truncate_previewÚ_EA_CMD_BUDGETr:  r.   r-   Úsmart_deniedÚ_EA_SMART_DENY_LINErf  r  r@  rA  Úwith_actionsr%  rÅ   r¦   rK   rã   rè   r9   )ra   rf  Úbtn_data_baserr  ÚlabelrQ  rj  Úkwrp   r  r{   ró   s   &&          r   Ú_send_exec_approval_promptÚ'TeamsAdapter._send_exec_approval_prompt¬  sè  é € à�y�yˆyÜ eÐ3NÔOÐOà&¨×(:Ñ(:¸EÄ9ÈVÏ^É^Ð]`ÓCaÐciÐkq×k}Ñk}Ð~ˆØˆØ$*§N¤NÑ ˆE˜5ß;@�'˜4×/Ñ/°Õ6Ñ7ÀbˆBØ�N‰Nœ=ñ ^Øð^Ø"2ð^àV˜ÐV ¸×8MÑ8MÈfÕ8UÑVð^àZ\ñ^ö _ñ %3ô
 ˜d×4Ñ4°V·^±^ÀT×EXÑEXÓYÐ[a×[mÑ[mÐvzÔ{ˆØ�‰”IÔ#@ÔAYÓA[Ó#\ÐcgÔhÔiØ××ÐØ�K‰Kœ	 t×'?Ñ'?×'EÑ'EÓ'GÈdÔSÔTÜ‹~×*Ñ*¨5Ó1×;Ñ;¸DÓA×NÑNÈwÓWˆð	KØŸ?™?¨6¯>©>¸4Ó@×@ˆFÜ d×V\´w¸vÀtÈTÓ7RÔgÐgÐbfÔgÐgñ Aøäô 	KÜ�L‰LÐ@À!ÈdˆLÔSÜ e´3°q³6ÀTÔJÕJûð	KüsT   ‚F$H;Æ'G4 ÇG2Ç#G4 Ç*H;Ç+G4 Ç1H;Ç2G4 Ç4H8Ç?.H3È-H8È.H;È3H8È8H;c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rÅ   r9   r  Úreply_torS   ÚmetadataúOptional[dict[str, Any]]r   r*   r   )r   s   "r   r   rA  Ä  s;   € ÷ Dñ DØðDØ%(ðDØ4AðDØTlðDà	ñDr   c              ƒ  	óÜ  "  € V P                   '       g   \        R RR7      # RpV P                  V P                  V4      4       F�  p V'       dD   VP	                  4       '       d.   VR8w  d'    V P                   P                  WV4      G Rj  x€L
 pM#V P                   P                  W4      G Rj  x€L
 p\        VRR4      pV P                  V4       K’  	  \        RVR	7      #  LW  \         dE   p\        P                  RT4       T P                   P                  Y4      G Rj  x€L 
 p Rp?L{Rp?ii ; i L‡  \         d$   p	\        R \        T	4      RR7      u Rp	?	u # Rp	?	ii ; i5i)
Frh  ri  Nr`  z3Teams reply() failed, falling back to flat send: %srÖ   Tro  rn  )rR  r*   Útruncate_messageÚformat_messageÚisdigitÚreplyrK   rã   rä   r+  r¦   r,  r9   )
ra   rÅ   r  r�  r‚  Úlast_message_idÚchunkr{   Ú	reply_errró   s
   &&&&&     r   r+  ÚTeamsAdapter.sendÄ  s,  é € ð �y�yˆyÜ eÐ3NÔOÐOØˆØ×*Ñ*¨4×+>Ñ+>¸wÓ+GÖHˆEðOß × 0Ñ 0× 2Ò 2°xÀ3´ðFØ'+§y¡y§¡°wÈ%Ó'P×!P™ð $(§9¡9§>¡>°'Ó#A×A�FÜ")¨&°$¸Ó"=�Ø×#Ñ# FÖ+ñ Iô  $°?ÔCÐCñ "QøÜ$ô FäŸ™Ð%ZÐ\eÔfØ'+§y¡y§~¡~°gÓ'E×!EÐ!E�ûðFúñ
 Bøô ô OÜ!¨%´s¸1³vÈÔN×NûðOüs�   ‚AE,ÁD;Á&D;Á.C'ÂC%ÂC'ÂD;Â1D9Â2"D;ÃE,Ã%C'Ã'D6Ã24D1Ä&D)Ä'D1Ä,D;Ä1D6Ä6D;Ä;E)ÅE$ÅE)ÅE,Å$E)Å)E,c               ó$   € V ^8„  d   QhRRRRRR/# )r   rÅ   r9   r‚  rƒ  r   rj   r   )r   s   "r   r   rA  Û  s(   € ÷ Eñ E¨ð EÐ8Pð EÐ\`ñ Er   c              ƒ  	óú   "  € V P                   '       dO   \        \        4      ;_uu_ 4        V P                   P                  V\	        4       4      G R j  x€L
  R R R 4       R # R #  L  + '       g   i     R # ; i5ir^   )rR  r   rK   r+  ÚTypingActivityInput)ra   rÅ   r‚  s   &&&r   Úsend_typingÚTeamsAdapter.send_typingÛ  sP   é € Ø�9�9ˆ9Üœ)×$Õ$Ø—i‘i—n‘n WÔ.AÓ.CÓD×DÐD÷ %Ñ$ñ áD÷ %×$Ð$üs.   ‚*A;¬(A'ÁA%ÁA'ÁA;Á%A'Á'A8	Á2	A;c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r   rÅ   r9   rÚ  Údefault_mimeÚcaptionrS   Úmedia_labelr   r*   r   )r   s   "r   r   rA  à  sD   € ÷ Kñ KØðKØ$'ðKØ7:ðKØERðKØhkðKà	ñKr   c              ƒ  óˆ  "  € V P                   '       g   \        RRR7      #  ^ RIp^ RIp^ RIHpHp	 VP                  R4      '       d<   Tp
VP                  VP                  R4      ^ ,          4      ^ ,          ;'       g    TpM‰VP                  R4      pVP                  V4      ^ ,          ;'       g    Tp\        P                  ! \        V4      P                  4      G Rj  x€L
 pRV R	VP                  V4      P!                  4        2p
V	! 4       P#                  V! WºR
7      4      pV'       d   VP%                  V4      pV P'                  WV4      G Rj  x€L
 p\        R\)        VRR4      R7      #  L‘ L  \*         d;   p\,        P/                  RTTRR7       \        R\1        T4      RR7      u Rp?# Rp?ii ; i5i)a  Send any media file/URL as a Teams attachment (shared by send_image/video/voice/document).
Remote ``http(s)://`` URLs are attached by reference; local paths (optional ``file://`` prefix)
are base64-encoded into a data URI. MIME is guessed from the path, else ``default_mime``.Frh  ri  N)Ú
Attachmentr!  Ú?zfile://zdata:z;base64,)rt   r  TrÖ   rn  z[teams] send_%s failed: %sr×   ro  )zhttp://zhttps://)rR  r*   Úbase64Ú	mimetypesr"  r—  r!  rà  Ú
guess_typer  Úremoveprefixrá   Ú	to_threadr   Ú
read_bytesÚ	b64encodeÚdecodeÚadd_attachmentsÚadd_textr#  r¦   rK   rã   rè   r9   )ra   rÅ   rÚ  r“  r”  r•  r™  rš  r—  r!  r  r  rg   rË   rÞ  r{   ró   s   &&&&&&           r   Ú_send_media_attachmentÚ#TeamsAdapter._send_media_attachmentà  s}  é € ð �y�yˆyÜ eÐ3NÔOÐOð	KÛÛßLà× Ñ Ð!8×9Ò9Ø$�Ø%×0Ñ0°·±¸cÓ1BÀ1Õ1EÓFÀqÕI×YÐYÈ\‘	à×*Ñ*¨9Ó5�Ø%×0Ñ0°Ó6°qÕ9×IÐI¸\�	Ü$×.Ò.¬t°D«z×/DÑ/DÓE×E�Ø % i [°¸×9IÑ9IÈ$Ó9O×9VÑ9VÓ9XÐ8YÐZ�Ù+Ó-×=Ñ=¹jÐV_Ô>yÓzˆHßØ#×,Ñ,¨WÓ5�Ø×2Ñ2°7ÀhÓO×OˆFÜ d´w¸vÀtÈTÓ7RÔSÐSñ Fñ
 Pøäô 	KÜ�L‰LÐ5°{ÀAÐPTˆLÔUÜ e´3°q³6ÀTÔJÕJûð	Küsf   ‚ G£AE: Â3E: Â5/E: Ã$E6Ã%A4E: ÅE8ÅE: Å5GÅ6E: Å8E: Å:F?Æ/F:Æ4F?Æ5GÆ:F?Æ?Gc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rÅ   r9   Ú	image_urlr”  rS   r�  r‚  rƒ  r   r*   r   )r   s   "r   r   rA  þ  sA   € ÷ xñ x¨ð x¸ð xÀmð xÐfsð xØ#;ðxØGQñxr   c              ƒ  	óH   "  € V P                  WR VRR7      G Rj  x€L
 #  L5i)z	image/pngr   ©r”  r•  N©r£  )ra   rÅ   r¦  r”  r�  r‚  s   &&&&&&r   Ú
send_imageÚTeamsAdapter.send_imageþ  s'   é € à×0Ñ0°À[ÐZaÐovÐ0Ów×wÐwÑwùó   ‚"› œ"c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rÅ   r9   Ú
image_pathr”  rS   r�  r   r*   r   )r   s   "r   r   rA    s8   € ÷ pñ p¨Sð p¸cð pÈMð pØ(5ðpØKUñpr   c              ‹  	óD   "  € V P                  WW4R 7      G Rj  x€L
 #  L5i))rÅ   r¦  r”  r�  N)rª  )ra   rÅ   r®  r”  r�  rú   s   &&&&&,r   Úsend_image_fileÚTeamsAdapter.send_image_file  s   é € à—_‘_¨WÐT[�_Óo×oÐoÑoùs   ‚ ™š c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rÅ   r9   Ú
video_pathr”  rS   r�  r‚  rƒ  r   r*   r   )r   s   "r   r   rA    sA   € ÷ yñ y¨ð y¸ð yÀ}ð yÐgtð yØ#;ðyØQ[ñyr   c              ‹  	óH   "  € V P                  WR VRR7      G Rj  x€L
 #  L5i)z	video/mp4r!  r¨  Nr©  )ra   rÅ   r³  r”  r�  r‚  rú   s   &&&&&&,r   Ú
send_videoÚTeamsAdapter.send_video  s'   é € à×0Ñ0°ÀkÐ[bÐpwÐ0Óx×xÐxÑxùr¬  c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r   rÅ   r9   Ú
audio_pathr”  rS   r�  r‚  rƒ  r   r*   r   )r   s   "r   r   rA  
  sA   € ÷ zñ z¨ð z¸ð zÀ}ð zÐgtð zØ#;ðzØQ[ñzr   c              ‹  	óH   "  € V P                  WR VRR7      G Rj  x€L
 #  L5i)z
audio/mpegÚvoicer¨  Nr©  )ra   rÅ   r¸  r”  r�  r‚  rú   s   &&&&&&,r   Ú
send_voiceÚTeamsAdapter.send_voice
  s'   é € à×0Ñ0°ÀlÐ\cÐqxÐ0Óy×yÐyÑyùr¬  c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r   rÅ   r9   Ú	file_pathr”  rS   Ú	file_namer�  r‚  rƒ  r   r*   r   )r   s   "r   r   rA    sJ   € ÷ eñ e¨3ð e¸3ð eÈð eÐjwð eØ&3ðeØF^ðeØt~ñer   c              ‹  	óH   "  € V P                  WR VRR7      G Rj  x€L
 #  L5i)zapplication/octet-streamr  r¨  Nr©  )ra   rÅ   r¾  r”  r¿  r�  r‚  rú   s   &&&&&&&,r   Úsend_documentÚTeamsAdapter.send_document  s6   é € à×0Ñ0ØÐ :ÀGÐYcð 1ó e÷ eð 	eñ eùr¬  c               ó    € V ^8„  d   QhRRRR/# )r   rÅ   r9   r   rw   r   )r   s   "r   r   rA    s   € ÷ Hñ H¨3ð H°4ñ Hr   c              ƒ  	ó   "  € R VRRRV/# 5i)r  rÎ   ÚunknownrÅ   r   )ra   rÅ   s   &&r   Úget_chat_infoÚTeamsAdapter.get_chat_info  s   é € Ø˜ ¨°I¸wÐGÐGùs   ‚	)rR  rL  rM  rI  rJ  rU  rT  rH  rQ  rO  rW  rS  r™  rX  rK  )g      >@)NNr^   )Nrù  )NNN)NNNN))r”   r•   r–   r—   r˜   r>  Ú__annotations__ÚMAX_MESSAGE_LENGTHÚsplits_long_messagesrb   ÚstaticmethodrV  rž  r¤  r´  rÇ  r€  ræ  rë  r%  r#  r,  r;  rC  rˆ  rM  rw  ru  rs  r~  r+  r�  r£  rª  r°  rµ  r»  rÁ  rÆ  r™   Ú__classcell__)rZ  s   @r   r=  r=  ^  sD  ø‡ ÙEà"&Ð˜4Ó&àÐØÐ÷2ð 2ð* ôRó ðRð4°E÷ 4õl,õ+÷.\õ()`ðV ôgó ðgõ6õpcõõ+ð ô^ó ð^ð ô[ó ð[õ'ð. ôó ðð( €NØ °	Ð;LÈhÐXhÐjpÐrxÐyÐØ  *¨h¸ÐF€OõK÷0D÷.E÷
K÷<x÷p÷y÷z÷e÷
Hó Hr   r=  z	Client IDr¢   zClient secretr¤   Úpasswordz	Tenant IDr¥   c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   r   "  s   € ÷ Dñ D˜4ñ Dr   c                 ó¦  € ^ RI Hp Hp ^ RIHpHpHpHpHp ^ RI	H
p V! RRR4      '       d   R# \         F  pV'       d   V! V4       K  \        4        K!  	  \         FM  w  ršpT! V	3RV ! V
4      ;'       g    R	/VB pV'       g   V! V	 R
24        R# V! W¬P                  4       4       KO  	  \        4        V! R4       V! RR4      '       dO   T! RV ! R4      ;'       g    R	R7      pV'       d#   V! RVP                  RR	4      4       V! R4       MV! RR	4       MV! RR4       V! R4       \        4        V! R4       V! R4       V! R4       R# )r  )Úget_env_valueÚsave_env_value)rf  Úprompt_yes_noÚ
print_infoÚprint_successÚprint_warning)Údeclines_reconfigureÚTeamszReconfigure Teams?r¢   NÚdefaultr£   u%    is required â€” skipping Teams setupzDTo find your AAD object ID for the allowlist: teams status --verbosez0Restrict access to specific users? (recommended)Tz(Allowed AAD object IDs (comma-separated)rV  )rØ  Ú zAllowlist configuredrU  r[  uF   âš ï¸�  Open access â€” anyone who can message the bot can command it.z+Teams configuration saved to ~/.hermes/.envz>Install the app in Teams:  teams app install --id <teamsAppId>z1Restart the gateway:       hermes gateway restart)Úhermes_cli.configrÐ  rÑ  Úhermes_cli.cli_outputrf  rÒ  rÓ  rÔ  rÕ  Úhermes_cli.setup_platformsrÖ  Ú_SETUP_INTROÚprintÚ_SETUP_CREDENTIALSrf  Úreplace)rÐ  rÑ  rf  rÒ  rÓ  rÔ  rÕ  rÖ  Úliner|  Úenv_keyÚprompt_kwargsr7  Úalloweds                 r   Úinteractive_setuprå  "  s)  € ß?ßeÕeÝ?Ù˜GÐ%9Ð;L×MÒMÙßˆß ‰
�4Ö¤e¦gñ ç);Ñ%ˆ˜Ù�uÑT¡m°GÓ&<×&BÐ&BÀÐTÀmÑTˆßÙ˜U˜GÐ#HÐIÔJÚÙ�w§¡£Ö.ñ *<ô 
„GÙÐUÔVÙÐGÈ×NÒNÙÐCÉ]Ð[pÓMq×MwÐMwÐuwÔxˆßÙÐ0°'·/±/À#ÀrÓ2JÔKÙÐ0Õ1áÐ0°"Õ5áÐ.°Ô7ÙÐ^Ô_Ü	„GÙÐ?Ô@ÙÐOÔPÙÐBÖCr   c               ó   € V ^8„  d   QhRR/# r§  r   )r   s   "r   r   r   B  s   € ÷ añ a�sñ ar   c                 ó   € R# )z@Point to the setup flow that requests PM's declared Teams extra.uS   Teams SDK missing â€” run `hermes setup`, configure Teams, then restart the gatewayr   r   r   r   Ú_install_hintrè  B  s   € á`r   c               ó   € V ^8„  d   QhRR/# r�   r   )r   s   "r   r   r   G  s   € ÷ 2ñ 2�Tñ 2r   c                ó    € V P                  R RR RR\        \        \        \        . RO\        4       \        \        R\        RRRR	R
RR7       R# )r  zMicrosoft Teamsc                ó   € \        V 4      # r^   )r=  )Úcfgs   &r   rû   Úregister.<locals>.<lambda>I  s
   € Ì<ÐX[ÔK\r   z>Connect Hermes to Microsoft Teams chats via the Bot Framework.zEhttps://hermes-agent.nousresearch.com/docs/user-guide/messaging/teamsrµ   rV  rU  r?  u   ðŸ’¼TuÛ   You are chatting via Microsoft Teams. Teams renders a subset of markdown â€” bold (**text**), italic (*text*), and inline code (`code`) work, but complex tables or raw HTML do not. Keep responses clear and professional.)r  r|  Úadapter_factoryÚdashboard_descriptionÚdocs_urlÚcheck_fnÚensure_deps_fnr®   r±   Úrequired_envÚinstall_hintÚsetup_fnÚenv_enablement_fnÚcron_deliver_env_varÚstandalone_sender_fnÚallowed_users_envÚallow_all_envÚmax_message_lengthÚemojiÚallow_update_commandÚplatform_hintN)r¢   r¤   r¥   )	Úregister_platformrž   r  r®   r±   rè  rå  rÀ   rô   )r|  s   &r   Úregisterr   G  sV   € Ø×ÑØÐ-Ñ?\Ø^ØXÜ#Ü/Ü'´lÚRÜ"“_Ô/@Ü)Ø1Ü-Ø/Ð?VØ Ø¨4ð0ð! ö 2r   )r  ÚActivityContext)rŽ  )ÚMessageActivityÚConversationReference)r�  )ÚAdaptiveCardInvokeActivity)rB  r:  )r9  ÚAdaptiveCardInvokeResponse)rf   ru   ÚHttpResponseri   )r  rt  r:  )
z2You'll need the Teams CLI. If you haven't already:z-  npm install -g @microsoft/teams.cli@previewz  teams loginr£   zAThen expose port 3978 publicly (devtunnel / ngrok / cloudflared),zand create your bot:zM  teams app create --name "Hermes" --endpoint "https://<tunnel>/api/messages"r£   zMThe CLI will print CLIENT_ID, CLIENT_SECRET, and TENANT_ID. Paste them below.r£   )yr˜   Ú
__future__r   rá   Úimportlib.utilr   rv   Úloggingrç  r!   Úcollectionsr   Ú
contextlibr   r   Úpathlibr   Útypingr   r   r	   r
   Úurllib.parser   rÝ   r   r�   r    r#   rœ   rŽ  r  r  r  r  r�  r  rB  r:  r  r9  ru   r  ri   r  rt  r:  r9   rf   Úgateway.configr$   r%   Úgateway.platforms.helpersr&   rÄ  r'   r(   r)   r*   r+   r,   Ú$gateway.platforms.base_exec_approvalr-   r.   Ú
agent.i18nr/   Úgateway.platforms.eventr0   r1   Úgateway.platforms._sharedr2   r3   rd  r4   r§   r5   r¿   r6   Ú	getLoggerr”   rã   rN  r‘  rP  r˜  rÙ   Ú	frozensetrJ   ÚcompilerÛ   r@   rA   rM   rP   rW   rY   rž   r©   r®   r±   rÀ   rô   r  r   r  rê  ÚDOCUMENTÚPHOTOÚVIDEOÚAUDIOrí  rN  rO  r-  r;  r=  rß  rÝ  rå  rè  r   r   r   r   Ú<module>r     s  ðñõ #ã ó
 Û Û Û 	Û 
Ý ß /Ý ß 0Ó 0Ý !ðÝØÐõ	5ñ 1Ó2Ð àRVÐ V€Ð V�Ð V�oÐ V¨Ð:OØTXÐ XÐ Ð XÐ0Ð3QØRVÐ VÐ !Ð VÐ$>ÀØ[_Ð _€Ð _ˆlÐ _Ð-Ð _°Ð _¸}ÈyØ€
ç 3Ý 9÷÷ ÷ iÝ ß =÷õ ð
 
×	Ò	˜8Ó	$€à€Ø€ð €Ø€àEÐ ñ  )Ð*CÐEhÐ)iÓjÐ ð —J’JÐ6Ó7Ð Ø9€õð¸5÷ õ8õ
3÷ñ õ85õ
Mõ+õ#õð7@à#ð7@àCGð7@à`e÷7@ðx Ð6Ø(Ð*<ØÐGØ+Ð-EØ9Ð;ZØ.Ð0wØ0Ð2bØ'Ð)jØÐKð	M€ð" ô'ó ð'õ*8ðB ˜4 ¨g°yÀ)ÐL€ð �×%Ñ%Ð&¨°+×2CÑ2CÐ(DØˆk×ÑÐ  7¨K×,=Ñ,=Ð">ð@Ð ð $ VÐ->À	ÐK[Ð]eÐgmÐouÐvÐ ð Ð3°YÐ@jØÐ7¸ÐAhðÐ õ?ð¸%÷ ôvHÐ&ô vHðt Ð# RÐ(ØÐ+¨j¸$Ð-?Ð@ØÐ# RÐ(ð*Ð ðY€õDõ@a÷
2øðQ ô ØÐØ
ƒCðús   ÁH ÈHÈH