+
    kHàjm ã                  óº  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIHtHtHt ^ RIHt ^ RIHtHtHtHtHtHtHtHt ^ RIHt ]'       d   ^ RItRt M ^ RItRt ^ R	I"H#t#H$t$ ^ R
I%H&t' ^ RI%H(t)H*t+H,t-H.t. ^ RI/H0t0H1t1 ^ RI2H3t3H4t4 ^ RI5H6t6H7t7 ^ RI5H8t8H9t9H:t: ^ RI;H<t< ^ RI=H>t> ^RI?H@t@ ^RIAHBtBHCtCHDtDHEtE ^RIAHFtG ^ RIHHItIHJtJ ^ RIKtK]P˜                  ! ]M4      tNRtORtPRtQRtRRtSR¦tTRtURtVR§tWRtXRtYRtZR R!.t[R"t\R# R$ lt]R% R& lt^R' R( lt_R) R* lt`R+ R, ltaR- R. ltb ! R/ R0]c4      td ! R1 R2]c4      teR¨R3 R4 lltfR5 R6 ltgR7 R8 lthR9 R: ltiR; R< ltjR= R> ltkR? R@ ltlRA RB ltmRC RD ltnRE RF lto]	Pà                  ! RG]	Pâ                  4      trRH RI ltsRJ RK lttRL RM ltuRN RO ltvRP RQ ltwRR RS ltxRT RU ltyRV RW ltzRX RY lt{RZ R[ lt|]}]~]4]]~,          ]]~,          3,          t€R\ R] lt�R^ R_ lt‚R`Ra Rb]�Rc]�RdRe Rf]‚/tƒRg]„Rh&   0 R©mt…Ri Rj lt†Rk Rl lt‡Rm Rn ltˆRo Rp lt‰Rq Rr ltŠRs Rt lt‹RuRRvRRwR/Rx Ry lltŒRz R{ lt� ! R| R}]04      tŽR~ R lt�R€R�R‚RƒR„R…R†R‡RˆR�R‰R�RŠR�/t�R‹RŒR�RŒRŽR�R�R‘R’R“R”R•R–R•/t‘R—R/R˜ R™ llt’Rš R› lt“Rœ R� lt”RžRRŸRR R/R¡ R¢ llt•]	Pà                  ! R£4      t–R¤ R¥ lt—R#   ]! d	    Rt Rt EL`i ; i)ªat  Photon Spectrum (iMessage) platform adapter.

Both directions flow through a supervised Node sidecar (``sidecar/index.mjs``) running
the TypeScript-only ``spectrum-ts`` SDK. Inbound: the SDK's gRPC stream re-emitted as
NDJSON over loopback ``GET /inbound`` (no webhook / public URL). Outbound: loopback
POSTs to the sidecar's control endpoints with a shared bearer token.
)ÚannotationsN)ÚdatetimeÚtimezoneÚUTC)ÚPath)ÚTYPE_CHECKINGÚAnyÚAsyncIteratorÚCallableÚDictÚListÚOptionalÚTuple)ÚurlparseTF)ÚPlatformÚPlatformConfig)Úcoerce_port)Úextra_or_secretÚget_scoped_secretÚseed_extra_from_envÚ
send_error)ÚBasePlatformAdapterÚ
SendResult)ÚMessageEventÚMessageType)Úcompile_mention_patternsÚstrip_markdown)ÚMessageDeduplicatorÚbounded_putÚcancel_task)Úregex_stripped_parser)Úatomic_json_write)Úload_project_credentials)Ú_NPM_ERROR_LOG_MAX_CHARSÚ_lock_newer_than_installÚ_npm_error_logÚ_sidecar_dir)Údir_writable)Úfind_node_executableÚwith_hermes_node_pathiU"  z	127.0.0.1i@  zphoton-sidecar.jsoni   ç      .@iX  ç      >@z.pluginpayloadattachmentç      @z#(?<![\w@])@?hermes\s+agent\b[,:\-]?z(?<![\w@])@?hermes\b[,:\-]?u‹   shared/free-tier Photon lines cannot initiate outbound sends to new targets â€” upgrade to a dedicated line or use another delivery channelc               ó    € V ^8„  d   QhRRRR/# )é   Úresponser   ÚreturnzAsyncIterator[str]© )Úformats   "ÚE/home/ubuntu/.hermes/hermes-agent/plugins/platforms/photon/adapter.pyÚ__annotate__r4   Z   s   € ÷ 	ñ 	¨ð 	Ð0Bñ 	ó    c               óØ   "  € RpV P                  4         Rj  x€L
  pW,           P                  R4      pVP                  4       pV F  pV5x € K
  	  KA   L<D=T'       d   T5x € R# R# 5i)zISplit the sidecar stream on its protocol delimiter, LF, and nothing else.Ú NÚ
)Ú
aiter_textÚsplitÚpop)r/   ÚpendingÚchunkÚlinesÚlines   &    r3   Ú_aiter_ndjson_linesr@   Z   se   é € à€GØ×*Ñ*Ô,÷ ð ˆeØ•×'Ñ'¨Ó-ˆØ—)‘)“+ˆÛˆDØ�Jó ñÐ,÷
 Ø�ñ ùs+   ‚A*•A™AšA�9A*ÁAÁA*Á!	A*c               ó   € V ^8„  d   QhRR/# )r.   r0   r   r1   )r2   s   "r3   r4   r4   h   s   € ÷ @ñ @˜dñ @r5   c                 ó@   € ^ RI Hp  V ! 4       R,          \        ,          # )é    ©Úget_hermes_homeÚruntime)Úhermes_constantsrE   Ú_RUNTIME_RECORD_NAMErD   s    r3   Ú_runtime_record_pathrI   h   s   € Ý0ÙÓ˜yÕ(Ô+?Õ?Ð?r5   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r.   ÚportÚintÚtokenÚstrÚpidr0   ÚNoner1   )r2   s   "r3   r4   r4   m   s.   € ÷ Qñ Q ð Q¨Cð Q°cð Q¸dñ Qr5   c           	     ó    €  \        \        4       RV RVRV/RRR7       R#   \         d"   p\        P	                  RT4        Rp?R# Rp?ii ; i)zKAtomically persist ``{port, token, pid}`` 0600 from creation (best-effort).rK   rM   rO   Ni€  )ÚindentÚmodez3[photon] failed to write sidecar runtime record: %s)r!   rI   Ú	ExceptionÚloggerÚwarning)rK   rM   rO   Úes   &&& r3   Ú_write_runtime_recordrX   m   sO   € ðQÜÔ.Ó0°6¸4ÀÈ%ÐQVÐX[Ð2\ÐeiÐpu×vøÜô QÜ�‰ÐLÈa×PÒPûðQús   ‚! ¡A¬AÁAc               ó   € V ^8„  d   QhRR/# )r.   r0   úOptional[dict[str, Any]]r1   )r2   s   "r3   r4   r4   u   s   € ÷ 2ñ 2Ð6ñ 2r5   c                 óÄ   €  \         P                  ! \        4       P                  R R7      4      p \        T \        4      '       d   T # R#   \        \
        3 d     R# i ; i)ú	utf-8-sig©ÚencodingN)ÚjsonÚloadsrI   Ú	read_textÚOSErrorÚ
ValueErrorÚ
isinstanceÚdict©Úraws    r3   Ú_read_runtime_recordrh   u   sY   € ðÜ�jŠjÔ-Ó/×9Ñ9À;Ð9ÓOÓPˆô ˜S¤$×'Ò'ˆ3Ð1¨TÐ1øô ”ZÐ ô Úðús   ‚.A
 Á
AÁAc               ó   € V ^8„  d   QhRR/# ©r.   r0   rP   r1   )r2   s   "r3   r4   r4   }   s   € ÷ 7ñ 7 ñ 7r5   c                 ó¸   € \         P                  ! \        4      ;_uu_ 4        \        4       P	                  R R7       RRR4       R#   + '       g   i     R# ; i)T)Ú
missing_okN)Ú
contextlibÚsuppressrb   rI   Úunlinkr1   r5   r3   Ú_delete_runtime_recordrp   }   s6   € Ü	×	Ò	œW×	%Õ	%ÜÓ×%Ñ%°Ð%Ô6÷ 
&×	%×	%Ò	%ús   £AÁA	c               ó    € V ^8„  d   QhRRRR/# )r.   rO   r   r0   Úboolr1   )r2   s   "r3   r4   r4   ‚   s   € ÷ ñ ˜Cð  Dñ r5   c                óN  €  \        V 4      pT^ 8:  d   R#  ^ RIHp \        T! T4      4      #   \        \        3 d     R# i ; i  \         d     Mi ; i\        P                  R8w  d   R#  \        P                  ! T^ 4       R#   \         d     R# \         d     R# i ; i)z8Best-effort liveness check for the recorded sidecar pid.F)Ú_pid_existsÚposixT)rL   Ú	TypeErrorrc   Úgateway.statusrt   rr   rT   ÚosÚnameÚkillÚPermissionErrorrb   )rO   Úpid_intrt   s   &  r3   Ú_sidecar_pid_aliver}   ‚   s¦   € ðÜ�c“(ˆð �!„|ÙðÝ.Ü‘K Ó(Ó)Ð)øô ”zÐ"ô Úðûô ô Ùðúä	‡w�w�'ÔÙðÜ
�Š�˜Ôñ
 øô	 ô ÚÜô Úðús>   ‚. —A ®AÁAÁAÁAÁ/B ÂB$ÂB$ÂB$Â#B$c                  ó>   a € ] tR t^œtRtRRRR/R V 3R llltRtV ;t# )	ÚPhotonSidecarStartupErrorz™Startup failure from ``_start_sidecar``; only deterministic failures (deps can't
install, node missing) set ``retryable=False`` so they surface as fatal.ÚcodeÚSIDECAR_FAILEDÚ	retryableTc               ó(   € V ^8„  d   QhRRRRRRRR/# )r.   ÚmessagerN   r€   r‚   rr   r0   rP   r1   )r2   s   "r3   r4   Ú&PhotonSidecarStartupError.__annotate__    s*   € ÷ "ñ " ð "¨cð "ÐQUð "Ðaeñ "r5   c               	ó>   <€ W n         W0n        \        SV `  V4       R # ©N)r€   r‚   ÚsuperÚ__init__)Úselfr„   r€   r‚   Ú	__class__s   &&$$€r3   r‰   Ú"PhotonSidecarStartupError.__init__    s   ø€ ØŒ	Ø"ŒÜ‰Ñ˜Ö!r5   ©r€   r‚   ©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r‰   Ú__static_attributes__Ú__classcell__©r‹   s   @r3   r   r   œ   s(   ø† ñPð"Ð4Dð "ÐX\÷ "÷ "ð "r5   r   c                  ó>   a € ] tR t^¦tRtRRRR/R V 3R llltRtV ;t# )	ÚPhotonSidecarErrorz=Structured failure returned by the supervised Photon sidecar.Úerror_classÚsidecar_errorr‚   Fc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r.   ÚpathrN   Ústatus_coderL   Úerrorr™   r‚   rr   r0   rP   r1   )r2   s   "r3   r4   ÚPhotonSidecarError.__annotate__©   sA   € ÷ 	@ñ 	@ ð 	@°#ð 	@¸cð 	@ÐPSð 	@Ø ð	@Ø-1ñ	@r5   c               	ó€   <€ Wn         W n        W0n        W@n        WPn        \
        SV `  R V RV RV RV RV 2
4       R# )zPhoton sidecar z
 returned ú (z, retryable=ú): N)rœ   r�   rž   r™   r‚   rˆ   r‰   )rŠ   rœ   r�   rž   r™   r‚   r‹   s   &$$$$$€r3   r‰   ÚPhotonSidecarError.__init__©   sT   ø€ àŒ	Ø&ÔØŒ
Ø&ÔØ"ŒÜ‰ÑØ˜d˜V :¨k¨]ð ;Øˆ}˜L¨¨°3°u°gð?ö	@r5   )rž   r™   rœ   r‚   r�   rŽ   r–   s   @r3   r˜   r˜   ¦   s*   ø† ÙGð	@ÐVeð 	@Ø#(÷	@÷ 	@ð 	@r5   r˜   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r.   rœ   rN   r�   rL   ÚtextÚdatarZ   r0   r˜   r1   )r2   s   "r3   r4   r4   µ   s8   € ÷ gñ g sð g¸ð gÀCð gØ'?ðgØK]ñgr5   c                ó  € Vf\   \         P                  ! \        4      ;_uu_ 4        \        P                  ! V4      pR R R 4       \        V\        4      '       d   TM/ p\        VP                  R4      ;'       g    VR,          ;'       g    R4      p\        VP                  R4      ;'       g    R4      p\        VP                  R4      4      pVR8X  d	   \        pRp\        WWEVR	7      #   + '       g   i     Lº; i)
Nrž   ºNéÈ   Nzsidecar errorr™   rš   r‚   Útarget_not_allowedF)rœ   r�   rž   r™   r‚   )rm   rn   rT   r_   r`   rd   re   rN   Úgetrr   Ú_TARGET_NOT_ALLOWED_MESSAGEr˜   )rœ   r�   r¥   r¦   rž   r™   r‚   s   &&&&   r3   Ú_sidecar_error_from_responser­   µ   sÆ   € à‚|Ü× Ò ¤×+Õ+Ü—:’:˜dÓ#ˆD÷ ,ä! $¬×-Ò-‰t°2ˆÜ�—‘˜Ó!×BÐB T¨$¥Z×BÐB°?ÓC€EÜ�d—h‘h˜}Ó-×@Ð@°ÓA€KÜ�T—X‘X˜kÓ*Ó+€IØÐ*Ô*ä+ˆØˆ	ÜØ°%Ð\eôgð g÷ ,×+ús   §C0Ã0D 	c               ó   € V ^8„  d   QhRR/# ©r.   r0   rr   r1   )r2   s   "r3   r4   r4   È   s   € ÷ Fñ F ñ Fr5   c                 óN   € \        4       R,          R,          P                  4       # )zŽTrue when spectrum-ts is present under node_modules/ (not just node_modules/
itself: npm creates it before aborting on ENOSPC/timeout/EACCES).Únode_moduleszspectrum-ts)r&   Úexistsr1   r5   r3   Úsidecar_deps_installedr³   È   s   € ô ‹N˜^Õ+¨mÕ;×CÑCÓEÐEr5   c               ó    € V ^8„  d   QhRRRR/# )r.   ÚexcÚBaseExceptionr0   rr   r1   )r2   s   "r3   r4   r4   Î   s   € ÷ 3ñ 3˜=ð 3¨Tñ 3r5   c                óú   € \        V \        P                  \        34      '       d   R# \        '       d#   \        V \        P
                  4      '       d   R# R\        V 4      P                  P                  4       9   # )z<True when *exc* indicates the request timed out (call hung).TÚtimeout)	rd   ÚasyncioÚTimeoutErrorÚHTTPX_AVAILABLEÚhttpxÚTimeoutExceptionÚtyper�   Úlower)rµ   s   &r3   Ú_is_timeout_errorrÀ   Î   sU   € ä�#œ×,Ñ,¬lÐ;×<Ò<Ùßƒœ: c¬5×+AÑ+A×BÒBÙØœ˜S›	×*Ñ*×0Ñ0Ó2Ñ2Ð2r5   c               ó   € V ^8„  d   QhRR/# r¯   r1   )r2   s   "r3   r4   r4   Ø   s   € ÷ .ñ .˜Dñ .r5   c                 ó  € ^ RI Hp  V ! 4       p\        '       g   \        P	                  R4       R# \        R4      '       g1   \        R4      '       g    V'       g   \        P	                  R4       R# \        4       '       gø   \        R4      '       g	   V'       d   \        \        4       4      '       d   R# R	p\        P                  ! \        4      ;_uu_ 4        \        4       P                  4       '       d0   \        4       P                  R
R7      P!                  4       R\"         pRRR4       V'       d"   \        P%                  R\        4       V4       R# \        P%                  R\        4       4       R# R#   + '       g   i     L[; i)zKReport readiness or permission to prepare at connect; never provision here.)Úlazy_installs_allowedu1   photon: httpx not installed â€” pip install httpxFÚPHOTON_NODE_BINÚnodezNphoton: node binary not found on PATH, in the pm store, or via PHOTON_NODE_BINÚnpmTr7   r\   r]   NuY   photon: spectrum-ts not installed at %s (last npm error: %s) â€” run: hermes photon setupuD   photon: spectrum-ts not installed at %s â€” run: hermes photon setup)ÚpmrÃ   r»   rU   rV   Ú_get_scoped_secretr(   r³   Ú_dir_writabler&   rm   rn   rb   r%   r²   ra   Ústripr#   Údebug)rÃ   Úcan_prepareÚ	npm_errors      r3   Úcheck_requirementsrÎ   Ø   s  € å(á'Ó)€Kß‹?Ü�‰ÐJÔKÙÜÐ0×1Ò1Ô5IÈ&×5QÒ5Q×U`Ü�‰ÐgÔhÙÜ!×#Ò#ô ! ×'Ò'¯;¼MÌ,Ë.×<YÒ<YÙàˆ	Ü× Ò ¤×)Õ)ÜÓ×&Ñ&×(Ò(Ü*Ó,×6Ñ6ÀÐ6ÓL×RÑRÓTÐUnÔVnÐo�	÷ *÷ Ü�L‰LðDä“Øô	ñ ô	 �L‰LØVÜ“ôñ Ù÷! *×)ús   ÃAE;Å;F	c               ó   € V ^8„  d   QhRR/# r¯   r1   )r2   s   "r3   r4   r4   	  s   € ÷ 4ñ 4˜Tñ 4r5   c                 ó(   € \        \        4       4      # )z�True when node_modules predates the lockfile (`hermes update` rewrites it without
reinstalling); False if either file is missing.)r$   r&   r1   r5   r3   Ú_sidecar_deps_stalerÑ   	  s   € ô $¤L£NÓ3Ð3r5   c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   r4     s   € ÷ (yñ (y ñ (yr5   c                 ó`  aaa€ ^ RI p  \        R4      o\        4       oSff   V P                  R4      P                  oV P                  R4      pVe   VP                  f   V P                  RR4      h\        VP                  4      o^ RIHo R TTT3R llp T! R4      pTP                  ^ 8w  d   \        P                  R	4       T! R
4      pTP                  ^ 8X  d   \        P%                  R4       R# \        P!                  RTP&                  ;'       g    TP(                  ;'       g    RP+                  4       4       R#   T P                   d"   p\        P                  RT4        Rp?R# Rp?ii ; i  \        P                   d    \        P!                  R\"        4        R# i ; i)u§  Reinstall the sidecar's node_modules from the lockfile (blocking).

Mirrors ``hermes photon install-sidecar``: ``npm ci`` for an exact,
reproducible install, falling back to ``npm install`` if the lockfile is
missing or drifted. Runs the postinstall patch as part of the install.
Best-effort â€” a failure here just leaves the (stale) deps in place and the
normal ``_start_sidecar`` readiness check reports the real error.
NrÆ   ú+ensured but no selected binary was recordedz0[photon] cannot prepare sidecar dependencies: %s©Úwindows_hide_flagsc               ó    € V ^8„  d   QhRRRR/# )r.   ÚverbrN   r0   zsubprocess.CompletedProcessr1   )r2   s   "r3   r4   Ú-_reinstall_sidecar_deps.<locals>.__annotate__(  s   € ÷ xñ x�3ð xÐ6ñ xr5   c                óš   <€ \         P                  ! SV .\         P                  \        \	        4       4      R R RRRS\
        S! 4       R7      # )Túutf-8ÚreplaceF)
ÚstdinÚcwdÚcapture_outputr¥   r^   ÚerrorsÚcheckÚenvr¸   Úcreationflags)Ú
subprocessÚrunÚDEVNULLrN   r&   Ú_NPM_REINSTALL_TIMEOUT)rØ   râ   rÆ   rÖ   s   &€€€r3   Ú_runÚ%_reinstall_sidecar_deps.<locals>._run(  sG   ø€ Ü�~Š~Ø�$ˆKœz×1Ñ1´s¼<»>Ó7JÐ[_ÐfjÐu|Ø E¨sÔ<RÑbtÓbvôxð 	xr5   Úciz?[photon] sidecar `npm ci` failed; falling back to `npm install`Úinstallz9[photon] sidecar dependency reinstall timed out after %ssz7[photon] sidecar dependencies reinstalled from lockfilez0[photon] sidecar dependency reinstall failed: %sr7   )rÇ   r(   r)   Úensurerâ   Úinstalled_packageÚbinaryÚInstallErrorrN   rU   rV   Úhermes_cli._subprocess_compatrÖ   Ú
returncoderä   ÚTimeoutExpiredrž   rç   ÚinfoÚstderrÚstdoutrÊ   )rÇ   Ú	installedrµ   rè   Úresultrâ   rÆ   rÖ   s        @@@r3   Ú_reinstall_sidecar_depsrø     sa  ú€ ó ðÜ" 5Ó)ˆÜ#Ó%ˆØŠ;Ø—)‘)˜EÓ"×&Ñ&ˆCØ×,Ñ,¨UÓ3ˆIØÒ  I×$4Ñ$4Ò$<Ø—o‘o eÐ-ZÓ[Ð[Ü�i×&Ñ&Ó'ˆCõ A÷xò xðÙ�d“ˆØ×Ñ Ô!Ü�N‰NÐ\Ô]Ù˜)“_ˆFð ×Ñ˜AÔÜ�‰ÐMÖNä�‰ÐGÈ&Ï-É-×JnÐJnÐ[a×[hÑ[h×JnÐJnÐln×IuÑIuÓIwÖxøð) �?‰?ô Ü�‰ÐIÈ3ÔOÝûðûô ×$Ñ$ô Ü�‰ÐPÔRhÔiÚðús*   ‰A>E Â6E: ÅE7ÅE2Å2E7Å:/F-Æ,F-c               ó    € V ^8„  d   QhRRRR/# ©r.   Úcfgr   r0   rr   r1   )r2   s   "r3   r4   r4   :  s   € ÷ *ñ *˜ð *¨Dñ *r5   c                ó  € V P                   ;'       g    / pVP                  R 4      '       g   \        R4      '       d+   VP                  R4      '       g   \        R4      '       d   R# \        4       w  r#\	        T;'       d    T4      # )Ú
project_idÚPHOTON_PROJECT_IDÚproject_secretÚPHOTON_PROJECT_SECRETT)Úextrar«   rÈ   r"   rr   )rû   r  Ú	stored_idÚ
stored_secs   &   r3   Úvalidate_configr  :  si   € Ø�I‰I�OˆO˜€EØ�	‰	�,×ÒÔ#5Ð6I×#JÒ#JØ�I‰IÐ&×'Ò'Ô+=Ð>U×+VÒ+VÙÜ4Ó6Ñ€IÜ�	×(Ð(˜jÓ)Ð)r5   c               ó    € V ^8„  d   QhRRRR/# rú   r1   )r2   s   "r3   r4   r4   C  s   € ÷  ñ  �nð  ¨ñ  r5   c                ó   € \        V 4      # r‡   )r  ©rû   s   &r3   Úis_connectedr  C  s   € Ü˜3ÓÐr5   c               ó   € V ^8„  d   QhRR/# )r.   r0   zOptional[dict]r1   )r2   s   "r3   r4   r4   G  s   € ÷ Hñ H˜ñ Hr5   c                 ód   € \        4       w  rV '       d	   V'       g   R# RV RV/\        RRR7      C# )zY``env_enablement_fn``: seed ``PlatformConfig.extra`` so env-only setups appear in status.Nrý   rÿ   ÚPHOTON_HOME_CHANNEL)Úhome_envr1   )r"   Ú_seed_extra_from_env)rý   rÿ   s     r3   Ú_env_enablementr  G  s<   € ä!9Ó!;Ñ€JßŸ>ÙØ˜*Ð&6¸ð HÜ" 2Ð0EÔFðHð Hr5   c               ó   € V ^8„  d   QhRR/# r¯   r1   )r2   s   "r3   r4   r4   Q  s   € ÷ eñ e˜4ñ er5   c                 óX   € \        RR4      P                  4       P                  4       R9  # )zWReplies go out as markdown; ``PHOTON_MARKDOWN=false`` is the kill-switch to plain text.ÚPHOTON_MARKDOWNÚtrue>   Ú0ÚnoÚfalse©rÈ   rÊ   r¿   r1   r5   r3   Ú_markdown_enabledr  Q  s(   € äÐ/°Ó8×>Ñ>Ó@×FÑFÓHÐPdÑdÐdr5   zhttps?://[^\s)'\"<>]+c               ó$   € V ^8„  d   QhRRRRRR/# )r.   r¥   rN   Úsend_markdownrr   r0   r1   )r2   s   "r3   r4   r4   \  s!   € ÷ 
8ñ 
8 ð 
8°Dð 
8¸Sñ 
8r5   c                óz   € V'       d(   \         P                  T ;'       g    R4      '       g   V # \        V RR7      # )a·  The ``/send`` text: verbatim only when the sidecar will really use spectrum-ts' markdown builder.

``chooseSendFormat`` routes markdown containing a raw URL through the verbatim ``text()`` builder
(the markdown builder's data detection 500s on those), and a plain send has no renderer at all, so
both are stripped here or iMessage shows literal ``**``/fences. Link targets survive as bare URLs:
iMessage auto-links those and nothing else.
r7   T©Úkeep_link_targets)Ú_SIDECAR_URL_REÚsearchr   )r¥   r  s   &&r3   Ú_sidecar_payload_textr  \  s/   € ÷ œ_×3Ñ3°D·J°J¸B×?Ò?ØˆÜ˜$°$Ô7Ð7r5   c               ó    € V ^8„  d   QhRRRR/# ©r.   r¥   rN   r0   úOptional[str]r1   )r2   s   "r3   r4   r4   i  s   € ÷ _ñ _˜cð _ mñ _r5   c                ó:  € T ;'       g    R P                  4       p\        P                  ! RV\        P                  R7      '       g   R#  \	        V4      pTP                  P                  4       R9   d   TP                  '       d   T# R#   \
         d     R# i ; i)r7   zhttps?://\S+)ÚflagsN>   ÚhttpÚhttps)	rÊ   ÚreÚ	fullmatchÚ
IGNORECASEr   rc   Úschemer¿   Únetloc)r¥   Ú	candidateÚparseds   &  r3   Ú_url_only_candidater.  i  s~   € Ø—�˜×"Ñ"Ó$€IÜ�<Š<˜¨¼"¿-¹-×HÓHÙðÜ˜)Ó$ˆð Ÿ™×+Ñ+Ó-Ð1BÔBÀvÇ}Ç}À}ˆ9Ð^ÐZ^Ð^øô ô Úðús   ÁB ÂBÂBc               ó    € V ^8„  d   QhRRRR/# r!  r1   )r2   s   "r3   r4   r4   t  s   € ÷ Fñ F˜cð F mñ Fr5   c                ó<   € \        4       '       d   \        V 4      # R# )u–   URL to send via ``richlink()`` â€” only exact http(s) URL messages; prose with
URLs and Markdown links stay on the text path so labels aren't dropped.N)r  r.  )r¥   s   &r3   Ú_richlink_candidater1  t  s   € ô ):×(;Ò(;Ô˜tÓ$ÐEÀÐEr5   c               ó    € V ^8„  d   QhRRRR/# ©r.   Úcontentúdict[str, Any]r0   rN   r1   )r2   s   "r3   r4   r4   z  s   € ÷ Tñ T nð T¸ñ Tr5   c                ó¬   a € V 3R  lR 4       w  rpY#V8w  d   TMRV3 Uu. uF  qD'       g   K  VNK  	  ppV'       d   RP                  V4      # R# u upi )c              3  óˆ   <"  € T F7  p\        SP                  V4      ;'       g    R 4      P                  4       x € K9  	  R# 5i©r7   N)rN   r«   rÊ   )Ú.0Úkr4  s   & €r3   Ú	<genexpr>Ú+_format_richlink_content.<locals>.<genexpr>{  s4   øé € ÐbÑFaÀœ3˜wŸ{™{¨1›~×3Ð3°Ó4×:Ñ:×<Ð<ÓFaùs
   ƒ!A¥Ar7   r8   z'[Photon rich link received with no URL])ÚurlÚtitleÚsummary)Újoin)r4  r=  r>  r?  ÚpÚpartss   f     r3   Ú_format_richlink_contentrC  z  sX   ø€ ÜbÑFaÓbÑ€C�Ø°eÔ+;¡ÀÀSÑIÓOÑI�1ËQ�QˆQÑI€EÐOß$ˆ4�9‰9�UÓÐSÐ*SÐSùò Ps
    	A®Ac               ó    € V ^8„  d   QhRRRR/# )r.   r4  r5  r0   zlist[dict[str, Any]]r1   )r2   s   "r3   r4   r4   €  s   € ÷ 5ñ 5 .ð 5Ð5Iñ 5r5   c                ó¤   € R V P                  R4      ;'       g    .  4       pV Uu. uF  p\        V\        4      '       g   K  VNK  	  up# u upi )zFThe dict ``content`` of every well-formed item in a ``group`` payload.c              3  ót   "  € T F.  p\        V\        4      '       d   VP                  R 4      MRx € K0  	  R# 5i)r4  N)rd   re   r«   )r9  Úitems   & r3   r;  Ú'_group_item_contents.<locals>.<genexpr>‚  s,   é € ÐlÑQkÈ¤J¨t´T×$:Ò$:ˆT�X‰X�iÔ ÀÔDÓQkùs   ‚68Úitems)r«   rd   re   )r4  rI  Úcs   &  r3   Ú_group_item_contentsrK  €  sH   € álÐQX×Q\ÑQ\Ð]dÓQe×QkÐQkÐikÐQkÓl€EÙÓ4‘u�!¤
¨1¬d× 3�AˆA‘uÑ4Ð4ùÒ4s   §AÁAc               ó    € V ^8„  d   QhRRRR/# )r.   r4  r5  r0   r"  r1   )r2   s   "r3   r4   r4   †  s   € ÷ ñ ¨ð ¸=ñ r5   c           	     óò   € V P                  R 4      pVR9   d.   \        T P                  VR8X  d   RMR4      ;'       g    R4      # VR8X  d+   \        R \        \        \        V 4      4       4       R4      # R# )r¾   r¥   r=  r7   Úgroupc              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir‡   r1   )r9  Úus   & r3   r;  Ú-_richlink_url_from_content.<locals>.<genexpr>‹  s   é € ÐdÑ ^˜1Óbc—Q’QÓ ^ùó   ‚	�
N)r¥   Úrichlink)r«   r.  ÚnextÚmapÚ_richlink_url_from_contentrK  ©r4  Úctypes   & r3   rV  rV  †  sl   € Ø�K‰K˜Ó€EØÐ$Ô$Ü" 7§;¡;¸À&¼©vÈeÓ#T×#ZÐ#ZÐXZÓ[Ð[Ø�ÔÜÑd¤Ô$>Ô@TÐU\Ó@]Ô ^ÓdÐfjÓkÐkÙr5   c               ó    € V ^8„  d   QhRRRR/# )r.   Úpayloadr5  r0   rr   r1   )r2   s   "r3   r4   r4   �  s   € ÷ jñ j¨^ð jÀñ jr5   c                ó°   a € S P                  R 4      R8H  ;'       d;    \        ;QJ d    V 3R lR 4       F  '       g   K   R# 	  R# ! V 3R lR 4       4      # )r¾   Ú
attachmentc              3  ó–   <"  € T F>  p\         \        SP                  V4      ;'       g    R 4      P                  4       9   x € K@  	  R# 5ir8  )Ú#_RICHLINK_PREVIEW_ATTACHMENT_SUFFIXrN   r«   r¿   )r9  r:  rZ  s   & €r3   r;  Ú2_is_richlink_preview_attachment.<locals>.<genexpr>’  s;   øé € ð 7jÙZhÐUVÔ+¬s°7·;±;¸q³>×3GÐ3GÀRÓ/H×/NÑ/NÓ/PÖPÓZhùs
   ƒ&A	ªA	TF)ry   Úid)r«   Úany)rZ  s   fr3   Ú_is_richlink_preview_attachmentrb  �  sd   ø€ ð �;‰;�vÓ ,Ñ.÷ jð j·3³3ô 7jÙZhó7j·3´3ð j²3ð j°3ô 7jÙZhó7jó 4jð jr5   c               ó    € V ^8„  d   QhRRRR/# r3  r1   )r2   s   "r3   r4   r4   –  s   € ÷ ñ  ^ð ¸ñ r5   c                óØ   a€ R  R loV P                  R4      R8X  d	   S! V 4      # V P                  R4      R8X  d/   RP                  V3R l\        V 4       4       4      ;'       g    R# R# )	c               ó    € V ^8„  d   QhRRRR/# )r.   rJ  r5  r0   rN   r1   )r2   s   "r3   r4   Ú-_richlink_preview_label.<locals>.__annotate__—  s   € ÷ @ñ @�.ð @ Sñ @r5   c                ó|   € \        V P                  R 4      ;'       g    V P                  R4      ;'       g    R4      # )ry   r`  ú	(unnamed))rN   r«   ©rJ  s   &r3   Ú_labelÚ'_richlink_preview_label.<locals>._label—  s-   € Ü�1—5‘5˜“=×>Ð> A§E¡E¨$£K×>Ð>°;Ó?Ð?r5   r¾   r\  rN  z, c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir‡   r1   )r9  rJ  rj  s   & €r3   r;  Ú*_richlink_preview_label.<locals>.<genexpr>œ  s   øé € ÐJÑ,I q™ Ÿ˜Ó,Iùs   ƒz(group)z	(unknown))r«   r@  rK  )r4  rj  s   &@r3   Ú_richlink_preview_labelrn  –  s[   ø€ õ@à‡{�{�6Ó˜lÔ*Ù�g‹ÐØ‡{�{�6Ó˜gÔ%Ø�y‰yÔJÔ,@ÀÔ,IÓJÓJ×WÐWÈiÐWÙr5   c               ó    € V ^8„  d   QhRRRR/# )r.   r4  r5  r0   rr   r1   )r2   s   "r3   r4   r4      s   € ÷ 	>ñ 	>¨.ð 	>¸Tñ 	>r5   c                óp  € \        V 4      '       d   R# V P                  R4      R8w  d   R# V P                  R4      ;'       g    . p\        V 4      p\        V4      ;'       dT    \	        V4      \	        V4      8H  ;'       d5    \
        ;QJ d    R V 4       F  '       d   K   R# 	  R# ! R V 4       4      # )zLA preview attachment, or a non-empty group made ONLY of preview attachments.Tr¾   rN  FrI  c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir‡   )rb  )r9  rJ  s   & r3   r;  Ú/_is_richlink_preview_content.<locals>.<genexpr>¨  s   é € ð ?>Ù4<¨qÔ'¨×*Ð*³Hùs   ‚)rb  r«   rK  rr   ÚlenÚall)r4  rI  Úcontentss   &  r3   Ú_is_richlink_preview_contentrv     s¨   € ä& w×/Ò/ÙØ‡{�{�6Ó˜gÔ%ÙØ�K‰K˜Ó ×&Ð& B€EÜ# GÓ,€HÜ�‹;÷ >ð >œ3˜x›=¬C°«JÑ6÷ >ð >¿3»3ñ ?>Ù4<ó?>¿3¼3ð >º3ð >¸3ñ ?>Ù4<ó?>ó <>ð >r5   c               ó    € V ^8„  d   QhRRRR/# )r.   Úts_strrN   r0   r   r1   )r2   s   "r3   r4   r4   ¬  s   € ÷ $ñ $˜Sð $ Xñ $r5   c                óÎ   €  V '       d   \         P                  ! V 4      # \         P                  ! \        R 7      #   \         d    \         P                  ! \        R 7      u # i ; i))Útz)r   ÚfromisoformatÚnowr   rc   )rx  s   &r3   Ú_parse_timestampr}  ¬  sF   € ð$ß17Œx×%Ò% fÓ-ÐQ¼X¿\º\ÌSÔ=QÐQøÜô $Ü�|Š|œsÔ#Ò#ð$ús   ‚; Š;  ; »&A$Á#A$c               ó    € V ^8„  d   QhRRRR/# )r.   rZ  r5  r0   Ú_Normalizedr1   )r2   s   "r3   r4   r4   ¶  s   € ÷ iñ i ~ð i¸+ñ ir5   c                ó‚  € V P                  R4      R8H  pV P                  R4      ;'       g    V'       d   RMRpV P                  R4      ;'       g    RpT;'       g-    VP                  4       P                  R4      ;'       g    VR8H  pV'       d   \        P                  M
\        V4      pV'       d   RMR	p\        WW1R
7      pV'       d"   RV R2YF.T;'       g    V'       d   R.3# R.3# V P                  R4      p\        V\        \        34      '       d   RV R2MRpRT RT RT;'       g    R V R2V. . 3# )zECache an inline attachment/voice payload; fall back to a text marker.r¾   Úvoicery   rh  ÚmimeTyper7   ú.cafúaudio/x-cafr\  )Úforce_audioÚ(Ú)ú	audio/mp4zapplication/octet-streamÚdurationz, duration: Úsz[Photon z received: r¡   zunknown MIMEz)])
r«   r¿   Úendswithr   ÚVOICEÚ_attachment_message_typeÚ_cache_inbound_attachmentrd   rL   Úfloat)	rZ  Úis_voicery   ÚmimeÚmtypeÚlabelÚcachedr‰  Úduration_texts	   &        r3   Ú_normalize_binary_payloadr–  ¶  s1  € à�{‰{˜6Ó" gÑ-€HØ�;‰;�vÓ×HÐH¯h¡7¸K€DØ�;‰;�zÓ"×(Ð( b€Dà×QÐQ˜4Ÿ:™:›<×0Ñ0°Ó8×QÐQ¸DÀMÑ<Q€Hß!)ŒK×ÒÔ/GÈÓ/M€Eß‰G \€EÜ& w°dÔQ€FßØ�5�'˜ˆ|˜U H¨t×/pÐ/pÇx¸Ð.qÐqÐqÐUoÐ.qÐqÐqØ�{‰{˜:Ó&€HÜ2<¸XÌÌUÀ|×2TÒ2T�l 8 *¨AÑ.ÐZ\€MØ�e�W˜K¨ v¨R°×0FÐ0F¸Ð/GÈÀÐVXÐYÐ[`ÐbdÐfhÐhÐhr5   c               ó    € V ^8„  d   QhRRRR/# ©r.   r4  r5  r0   r  r1   )r2   s   "r3   r4   r4   Ç  s   € ÷ wñ w nð w¸ñ wr5   c                ó  € . p\         P                  p. p. p\        V 4       Fô  pVP                  R 4      pVR
9   de   \	        V4      w  rxršV\         P                  8X  d   TpVP                  V	4       VP                  V
4       V	'       g   VP                  V4       K}  K  VR8X  d-   TP                  VP                  R4      ;'       g    R4       K²  VR8X  d   VP                  \        V4      4       KÕ  V'       g   Kß  VP                  RV R24       Kö  	  V'       d&   V\         P                  8X  d   \         P                  pRP                  R V 4       4      P                  4       pT;'       g    V'       d   RMR	W#V3# )r¾   r¥   r7   rS  ú"[Photon content type not handled: Ú]r8   c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir‡   r1   ©r9  Úparts   & r3   r;  Ú+_normalize_group_content.<locals>.<genexpr>Þ  s   é € Ð9¡j˜d³D—T’T£jùrR  z(attachment)z[Photon empty group received]>   r�  r\  )r   ÚTEXTrK  r«   r–  ÚextendÚappendrC  ÚDOCUMENTr@  rÊ   )r4  Ú
text_partsr’  Ú
media_urlsÚmedia_typesÚitem_contentÚ	item_typeÚmarkerÚ
item_mtypeÚ	item_urlsÚ
item_typesr¥   s   &           r3   Ú_normalize_group_contentr­  Ç  sQ  € Ø€JÜ×Ñ€EØ€JØ€KÜ,¨WÖ5ˆØ ×$Ñ$ VÓ,ˆ	ØÐ/Ô/Ü8QÐR^Ó8_Ñ5ˆF 	Øœ×(Ñ(Ô(Ø"�Ø×Ñ˜iÔ(Ø×Ñ˜zÔ*ßØ×!Ñ! &Ö)ñ à˜&Ô Ø×Ñ˜l×.Ñ.¨vÓ6×<Ð<¸"Ö=Ø˜*Ô$Ø×ÑÔ6°|ÓDÖEß‰YØ×ÑÐ BÀ9À+ÈQÐOÖPñ 6÷  �eœ{×/Ñ/Ô/Ü×$Ñ$ˆØ�9‰9Ñ9¡jÓ9Ó9×?Ñ?ÓA€DØ×VÐV§j‘NÐ6UÐX]ÐkvÐvÐvr5   r¥   c                ó\   € V P                  R 4      ;'       g    R\        P                  . . 3# )r¥   r7   )r«   r   r   ri  s   &r3   Ú<lambda>r¯  ã  s#   € �q—u‘u˜V“}×*Ð*¨¬K×,<Ñ,<¸bÀ"ÑEr5   r\  r�  rS  c                ó<   € \        V 4      \        P                  . . 3# r‡   )rC  r   r   ri  s   &r3   r¯  r¯  å  s   € Ô3°AÓ6¼×8HÑ8HÈ"ÈbÑQr5   rN  z2dict[Any, Callable[[dict[str, Any]], _Normalized]]Ú_CONTENT_NORMALIZERSc               ó    € V ^8„  d   QhRRRR/# r3  r1   )r2   s   "r3   r4   r4   ë  s   € ÷ 
ñ 
 ð 
°3ñ 
r5   c           	     óü   € V P                  R4      pVR8X  d   V P                  R4      ;'       g    R# VR8X  d   \        V 4      # VR8X  d0   RP                  R \        \        \        V 4      4       4       4      # R# )zªThe user-typed text of a payload WITHOUT decoding or caching any attachment bytes,
so the group require_mention gate can run before ``_normalize_content`` persists media.r¾   r¥   r7   rS  rN  r8   c              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir‡   r1   r�  s   & r3   r;  Ú%_mention_gate_text.<locals>.<genexpr>ô  s   é € ÐiÑ*` $ÓdhŸšÓ*`ùrR  )r«   rC  r@  rU  Ú_mention_gate_textrK  rW  s   & r3   r¶  r¶  ë  sr   € ð �K‰K˜Ó€EØ�„Ø�{‰{˜6Ó"×(Ð( bÐ(Ø�
ÔÜ'¨Ó0Ð0Ø�ÔØ�y‰yÑi¬#Ô.@ÔBVÐW^ÓB_Ô*`ÓiÓiÐiÙr5   c               ó    € V ^8„  d   QhRRRR/# r˜  r1   )r2   s   "r3   r4   r4   ø  s   € ÷ ñ  ð °;ñ r5   c                óÆ   € V P                  R4      p\        V\        4      '       d   \        P                  V4      MRpVf   RV R2\        P
                  . . 3# V! V 4      # )zNTurn a sidecar ``content`` payload into (text, type, media_urls, media_types).r¾   Nrš  r›  )r«   rd   rN   r±  r   r   )r4  rX  Ú	normalizes   &  r3   Ú_normalize_contentrº  ø  s`   € à�K‰K˜Ó€EÜ3=¸eÄS×3IÒ3IÔ$×(Ñ(¨Ô/Èt€IØÒØ3°E°7¸!Ð<¼k×>NÑ>NÐPRÐTVÐVÐVÙ�WÓÐr5   c               ó    € V ^8„  d   QhRRRR/# )r.   Úchat_idr"  r0   r1   )r2   s   "r3   r4   r4     s   € ÷ Kñ K˜Mð K¨mñ Kr5   c                ó@   € V '       d   \         P                  V 4      # R# )zUDM GUID (``any;-;+1555...``) and bare E.164 address one space; index under the phone.N)ÚPhotonAdapterÚ_normalize_chat_key)r¼  s   &r3   Ú_sent_text_keyrÀ    s   € ç9@Œ=×,Ñ,¨WÓ5ÐJÀdÐJr5   c               ó$   € V ^8„  d   QhRRRRRR/# )r.   ÚkindrN   ry   r0   r1   )r2   s   "r3   r4   r4     s!   € ÷ ñ ˜Cð  sð ¨sñ r5   c                ó   € R V  RV R2# )Ú[ú: r›  r1   )rÂ  ry   s   &&r3   Ú_attachment_labelrÆ    s   € Øˆtˆf�B�t�f˜AÐÐr5   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r.   r¼  r"  Ú
message_idr¥   r0   rP   r1   )r2   s   "r3   r4   r4   
  s0   € ÷ Nñ N¨=ð NÀmð NÐ[hð NÐmqñ Nr5   c              ƒ  ó¸   "  €  ^ RI Hp VP                  \        V 4      W4      G Rj  x€L
  R#  L  \         d    \
        P                  RRR7        R# i ; i5i)z\Remember what we sent so a later threaded reply to it carries the quoted text. Never raises.©Úrich_sent_storeNz&[photon] sent-text index record failedT©Úexc_info)ÚgatewayrË  Úrecord_asyncrÀ  rT   rU   rË   )r¼  rÈ  r¥   rË  s   &&& r3   Ú_record_sent_text_asyncrÐ  
  sJ   é € ðNÝ+Ø×*Ñ*¬>¸'Ó+BÀJÓU×UÔUøÜô NÜ�‰Ð=Èˆ×MðNüs1   ‚A„$1 ¨/©1 ­A¯1 ±"AÁAÁAÁAc               ó$   € V ^8„  d   QhRRRRRR/# )r.   r¼  r"  rÈ  r0   r1   )r2   s   "r3   r4   r4     s!   € ÷ ñ ˜}ð ¸-ð ÈMñ r5   c                ó˜   €  ^ RI Hp VP                  \        V 4      V4      #   \         d    \
        P                  RRR7        R# i ; i)rC   rÊ  z&[photon] sent-text index lookup failedTrÌ  N)rÎ  rË  ÚlookuprÀ  rT   rU   rË   )r¼  rÈ  rË  s   && r3   Ú_lookup_sent_textrÔ    sE   € ðÝ+Ø×%Ñ%¤n°WÓ&=¸zÓJÐJøÜô Ü�‰Ð=ÈˆÔMÚðús   ‚ # £"A	ÁA	ry   Ú	mime_typeÚcaptionc               ó4   € V ^8„  d   QhRRRRRRRRRRRRR	R
/# )r.   Úspace_idrN   Ú	safe_pathrÂ  ry   r"  rÕ  rÖ  r0   r5  r1   )r2   s   "r3   r4   r4     s@   € ÷ ñ ˜sð ¨sð ¸Sð Èð Ø -ðØ?LðØXfñr5   c               ó¤   € RT RTRVR8X  d   RMR/pTP                  RV3RV3RV33 UUu/ uF  w  rxV'       g   K  WxbK  	  upp4       V# u uppi )	z‰``/send-attachment`` body; spectrum-ts infers name/mimeType from the extension,
so optional keys are only sent when Hermes supplied them.ÚspaceIdrœ   rÂ  r�  r\  ry   r‚  rÖ  )Úupdate)	rØ  rÙ  rÂ  ry   rÕ  rÖ  Úbodyr:  Úvs	   &&$$$$   r3   Ú_attachment_bodyrß    si   € ð
 	�8˜V Y°À4È7Ä?¹ÐXdðf€Dà‡K�K F¨D >°JÀ	Ð3JÈYÐX_ÐL`Ñ"aÔgÑ"a™$˜!Ôef”�’Ñ"aÒgÔhØ€Kùó hs
   «A
¼A
c               ó    € V ^8„  d   QhRRRR/# )r.   rœ   rN   r0   r"  r1   )r2   s   "r3   r4   r4   &  s   € ÷ 1ñ 1�cð 1˜mñ 1r5   c                óN   € ^ RI pVP                  V 4      ^ ,          ;'       g    R# )rC   N)Ú	mimetypesÚ
guess_type)rœ   râ  s   & r3   Ú_guess_mimerä  &  s#   € ÛØ×Ñ Ó% aÕ(×0Ð0¨DÐ0r5   c                  ó  a € ] tR tRtRt]tRtRtR V 3R l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/R R lltR R ltR R ltR R ltR R ltR R ltR R l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4       t]
R, R- l4       tR. R/ ltR0 R1 lt R2 R3 lt!R4 R5 lt"R6 R7 lt#R8 R9 lt$R: R; lt%R< R= lt&R> R? lt'R@ RA lt(RB RC lt)R•RE RF llt*R–RG V 3RH lllt+R—RI V 3RJ lllt,R—RK RL llt-R—RM RN llt.R—RO RP llt/R˜RQ RR llt0RS RT lt1R–RU RV llt2RW RX lt3RYt4^Èt5RZ R[ lt6]7Pp                  ! R\4      t9]R] R^ l4       t:R_ R` lt;Ra Rb lt<Rc Rd lt=Re Rf lt>Rg Rh lt?Ri Rj lt@Rk Rl ltAR–Rm Rn lltBR–Ro Rp lltCRq Rr ltDRstERttFRu Rv ltGRw Rx ltH]
Ry Rz l4       tI]
R{ R| l4       tJR} R~ ltKR R€ ltLR�RR‚RD/Rƒ R„ lltMR…RR†R/R‡ Rˆ lltNR‰ RŠ ltOR‹RDRŒRDR�RDRŽR�/R� R‘ lltPR’ R“ ltQR”tRV ;tS# )™r¾  i/  zIBidirectional bridge to Photon Spectrum via the Node spectrum-ts sidecar.FTc               ó   € V ^8„  d   QhRR/# )r.   Úconfigr   r1   )r2   s   "r3   r4   ÚPhotonAdapter.__annotate__6  s   € ÷ 4@ñ 4@˜~ñ 4@r5   c                	óÒ  <a€ \         SV `  V\        R 4      4       VP                  ;'       g    / o\	        4       w  r#\        R4      ;'       g&    SP                  R4      ;'       g    T;'       g    RV n        \        R4      ;'       g&    SP                  R4      ;'       g    T;'       g    RV n        \        SP                  R4      ;'       g    \        R4      \        4      V n        \        V n        \        R4      ;'       g    \        P                  ! ^4      V n        \#        \        R	R
4      4      P%                  4       pVR 9  V n        \        R4      ;'       g    \)        R4      V n        R V3R llpV! RRR\,        4      V n        V! RRR\,        4      V n        V! RR^\2        4      V n        V P.                  ^ 8„  V n        RV n        RV n        RV n        RV n        R;V n         ;V n!        V n"        RV n#        R;V n$        V n%        RV n&        ^ V n'        RV n(        \S        \T        \V        R7      V n,        / V n-        / V n.        / V n/        / V n0        / V n1        SP                  R4      pVf   \        R4      p\#        V4      Pe                  4       P%                  4       R!9   V n3        T Pi                  RS9   d
   SR,          M
\        R4      4      V n5        R# )"Úphotonrþ   rý   r7   r   rÿ   Úsidecar_portÚPHOTON_SIDECAR_PORTÚPHOTON_SIDECAR_TOKENÚPHOTON_SIDECAR_AUTOSTARTr  rÄ   rÅ   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r.   ÚkeyrN   râ   Údefaultr   ÚcastzCallable[[Any], Any]r0   r1   )r2   s   "r3   r4   Ú,PhotonAdapter.__init__.<locals>.__annotate__H  s1   € ÷ 	ñ 	˜#ð 	 Cð 	°#ð 	Ð=Qð 	ÐVYñ 	r5   c                ó^   <€  V! \        SWR 4      4      #   \        \        3 d    Tu # i ; ir‡   )Ú_extra_or_secretrv   rc   )rð  râ   rñ  rò  r  s   &&&&€r3   Ú_settingÚ(PhotonAdapter.__init__.<locals>._settingH  s6   ø€ ðÙÔ,¨U°C¸dÓCÓDÐDøÜœzÐ*ô Ø’ðús   ƒ –,«,Úprobe_interval_secondsÚPHOTON_PROBE_INTERVAL_SECONDSg     À‚@Úprobe_timeout_secondsÚPHOTON_PROBE_TIMEOUT_SECONDSg      $@Úprobe_max_failuresÚPHOTON_PROBE_MAX_FAILURESFNr*   ç        )Úmax_sizeÚttl_secondsÚrequire_mentionÚPHOTON_REQUIRE_MENTIONÚmention_patternsÚPHOTON_MENTION_PATTERNS)r  r  r  >   Ú1ÚonÚyesr  )6rˆ   r‰   r   r  r"   rÈ   r«   Ú_project_idÚ_project_secretÚ_coerce_portÚ_DEFAULT_SIDECAR_PORTÚ_sidecar_portÚ_DEFAULT_SIDECAR_BINDÚ_sidecar_bindÚsecretsÚ	token_hexÚ_sidecar_tokenrN   r¿   Ú_autostart_sidecarr(   Ú	_node_binr�  Ú_probe_intervalÚ_probe_timeoutrL   Ú_probe_max_failuresÚ_probe_enabledÚsupports_code_blocksÚ_sidecar_procÚ_http_clientÚ_respawn_lockÚ_sidecar_supervisor_taskÚ_inbound_taskÚ_sidecar_health_taskÚ_watchdog_taskÚ_inbound_runningÚ_watchdog_runningÚ_sidecar_health_intervalÚ_probe_failuresÚ_last_upstream_activityr   Ú_DEDUP_MAX_SIZEÚ_DEDUP_WINDOW_SECONDSÚ_dedupÚ_sent_message_idsÚ_last_inbound_by_chatÚ_recent_richlinks_by_chatÚ_typing_last_sentÚ_pending_fffcrÊ   r  Ú_compile_mention_patternsÚ_mention_patterns)	rŠ   rç  r  r  Ú	autostartrö  r  r  r‹   s	   &&     @€r3   r‰   ÚPhotonAdapter.__init__6  s­  ù€ Ü‰Ñ˜¤¨(Ó!3Ô4Ø—‘×"Ð" ˆä 8Ó :Ñˆ	Ü 2Ð3FÓ G× uÐ uÈ5Ï9É9ÐUaÓKb× uÐ uÐfo× uÐ uÐsuˆÔäÐ6Ó7×jÐj¸5¿9¹9ÐEUÓ;V×jÐjÐZd×jÐjÐhjð 	Ôä)Ø�I‰I�nÓ%×RÐRÔ);Ð<QÓ)RÔTiókˆÔä2ˆÔÜ0Ð1GÓH×aÐaÌG×L]ÒL]Ð^`ÓLaˆÔÜÔ*Ð+EÀvÓNÓO×UÑUÓWˆ	Ø"+Ð3GÑ"GˆÔÜ+Ð,=Ó>×^Ð^ÔBVÐW]ÓB^ˆŒ÷	ð 	ñ
  (Ð(@ÐBaÐchÔjoÓpˆÔÙ&Ð'>Ð@^Ð`dÔfkÓlˆÔÙ#+Ð,@ÐB]Ð_`ÔbeÓ#fˆÔ Ø"×2Ñ2°QÑ6ˆÔð %*ˆÔ!Ø9=ˆÔØ9=ˆÔØ59ˆÔØY]Ð]ˆÔ%Ð]¨Ô(:¸TÔ=VØ6:ˆÔØ9>Ð>ˆÔ Ô 6Ø(,ˆÔ%Ø ˆÔØ'*ˆÔ$Ü)´?ÔPeÔfˆŒØ35ˆÔØ57ˆÔ"Ø;=ˆÔ&Ø35ˆÔØ;=ˆÔàŸ)™)Ð$5Ó6ˆØÒ"Ü0Ð1IÓJˆOÜ" ?Ó3×9Ñ9Ó;×AÑAÓCÐGaÑaˆÔØ!%×!?Ñ!?Ø);¸uÔ)DˆEÐ$Ö%Ü#Ð$=Ó>ó"@ˆÖr5   c               ó    € V ^8„  d   QhRRRR/# )r.   rg   r   r0   zlist[re.Pattern]r1   )r2   s   "r3   r4   rè  o  s   € ÷ Zñ Z sð ZÐ/?ñ Zr5   c                ó0   € \        V R\        \        R7      # )zP``raw``: list, string (JSON list or comma/newline-separated) or None (defaults).rê  )Ú
log_prefixÚdefaultsÚlogger_)r   Ú_DEFAULT_MENTION_PATTERNSrU   rf   s   &r3   r-  Ú'PhotonAdapter._compile_mention_patternsn  s   € ô (Ø˜HÔ/HÔRXôZð 	Zr5   c               ó    € V ^8„  d   QhRRRR/# )r.   r¥   rN   r0   rr   r1   )r2   s   "r3   r4   rè  t  s   € ÷ ^ñ ^°cð ^¸dñ ^r5   c                	óÆ   a€ \        S4      ;'       dO    \        ;QJ d)    V3R  lV P                   4       F  '       g   K   R# 	  R# ! V3R  lV P                   4       4      # )c              3  óD   <"  € T F  qP                  S4      x € K  	  R # 5ir‡   )r  )r9  Úpatternr¥   s   & €r3   r;  ÚBPhotonAdapter._message_matches_mention_patterns.<locals>.<genexpr>u  s   øé € Ð!]ÑF\¸7§.¡.°×"6Ð"6ÓF\ùó   ƒ TF)rr   ra  r.  )rŠ   r¥   s   &fr3   Ú!_message_matches_mention_patternsÚ/PhotonAdapter._message_matches_mention_patternst  sD   ø€ Ü�D‹z×]Ð]Ÿc›cÔ!]Àd×F\ÒF\Ó!]ŸcœcÐ]šcÐ]˜cÔ!]Àd×F\ÒF\Ó!]Ó]Ð]r5   c               ó    € V ^8„  d   QhRRRR/# )r.   r¥   rN   r0   r1   )r2   s   "r3   r4   rè  w  s   € ÷ ñ ¨ð °ñ r5   c                óâ   a€ V'       d   VP                  4       MRo\        RV3R lV P                   4       4       F/  pSVP                  4       R P                  R4      ;'       g    Tu # 	  V# )zOStrip a leading wake word only (patterns are regexes; never touch later words).r7   Nc              3  óD   <"  € T F  qP                  S4      x € K  	  R # 5ir‡   )Úmatch)r9  r;  Ústrippeds   & €r3   r;  Ú4PhotonAdapter._clean_mention_text.<locals>.<genexpr>z  s   øé € Ð"aÑJ`¸w§=¡=°×#:Ð#:ÓJ`ùr=  z ,:-)ÚlstripÚfilterr.  Úend)rŠ   r¥   rC  rD  s   && @r3   Ú_clean_mention_textÚ!PhotonAdapter._clean_mention_textw  s[   ø€ ç$(�4—;‘;”=¨bˆÜ˜DÔ"aÈ$×J`ÒJ`Ó"aÖbˆEØ˜EŸI™I›K˜LÐ)×0Ñ0°Ó8×@Ð@¸DÒ@ñ càˆr5   c               ó    € V ^8„  d   QhRRRR/# )r.   rœ   rN   r0   r1   )r2   s   "r3   r4   rè  €  s   € ÷ Iñ I ð I¨ñ Ir5   c                	ó>   € R V P                    RV P                   V 2# )úhttp://Ú:)r  r  )rŠ   rœ   s   &&r3   Ú_sidecar_urlÚPhotonAdapter._sidecar_url€  s'   € Ø˜×+Ñ+Ð,¨A¨d×.@Ñ.@Ð-AÀ$ÀÐHÐHr5   c               ó   € V ^8„  d   QhRR/# )r.   r0   zdict[str, str]r1   )r2   s   "r3   r4   rè  ƒ  s   € ÷ ?ñ ? .ñ ?r5   c                	ó   € R V P                   /# )úX-Hermes-Sidecar-Token)r  ©rŠ   s   &r3   Ú_sidecar_headersÚPhotonAdapter._sidecar_headersƒ  s   € Ø(¨$×*=Ñ*=Ð>Ð>r5   Úis_reconnectc               ó    € V ^8„  d   QhRRRR/# )r.   rW  rr   r0   r1   )r2   s   "r3   r4   rè  ˆ  s   € ÷ )ñ )¨Tð )¸dñ )r5   c             ƒ  	ó4  "  € \         '       g   V P                  R RRR7       R# V P                  '       d   V P                  '       g   V P                  RRRR7       R# \        P
                  ! RRR7      pW n        V P                  '       d    V P                  4       G Rj  x€L
  M\"        P%                  R4       \&        P(                  ! 4       pRV n        VP-                  V P/                  4       4      V n        VP-                  V P3                  4       4      V n        \6        P8                  ! 4       V n        V P<                  '       dX   V P                  '       dF   \&        P>                  ! 4       V n         RV n!        VP-                  V PE                  4       4      V n#        V PI                  4        \"        PK                  RV PL                  V PN                  4       V PQ                  R4       R#  ELP  \         d•   p\        T\        4      '       d3   T P                  TP                  \        T4      TP                  R7       MT P                  R	R
T 2RR7       \        4        TP!                  4       G Rj  x€L 
  RT n         Rp?R# Rp?ii ; i5i)ÚMISSING_DEPúhttpx not installedF©r‚   ÚMISSING_CREDENTIALSzRPHOTON_PROJECT_ID and PHOTON_PROJECT_SECRET are required. Run: hermes photon setupr+   ©r¸   Ú	trust_envNr�   z failed to start Photon sidecar: TuD   [photon] sidecar autostart disabled â€” inbound + outbound will failuD   [photon] connected â€” sidecar on %s:%d, streaming inbound over gRPC))r»   Ú_set_fatal_errorr  r	  r¼   ÚAsyncClientr  r  Ú_start_sidecarrT   rd   r   r€   rN   r‚   rp   ÚacloserU   rV   r¹   Úget_event_loopr   Úcreate_taskÚ_inbound_loopr  Ú_monitor_sidecar_healthr  ÚtimeÚ	monotonicr$  r  ÚLockr  r!  Ú_presence_watchdogr  Ú_mark_connectedró   r  r  Ú_wire_plugin_handlers)rŠ   rW  ÚclientrW   Úloops   &$   r3   ÚconnectÚPhotonAdapter.connectˆ  s  é € ß‹Ø×!Ñ! -Ð1FÐRWÐ!ÔXÙØ××Ð t×';×';Ð';Ø×!Ñ!Ø%ØdØð "ô !ñ Ü×"Ò"¨4¸5ÔAˆØ"ÔØ×"×"Ð"ðØ×)Ñ)Ó+×+Ñ+ô �N‰NÐaÔbÜ×%Ò%Ó'ˆØ $ˆÔØ!×-Ñ-¨d×.@Ñ.@Ó.BÓCˆÔØ$(×$4Ñ$4°T×5QÑ5QÓ5SÓ$TˆÔ!Ü'+§~¢~Ó'7ˆÔ$Ø××Ð 4×#:×#:Ð#:Ü!(§¢£ˆDÔØ%)ˆDÔ"Ø"&×"2Ñ"2°4×3JÑ3JÓ3LÓ"MˆDÔØ×ÑÔÜ�‰ÐZØ×&Ñ&¨×(:Ñ(:ô	<à×"Ñ" 4Ô(Ùò7 ,øÜô 
ô ˜aÔ!:×;Ò;Ø×)Ñ)¨!¯&©&´#°a³&ÀAÇKÁKÐ)ÕPà×)Ñ)Ð*:Ð>^Ð_`Ð^aÐ<bÐnrÐ)ÔsÜ&Ô(Ø—m‘m“o×%Ñ%Ø$(�Ô!Ýûð
üsh   ‚4J·JÁ	AJÂG6 Â#G3Â$G6 Â(B%JÅJÅ BJÇ3G6 Ç6JÈA<JÉ=J É>JÊ
JÊJÊJc               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  ³  s   € ÷ "ñ " $ñ "r5   c              ƒ  	ó(  "  € R V n         V P                  4       G Rj  x€L
  V P                  Ruqn        \        V4      G Rj  x€L
  V P                  Ruqn        \        V4      G Rj  x€L
  \        V P                  P                  4       4       F7  w  r#V'       g   K  VP                  4       '       d   K'  VP                  4        K9  	  V P                  P                  4        V P                  4       G Rj  x€L
  V P                  eU   \        P                  ! \        4      ;_uu_ 4        V P                  P!                  4       G Rj  x€L
  RRR4       RV n        V P#                  4        R#  ELU EL2 EL L� L0  + '       g   i     L6; i5i©FN)r   Ú_stop_watchdogr  r   r  Úlistr,  ÚvaluesÚdoneÚcancelÚclearÚ_stop_sidecarr  rm   rn   rT   rc  Ú_mark_disconnected)rŠ   ÚtaskÚ_Ú	fffc_tasks   &   r3   Ú
disconnectÚPhotonAdapter.disconnect³  s/  é € Ø %ˆÔØ×!Ñ!Ó#×#Ð#Ø*.×*CÑ*CÀTÐ'ˆÔ'Ü˜$Ó×ÐØ#'×#5Ñ#5°tÐ ˆÔ Ü˜$Ó×ÐÜ  ×!3Ñ!3×!:Ñ!:Ó!<Ö=‰LˆAß‰y §¡×!1Ô!1Ø× Ñ Ö"ñ >ð 	×Ñ× Ñ Ô"Ø× Ñ Ó"×"Ð"Ø×ÑÒ(Ü×$Ò$¤Y×/Õ/Ø×'Ñ'×.Ñ.Ó0×0Ð0÷ 0à $ˆDÔØ×ÑÖ!ò 	$ââñ
 	#ñ 1÷ 0×/üs|   ‚F�E2ž%FÁE5Á%FÁ)E8Á*1FÂ FÂ8AFÃ9E;Ã:4FÄ.E?ÅE=ÅE?Å"FÅ5FÅ8FÅ;FÅ=E?Å?F	Æ
Fc               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  Å  s   € ÷ ?ñ ?¨dñ ?r5   c                óN   € \         P                  ! V P                  4       4       R# )u�  Notify the gateway of a fatal error from a detached task. The health/supervisor
tasks must NOT await ``_notify_fatal_error()`` inline: the gateway answers with
``disconnect()``, which cancels those very tasks (via its own wrapper task, so the
``current_task()`` guard can't help) â€” the CancelledError would kill the notifier
mid-handoff: no log, no reconnect. A fresh task can be cancelled freely.N)r¹   re  Ú_notify_fatal_error_loggedrT  s   &r3   Ú_dispatch_fatal_notificationÚ*PhotonAdapter._dispatch_fatal_notificationÅ  s   € ô 	×Ò˜D×;Ñ;Ó=Ö>r5   c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  Í  s   € ÷ Pñ P°$ñ Pr5   c              ƒ  	ó¢   "  €  V P                  4       G R j  x€L
  R #  L  \         d"   p\        P                  RT4        R p?R # R p?ii ; i5i)Nz,[photon] fatal-error notification failed: %s)Ú_notify_fatal_errorrT   rU   rV   )rŠ   rµ   s   & r3   r„  Ú(PhotonAdapter._notify_fatal_error_loggedÍ  s@   é € ð	PØ×*Ñ*Ó,×,Ô,øÜô 	PÜ�N‰NÐIÈ3×OÒOûð	Püs6   ‚A„  —˜  œAž   A«AÁAÁAÁAc               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  Õ  s   € ÷ 1ñ 1 Tñ 1r5   c              ƒ  óŠ  "  € V P                   pVf   R# V P                  R4      pV P                  4       pRpV P                  '       dÂ    VP	                  RW#RR7      ;_uu_4       GRj  x€L
 pVP
                  ^È8w  d   \        RVP
                   24      hRp\        V4        Rj  x€L
  pV P                  '       g    M5VP                  4       pV'       g   K8  V P                  V4      G Rj  x€L
  KS  RRR4      GRj  x€L
  KÓ  R#  L¡ Ld LDgL L  + GRj  x€L 
 '       g   i     Kù  ; i  \        P                   d    h \         dm   pT P                  '       g    Rp?R# \        P                  RYt4       \        P                  ! T4      G Rj  x€L 
  \!        T^,          R4      p Rp?EKƒ  Rp?ii ; i5i)	z|Consume the sidecar's ``/inbound`` NDJSON stream, re-opening it if it drops
(the sidecar owns the gRPC reconnect to Photon).Nz/inboundg      ð?ÚGET©Úheadersr¸   z/inbound returned z;[photon] inbound stream dropped (%s); reconnecting in %.1fsr+   )r  rO  rU  r   Ústreamr�   ÚRuntimeErrorr@   rÊ   Ú_on_inbound_liner¹   ÚCancelledErrorrT   rU   rV   ÚsleepÚmin)rŠ   rn  r=  r�  ÚbackoffÚrespr?   rW   s   &       r3   rf  ÚPhotonAdapter._inbound_loopÕ  st  é € ð ×"Ñ"ˆØŠ>ÙØ×Ñ 
Ó+ˆØ×'Ñ'Ó)ˆØˆØ×#×#Ð#ð1Ø!Ÿ=™=¨°Èd˜=×S×SÔSÐW[Ø×'Ñ'¨3Ô.Ü*Ð-?À×@PÑ@PÐ?QÐ+RÓSÐSØ!�GÜ&9¸$Ô&?÷ :ð :˜dØ#×4×4Ð4Ù!Ø#Ÿz™z›|˜ß#Ù$Ø"×3Ñ3°DÓ9×9Ò9÷ T×SÑSñ $áSñ:ñ :ñ '@÷	 T×S×SÓSûô ×)Ñ)ô ØÜô 1Ø×,×,Ð,ÝÜ—‘Ð\Ð^_ÔiÜ—m’m GÓ,×,Ñ,Ü˜g¨�k¨4Ó0—ûð1üsä   ‚AGÁ D4 Á+DÁ,D4 Á/7DÂ&DÂ*D
Â+DÂ.-DÃDÃ2D
Ã3DÃ9D4 ÄDÄD4 Ä	GÄD4 ÄDÄDÄDÄD4 ÄD1	ÄD Ä
D1	Ä)D1	Ä+D4 Ä/GÄ1D4 Ä4G ÅG ÅF;Å&GÅ,/F;ÆFÆF;Æ4GÆ;G Ç Gc               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  ô  s   € ÷ ñ ¨tñ r5   c              ƒ  ó  "  € V P                   '       Edª   \        P                  ! V P                  4      G Rj  x€L
  V P                   '       g   R#  V P	                  R/ 4      G Rj  x€L
 p\        T\        4      '       d   TP                  R4      MRp\        T\        4      '       g   K«  TP                  R4      p\        T\        4      '       dK   TP                  R4      RJ d6   \        P                  RTP                  R	4      TP                  R
4      4       TP                  R4      RJd   EK4  RTP                  R4      ;'       g    R RTP                  R4       RTP                  R4      ;'       g    R 2p\        P                  RT4       T P                  RTRR7       T P                  4        R# R#  ELˆ EL\  \        P
                   d    h \         d#   p\        P                  RT4        Rp?EK  Rp?ii ; i5i)z•Promote a degraded upstream stream (per ``/healthz``) into a reconnect, so a
live sidecar HTTP process with a dead gRPC stream isn't a silent outage.Nú/healthzz([photon] sidecar health check failed: %sr�  Ú	stalenessÚzombieSuspectedTzV[photon] sidecar reports suspected zombie stream (silentForMs=%s, lastProbeOutcome=%s)ÚsilentForMsÚlastProbeOutcomeÚokFz'Photon upstream stream degraded (state=ÚstateÚunknownz, degradedForMs=ÚdegradedForMsr¢   Ú	lastIssuezunknown stream issueú[photon] %sÚUPSTREAM_STREAM_DEGRADEDr\  )r   r¹   r”  r"  Ú_sidecar_callr“  rT   rU   rË   rd   re   r«   rV   rž   r`  r…  )rŠ   r¦   rµ   r�  rœ  r„   s   &     r3   rg  Ú%PhotonAdapter._monitor_sidecar_healthô  s¹  é € ð ×#×#Ñ#Ü—-’- × =Ñ =Ó>×>Ð>Ø×(×(Ð(ÙðØ!×/Ñ/°
¸BÓ?×?�ô ,6°d¼D×+AÒ+A�T—X‘X˜hÔ'ÀtˆFÜ˜f¤d×+Ò+ÙàŸ
™
 ;Ó/ˆIÜ˜)¤T×*Ò*¨y¯}©}Ð=NÓ/OÐSWÓ/WÜ—‘ð  Hà(Ÿ}™}¨]Ó;¸Y¿]¹]ÐK]Ó=^ô`ð �z‰z˜$Ó uÓ,Úà9¸&¿*¹*ÀWÓ:M×:ZÐ:ZÐQZÐ9[ð \!Ø!'§¡¨OÓ!<Ð =¸SÀÇÁÈKÓAX×ArÐArÐ\rÐ@sðuð ô �L‰L˜¨Ô0Ø×!Ñ!Ð"<¸gÐQUÐ!ÔVØ×-Ñ-Ô/Ùñ9 $Ú>ò @øÜ×)Ñ)ô ØÜô Ü—‘ÐGÈÔMÞûðüsj   ‚H–#H¹GºHÁHÁG Á(GÁ)G Á-C"HÅ-HÅ>AHÇG ÇH	Ç&H	Ç'HÇ=HÈH	È	Hc               ó    € V ^8„  d   QhRRRR/# )r.   r?   rN   r0   rP   r1   )r2   s   "r3   r4   rè    s   € ÷ Añ A¨3ð A°4ñ Ar5   c              ƒ  	ó¼  "  € V P                  4         \        P                  ! V4      pTP                  R4      pT'       d$   T P                  P                  T4      '       d   R#  T P                  T4      G Rj  x€L
  R#   \        P                   d    \        P                  R 4        R# i ; i L7  \         d    \        P                  R4        R# i ; i5i)z'[photon] skipping non-JSON inbound lineNÚ	messageIdz [photon] inbound dispatch failed)Ú_note_upstream_activityr_   r`   ÚJSONDecodeErrorrU   rË   r«   r'  Úis_duplicateÚ_dispatch_inboundrT   Ú	exception)rŠ   r?   ÚeventÚmsg_ids   &&  r3   r’  ÚPhotonAdapter._on_inbound_line  s³   é € Ø×$Ñ$Ô&ð	Ü—J’J˜tÓ$ˆEð —‘˜;Ó'ˆß�d—k‘k×.Ñ.¨v×6Ò6Ùð	AØ×(Ñ(¨Ó/×/Ò/øô ×#Ñ#ô 	Ü�L‰LÐBÔCÚð	úñ 0øÜô 	AÜ×ÑÐ?×@ð	Aüsi   ‚C”B ªCÁ CÁ$CÁ'B5 Á;B3Á<B5 Â CÂ*B0Â,CÂ/B0Â0CÂ3B5 Â5 CÃCÃCÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r.   Úchat_keyrN   rÈ  r0   rP   r1   )r2   s   "r3   r4   rè  $  s&   € ÷ Jñ J°Cð JÀSð JÈTñ Jr5   c              ƒ  	óÊ   "  € \         P                  ! \        4      G R j  x€L
  V P                  P	                  VR 4      '       d   \
        P                  RW!4       R # R #  L@5i)Nz_[photon] wait for attachment was too long, can't retrieve attachment data (message %s, chat %s))r¹   r”  Ú_FFFC_WAIT_SECONDSr,  r;   rU   rV   )rŠ   rµ  rÈ  s   &&&r3   Ú_fffc_timeout_handlerÚ#PhotonAdapter._fffc_timeout_handler$  sP   é € Ü�mŠmÔ.Ó/×/Ð/Ø×Ñ×!Ñ! (¨D×1Ò1Ü�N‰Nð 3Ø4>öJñ 2ñ 	0ùs   ‚A# A!¡%A#ÁA#c               ó    € V ^8„  d   QhRRRR/# )r.   rµ  rN   r0   rr   r1   )r2   s   "r3   r4   rè  *  s   € ÷ ñ ¨Sð °Tñ r5   c                óü   € V P                   P                  VR4      p\        T;'       d.    V^,          ;'       d    V^,          P                  4       '       * 4      pV'       d   V^,          P	                  4        V# )zMPop and cancel a pending U+FFFC timeout; True when a live task was cancelled.N)r,  r;   rr   rx  ry  )rŠ   rµ  ÚprevÚlives   &&  r3   Ú_cancel_pending_fffcÚ"PhotonAdapter._cancel_pending_fffc*  s[   € à×!Ñ!×%Ñ% h°Ó5ˆÜ�D×;Ð;˜T !�W×;Ð;¨T°!­W¯\©\«^Ô);Ó<ˆßØ��G�N‰NÔØˆr5   c               ó    € V ^8„  d   QhRRRR/# )r.   r±  r5  r0   rP   r1   )r2   s   "r3   r4   rè  2  s"   € ÷ igñ ig¨^ð igÀñ igr5   c           
   ƒ  óP  a aaaaaaa"  € SP                  R4      ;'       g    / pSP                  R4      ;'       g    / pSP                  R4      ;'       g    / pVP                  R4      ;'       g    RoS'       g   \        P                  R4       R# VP                  R4      R	8X  d   R	MR
oVP                  R4      ;'       g    VP                  R4      ;'       g    So\        SP                  R4      ;'       g    R4      oSP                  R4      o/ oVP                  R4      R8X  dò   \	        VP                  R4      \
        4      '       dÍ   VR,          P                  R4      R-9  d°   VP                  R4      pVP                  R4      ;'       g    RpV'       d   V'       g   \        SV4      MRpVP                  R4      R8H  ;'       g/    \        T;'       d    VS P                  9   4      ;'       g    VRJpRTRT;'       g    TRV/oVR,          pVP                  R4      p	\        P                  3R VVVVV VVV3R lllp
V	R.9   d2   \        P                  RVP                  R4      ;'       g    R4       R# V	R8X  dÀ   VP                  R4      pVP                  R4      R8H  ;'       g    T;'       d    VS P                  9   pV'       g   \        P                  R4       R# S P                  T
! RVP                  R4      ;'       g    R 2TVP                  R4      ;'       g    RRR7      4      G Rj  x€L
  R# V	R 8X  d«   VP                  R 4      ;'       g    RP                  4       R!8X  d}   S P                  S4       \        P                   ! S P#                  SS;'       g    R4      4      p\$        P&                  ! 4       V3S P(                  S&   \        P                  R"4       R# V	R/9   d-   S P                  S4      '       d   \        P                  R#4       S P+                  SV4      '       d"   \        P-                  R$\/        V4      4       R# S P1                  SS4       V	R%8X  d–   VP                  R&4      R'J d   \        P                  R(4       R# VP                  R)4      ;'       g    RP                  4       pV'       g   \        P                  R*4       R# S P                  V
! V4      4      G Rj  x€L
  R# SR	8H  ;'       d    S P2                  pV'       d8   S P5                  \7        V4      4      '       g   \        P                  R+4       R# V	\8        9   d*   \        P:                  ! \<        V4      G Rj  x€L
 w  ppppM\=        V4      w  ppppV'       d   S P?                  V4      pS PA                  S\C        V4      ;'       g    T4       S P                  V
! VVVVR,7      4      G Rj  x€L
  R#  ELÑ EL	 Lƒ L5i)0uK  Normalize a sidecar inbound event ``{messageId, space: {id, type: dm|group, phone},
sender: {id}, content: {type: text|attachment|voice|reaction|richlink|group|
poll_option|read, ...}, timestamp}`` and dispatch it. Attachment/voice bytes arrive
inline as base64 ``data`` under the sidecar's cap; otherwise metadata only â†’ marker.ÚspaceÚsenderr4  r`  r7   z![photon] inbound missing space.idNr¾   rN  ÚdmÚphoneÚ	timestampr«  Úreplyr¢  ÚtargetMessageIdÚ
targetTextÚtargetDirectionÚoutboundÚreply_to_message_idÚreply_to_textÚreply_to_is_own_messagec               ó(   € V ^8„  d   QhRRRRRRRR/# )	r.   r¥   rN   r’  r   Úkwargsr   r0   r   r1   )r2   s   "r3   r4   Ú5PhotonAdapter._dispatch_inbound.<locals>.__annotate__V  s/   € ÷ 	Rñ 	R˜ð 	R [ð 	RÈsð 	RÐWcñ 	Rr5   c                óÈ   <€ S
P                  SSSSS;'       g    R SR7      pS	P                  4        F  w  rEVP                  WE4       K  	  \        RRV RVRVRSRSRS/VB # )	N)r¼  Ú	chat_nameÚ	chat_typeÚuser_idÚ	user_namerÈ  r¥   Úmessage_typeÚsourcerÈ  Úraw_messagerÆ  r1   )Úbuild_sourcerI  Ú
setdefaultr   )r¥   r’  rÐ  rØ  rð  ÚvaluerÔ  r±  rÈ  Ú	reply_ctxrŠ   Ú	sender_idrØ  rÆ  s   &&,   €€€€€€€€r3   Ú_eventÚ/PhotonAdapter._dispatch_inbound.<locals>._eventV  s�   ø€ Ø×&Ñ&¨xÀ8ÐW`Ø/8ÀI×DUÐDUÐQUÐblð 'ó nˆFà'Ÿo™oÖ/‘
�Ø×!Ñ! #Ö-ñ 0äñ R Tð R¸ð RÀfð RÐYcð RØ,1ðRØ=FðRØJPñRð Rr5   z"[photon] outbound message read: %sÚreactionz6[photon] ignoring reaction on a message we didn't sendzreaction:added:ÚemojiT)rÌ  rÍ  rÎ  r¥   u   ï¿¼u?   [photon] U+FFFC placeholder received â€” waiting for attachmentu9   [photon] attachment arrived â€” cancelling U+FFFC timeoutz5[photon] suppressing rich-link preview attachment: %sÚpoll_optionÚselectedFz"[photon] ignoring poll deselectionr>  z,[photon] ignoring poll vote with empty titlezR[photon] ignoring group message (require_mention=true, no mention pattern matched))r¥  r¦  )Nr¢  >   ÚreadÚread_receipt>   r�  r\  )"r«   rU   rV   r}  rd   re   rÔ  rr   r(  r   r   rË   Úhandle_messagerÊ   r¾  r¹   re  r¸  rh  ri  r,  Ú_is_recent_richlink_previewró   rn  Ú_record_last_inboundr  r>  r¶  Ú_BINARY_CONTENT_TYPESÚ	to_threadrº  rI  Ú_record_recent_richlinkrV  )rŠ   r±  rÂ  rÃ  r4  Ú	target_idÚtarget_textÚstored_textÚis_ownrX  rß  Úis_oursr}  ÚchoiceÚgatedr¥   r’  r¥  r¦  rÔ  rÈ  rÝ  rÞ  rØ  rÆ  s   ff                 @@@@@@r3   r¯  ÚPhotonAdapter._dispatch_inbound2  sP  ÿé € ð
 —	‘	˜'Ó"×(Ð( bˆØ—‘˜8Ó$×*Ð*¨ˆØ—)‘)˜IÓ&×,Ð,¨"ˆØ—9‘9˜T“?×(Ð( bˆßÜ�N‰NÐ>Ô?ÙØ$Ÿy™y¨Ó0°GÔ;‘GÀˆ	Ø—J‘J˜tÓ$×FÐF¨¯	©	°'Ó(:×FÐF¸hˆ	Ü$ U§Y¡Y¨{Ó%;×%AÐ%A¸rÓBˆ	Ø—Y‘Y˜{Ó+ˆ
ð %'ˆ	Ø�;‰;�vÓ 'Ô)¬j¸¿¹ÀYÓ9OÔQU×.VÒ.VØ˜IÕ&×*Ñ*¨6Ó2Ð:KÔKØŸ™Ð$5Ó6ˆIØ!Ÿ+™+ lÓ3×;Ð;°tˆK÷ EN×VaÔ+¨H°iÔ@ÐgkˆKð —[‘[Ð!2Ó3°zÑA÷ ^ð ^ÄTØ×AÐA˜i¨4×+AÑ+AÑAóFC÷ ^ð ^ØFQÐY]ÐF]ð à.°	¸?ÈK×LfÐLfÐ[fØ2°Fð<ˆIà˜iÕ(ˆGØ—‘˜FÓ#ˆä3>×3CÑ3C÷ 	R÷ 	Rñ 	Rð Ð,Ô,Ü�L‰LÐ=¸w¿{¹{ÐK\Ó?]×?jÐ?jÐajÔkÙØ�JÔð  Ÿ™Ð$5Ó6ˆIØ—k‘kÐ"3Ó4¸
ÑB÷ Cð CØ×AÐA˜i¨4×+AÑ+AÑAð çÜ—‘ÐUÔVÙð ×%Ñ%¡fØ! '§+¡+¨gÓ"6×"<Ð"<¸"Ð!=Ð>ÐT]Ø%Ÿk™k¨,Ó7×?Ð?¸4ÐY]ô'_ó `÷ `ð `ñ ð �FŒ? §¡¨FÓ 3× 9Ð 9°r×@Ñ@ÓBÀhÔNØ×%Ñ% hÔ/Ü×&Ò& t×'AÑ'AÀ(ÈJ×L\ÐL\ÐZ\Ó']Ó^ˆDÜ,0¯NªNÓ,<¸dÐ+CˆD×Ñ˜xÑ(Ü�L‰LÐZÔ[ÙØÐ+Ô+°×0IÑ0IÈ(×0SÒ0SÜ�L‰LÐTÔUð ×+Ñ+¨H°g×>Ò>Ü�K‰KÐOÔQhÐipÓQqÔrÙð 	×!Ñ! (¨JÔ7Ø�MÔ!ð �{‰{˜:Ó&¨%Ó/Ü—‘ÐAÔBÙØ—k‘k 'Ó*×0Ð0¨b×7Ñ7Ó9ˆFßÜ—‘ÐKÔLÙØ×%Ñ%¡f¨V£nÓ5×5Ð5Ùð ˜WÑ$×=Ð=¨×)=Ñ)=ˆß˜×?Ñ?Ô@RÐSZÓ@[×\Ò\Ü�L‰LÐmÔnÙØÔ)Ô)ä9@×9JÒ9JÔK]Ð_fÓ9g×3gÑ0ˆD�%˜¡[ä3EÀgÓ3NÑ0ˆD�%˜ [ßØ×+Ñ+¨DÓ1ˆDØ×$Ñ$ XÔ/IÈ'Ó/R×/ZÐ/ZÐVZÔ[Ø×!Ñ!¡&¨¨uÀÐYdÔ"eÓf×fÒfòa`ò@ 6ñ 4hñ 	gùs  Š3X&¾X&ÁX&Á4
X&Á?AX&ÃX&Ã!X&ÄBX&Æ
X&Æ'X&Æ/(X&ÇX&Ç'X&ÈX&ÈA/X&Ê;X&Ê?	X&Ë	X&Ë!<X&ÌX&Ì;X&ÍXÍ$X&Í1AX&Î=A#X&Ð!,X&ÑA=X&ÓX&Ó%1X&ÔXÔX&Ô)X&Ô>A X&ÖX"Ö!X&×.X&×0%X&ØX$ØX&ØX&Ø"X&Ø$X&c               ó    € V ^8„  d   QhRRRR/# )r.   Úcmdz	list[str]r0   r"  r1   )r2   s   "r3   r4   rè     s   € ÷ ñ ˜9ð ¨ñ r5   c                ó´   €  \         P                  ! V \         P                  RRRRRRR7      P                  #   \        \         P
                  3 d     R# i ; i)z9stdout of a short shell-out, or None if it failed to run.TrÛ   rÜ   r,   F)rÝ   rß   r¥   r^   rà   r¸   rá   N)rä   rå   ræ   rõ   rb   rò   )rö  s   &r3   Ú_quick_stdoutÚPhotonAdapter._quick_stdoutŸ  sW   € ð	Ü—>’>Øœ:×-Ñ-¸dÈÐX_ÐhqÐ{~Øôç#™Vð$øô œ×2Ñ2Ð3ô 	Úð	ús   ‚58 ¸AÁAc               ó    € V ^8„  d   QhRRRR/# )r.   rK   rL   r0   z	list[int]r1   )r2   s   "r3   r4   rè  ª  s   € ÷ eñ e sð e¨yñ er5   c                óä   € V P                  RRRV 2R.4      pVeO   VP                  4        Uu. uF3  q3P                  4       P                  4       '       g   K(  \	        V4      NK5  	  up# . # u upi )zBPIDs listening on a local TCP port (empty if none/undeterminable).Úlsofz-tiztcp:z-sTCP:LISTEN)rø  r:   rÊ   ÚisdigitrL   )ÚclsrK   ÚoutÚtoks   &&  r3   Ú_find_listener_pidsÚ!PhotonAdapter._find_listener_pids©  s`   € ð ×Ñ ¨°$°t°f°¸~Ð NÓOˆØMPÊ_ C§I¡I¤KÓI¡K˜S·9±9³;×3FÑ3F×3H””�C–¡KÑIÐdÐbdÐdùÒIs   ¯%A-ÁA-c               ó    € V ^8„  d   QhRRRR/# ©r.   rO   rL   r0   rr   r1   )r2   s   "r3   r4   rè  °  s   € ÷ Eñ E #ð E¨$ñ Er5   c                ób   € V P                  RR\        V4      RR.4      pVRJ;'       d    RV9   # )zITrue if ``pid``'s command line is a Photon sidecar (any Hermes checkout).Úpsz-pz-ozcommand=Nzphoton/sidecar/index.mjs)rø  rN   )rþ  rO   rÿ  s   && r3   Ú_pid_is_sidecarÚPhotonAdapter._pid_is_sidecar¯  s;   € ð ×Ñ  t¬S°«X°t¸ZÐ HÓIˆØ˜$ˆ×DÐDÐ#=ÀÑ#DÐDr5   c               ó    € V ^8„  d   QhRRRR/# r  r1   )r2   s   "r3   r4   rè  ¶  s   € ÷ ñ ˜ð  ñ r5   c                	óZ   €  \         P                  ! V ^ 4       R#   \         d     R# i ; i)rC   FT)rx   rz   rb   )rO   s   &r3   Ú
_pid_aliveÚPhotonAdapter._pid_aliveµ  s-   € ð	Ü�GŠG�C˜ŒOñ øô ô 	Úð	ús   ‚ ›*©*c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  ½  s   € ÷ %pñ %p¨4ñ %pr5   c              ƒ  ó  a "  € \         P                  R8X  d   R#  \        P                  ! RRR7      ;_uu_4       GRj  x€L
 pVP	                  S P                  R4      S P                  4       R7      G Rj  x€L
  RRR4      GRj  x€L
  T 3R lp\        P                  ! T4      G Rj  x€L
 w  r4R	pT'       g)   \        R
S P                   RT;'       g    R RT 24      hR R lpT F;  p\        P                  RTS P                  4       T! T\        P                  4       K=  	  \         P                   ! 4       R,           p\         P                   ! 4       T8  da   \"        ;QJ d    T 3R lT 4       F  '       g   K   RM	  RM! T 3R lT 4       4      '       d!   \        P$                  ! R4      G Rj  x€L
  Kz  T F3  pS P'                  T4      '       g   K  T! T\        P(                  4       K5  	  \        P$                  ! R4      G Rj  x€L
  T'       d   \        R
S P                   RT RT 24      hR#  EL ELÌ EL¿  + GRj  x€L 
 '       g   i     EL×; i  \        P                   d     R# i ; i EL× LÊ Ls5i)zËKill an orphaned sidecar squatting our port (a SIGKILLed gateway leaves one whose
token we don't know, so every respawn dies on EADDRINUSE). Listeners are verified
by command line before being signalled.Úwin32Nç       @Fr^  r›  ©r�  c                 óØ   <€ SP                  SP                  4      p V  Uu. uF  pSP                  V4      '       g   K  VNK   	  ppY  Uu. uF  qV9  g   K  VNK  	  up3# u upi u upi r‡   )r  r  r  )ÚfoundrO   ÚminerŠ   s      €r3   Ú_inspectÚ3PhotonAdapter._reap_stale_sidecar.<locals>._inspectÉ  se   ø€ Ø×,Ñ,¨T×-?Ñ-?Ó@ˆEÙ#(ÓF¡5˜C¨D×,@Ñ,@À×,E—C�C¡5ˆDÐFØ¨ÓB© #¸T±/Ÿ#˜#©ÑBÐBÐBùò GùÚBs   ¡A"¿A"ÁA'ÁA'z6free it or set PHOTON_SIDECAR_PORT to a different portzport z% is in use by another process (pids: r¢  u   , not a Photon sidecar) â€” c               ó$   € V ^8„  d   QhRRRRRR/# )r.   rO   rL   Úsigr0   rP   r1   )r2   s   "r3   r4   Ú7PhotonAdapter._reap_stale_sidecar.<locals>.__annotate__Ó  s!   € ÷ 	"ñ 	"�sð 	" ð 	"¨ñ 	"r5   c                ó°   € \         P                  ! \        4      ;_uu_ 4        \        P                  ! W4       R R R 4       R #   + '       g   i     R # ; ir‡   )rm   rn   rb   rx   rz   )rO   r  s   &&r3   Ú_killÚ0PhotonAdapter._reap_stale_sidecar.<locals>._killÓ  s.   € Ü×$Ò$¤W×-Õ-Ü—’˜Ô!÷ .×-×-Ò-ús   £AÁA	z5[photon] reaping orphaned sidecar (pid %d) on port %dç      @c              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir‡   )r  )r9  rA  rŠ   s   & €r3   r;  Ú4PhotonAdapter._reap_stale_sidecar.<locals>.<genexpr>Ú  s   øé € Ð,OÉÀA¨T¯_©_¸Q×-?Ð-?Ëùs   ƒ!Tgš™™™™™¹?çš™™™™™É?z. is also held by non-sidecar processes (pids: u   ) â€” )ÚsysÚplatformr¼   ra  ÚpostrO  rU  ÚRequestErrorr¹   rë  r‘  r  rU   rV   ÚsignalÚSIGTERMrh  ra  r”  r  ÚSIGKILL)	rŠ   rn  r  ÚstaleÚforeignÚfixr  rO   Údeadlines	   f        r3   Ú_reap_stale_sidecarÚ!PhotonAdapter._reap_stale_sidecar½  s  øé € ô �<‰<˜7Ô"Ùð	Ü×(Ò(°À×F×FÕFÈ&Ø—k‘k $×"3Ñ"3°JÓ"?È×I^ÑI^ÓI`�kÓa×aÐa÷ G×Fõ
	Cô  '×0Ò0°Ó:×:‰ˆØFˆßÜ  t×'9Ñ'9Ð&:ð ;)Ø)0×)=Ð)=°IÐ(>Ð>ZÐ[^ÐZ_ð aó bð bõ	"ó ˆCÜ�N‰NÐRÐTWÐY]×YkÑYkÔlÙ�#”v—~‘~Ö&ñ ô —9’9“; Õ$ˆÜ�iŠi‹k˜HÔ$¯«Ô,OÉÓ,O¯¯ªÔ,OÉÓ,O×)OÒ)OÜ—-’- Ó$×$Ò$ÛˆCØ�‰˜s×#Ô#Ù�cœ6Ÿ>™>Ö*ñ ô �mŠm˜CÓ × Ð ßÜØ˜×*Ñ*Ð+Ð+YÐZaÐYbÐbhÐilÐhmÐnópð pñ ò9 GÚa÷ G×F×FÔFûä×!Ñ!ô 	Úð	úò ;ñ %ñ 	!ùsé   ƒJ
œ$I' Á IÁI' Á4I
Á8IÁ9I
Á=I' ÂIÂ	I' ÂJ
Â,JÂ-+J
ÃBJ
Å-J
ÆJ
Æ"J
Æ;JÆ<J
Ç 4J
ÈJÈJ
È! J
ÉI' ÉI
ÉI' É
I$	ÉIÉ
I$	ÉI$	ÉI' É"J
É$I' É'J É<J
É?J Ê J
ÊJ
ÊJ
c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  ä  s   € ÷ =ñ =¨Dñ =r5   c              ƒ  ó²  "  € \        4       '       gv   \        P                  R\        4       4       \        P
                  ! \        4      G Rj  x€L
  \        4       '       g&   \        R\        4        R\        4        R2RRR7      h\        4       '       d:   \        P                  R	4       \        P
                  ! \        4      G Rj  x€L
  R# R#  L„ L
5i)
zICold-install or refresh sidecar node_modules before spawn (off the loop).z7[photon] sidecar deps not installed; installing into %sNz0Photon sidecar deps could not be installed into z& (see log for the npm error). Run: cd z' && npm ci   (or `hermes photon setup`)ÚSIDECAR_DEPS_MISSINGFr�   zX[photon] sidecar deps are stale (lockfile newer than install); reinstalling before start)
r³   rU   ró   r&   r¹   rë  rø   r   rÑ   rV   rT  s   &r3   Ú_ensure_sidecar_depsÚ"PhotonAdapter._ensure_sidecar_depsä  s²   é € ä%×'Ò'ä�K‰KÐQÔS_ÓSaÔbÜ×#Ò#Ô$;Ó<×<Ð<Ü)×+Ò+ä/ØFÜ#“~Ð&ð 'Ü+›~Ð.Ð.UðWð 0¸5ô	Bð Bô × Ò Ü�N‰NÐuÔvÜ×#Ò#Ô$;Ó<×<Ò<ñ !ñ =ñ =ùs%   ‚ACÁCÁA;CÃ
CÃ	CÃCc               ó    € V ^8„  d   QhRRRR/# )r.   Ú
hide_flagsrL   r0   rP   r1   )r2   s   "r3   r4   rè  ÷  s   € ÷ `ñ `°cð `¸dñ `r5   c              ƒ  óž  "  €  \         P                  ! \        P                  V P                  \        \        4       R,          4      \        \        4       4      .RRRR^
RV\        4       R7
      G Rj  x€L
 pVP                  ^ 8w  dB   \        VP                  ;'       g    VP                  ;'       g    RP                  4       4      hVP                  P                  4       '       d1   \        P                  R	VP                  P                  4       4       R# R#  L¨  \         d"   p\        P!                  R
T4        Rp?R# Rp?ii ; i5i)z^Run the mixed-attachment patch script (best-effort, off the loop: up to 10s, every reconnect).z$patch-spectrum-mixed-attachments.mjsTrÛ   rÜ   F)rß   r¥   r^   rà   r¸   rá   rã   râ   Nr7   r¥  z<[photon] failed to apply Spectrum mixed attachment patch: %s)r¹   rë  rä   rå   r  rN   r&   r)   rñ   r‘  rô   rõ   rÊ   rU   rË   rT   rV   )rŠ   r4  Úpatchrµ   s   &&  r3   Ú_apply_spectrum_patchÚ#PhotonAdapter._apply_spectrum_patch÷  s  é € ð	`Ü!×+Ò+Ü—‘Ø—‘¤¤\£^Ð6\Õ%\Ó!]Ô_bÔcoÓcqÓ_rÐsØ#¨$¸ÈÐ\^ÐfkØ(Ô.CÓ.Eô	G÷ GˆEð
 ×Ñ 1Ô$Ü" E§L¡L×$FÐ$F°E·L±L×$FÐ$FÀB×#MÑ#MÓ#OÓPÐPØ�|‰|×!Ñ!×#Ò#Ü—‘˜]¨E¯L©L×,>Ñ,>Ó,@ÖAñ $ñGøô ô 	`Ü�N‰NÐYÐ[^×_Ò_ûð	`üsS   ‚E„A/D Á3DÁ4,D Â!D Â54D Ã*.D ÄEÄD ÄE
Ä)EÄ?EÅE
Å
Ec               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè    s   € ÷ >Zñ >Z dñ >Zr5   c              ƒ  	ó¦  "  € V P                   f~   ^ R Ip \        P                  ! VP                  R4      G R j  x€L
  VP                  R4      pVe   VP                  f   VP                  RR4      h\        VP                  4      V n         V P                  4       G R j  x€L
  V P                  4       G R j  x€L
  \        4       pVP                  RV P                  RV P                  R\        V P                   4      R	V P"                  R
V P$                  RR/4       ^ RIHp V P+                  V! 4       4      G R j  x€L
   \,        P.                  ! V P                   \        \1        4       R,          4      .\,        P2                  \,        P2                  \,        P4                  V\6        P8                  R8g  V! 4       R7      V n        \        P>                  ! 4       pTPA                  T PC                  T P:                  4      4      T n"        \F        PF                  ! 4       R,           pR p\H        PJ                  ! RRR7      ;_uu_4       GR j  x€L
 p	\F        PF                  ! 4       T8  dþ   T P:                  PM                  4       e.   \O        4        \Q        RT P:                  PR                   R24      h T	PU                  T PW                  R4      T PY                  4       R7      G R j  x€L
 p
T
PZ                  ^È8X  dI   \]        T P                   T P$                  T P:                  P^                  4        R R R 4      GR j  x€L
  R #  \        Pb                  ! R4      G R j  x€L
  EK  R R R 4      GR j  x€L
  \O        4        \Q        RT 24      h EL[  TP                   d   p\        \        T4      RRR7      ThR p?ii ; i EL( EL EL�  \<         d&   p\        RT P                   : RT 2RRR7      ThR p?ii ; i EL´ EL LÆ  \H        P`                   d   pTp R p?LÝR p?ii ; i LË Lº  + GR j  x€L 
 '       g   i     LÑ; i5i)NrÅ   rÔ   ÚSIDECAR_NODE_MISSINGFr�   rþ   r   rì  ÚPHOTON_SIDECAR_BINDrí  ÚPHOTON_SIDECAR_WATCH_STDINr  rÕ   z	index.mjsr  )rÝ   rõ   rô   râ   Ústart_new_sessionrã   znode binary not found (u6   ) â€” install Node.js 18+ or run `hermes pm install`: r*   r  r^  z Photon sidecar exited with code z before becoming readyr›  r  r   z0Photon sidecar did not become ready within 15s: )2r  rÇ   r¹   rë  rì   rí   rî   rï   rN   r   r1  r,  r)   rÜ  r  r	  r  r  r  rð   rÖ   r7  rä   ÚPopenr&   ÚPIPEÚSTDOUTr!  r"  r  ÚFileNotFoundErrorrd  re  Ú_supervise_sidecarr  rh  r¼   ra  Úpollrp   r‘  rñ   r#  rO  rU  r�   rX   rO   r$  r”  )rŠ   rÇ   rö   rµ   râ   rÖ   ro  r+  Úlast_errrn  r—  rW   s   &           r3   rb  ÚPhotonAdapter._start_sidecar  s�  é € Ø�>‰>Ò!ÛðqÜ×'Ò'¨¯	©	°6Ó:×:Ð:Ø×0Ñ0°Ó8�	ØÒ$¨	×(8Ñ(8Ò(@ØŸ/™/¨&Ð2_Ó`Ð`Ü!$ Y×%5Ñ%5Ó!6�”ð ×'Ñ'Ó)×)Ð)Ø×&Ñ&Ó(×(Ð(Ü#Ó%ˆØ�
‰
Ø ×!1Ñ!1Ð3JÈD×L`ÑL`Ø!¤3 t×'9Ñ'9Ó#:Ð<QÐSW×SeÑSeØ" D×$7Ñ$7à(¨#ð/ô 	0õ 	EØ×(Ñ(Ñ);Ó)=Ó>×>Ð>ð	Ü!+×!1Ò!1Ø—‘¤¤\£^°kÕ%AÓ!BÐCÜ —o‘o¬j¯o©oÄj×FWÑFWÐ]`Ü#&§<¡<°7Ñ#:ñ 1Ó2ô"ˆDÔô& ×%Ò%Ó'ˆØ(,×(8Ñ(8¸×9PÑ9PÐQU×QcÑQcÓ9dÓ(eˆÔ%Ü—9’9“; Õ%ˆØ(,ˆÜ×$Ò$¨S¸E×B×BÕBÀfÜ—)’)“+ Ô(Ø×%Ñ%×*Ñ*Ó,Ò8Ü*Ô,Ü&Ø:¸4×;MÑ;M×;XÑ;XÐ:YÐYoÐpórð rð!Ø!'§¡¨T×->Ñ->¸zÓ-JÐTX×TiÑTiÓTk Ó!l×l�DØ×'Ñ'¨3Ô.Ü-¨d×.@Ñ.@À$×BUÑBUÐW[×WiÑWi×WmÑWmÔnØ÷ C×BÑBð /ô
 —m’m CÓ(×(Ó(÷ C×Bô 	Ô ÜÐMÈhÈZÐXÓYÐYòs ;øð
 —?‘?ô qÜ/´°C³Ð?UÐafÔgÐmpÐpûðqúâ)Ú(ò 	?øô !ô 	ô ,Ø)¨$¯.©.Ñ);ð <3Ø36°%ð9à+Øô	ð
 ðûð	úò Cò mñ Cøô ×)Ñ)ô !Ø •Hûð!úá(÷ C×B×BÒBüs:  ‚Q–$N ºN»AN ÂQÂ!O	Â"QÂ9OÂ:BQÄ?OÅ QÅBO ÇBQÉPÉQÉA$P5Ê:3PË-PË.A
PÌ9QÍPÍQÍP5Í%P1Í&P5Í-QÍ8P3Í9QÎN ÎOÎ)OÏOÏQÏQÏQÏPÏ O=Ï=PÐQÐPÐQÐP.Ð"P)Ð$P5Ð)P.Ð.P5Ð3QÐ5Q	Ð;P>Ð<
Q	ÑQ	Ñ	Qc               ó    € V ^8„  d   QhRRRR/# )r.   Úproczsubprocess.Popenr0   rP   r1   )r2   s   "r3   r4   rè  F  s   € ÷ 0ñ 0Ð-=ð 0À$ñ 0r5   c              ƒ  ó¢  "  € VP                   f   R# VP                   p\        P                  ! 4       p  VP                  RVP                  4      G Rj  x€L
 pV'       g   M6\
        P                  RVP                  RR4      P                  4       4       Kd  \        \        V RR4      RR	4      pV P                  '       d[   V'       gQ   VP                  4       p\
        P                  R
V4       V P                  RRV R2RR7       V P!                  4        R# R# R#  LÉ  \         d!   p\
        P                  RT4        Rp?L®Rp?ii ; i5i)z1Pump the sidecar's stdout/stderr into our logger.NTz[photon-sidecar] %srÛ   rÜ   z&[photon-sidecar] supervisor exited: %sÚgateway_runnerÚ_stop_requested_by_signalFuG   [photon] sidecar exited unexpectedly (code %s) â€” triggering reconnectÚSIDECAR_CRASHEDz)Photon sidecar exited unexpectedly (code r‡  r\  )rõ   r¹   rd  Úrun_in_executorÚreadlinerU   ró   ÚdecodeÚrstriprT   rV   Úgetattrr   rD  rž   r`  r…  )rŠ   rH  rõ   ro  r?   rW   Úrunner_stopÚ	exit_codes   &&      r3   rC  Ú PhotonAdapter._supervise_sidecarF  s  é € à�;‰;ÒÙØ—‘ˆÜ×%Ò%Ó'ˆð	HØØ!×1Ñ1°$¸¿¹ÓH×H�ßØÜ—‘Ð1°4·;±;¸wÈ	Ó3R×3YÑ3YÓ3[Ö\ô œg dÐ,<¸dÓCÐE`ÐbgÓhˆØ× × Ð ¯ØŸ	™	›ˆIÜ�L‰LÐbÐdmÔnØ×!Ñ!Ø!Ð%NÈyÈkÐYZÐ#[Ðgkð "ô mà×-Ñ-Ö/ñ *5Ñ ñ Iøô ô 	HÜ�N‰NÐCÀQ×GÑGûð	HüsS   ‚2Eµ D! ÁDÁD! Á"EÁ#6D! Â1EÃAEÄD! Ä!EÄ,EÅEÅEÅEc               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  _  s   € ÷ 35ñ 35 Tñ 35r5   c              ƒ  	óÔ  "  € V P                   pVf   \        4        R #  VP                  eF   \        P                  ! \
        4      ;_uu_ 4        VP                  P                  4        R R R 4       V P                  eo   \        P                  ! \
        4      ;_uu_ 4        V P                  P                  V P                  R4      V P                  4       RR7      G R j  x€L
  R R R 4        VP                  RR7       R T n         \        4        T P4                  eG   T P4                  \6        P8                  ! 4       Jd   T P4                  P;                  4        R T n        R # R #   + '       g   i     EL; i Lš  + '       g   i     L ; i  \        P                   dÖ    \        P                  R8w  dm    \         P"                  ! \         P$                  ! TP&                  4      \(        P*                  4       M7  \,        \.        3 d    TP1                  4         Mi ; iTP1                  4         TP                  RR7        ELL  \        P                   d    TP3                  4          ELui ; ii ; i  R T n         \        4        T P4                  eF   T P4                  \6        P8                  ! 4       Jd   T P4                  P;                  4        R T n        i i ; i5i)Nz	/shutdownr  rŽ  r  )r¸   r  )r  rp   rÝ   rm   rn   rT   Úcloser  r#  rO  rU  Úwaiträ   rò   r!  r"  rx   ÚkillpgÚgetpgidrO   r%  r&  ÚProcessLookupErrorr{   Ú	terminaterz   r  r¹   Úcurrent_taskry  )rŠ   rH  s   & r3   r{  ÚPhotonAdapter._stop_sidecar_  s4  é € Ø×!Ñ!ˆØŠ<Ü"Ô$Ùð.	5Ø�z‰zÒ%Ü×(Ò(¬×3Õ3Ø—J‘J×$Ñ$Ô&÷ 4à× Ñ Ò,Ü×(Ò(¬×3Õ3Ø×+Ñ+×0Ñ0Ø×)Ñ)¨+Ó6À×@UÑ@UÓ@WÐadð 1ó f÷ fð f÷ 4ð Ø—	‘	 #�	Ô&ð "&ˆDÔÜ"Ô$Ø×,Ñ,Ò8ð
 ×0Ñ0¼×8LÒ8LÓ8NÓNð ×1Ñ1×8Ñ8Ô:Ø04�Ö-ñ+ 9÷/ 4×3Ð3úñf÷ 4×3ûô
 ×,Ñ,ô  Ü—<‘< 7Ô*ð)ÜŸ	š	¤"§*¢*¨T¯X©XÓ"6¼¿¹ÕGøÜ.´Ð@ô )ØŸ™Ö(ð)úð —N‘NÔ$ð Ø—I‘I c�I×*øÜ!×0Ñ0ô  Ø—I‘I—K�Kð úð ûð "&ˆDÔÜ"Ô$Ø×,Ñ,Ò8ð
 ×0Ñ0¼×8LÒ8LÓ8NÓNð ×1Ñ1×8Ñ8Ô:Ø04�Õ-ð+ 9üsÁ   ‚K( 0I? ÁE)Á+8I? Â#?E?Ã"E=Ã#E?Ã'I? Ã0F ÄA'K(Å)E:	Å4	I? Å=E?Å?F	Æ
I? Æ*I<Æ=AHÈ I<È!H%È"I<È$H%È%I<È9IÉI? É%I8É3I<É4I? É7I8É8I<É<I? É?A&K%Ë%K(c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  –  s   € ÷ !ñ !¨ñ !r5   c                óH   € \         P                  ! 4       V n        ^ V n        R# )zLRecord proof the upstream gRPC channel is live (inbound line or good probe).N)rh  ri  r$  r#  rT  s   &r3   r¬  Ú%PhotonAdapter._note_upstream_activity–  s   € ä'+§~¢~Ó'7ˆÔ$Ø ˆÖr5   c               ó   € V ^8„  d   QhRR/# )r.   r0   rN   r1   )r2   s   "r3   r4   rè  ›  s   € ÷ Fñ F 3ñ Fr5   c              ƒ  óÆ  "  € V P                   pVf   R#  VP                  V P                  R4      V P                  4       V P                  R7      G Rj  x€L
 pTP                  ^È8X  d   R# R#  L  \
        P                   d    h \         dO   p\        T4      '       d   \        P                  RT4        Rp?R# \        P                  RT4        Rp?R# Rp?ii ; i5i)	u  One ``/probe`` round-trip â†’ ``"alive"`` (HTTP 200, the only proof of liveness),
``"hung"`` (the HTTP call timed out; counts toward respawn) or ``"inconclusive"``
(503/refused/transport error: never counts â€” the network may just be down and a
dead process is the supervisor's job).NÚinconclusivez/proberŽ  z![photon] probe HTTP call hung: %sÚhungz1[photon] probe transport error (inconclusive): %sÚalive)r  r#  rO  rU  r  r¹   r“  rT   rÀ   rU   rË   r�   )rŠ   rn  r—  rW   s   &   r3   Ú_probe_onceÚPhotonAdapter._probe_once›  sÊ   é € ð
 ×"Ñ"ˆØŠ>Ù!ð
	"ØŸ™Ø×!Ñ! (Ó+°T×5JÑ5JÓ5LÐVZ×ViÑVið %ó k÷ kˆDð ×*Ñ*¨cÔ1ˆwÐE°~ÐEñkøä×%Ñ%ô 	ØÜô 	"Ü  ×#Ò#Ü—‘Ð@À!ÔDÝÜ�L‰LÐLÈaÔPÝ!ûð	"üsR   ‚C!–>A0 ÁA.ÁA0 ÁC!Á.A0 Á0CÂCÂ'CÂ7C!Â=CÃC!ÃCÃC!c               ó    € V ^8„  d   QhRRRR/# )r.   ÚreasonrN   r0   rP   r1   )r2   s   "r3   r4   rè  °  s   € ÷ ^ñ ^¨Sð ^°Tñ ^r5   c              ƒ  óö  "  € V P                   f   \        P                  ! 4       V n         V P                   pVP                  4       '       d   \        P                  R4       R# T;_uu_4       GRj  x€L
  \        P                  RV4        V P                  4       G Rj  x€L
   V P                  4       G Rj  x€L
  T P                  4        \        P                  R4       RRR4      GRj  x€L
  R#  Lƒ LV  \         d    \        P                  R4        Lvi ; i Le  \         d+    \        P                  R4        RRR4      GRj  x€L 
  R# i ; i Lj  + GRj  x€L 
 '       g   i     R# ; i5i)z¿Restart the sidecar to recover a dead gRPC stream (a fresh ``Spectrum()``
re-subscribes; the inbound loop re-opens ``/inbound`` on its own). Locked so
overlapping triggers can't double-spawn.Nz.[photon] respawn already in progress; skippingu5   [photon] presence watchdog: %s â€” respawning sidecarz.[photon] error stopping sidecar during respawnz7[photon] failed to respawn sidecar; watchdog will retryzB[photon] presence watchdog: sidecar respawned, gRPC stream renewed)r  r¹   rj  ÚlockedrU   ró   rV   r{  rT   r°  rb  r¬  )rŠ   rj  Úlocks   && r3   Ú_respawn_sidecarÚPhotonAdapter._respawn_sidecar°  s  é € ð ×ÑÒ%Ü!(§¢£ˆDÔØ×!Ñ!ˆØ�;‰;�=Š=Ü�K‰KÐHÔIÙß—4’4Ü�N‰NÐRÐTZÔ[ðSØ×(Ñ(Ó*×*Ð*ðØ×)Ñ)Ó+×+Ð+ð ×(Ñ(Ô*Ü�K‰KÐ\Ô]÷ —4“4ñ +øÜô SÜ× Ñ Ð!QÖRðSúñ ,øÜô Ü× Ñ Ð!ZÔ[Ø÷ —4’4ðú÷ —4—4“4üsÌ   ‚A
E9Á%E9Á2C6Á3E9Á6EÂC:Â!C8Â"C:Â'D"Â:D Â;D"Â?%EÃ$E9Ã/EÃ0E9Ã8C:Ã: DÄEÄDÄEÄ D"Ä" EÅEÅE9ÅEÅE9ÅEÅEÅE9ÅE6	Å"E%Å#
E6	Å.E6	Å0	E9c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  È  s   € ÷ 6ñ 6¨$ñ 6r5   c              ƒ  óÞ  "  € \         P                  ! V P                  4      G Rj  x€L
  V P                  '       Edg    \        P
                  ! 4       V P                  ,
          pWP                  8  d2   \         P                  ! V P                  V,
          4      G Rj  x€L
  K{  V P                  4       G Rj  x€L
 pVR8X  d   V P                  4        M£VR8X  d‡   V ;P                  ^,          un	        \        P                  RV P                  V P                  4       V P                  V P                  8¼  d'   V P                  V P                   R24      G Rj  x€L
  M\        P                  R4        \         P                  ! V P                  4      G Rj  x€L
  EKy  R#  EL€ EL
 Lò LP  \         P                   d    h \          d    \        P#                  R4        Lni ; i LN5i)z“Probe on a long interval, skipping when inbound traffic already proved liveness;
only *hung* probes count toward respawn (``_probe_max_failures``).Nrf  re  z$[photon] presence probe hung (%d/%d)z consecutive hung probesz6[photon] presence probe inconclusive; taking no actionz+[photon] presence watchdog iteration failed)r¹   r”  r  r!  rh  ri  r$  rg  r¬  r#  rU   rV   r  rn  rË   r“  rT   r°  )rŠ   ÚidleÚverdicts   &  r3   rk  Ú PhotonAdapter._presence_watchdogÈ  s�  é € ô �mŠm˜D×0Ñ0Ó1×1Ð1Ø×$×$Ñ$ðPÜ—~’~Ó'¨$×*FÑ*FÕF�Ø×.Ñ.Ô.Ü!Ÿ-š-¨×(<Ñ(<¸tÕ(CÓD×DÐDÙØ $× 0Ñ 0Ó 2×2�Ø˜gÔ%Ø×0Ñ0Õ2Ø Ô&Ø×(Ò(¨AÕ-Õ(Ü—N‘NÐ#IØ#'×#7Ñ#7¸×9QÑ9QôSà×+Ñ+¨t×/GÑ/GÔGØ"×3Ñ3°t×7KÑ7KÐ6LÐLdÐ4eÓf×fÐføä—L‘LÐ!YÕZô
 —-’- × 4Ñ 4Ó5×5Ó5ñ+ %ò 	2ò
 Eá2ñ gøô ×)Ñ)ô ØÜô PÜ× Ñ Ð!NÖOðPúá5ùs    ‚$G-¦F&§G-¿A F0 ÂF)Â F0 Â$G-Â&F0 Â9F,Â:F0 ÃG-ÃBF0 ÅF.ÅF0 Å"G-Å#F0 Å8$G-ÆG+Æ
G-Æ)F0 Æ,F0 Æ.F0 Æ0G(ÇG(Ç%G-Ç'G(Ç(G-c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   rè  ã  s   € ÷  ñ   dñ  r5   c              ƒ  	ól   "  € R V n         V P                  Ruqn        \        V4      G Rj  x€L
  R#  L5irt  )r!  r  r   )rŠ   r}  s   & r3   ru  ÚPhotonAdapter._stop_watchdogã  s.   é € Ø!&ˆÔØ$(×$7Ñ$7¸Ð!ˆÔ!Ü˜$Ó×Ôùs   ‚)4«2¬4Nc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r.   r¼  rN   r4  Úreply_tor"  ÚmetadatarZ   r0   r   r1   )r2   s   "r3   r4   rè  ê  s8   € ÷ Oñ O #ð O°ð O¸}ð OØ5ðOØAKñOr5   c              ƒ  	ó^   "  € V P                  WP                  V4      4      G R j  x€L
 #  L5ir‡   )Ú_sidecar_sendÚformat_message©rŠ   r¼  r4  ry  rz  s   &&&&&r3   ÚsendÚPhotonAdapter.sendê  s'   é € à×'Ñ'¨×1DÑ1DÀWÓ1MÓN×NÐNÑNùs   ‚$-¦+§-c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r.   r¼  rN   ÚquestionÚchoicesúOptional[list]Ú
clarify_idÚsession_keyrz  rZ   r0   r   r1   )r2   s   "r3   r4   rè  î  sA   € ÷ ñ ¨#ð ¸ð À~ð Ðcfð Ø(+ðØ7OðØ[eñr5   c              ƒ  óV  <"  € V'       g   \         S	V `  WW4WV4      G Rj  x€L
 # ^ RIHp V! V4       V P	                  W\        V4      4      G Rj  x€L
 pVP                  '       g:   \        P                  RVP                  4       \         S	V `  WW4WV4      G Rj  x€L
 # V#  L‚ LS L
5i)zÍMultiple-choice renders as a native poll; the vote comes back as a `poll_option`
event that _dispatch_inbound turns into plain text, so the clarify is flipped into
text-capture mode like the base fallback.N)Úmark_awaiting_textz<[photon] poll clarify failed (%s); falling back to text list)
rˆ   Úsend_clarifyÚtools.clarify_gatewayrˆ  Ú_sidecar_send_pollrv  ÚsuccessrU   rV   rž   )
rŠ   r¼  r‚  rƒ  r…  r†  rz  rˆ  r÷   r‹   s
   &&&&&&&  €r3   r‰  ÚPhotonAdapter.send_clarifyî  s—   øé € ÷
 Ü™Ñ-¨gÀÐVaÓl×lÐlÝ<Ù˜:Ô&Ø×.Ñ.¨wÄ$ÀwÃ-ÓP×PˆØ�~�~ˆ~ô �N‰NÐYÐ[a×[gÑ[gÔhÜ™Ñ-¨gÀÐVaÓl×lÐlØˆñ mñ Qñ
 mùs9   ƒB) B#¡0B)ÁB%ÁB)Á(4B)ÂB'ÂB)Â%B)Â'B)c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r.   r¼  rN   Ú	image_urlrÖ  r"  ry  rz  rZ   r0   r   r1   )r2   s   "r3   r4   rè    sA   € ÷ Yñ Y¨ð Y¸ð YÀmð YØ#0ðYØC[ðYØgqñYr5   c              ƒ  	óÌ   <"  €  ^ RI Hp V! V4      G Rj  x€L
 pT P                  YTR7      G Rj  x€L
 #  L  \         d    \        ST `  YY44      G Rj  x€L 
 u # i ; i L05i)rC   )Úcache_image_from_urlN©rÖ  )Úgateway.platforms.baser‘  rT   rˆ   Ú
send_imageÚ_sidecar_send_attachment)	rŠ   r¼  r�  rÖ  ry  rz  r‘  Ú
local_pathr‹   s	   &&&&&&  €r3   r”  ÚPhotonAdapter.send_image  si   øé € ð	SÝCÙ3°IÓ>×>ˆJð ×2Ñ2°7ÐPWÐ2ÓX×XÐXñ ?øÜô 	SÜ™Ñ+¨GÀÓR×RÐRÒRð	SúáXùsG   ƒA$…8 –6—8 ›A$±A"²A$¶8 ¸AÁAÁAÁA$ÁAÁA$c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r.   r¼  rN   Ú
image_pathrÖ  r"  ry  rz  rZ   r0   r   r1   )r2   s   "r3   r4   rè    sA   € ÷ Yñ Y¨Sð Y¸cð YÈMð YØ(5ðYØH`ðYà+5ñYr5   c              ‹  	óD   "  € V P                  WVR 7      G Rj  x€L
 #  L5i©r’  N©r•  )rŠ   r¼  r™  rÖ  ry  rz  rÐ  s   &&&&&&,r3   Úsend_image_fileÚPhotonAdapter.send_image_file  ó$   é € ð ×2Ñ2°7ÐPWÐ2ÓX×XÐXÑXùó   ‚ ™š c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r.   r¼  rN   Ú
audio_pathrÖ  r"  ry  rz  rZ   r0   r   r1   )r2   s   "r3   r4   rè    sA   € ÷ gñ g¨ð g¸ð gÀ}ð gØ#0ðgØC[ðgà&0ñgr5   c              ‹  	óF   "  € V P                  WVR R7      G Rj  x€L
 #  L5i)r�  )rÖ  rÂ  Nrœ  )rŠ   r¼  r¢  rÖ  ry  rz  rÐ  s   &&&&&&,r3   Ú
send_voiceÚPhotonAdapter.send_voice  s'   é € ð ×2Ñ2°7ÐPWÐ^eÐ2Óf×fÐfÑfùs   ‚!š›!c               ó0   € V ^8„  d   QhRRRRRRRRRRR	R
/# )r.   r¼  rN   Ú
video_pathrÖ  r"  ry  rz  rZ   r0   r   r1   )r2   s   "r3   r4   rè    sA   € ÷ Yñ Y¨ð Y¸ð YÀ}ð YØ#0ðYØC[ðYà&0ñYr5   c              ‹  	óD   "  € V P                  WVR 7      G Rj  x€L
 #  L5ir›  rœ  )rŠ   r¼  r§  rÖ  ry  rz  rÐ  s   &&&&&&,r3   Ú
send_videoÚPhotonAdapter.send_video  rŸ  r   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r.   r¼  rN   Ú	file_pathrÖ  r"  Ú	file_namery  rz  rZ   r0   r   r1   )r2   s   "r3   r4   rè    sJ   € ÷ hñ h¨3ð h¸3ð hÈð hØ'4ðhØGTðhà&>ðhàT^ñhr5   c              ‹  	óD   "  € V P                  WWCR 7      G Rj  x€L
 #  L5i))ry   rÖ  Nrœ  )rŠ   r¼  r¬  rÖ  r­  ry  rz  rÐ  s   &&&&&&&,r3   Úsend_documentÚPhotonAdapter.send_document  s#   é € ð ×2Ñ2°7ÈIÐ2Óg×gÐgÑgùr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r.   rœ   rN   rÝ  r5  Úwhatr0   rr   r1   )r2   s   "r3   r4   rè  !  s)   € ÷ ñ  sð °.ð Èð ÐPTñ r5   c              ƒ  ó¤   "  €  V P                  W4      G Rj  x€L
  R#  L  \         d"   p\        P                  RY44        Rp?R# Rp?ii ; i5i)zNSoft-failing sidecar call: True on success, False (debug-logged) on any error.NTz[photon] %s failed: %sF)r§  rT   rU   rË   )rŠ   rœ   rÝ  r²  rW   s   &&&& r3   Ú_sidecar_tryÚPhotonAdapter._sidecar_try!  sG   é € ð	Ø×$Ñ$ TÓ0×0Ð0Ùñ 1øäô 	Ü�L‰LÐ1°4Ô;Ýûð	üs6   ‚A„! ˜™! �AŸ! ¡A¬AÁAÁAÁAc               ó    € V ^8„  d   QhRRRR/# ©r.   r¼  rN   r0   rP   r1   )r2   s   "r3   r4   rè  *  s   € ÷ bñ b¨ð bÀñ br5   c              ƒ  	óð   "  € \         P                   ! 4       pW0P                  P                  VR 4      ,
          \        8  d   R# W0P                  V&   V P	                  RRVRR/R4      G Rj  x€L
  R#  L5i)rþ  Nú/typingrÛ  r¡  ÚstartÚsend_typing)rh  r+  r«   Ú_TYPING_COOLDOWN_SECONDSr´  )rŠ   r¼  rz  r|  s   &&& r3   r»  ÚPhotonAdapter.send_typing*  sb   é € Ü�iŠi‹kˆØ×'Ñ'×+Ñ+¨G°SÓ9Õ9Ô<TÔTÙØ*-×Ñ˜wÑ'Ø×Ñ 	¨I°wÀÈÐ+QÐS`Óa×aÔaùs   ‚A+A6Á-A4Á.A6c               ó    € V ^8„  d   QhRRRR/# r·  r1   )r2   s   "r3   r4   rè  1  s   € ÷ añ a¨ð a°ñ ar5   c              ƒ  	óˆ   "  € V P                   P                  VR 4       V P                  RRVRR/R4      G R j  x€L
  R #  L5i)Nr¹  rÛ  r¡  ÚstopÚstop_typing)r+  r;   r´  ©rŠ   r¼  s   &&r3   rÁ  ÚPhotonAdapter.stop_typing1  s=   é € Ø×Ñ×"Ñ" 7¨DÔ1Ø×Ñ 	¨I°wÀÈÐ+PÐR_Ó`×`Ô`ùs   ‚7A¹A ºAiè  c               ó    € V ^8„  d   QhRRRR/# )r.   rÈ  r"  r0   rP   r1   )r2   s   "r3   r4   rè  ;  s   € ÷ ]ñ ]¨}ð ]Àñ ]r5   c                	ó„   € V'       d8   \        V P                  V\        P                  ! 4       V P                  4       R # R # r‡   )r   r(  rh  Ú_SENT_IDS_MAX)rŠ   rÈ  s   &&r3   Ú_record_sent_messageÚ"PhotonAdapter._record_sent_message;  s*   € ßÜ˜×.Ñ.°
¼D¿IºI»KÈ×I[ÑI[Ö\ñ r5   z^any;-;(\+\d{6,})$c               ó    € V ^8„  d   QhRRRR/# )r.   r¼  rN   r0   r1   )r2   s   "r3   r4   rè  E  s   € ÷ 4ñ 4¨#ð 4°#ñ 4r5   c                	ón   € V P                   P                  V4      pV'       d   VP                  ^4      # T# )é   )Ú_DM_CHAT_GUID_RErC  rN  )rþ  r¼  rC  s   && r3   r¿  Ú!PhotonAdapter._normalize_chat_keyD  s-   € à×$Ñ$×*Ñ*¨7Ó3ˆß!&ˆu�{‰{˜1‹~Ð3¨GÐ3r5   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r.   Ústorer5  r¼  rN   rÜ  r   r0   rP   r1   )r2   s   "r3   r4   rè  I  s.   € ÷ cñ c .ð c¸3ð cÀsð cÈtñ cr5   c                	óP   € \        WP                  V4      W0P                  4       R # r‡   )r   r¿  Ú_LAST_INBOUND_CHATS_MAX)rŠ   rÏ  r¼  rÜ  s   &&&&r3   Ú_put_by_chatÚPhotonAdapter._put_by_chatI  s   € Ü�E×3Ñ3°GÓ<¸e×EaÑEaÖbr5   c               ó$   € V ^8„  d   QhRRRRRR/# )r.   r¼  r"  rÈ  r0   rP   r1   )r2   s   "r3   r4   rè  L  s'   € ÷ Oñ O¨Mð OÀ}ð OÐY]ñ Or5   c                	óf   € V'       d)   V'       d   V P                  V P                  W4       R # R # R # r‡   )rÒ  r)  ©rŠ   r¼  rÈ  s   &&&r3   ré  Ú"PhotonAdapter._record_last_inboundL  s$   € ß—zØ×Ñ˜d×8Ñ8¸'ÖNñ "‰7r5   c               ó$   € V ^8„  d   QhRRRRRR/# )r.   r¼  rN   r¥   r0   rP   r1   )r2   s   "r3   r4   rè  P  s&   € ÷ Tñ T¨sð T¸#ð TÀ$ñ Tr5   c                	ó    € V'       dF   \        V4      '       d3   V P                  V P                  V\        P                  ! 4       4       R # R # R # r‡   )r.  rÒ  r*  rh  )rŠ   r¼  r¥   s   &&&r3   rì  Ú%PhotonAdapter._record_recent_richlinkP  s5   € ßÔ*¨4×0Ò0Ø×Ñ˜d×<Ñ<¸gÄtÇyÂyÃ{ÖSñ 1‰7r5   c               ó$   € V ^8„  d   QhRRRRRR/# )r.   r¼  rN   r4  r5  r0   rr   r1   )r2   s   "r3   r4   rè  T  s"   € ÷ 
ñ 
°3ð 
Àð 
ÐTXñ 
r5   c                	ó&  € V'       d   \        V4      '       g   R # V P                  V4      pV P                  P                  V4      pVf   R # \        P                  ! 4       V,
          \
        8”  d   V P                  P                  VR4       R # R# )FNT)rv  r¿  r*  r«   rh  Ú"_RICHLINK_PREVIEW_SUPPRESS_SECONDSr;   )rŠ   r¼  r4  rð  Úlasts   &&&  r3   rè  Ú)PhotonAdapter._is_recent_richlink_previewT  sq   € ßÔ:¸7×CÒCÙØ×&Ñ& wÓ/ˆØ×-Ñ-×1Ñ1°#Ó6ˆØŠ<ÙÜ�9Š9‹;˜ÕÔ BÔBØ×*Ñ*×.Ñ.¨s°DÔ9ÙÙr5   c               ó   € V ^8„  d   QhRR/# r¯   r1   )r2   s   "r3   r4   rè  `  s   € ÷ mñ m Dñ mr5   c                	óX   € \        R R4      P                  4       P                  4       R9   # )ÚPHOTON_REACTIONSr  >   r  r  r  r  r  rT  s   &r3   Ú_reactions_enabledÚ PhotonAdapter._reactions_enabled`  s(   € Ü!Ð"4°gÓ>×DÑDÓF×LÑLÓNÐRlÑlÐlr5   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r.   r¼  rN   rÈ  râ  r0   rr   r1   )r2   s   "r3   r4   rè  c  s/   € ÷ eñ e¨3ð e¸Cð eÈð eÐPTñ er5   c           	   ƒ  óP   "  € V P                  RRVRVRV/R4      G Rj  x€L
 #  L5i)zCTapback ``emoji`` onto a message. Soft-fails (False), never raises.z/reactrÛ  r«  râ  Úadd_reactionN©r´  )rŠ   r¼  rÈ  râ  s   &&&&r3   Ú_add_reactionÚPhotonAdapter._add_reactionc  s;   é € à×&Ñ&Ø�y '¨;¸
ÀGÈUÐSÐUcóe÷ eð 	eñ eùs   ‚&Ÿ$ &c               ó$   € V ^8„  d   QhRRRRRR/# )r.   r¼  rN   rÈ  r0   rr   r1   )r2   s   "r3   r4   rè  h  s&   € ÷ uñ u¨cð u¸sð uÀtñ ur5   c              ƒ  óL   "  € V P                  RRVRV/R4      G Rj  x€L
 #  L5i)z‚Retract our tapback (best-effort: the sidecar's per-message reaction handle is
lost on restart). Soft-fails (False), never raises.z/unreactrÛ  r«  Úremove_reactionNrè  rÖ  s   &&&r3   Ú_remove_reactionÚPhotonAdapter._remove_reactionh  s-   é € ð ×&Ñ& z°I¸wÈÐU_Ð3`ÐbsÓt×tÐtÑtùs   ‚$�"ž$c               ó(   € V ^8„  d   QhRRRRRRRR/# )r.   r¼  rN   râ  rÈ  r"  r0   r5  r1   )r2   s   "r3   r4   rè  p  s)   € ÷ 	7ñ 	7¨#ð 	7°cð 	7À}ð 	7Ð`nñ 	7r5   c              ƒ  óê   "  € T;'       g+    V P                   P                  V P                  V4      4      pV'       g   RRRR/# V P                  WV4      G Rj  x€L
 '       g   RRRR/# RRRV/#  L5i)	u®   Tapback ``emoji`` onto a message (default: the chat's latest inbound). iMessage
maps â�¤ï¸�ðŸ‘�ðŸ‘ŽðŸ˜‚â€¼ï¸�â�“ to native tapbacks; anything else is a custom-emoji reaction.rŒ  Frž   uk   no message to react to â€” pass message_id (no inbound message seen in this chat since the gateway started)Nz'reaction failed (see gateway debug log)TrÈ  )r)  r«   r¿  ré  )rŠ   r¼  râ  rÈ  Útargets   &&&& r3   rç  ÚPhotonAdapter.add_reactionp  sˆ   é € ð ×`Ð`˜t×9Ñ9×=Ñ=¸d×>VÑ>VÐW^Ó>_Ó`ˆßØ˜u gð 0Sð Tð Tà×'Ñ'¨¸Ó?×?Ö?Ø˜u gÐ/XÐYÐYØ˜4 ¨vÐ6Ð6ñ @ùs   ‚<A3¿A3ÁA1Á	A3Á%A3c               ó$   € V ^8„  d   QhRRRRRR/# )r.   r¼  rN   rÈ  r"  r0   r5  r1   )r2   s   "r3   r4   rè  {  s"   € ÷ 7ñ 7¨Sð 7¸mð 7ÐWeñ 7r5   c              ƒ  óè   "  € T;'       g+    V P                   P                  V P                  V4      4      pV'       g   RRRR/# V P                  W4      G Rj  x€L
 '       g   RRRR/# RRRV/#  L5i)	z1Retract our tapback from a message (best-effort).rŒ  Frž   u)   no message to unreact â€” pass message_idNz&unreact failed (see gateway debug log)TrÈ  )r)  r«   r¿  rî  )rŠ   r¼  rÈ  rò  s   &&& r3   rí  ÚPhotonAdapter.remove_reaction{  sz   é € à×`Ð`˜t×9Ñ9×=Ñ=¸d×>VÑ>VÐW^Ó>_Ó`ˆßØ˜u gÐ/ZÐ[Ð[Ø×*Ñ*¨7Ó;×;Ö;Ø˜u gÐ/WÐXÐXØ˜4 ¨vÐ6Ð6ñ <ùs   ‚<A2¿A2ÁA0Á	A2Á$A2c               ó    € V ^8„  d   QhRRRR/# )r.   r±  r   r0   rP   r1   )r2   s   "r3   r4   rè  „  s   € ÷ Hñ H¨|ð HÀñ Hr5   c              ƒ  óæ   "  € V P                  4       '       g   R# \        VP                  RR4      p\        VRR4      pV'       d'   V'       d   V P                  W#R4      G Rj  x€L
  R# R# R#  L
5i)u=   Tapback ðŸ‘€ on the triggering message while the agent works.Nr¼  rÈ  u   ðŸ‘€)rã  rQ  rØ  ré  )rŠ   r±  r¼  rÈ  s   &&  r3   Úon_processing_startÚ!PhotonAdapter.on_processing_start„  s\   é € à×&Ñ&×(Ò(ÙÜ˜%Ÿ,™,¨	°4Ó8ˆÜ˜U L°$Ó7ˆ
ß—zØ×$Ñ$ W¸,ÓG×GÒGñ "‰7ÙGùs   ‚AA1ÁA1Á$A/Á%A1u   ðŸ‘�u   ðŸ‘Žc               ó    € V ^8„  d   QhRRRR/# )r.   r¼  rN   r0   r5  r1   )r2   s   "r3   r4   rè  ’  s   € ÷ >ñ >¨3ð >°>ñ >r5   c              ƒ  ó   "  € RVRRRV/# 5i)zHPhoton's ``space.id`` is opaque; with only the id, infer conservatively.ry   r¾   rÄ  r`  r1   rÂ  s   &&r3   Úget_chat_infoÚPhotonAdapter.get_chat_info’  s   é € à˜ ¨¨t°WÐ=Ð=ùs   ‚	c               ó    € V ^8„  d   QhRRRR/# )r.   r4  rN   r0   r1   )r2   s   "r3   r4   rè  –  s   € ÷ cñ c cð c¨cñ cr5   c                	ó@   € \        4       '       d   V# \        VR R7      # )Tr  )r  r   )rŠ   r4  s   &&r3   r}  ÚPhotonAdapter.format_message–  s   € ä+×-Ò-ˆwÐb´>À'Ð]aÔ3bÐbr5   c               ó    € V ^8„  d   QhRRRR/# )r.   rž   r"  r0   rr   r1   )r2   s   "r3   r4   rè  ›  s   € ÷ Iñ I =ð I°Tñ Ir5   c                	ó(  a€ \         P                  ! V 4      '       d   R # T ;'       g    RP                  4       oS'       d   RS9   g   RS9   d   R# \        ;QJ d#    V3R l\         4       F  '       g   K   R # 	  R# ! V3R l\         4       4      # )Tr7   zretryable=falseÚauth_or_configFc              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir‡   r1   )r9  ÚpatÚlowereds   & €r3   r;  Ú4PhotonAdapter._is_retryable_error.<locals>.<genexpr>¡  s   øé € ÐHÑ-G c˜'–>Ó-Gùs   ƒ)r   Ú_is_retryable_errorr¿   ra  Ú_PHOTON_RETRYABLE_PATTERNS)rž   r  s   &@r3   r	  Ú!PhotonAdapter._is_retryable_errorš  sl   ø€ ä×2Ò2°5×9Ò9ÙØ—;�;˜B×%Ñ%Ó'ˆßÐ+¨wÔ6Ð:JÈgÔ:UÙß‹sÔHÕ-GÓH�sŒsÐHŠsÐHˆsÔHÕ-GÓHÓHÐHr5   c               ó    € V ^8„  d   QhRRRR/# ©r.   r÷   r   r0   rr   r1   )r2   s   "r3   r4   rè  ¤  s   € ÷ Xñ X¨jð X¸Tñ Xr5   c                ó¨   € V P                   p\        V\        4      ;'       d0    VP                  R4      RJ ;'       d    VP                  R4      R9   # )u¤   ``auth_or_config`` / ``target_not_allowed`` can't be fixed by retrying or by the
plain-text resend â€” either would just double-send a doomed request.

See #50971.
r‚   Fr™   )r  rª   )Úraw_responserd   re   r«   )r÷   rg   s   & r3   Ú_is_permanent_sidecar_failureÚ+PhotonAdapter._is_permanent_sidecar_failure£  sY   € ð ×!Ñ!ˆÜ˜3¤Ó%÷ Wð W¨#¯'©'°+Ó*>À%Ð*G÷ Wð WØ—G‘G˜MÓ*Ð.VÑVð	Xr5   c               ó    € V ^8„  d   QhRRRR/# r  r1   )r2   s   "r3   r4   rè  ®  s   € ÷ :ñ :¨:ð :¸$ñ :r5   c                	ó$   € V P                  V4      # r‡   )r  )rŠ   r÷   s   &&r3   Ú_send_retry_is_finalÚ"PhotonAdapter._send_retry_is_final®  s   € Ø×1Ñ1°&Ó9Ð9r5   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r.   r¼  rN   r4  ry  r"  rz  r   r0   r   r1   )r2   s   "r3   r4   rè  ±  s9   € ÷ nñ n°#ð nÀð nÐR_ð nÐknð nÐs}ñ nr5   c             ƒ  ó~   "  € V P                  WP                  V4      RV P                   RRR7      G Rj  x€L
 #  L5i)z�No Markdown banner (replies are markdown or already-stripped plain text); bypass
richlink() so a rich-link outage doesn't strand a sendable URL.NF)rS  Úmarkdown)r|  r}  ÚMAX_MESSAGE_LENGTHr~  s   &&&$$r3   Ú_send_plain_fallbackÚ"PhotonAdapter._send_plain_fallback±  sO   é € ð ×'Ñ'Ø×(Ñ(¨Ó1Ð2K°D×4KÑ4KÐLÐW\Ðglð (ó n÷ nð 	nñ nùs   ‚4=¶;·=Ú
structuredÚ	sent_textc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r.   rœ   rN   rÝ  r5  r  rr   r  r"  r0   r   r1   )r2   s   "r3   r4   rè  ·  s8   € ÷ Jñ J Sð J°ð JÈtð JØ$1ðJØ=GñJr5   c          
   ƒ  óp  "  €  V P                  W4      G Rj  x€L
 pT P                  TP                  R4      4       T'       d4   \        TP                  R4      TP                  R4      T4      G Rj  x€L
  \        R	TP                  R4      R
7      #  L{  \         dh   pT'       d@   \        R\        T4      TP                  RTP
                  RTP                  /R7      u Rp?# \        R\        T4      R7      u Rp?# Rp?i\         d!   p\        R\        T4      R7      u Rp?# Rp?ii ; i LÀ5i)aJ  POST a send-like body and wrap the outcome as a SendResult. ``structured`` carries
a ``PhotonSidecarError``'s class/retryability so ``_send_with_retry`` can recognise
permanent failures. ``sent_text`` is what a later threaded reply to this bubble quotes;
every outbound path passes through here, so recording here covers them all.NFr™   r‚   )rŒ  rž   r‚   r  ©rŒ  rž   r«  rÛ  T)rŒ  rÈ  )
r§  r˜   r   rN   r‚   r™   rT   rÇ  r«   rÐ  )rŠ   rœ   rÝ  r  r  r¦   rW   s   &&&$$  r3   Ú
_post_sendÚPhotonAdapter._post_send·  sñ   é € ð	;Ø×+Ñ+¨DÓ7×7ˆDð 	×!Ñ! $§(¡(¨;Ó"7Ô8ßÜ)¨$¯(©(°9Ó*=¸t¿x¹xÈÓ?TÐV_Ó`×`Ð`Ü $°4·8±8¸KÓ3HÔIÐIñ 8øÜ!ô 	;ßÜ!¨%´s¸1³vÈÏÉØ0=¸q¿}¹}ÈkÐ[\×[fÑ[fÐ/gôiõ iä e´3°q³6Ô:Õ:ûÜô 	;Ü e´3°q³6Ô:Õ:ûð	;úñ aùs†   ‚D6„B ˜B™B �'D6Á.D6Á3D4Á4 D6ÂB ÂD1Â!ADÃ"D1Ã#D6Ã(DÃ=D1Ã>D6ÄD1ÄD1ÄD,Ä&D1Ä'D6Ä,D1Ä1D6rS  r  c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r.   rØ  rN   r¥   rS  rr   r  r0   r   r1   )r2   s   "r3   r4   rè  Ë  s8   € ÷ Zñ Z¨Cð Z°sð ZÈð ZØ&*ðZØ6@ñZr5   c             ƒ  	ó@  "  € TpV'       d   \        V4      MR pV'       dW   V P                  RRVRV/VR7      G R j  x€L
 pVP                  '       d   V# \        P	                  RVP
                  4       RpT;'       d    \        4       p\        W(4      p\        V4      V P                  8”  d:   \        P	                  R\        V4      V P                  4       VR V P                   pRVRV/p	V'       d   R	V	R
&   V P                  RV	RVR7      G R j  x€L
 #  LÜ L5i)Nú/send-richlinkrÛ  r=  ©r  z>[photon] rich-link send failed, falling back to plain text: %sFz0[photon] truncating outbound from %d to %d charsr¥   r  r2   ú/sendT©r  r  )
r1  r!  rŒ  rU   rV   rž   r  r  rs  r  )
rŠ   rØ  r¥   rS  r  r  Úrich_urlÚrich_resultr  rÝ  s
   &&&$$     r3   r|  ÚPhotonAdapter._sidecar_sendË  s  é € àˆ	ß08Ô& tÔ,¸dˆßØ $§¡Ð0@À9ÈhÐX]Ð_gÐBhØ:Cð !0ó !E÷ EˆKà×"×"Ð"Ø"Ð"Ü�N‰NÐ[Ð]h×]nÑ]nÔoØˆHØ ×8Ð8Ô%6Ó%8ˆô % TÓ9ˆÜˆt‹9�t×.Ñ.Ô.Ü�N‰NÐMÌsÐSWËyÐZ^×ZqÑZqÔrØÐ1˜$×1Ñ1Ð2ˆDØ )¨8°V¸TÐBˆßØ'ˆD�‰NØ—_‘_ W¨d¸tÈy�_ÓY×YÐYñ!Eñ  Zùs9   ‚D¢D½D¾DÁ,DÂA6DÃ8DÄDÄDÄDc               ó(   € V ^8„  d   QhRRRRRRRR/# )r.   rØ  rN   r>  Úoptionsrv  r0   r   r1   )r2   s   "r3   r4   rè  â  s/   € ÷ Rñ R°ð R¸Sð RÈ4ð RÐT^ñ Rr5   c              ƒ  óØ  "  € T;'       g    .  Uu. uF=  p\        V4      P                  4       '       g   K$  \        V4      P                  4       NK?  	  ppV'       d   VP                  4       '       g   \        RRR7      # \        V4      ^8  d   \        RRR7      # RVRVP                  4       RV P                   RV/pV P                  R	WfR,          R
7      G Rj  x€L
 # u upi  L	5i)zMPOST a native poll to ``/send-poll`` (degrades to a numbered list elsewhere).Fzpoll title is requiredr   zpoll needs at least two optionsrÛ  r>  Nr-  z
/send-pollr&  )rN   rÊ   r   rs  r  r!  )rŠ   rØ  r>  r-  ÚoÚoptsrÝ  s   &&&&   r3   r‹  Ú PhotonAdapter._sidecar_send_pollâ  s»   é € à)0¯¨°B¨ÓJ© 1¼3¸q»6¿<¹<¿>””�A“—‘–©ˆÐJß˜EŸK™KŸMšMÜ eÐ3KÔLÐLÜˆt‹9�qŒ=Ü eÐ3TÔUÐUØ˜8 W¨e¯k©k«mÐ<U¸d×>UÑ>UÐ.VÐXaÐcgÐhˆØ—_‘_ \°4ÈÅ=�_ÓQ×QÐQùò Kñ Rùs(   ‚C*‘!C#·C#ÁC*Á4A*C*ÃC(Ã
C*ry   rÕ  rÖ  rÂ  r\  c               ó4   € V ^8„  d   QhRRRRRRRRRRRRR	R
/# )r.   rØ  rN   rœ   ry   r"  rÕ  rÖ  rÂ  r0   r   r1   )r2   s   "r3   r4   rè  ì  sK   € ÷ añ a°sð aÀ#ð aÐP]ð aØ2?ðaØQ^ðaà-0ðaàDNñar5   c          	   ƒ  óh  "  € V P                  \        V4      4      pV'       g   \        RRV 2R7      # \        YYcT;'       g    \	        V4      VR7      pT;'       g3    \        Yc;'       g     \        P                  P                  V4      4      p	V P                  RVRV	R7      G Rj  x€L
 #  L5i)	z“POST a local file to ``/send-attachment``. ``kind="voice"`` sends audio as a voice
note (downgrades to a plain audio attachment where unsupported).Fz#unsafe or missing attachment path: r   )rÂ  ry   rÕ  rÖ  ú/send-attachmentTr(  N)
Úvalidate_media_delivery_pathrN   r   rß  rä  rÆ  rx   rœ   Úbasenamer!  )
rŠ   rØ  rœ   ry   rÕ  rÖ  rÂ  rÙ  rÝ  r“  s
   &&&$$$$   r3   r•  Ú&PhotonAdapter._sidecar_send_attachmentì  s¡   é € ð
 ×5Ñ5´c¸$³iÓ@ˆ	ßÜ eÐ5XÐY]ÐX^Ð3_Ô`Ð`ÜØ dÀ×AdÐAdÌkÐZcÓNdÐnuôwˆà×WÐWÔ,¨T×3VÐ3V¼2¿7¹7×;KÑ;KÈIÓ;VÓWˆØ—_‘_Ð%7¸È$ÐZ_�_Ó`×`Ð`Ñ`ùs   ‚AB2Á B2Á/<B2Â+B0Â,B2c               ó$   € V ^8„  d   QhRRRRRR/# )r.   rœ   rN   rÝ  r5  r0   r1   )r2   s   "r3   r4   rè  ù  s!   € ÷ ñ ¨ð °>ð Ànñ r5   c              ƒ  	ól  "  € V P                   f   \        R4      h\        P                  ! RRR7      ;_uu_4       GR j  x€L
 pVP	                  V P                  V4      W P                  4       R7      G R j  x€L
 pR R R 4      GR j  x€L
  XP                  ^È8w  d!   \        WP                  VP                  4      hVP                  4       ;'       g    / pVP                  R4      '       g"   \        WP                  VP                  V4      hV#  LÑ L› L�  + GR j  x€L 
 '       g   i     L¤; i5i)NzPhoton adapter not connectedr+   Fr^  ©r_   r�  r   )r  r‘  r¼   ra  r#  rO  rU  r�   r­   r¥   r_   r«   )rŠ   rœ   rÝ  rn  r—  r¦   s   &&&   r3   r§  ÚPhotonAdapter._sidecar_callù  så   é € Ø×ÑÒ$ÜÐ=Ó>Ð>ô ×$Ò$¨T¸U×C×CÕCÀvØŸ™ T×%6Ñ%6°tÓ%<À4×QfÑQfÓQh˜Ói×iˆD÷ D×Cà×Ñ˜sÔ"Ü.¨t×5EÑ5EÀtÇyÁyÓQÐQØ�y‰y‹{× Ð ˜bˆØ�x‰x˜�~Š~Ü.¨t×5EÑ5EÀtÇyÁyÐRVÓWÐWØˆñ DÙi÷ D×C×CÒCüsl   ‚>D4Á DÁD4Á4DÁ8DÁ9DÁ=D4ÂDÂ	AD4ÃD4Ã/$D4ÄDÄD4ÄD1	ÄD!Ä
D1	Ä*D1	Ä,D4) r  r'  r  r   r  r)  r$  r.  r  r,  r  r#  r  r  r  r  r	  r*  r  r(  r  r"  r  r  r  r  r  r+  r!  r  r  r  )NNr‡   )NNN)NNNN)Tr�   r�   r‘   r’   r“   Ú_MAX_MESSAGE_LENGTHr  ÚSUPPORTS_MESSAGE_EDITINGÚserial_receive_loopr‰   Ústaticmethodr-  r>  rI  rO  rU  rp  r€  r…  r„  rf  rg  r’  r¸  r¾  r¯  rø  Úclassmethodr  r  r  r,  r1  r7  rb  rC  r{  r¬  rg  rn  rk  ru  r  r‰  r”  r�  r¤  r©  r¯  r´  r»  rÁ  rÆ  rÑ  rÇ  r'  ÚcompilerÌ  r¿  rÒ  ré  rì  rè  rã  ré  rî  rç  rí  rù  Ú	_OK_EMOJIÚ_FAIL_EMOJIrý  r}  r	  r  r  r  r!  r|  r‹  r•  r§  r”   r•   r–   s   @r3   r¾  r¾  /  s’  ø† ÙSà,ÐØ$ÐØÐ÷4@ð 4@ðp ôZó ðZõ
^õõIõ?ð
)°E÷ )õV"õ$?õPõ1õ>õBAõJõõigðZ ôó ðð ôeó ðeð
 ôEó ðEð
 ôó ðõ%põN=õ&`õ>Zõ@0õ235õn!õ
Fõ*^õ06õ6 ÷O÷ò ÷(Yò Y÷Y÷
g÷
Y÷
hõ÷bõað €MØ!Ðõ]ð —z’zÐ"7Ó8Ðàô4ó ð4õcõOõTõ
õmõeõ
u÷	7÷7õHð €IØ€Kõ>õcð ôIó ðIð ôXó ðXõ:õnðJÐV[ð JØ48÷Jð(ZÐPTð ZØ-1÷Zõ.RðaÐ`dð aØBFðaØaeðaà3?÷a÷ó r5   r¾  c               ó    € V ^8„  d   QhRRRR/# )r.   r‘  rN   r0   r   r1   )r2   s   "r3   r4   r4   
  s   € ÷  ñ   3ð  ¨;ñ  r5   c                ó  € T ;'       g    R P                  4       p R\        P                  3R\        P                  3R\        P                  33 F   w  rV P                  V4      '       g   K  Vu # 	  \        P                  # )r7   úimage/zvideo/úaudio/)r¿   r   ÚPHOTOÚVIDEOÚAUDIOÚ
startswithr£  )r‘  Úprefixr’  s   &  r3   r�  r�  
  so   € Ø�JˆJ�B×ÑÓ€DØ#¤[×%6Ñ%6Ð7¸(ÄK×DUÑDUÐ9VÐYaÔcn×ctÑctÐXuÓv‰ˆØ�?‰?˜6×"Ô"ØŠLñ wô ×ÑÐr5   z
image/jpegú.jpgz	image/pngz.pngz	image/gifz.gifz
image/webpz.webpz
image/heicz
image/heifz
image/tiffz	audio/mp3ú.mp3z
audio/mpegz	audio/oggz.oggz	audio/wavz.wavr„  rƒ  rˆ  ú.m4az	audio/aacr…  c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r.   r4  r5  ry   rN   r‘  r…  rr   r0   r"  r1   )r2   s   "r3   r4   r4     s1   € ÷ ñ  ~ð ¸Sð Èð Ø+/ðØ<Iñr5   c               ó"  € V P                  R4      '       g   R#  \        P                  ! V R,          4      p^ RIHpH	pH
p T;'       g    RP                  4       pT'       d   \        T4      P                  MRp	 TP                  R4      '       d*   T	;'       g    \        P                  TR4      p
 T! YJ4      # T'       g   TP                  R4      '       d2   T	;'       g     \         P                  Y#'       d   R	MR
4      p
T! YJ4      # T! YA4      #   \        \        3 d"   p\
        P                  RT4        Rp?R# Rp?ii ; i  \         d    T! YA4      u # i ; i  \"         d"   p\
        P                  RY4        Rp?R# Rp?ii ; i)už   Decode base64-inlined ``content["data"]`` into the shared media cache by MIME; None
when there are no bytes (over the inline cap) or caching fails â†’ marker.r¦   Nz6[photon] failed to decode inbound attachment bytes: %s)Úcache_audio_from_bytesÚcache_document_from_bytesÚcache_image_from_bytesr7   rF  rM  rG  rO  rN  z2[photon] failed to cache inbound attachment %s: %s)r«   Úbase64Ú	b64decoderc   rv   rU   rV   r“  rR  rS  rT  r¿   r   ÚsuffixrK  Ú_IMAGE_EXT_BY_MIMEÚ_AUDIO_EXT_BY_MIMErT   )r4  ry   r‘  r…  rg   rµ   rR  rS  rT  rW  Úexts   &&&$       r3   rŽ  rŽ    sO  € ð �;‰;�v×ÒÙðÜ×Ò˜w v�Ó/ˆ÷ qÑpØ�JˆJ�B×ÑÓ€Dß"&ŒT�$‹Z×Ò¨B€FðØ�?‰?˜8×$Ò$Ø×@Ð@Ô.×2Ñ2°4¸Ó@ˆCð<Ù-¨cÓ7Ð7÷ ˜$Ÿ/™/¨(×3Ò3Ø×[Ð[Ô.×2Ñ2°4Æ;¹ÐTZÓ[ˆCÙ)¨#Ó3Ð3Ù(¨Ó3Ð3øô! œ	Ð"ô Ü�‰ÐOÐQTÔUÝûðûô ô <Ù0°Ó;Ò;ð<ûô ô Ü�‰ÐKÈTÔWÝûðúsw   ›D Á<E" ÂE" ÂE" Â4E	 Â<E" ÃE" ÃE" Ã$'E" ÄE" ÄEÄ%EÅEÅ	EÅE" ÅEÅE" Å"FÅ-F	Æ	Fc               ó    € V ^8„  d   QhRRRR/# )r.   r—  r   r0   r5  r1   )r2   s   "r3   r4   r4   <  s   € ÷ Uñ U˜Cð U Nñ Ur5   c                ó^  € / p\         P                  ! \        4      ;_uu_ 4        V P                  4       ;'       g    / pRRR4       \	        V\
        4      '       d   TM/ p\        VP                  R4      ;'       g    R4      p\        VP                  R4      4      pVR8X  d
   \        pRpMYV P                  ^È8w  d%   RV P                   RV P                  R	,           2pM$\        VP                  R
4      ;'       g    R4      p/ \        V4      CRVRV/C#   + '       g   i     Lä; i)z‹Structured error dict for a failed standalone call (mirrors
``_sidecar_error_from_response``, incl. the canonical target_not_allowed text).Nr™   rš   r‚   rª   Fzsidecar returned rÅ  r¨   rž   zsidecar reported failure)rm   rn   rT   r_   rd   re   rN   r«   rr   r¬   r�   r¥   r   )r—  r¦   r™   r‚   rž   s   &    r3   Ú_standalone_errorr]  <  sö   € ð €DÜ	×	Ò	œY×	'Õ	'Ø�y‰y‹{× Ð ˜bˆ÷ 
(ä˜d¤D×)Ò)‰4¨r€DÜ�d—h‘h˜}Ó-×@Ð@°ÓA€KÜ�T—X‘X˜kÓ*Ó+€IØÐ*Ô*Ü+ˆØ‰	Ø	×	Ñ	˜SÔ	 Ø# D×$4Ñ$4Ð#5°R¸¿	¹	À$½Ð7HÐI‰ä�D—H‘H˜WÓ%×CÐCÐ)CÓDˆØTŒj˜ÓÐT °¸[È)ÑTÐT÷ 
(×	'ús   ¥DÄD,	c               ó    € V ^8„  d   QhRRRR/# )r.   rK   rL   r0   ztuple[Optional[str], int, str]r1   )r2   s   "r3   r4   r4   O  s   € ÷ Sñ S¨ð SÐ0Nñ Sr5   c                óF  € \        4       pRpV'       d{   VP                  R4      '       dd   \        VP                  R4      4      '       d/   \        VR,          4      \	        VP                  R4      V 4      R3# RVP                  R4       R2pRV R\
         R	2V,           3# )
už   ``(token, port, error)`` from the runtime record the gateway persists once the
sidecar passes /healthz â€” the token otherwise exists only in the gateway env.r7   rM   rO   rK   z/ A stale sidecar runtime record was found (pid u4    is not running) â€” the gateway appears to be down.NzšPhoton standalone send requires a running sidecar. Start the Hermes gateway (which spawns the sidecar and records its address under <hermes-home>/runtime/z=), or set PHOTON_SIDECAR_TOKEN in this process's environment.)rh   r«   r}   rN   r
  rH   )rK   ÚrecordÚ
stale_hints   &  r3   Ú_standalone_token_from_recordrb  O  s¯   € ô "Ó#€FØ€Jß�&—*‘*˜W×%Ò%Ü˜fŸj™j¨Ó/×0Ò0Ü�v˜g•Ó'¬°f·j±jÀÓ6HÈ$Ó)OÐQSÐSÐSØGÈÏ
É
ÐSXÓHYÐGZð [=ð =ˆ
à�ð	KÜK_ÐJ`ð aEð	EàGQõ	RðSð Sr5   Ú	thread_idÚmedia_filesÚforce_documentc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r.   Úpconfigr   r¼  rN   r„   rc  r"  rd  r„  re  rr   r0   r5  r1   )r2   s   "r3   r4   r4   `  sS   € ÷ <Añ <AØð<AØ&)ð<AØ47ð<Aàð<Að  ð<Að ð	<Að
 ñ<Ar5   c             ƒ  óŽ  aaa"  € \         '       g   \        R 4      # \        V P                  ;'       g    / P	                  R4      ;'       g    \        R4      \        4      p\        R4      pV'       g"   \        V4      w  rvpV'       g   \        V4      # R\         RV 2oRV/oRp	 \        P                  ! RR	R
7      ;_uu_4       GRj  x€L
 oR VVV3R llp
V'       dÏ   \        V4      pRpV'       d   V
! RRVRV/4      G Rj  x€L
 w  rÜV'       gv   \        4       ;'       d    V'       * pRVR\        W.4      R\         /pV'       d   RVR&   V
! RV4      G Rj  x€L
 w  ppV'       g   \        V4      uuRRR4      GRj  x€L
  # VP	                  R4      p	\!        WV4      G Rj  x€L
  T;'       g    .  EF  w  pp\"        P$                  ! \'        V4      4      pV'       g   \(        P+                  R4       KE  \-        TTV'       d   RMR\/        V4      R7      pV
! RV4      G Rj  x€L
 w  ppV'       g    \        V4      u uuRRR4      GRj  x€L
  # VP	                  R4      ;'       g    T	p	\!        YP	                  R4      \1        V'       d   RMR\2        P4                  P7                  V4      4      4      G Rj  x€L
  EK  	  RRR4      GRj  x€L
  RRRV	/#  EL ELä EL� ELl ELI LÇ L  L2 L  + GRj  x€L 
 '       g   i     L6; i  \8         d   p\        RT 24      u Rp?# Rp?ii ; i5i)r[  rë  rì  rí  rM  rN  rS  Nr+   Fr^  c               ó$   € V ^8„  d   QhRRRRRR/# )r.   rœ   rN   rÝ  r5  r0   z$tuple[Any, Optional[dict[str, Any]]]r1   )r2   s   "r3   r4   Ú&_standalone_send.<locals>.__annotate__t  s'   € ÷ @ñ @ #ð @¨^ð @Ð@dñ @r5   c              “  óè   <"  € SP                  S V  2VSR7      G Rj  x€L
 pVP                  ^È8w  d   VR3# VP                  4       ;'       g    / pY#P                  R4      '       d   V3# R3#  LP5i)z!(response, data-if-ok-else-None).r:  Nr   )r#  r�   r_   r«   )rœ   rÝ  r—  r¦   Úbasern  r�  s   &&  €€€r3   Ú_postÚ_standalone_send.<locals>._postt  ss   øé € à#Ÿ[™[¨D¨6°$°¨¸tÈW˜[ÓU×U�Ø×#Ñ# sÔ*Ø ˜:Ð%Ø—y‘y“{×(Ð( b�Ø§h¡h¨t§n¢n˜dÐ?Ð?¸$Ð?Ð?ñ	 Vùs   ƒA2ŸA0 /A2Á!A2r%  rÛ  r=  r¥   r  r2   r'  r«  z-[photon] standalone send skipping unsafe pathr�  r\  )rÂ  rÕ  r4  rŒ  TrÈ  zPhoton standalone send failed: )r»   r   r
  r  r«   rÈ   r  rb  r  r¼   ra  r1  r  r  r<  r]  rÐ  r   r5  rN   rU   rV   rß  rä  rÆ  rx   rœ   r6  rT   )rg  r¼  r„   rc  rd  re  rK   rM   rž   Úlast_message_idrm  r)  r¦   Ú_respr  Ú	send_bodyr—  Ú
media_pathr�  rÙ  Úatt_bodyrW   rl  rn  r�  s   &&&$$$                @@@r3   Ú_standalone_sendrt  `  sú  úé € ÷ ‹?ÜÐ/Ó0Ð0ÜØ	�‰×	Ð	˜"×!Ñ! .Ó1×^Ð^Ô5GÐH]Ó5^Ô`uów€DäÐ5Ó6€EßÜ:¸4Ó@Ñˆ�UßÜ˜eÓ$Ð$ØÔ*Ð+¨1¨T¨FÐ3€DØ'¨Ð/€GØ%)€Oð*AÜ×$Ò$¨T¸U×C×CÕCÀv÷@ò @÷ Ü.¨wÓ7�Ø�ßÙ(-Ð.>ÀÈGÐUZÐ\dÐ@eÓ(f×"f‘K�EßÜ$5Ó$7×$HÐ$HÀ¼L�Mà! 7¨FÔ4IÈ'Ó4aÐbvÔcvÐ4wð1y�Iç$Ø.8˜	 (Ñ+Ù',¨W°iÓ'@×!@‘J�D˜$ßÜ0°Ó6÷+ D×CÒCð, #'§(¡(¨;Ó"7�Ü-¨gÈÓP×PÐPð )4×(9Ð(9°rÓ(9Ñ$�
˜HÜ/×LÒLÌSÐQ[Ë_Ó]�	ß Ü—N‘NÐ#RÔSÙÜ+Ø˜Y¿©WÀlÔ^iÐjsÓ^tôv�á#(Ð);¸XÓ#F×F‘
��dßÜ,¨TÓ2Ñ2÷G D×CÒCðH #'§(¡(¨;Ó"7×"JÐ"J¸?�Ü-¨g·x±xÀÓ7LÔN_ß'‘G¨\¼2¿7¹7×;KÑ;KÈIÓ;VóOXó Y÷ Yó Yñ ):÷5 D×CðN ˜4 ¨Ð?Ð?òO Dò #gò "Aò' Dò. Qñ GñC DñJY÷K D×C×CÒCûôP ô AÜÐ;¸A¸3Ð?Ó@Õ@ûðAüsW  …/MµMÁAMÂ*$L ÃK,ÃL Ã9LÄK/ÄLÄLÄ+7LÅ"K2Å#LÅ2
LÅ<L Æ	K5Æ
L ÆMÆ LÆ/K8Æ0LÆ=A6LÈ3K;
È4LÉLÉL ÉK=ÉL É!MÉ"LÉ:ALËK?
Ë	LËL Ë!LË"	L Ë+MË,L Ë/LË2LË5L Ë8LË;LË=L Ë?LÌL ÌL	Ì	LÌ

L	ÌL	ÌL ÌMÌ*L=Ì7MÌ8MÌ=MÍMz^any;-;\+\d{6,}$c               ó   € V ^8„  d   QhRR/# rj   r1   )r2   s   "r3   r4   r4   ¤  s   € ÷ (>ñ (>�Tñ (>r5   c                ó  € ^RI Hp V P                  \        \        4      RRR RR\
        \        \        RR.R	VP                  \        R
\        RR\        RRRRRR7       V P                  RRVP                  VP                  R7       R# )z.Called by the Hermes plugin loader at startup.)Úclirê  ziMessage via Photonc                ó   € \        V 4      # r‡   )r¾  r  s   &r3   r¯  Úregister.<locals>.<lambda>ª  s   € ÔP]Ð^aÔPbr5   zCUse Hermes through iMessage via Photon's managed Spectrum platform.zFhttps://hermes-agent.nousresearch.com/docs/user-guide/messaging/photonrþ   r   z‹Run: hermes photon setup  (logs in via device flow, creates a Spectrum project, links your phone number, installs the spectrum-ts sidecar).r  ÚPHOTON_ALLOWED_USERSÚPHOTON_ALLOW_ALL_USERSu   ðŸ“±Ta´  You are texting via iMessage (Photon). Write like a person texting: short and conversational, answer first, no preamble or recap. Markdown mostly does not survive here: any message containing a link is sent as plain text with all formatting stripped, headings flatten to bold, tables to pipe-separated lines, and backtick or code-block text turns into Unicode look-alike glyphs that break when copied. So no headers, tables, code fences or backticks; an occasional **bold** word is fine in a message without links. Put a command or code snippet on its own line as plain text so it copies and runs. Write links as bare URLs; a message that is only a URL sends as a rich preview card. You can send files natively: write MEDIA:/absolute/path/to/file in your response (images and video appear inline, audio as voice notes, other files as attachments). Recipient identifiers are E.164 phone numbers; never expose them in responses unless the user asked.Úlow)Útarget_ref_syntax_fnry   r“  Úadapter_factoryÚdashboard_descriptionÚdocs_urlÚcheck_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_lengthrâ  Úpii_safeÚallow_update_commandÚplatform_hintÚdisplay_tierz1Set up and manage the Photon iMessage integration)ry   Úhelpr„  Ú
handler_fnN)r7   rw  Úregister_platformr    Ú_SEND_DM_GUID_RErÎ   r  r  Úgateway_setupr  rt  r<  Úregister_cli_commandÚregister_cliÚdispatch)ÚctxÚ_clis   & r3   Úregisterr™  ¤  s¢   € åØ×Ñä2Ô3CÓDØÐ2ÑDbØcØYÜ#´_ÔS_Ø)Ð+BÐCð$ð ×#Ñ#Ü)Ð@UÜ-ÐAWØ.ÔCVÐ^dØØ!ð
%ð ðC ô "ðF ×ÑØÐOØ×"Ñ"¨t¯}©}ð ö >r5   i £ )zinternal sidecar errorzupstream connect errorzupstream unavailablezconnection droppedzreset reason: overflowÚupstream_overflowÚupstream_unavailabler‡   >   rN  r�  r\  )˜Ú__conditional_annotations__r“   Ú
__future__r   r¹   rU  r_   Úloggingrx   r'  r  r%  rä   r!  rh  r   r   r   Úpathlibr   Útypingr   r   r	   r
   r   r   r   r   Úurllib.parser   r¼   r»   ÚImportErrorÚgateway.configr   r   Úgateway.platforms._sharedr   r
  r   rõ  r   rÈ   r   r  r   r“  r   r   Úgateway.platforms.eventr   r   Úgateway.platforms.helpersr   r   r   r   r   Úgateway.platforms.send_targetsr    Úutilsr!   Úauthr"   Úsidecar_pathsr#   r$   r%   r&   r'   rÉ   rG   r(   r)   rm   Ú	getLoggerr�   rU   r  r  r<  rH   r%  r&  r·  rç   r
  rÝ  r^  r¼  r6  r¬   r@   rI   rX   rh   rp   r}   r‘  r   r˜   r­   r³   rÀ   rÎ   rÑ   rø   r  r  r  r  rA  r)  r  r  r.  r1  rC  rK  rV  rb  rn  rv  r}  ÚtuplerN   rv  r  r–  r­  r±  Ú__annotations__rê  r¶  rº  rÀ  rÆ  rÐ  rÔ  rß  rä  r¾  r�  rX  rY  rŽ  r]  rb  rt  r’  r™  )rœ  s   @r3   Ú<module>r®     sQ  øðôõ #ã Û Û Û Û 	Û 	Û Û Û Û 
Û ß ,Ñ ,Ý ß [× [Ó [Ý !çÛØ�OðÛØˆ÷
 4Ý A÷ó ÷ Cß =ß Nß SÑ SÝ @Ý #å *÷ lÓ kÝ 8ß HÛ à	×	Ò	˜8Ó	$€àÐ Ø#Ð ØÐ ð -Ð Ø€Ø!Ð ØÐ ØÐ ðKÐ ð
 &*Ð "Ø&@Ð #ØÐ àCÐEcÐdÐ ðNð õ
	õ@õ
Qõ2õ7õ
ô4" ô "ô@˜ô @÷gõ&Fõ3õ.õb4õ(yõV*õ õHõeð —*’*Ð5°r·}±}ÓE€õ
8õ_õFõTõ5õõjõõ	>õ$ð �C˜ d¨3¥i°°cµÐ:Õ;€õiõ"wð8 ÑEØÐ+¨WÐ6OØÑQØÐ%ð	LÐ ÐHó ò 9Ð õ
õõKõ
õNõðÐX\ð Ø04ðØOS÷õ1ôVÐ'ô Võv ð �&˜+ v¨{¸FÀLÐRYØ�&˜,¨°¸fðFÐ ð �˜ v¨{¸FÀKÐQWØ�6˜;¨°¸VðEÐ ð
Ø27÷õBUõ&Sð"<Aà#ð<Að #'ð<Að !÷	<AðB —:’:Ð1Ó2Ð ÷(>øðG4 ô ØˆØ‹ðús   Á3K ËKËK