+
    jHàjb"  ã                  ód  € R t ^ RIHt ^ RIt^ RIHt ^ RIHtHtH	t	 ^ RI
Ht ^ RIHtHt ^ RIHtHtHt ^ RIHt R	tR
R,RR-/t0 R.mtRR/RR0RR1/t] ! R R4      4       tR2R 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"]R#]/t"R$ R% lt#R& R' lt$R( R) lt%R* R+ lt&R# )3u   ``hermes doctor --live`` â€” opt-in bounded real-call tool-backend probes.

Opt-in only: these probes make real (cheap, metadata/read-only) network calls and may spend a
trivial amount of quota. They run ONLY when the user passes ``hermes doctor --live``.
)ÚannotationsN)Ú	dataclass)ÚCallableÚListÚOptional)Úchromium_executable)Ú_sectionÚ
check_info)Ú
check_failÚcheck_okÚ
check_warn)Únormalize_proxy_env_varsg      $@Ú	FirecrawlÚFALÚopenaiÚgroqÚ
elevenlabsc                  ó>   € ] tR t^"t$ RtR]R&   R]R&   RtR]R&   RtR# )	ÚProbeResultzOutcome of one backend probe.ÚstrÚnameÚstatusÚ Údetail© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   Ú__static_attributes__r   ó    Ú;/home/ubuntu/.hermes/hermes-agent/hermes_cli/doctor_live.pyr   r   "   s   ‡ á'à
ƒIØƒKØ€FˆC×r"   r   c               ó$   € V ^8„  d   QhRRRRRR/# )é   Úurlr   ÚheaderszOptional[dict]ÚtimeoutzOptional[float]r   )Úformats   "r#   Ú__annotate__r*   -   s&   € ÷ Bñ B�3ð B ð BÀñ Br"   c                óX   € ^ RI p\        4        TP                  Y;'       g    / VR7      # )z-Single HTTP GET seam for all metadata probes.N©r'   r(   )Úhttpxr   Úget)r&   r'   r(   r-   s   &&& r#   Ú	_http_getr/   -   s&   € ãô ÔØ�9‰9�S§- -¨R¸ˆ9ÓAÐAr"   c               ó   € V ^8„  d   QhRR/# )r%   ÚreturnÚboolr   )r)   s   "r#   r*   r*   7   s   € ÷ ñ ˜Dñ r"   c                 óX   €  ^ RI Hp  \        V ! RR7      4      #   \         d     R# i ; i)zBIs the local browser automation backend (agent-browser) installed?©Ú_find_agent_browserF)Úvalidate)Útools.browser_tool_installr5   r2   Ú	Exceptionr4   s    r#   Ú_browser_availabler9   7   s-   € ðÝBÜÑ'°Ô7Ó8Ð8øÜô Úðús   ‚ š)¨)c               ó    € V ^8„  d   QhRRRR/# )r%   r(   Úfloatr1   Útupler   )r)   s   "r#   r*   r*   @   s   € ÷ 5ñ 5 5ð 5¨Uñ 5r"   c           	     óŒ  €  ^ RI Hp T! 4       ;_uu_ 4       pTP                  P	                  R\        4       RT R,          R7      p TP                  4       P                  RT R,          R7       TP                  4         RRR4       R
#   \         d    R	u # i ; i  TP                  4        i ; i  + '       g   i     R
# ; i)z»Launch a browser, open about:blank, close. Returns (ok, detail). Uses Playwright directly (what
agent-browser drives underneath) so the probe owns the full lifecycle and always cleans up.)Úsync_playwrightÚchromiumTiè  )ÚchannelÚexecutable_pathÚheadlessr(   zabout:blank©r(   N)Fzplaywright not installed)Tzlaunched + about:blank + closed)	Úplaywright.sync_apir>   ÚImportErrorr?   Úlaunchr   Únew_pageÚgotoÚclose)r(   r>   ÚpÚbrowsers   &   r#   Ú_launch_browser_proberL   @   s±   € ð3Ý7ñ 
×	Ô	˜aØ—*‘*×#Ñ#ØÔ0CÓ0EØ 7¨T¥>ð $ó 
ˆð	Ø×ÑÓ×#Ñ# M¸7ÀT½>Ð#ÔJà�M‰M�O÷ 
ð 5Ð4øô ô 3Ø2Ò2ð3ûð �M‰M�Oú÷ 
Ö	ð 5Ð4ús4   ‚B
 —/B2Á(BÁ/B2Â
BÂBÂB/Â/B2Â2C	c               ó$   € V ^8„  d   QhRRRRRR/# )r%   r   r   ÚconfigÚdictr(   r;   r   )r)   s   "r#   r*   r*   S   s&   € ÷ Gñ G˜Cð G¨ð G¸ñ Gr"   c                ó"   € ^ RI Hp V! WVR7      # )z:initialize + tools/list against one configured MCP server.)Ú_probe_single_server)Úconnect_timeout)Úhermes_cli.mcp_configrQ   )r   rN   r(   rQ   s   &&& r#   Ú_probe_mcp_serverrT   S   s   € å:Ù ¸gÔFÐFr"   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   r   r   Úkey_hintr1   r   r   )r)   s   "r#   r*   r*   [   s&   € ÷ xñ x˜ð x¨cð x°kñ xr"   c           	     ó´   € \        VR R4      pVe$   ^ÈTu;8:  d   R8  d   M M\        V RRV R24      # \        T RVR9   d   RV RV R24      # RV R24      # )	Ústatus_codeNi,  Úpassz(HTTP Ú)Úfailu    â€” check )i‘  i“  )Úgetattrr   )r   ÚresprV   Úcodes   &&& r#   Ú_classify_httpr_   [   su   € Ü�4˜¨Ó-€DØÒ˜C 4Ö-¨#×-Ü˜4 ¨6°$°°qÐ)9Ó:Ð:Ü�t˜VÈdÐV`ÔN` v¨d¨V°;¸x¸jÈÐ%JÓwÐwÐhnÐosÐntÐtuÐfvÓwÐwr"   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR	/# )
r%   r   r   r&   Úenv_varÚschemer(   r;   r1   r   r   )r)   s   "r#   r*   r*   b   s7   € ÷ /ñ /�sð / ð /¨sð /¸Cð /È%ð /ÐT_ñ /r"   c                ó¸   € \         P                  ! VR4      P                  4       pV'       g   \        V RR4      # \	        VRV RV 2/VR7      p\        WV4      # )zDMetadata GET authenticated by one env var (never a generation call).r   Úskipú(not configured)ÚAuthorizationÚ r,   )ÚosÚgetenvÚstripr   r/   r_   )r   r&   ra   rb   r(   Úkeyr]   s   &&&&&  r#   Ú_keyed_proberl   b   sZ   € ä
�)Š)�G˜RÓ
 ×
&Ñ
&Ó
(€CßÜ˜4 Ð);Ó<Ð<Ü�S ?°v°h¸aÀ¸uÐ4EÐ"FÐPWÔX€DÜ˜$ gÓ.Ð.r"   c               ó    € V ^8„  d   QhRRRR/# )r%   r(   r;   r1   r   r   )r)   s   "r#   r*   r*   k   s   € ÷ Kñ K˜Eð K kñ Kr"   c                óŒ   € \        4       '       g   \        R RR4      # \        V 4      w  r\        R V'       d   RMRRV R24      # )ÚBrowserrd   re   rY   r[   Ú(rZ   )r9   r   rL   )r(   Úokr   s   &  r#   Ú_probe_browserrr   k   sB   € Ü×ÒÜ˜9 fÐ.@ÓAÐAÜ& wÓ/�J€BÜ�y¯B¡&°F¸aÀ¸xÀq¸MÓJÐJr"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   Úkindr   rN   rO   r(   r;   r1   r   r   )r)   s   "r#   r*   r*   r   s(   € ÷ ñ �sð  Dð °5ð ¸[ñ r"   c           	     ón  € V P                  4       pVP                  V 4      ;'       g    / P                  R4      ;'       g    RP                  4       P                  4       pV\        9   d   \        TRRT;'       g    R R24      # V\        9  d   \        VRRV R24      # \        V,          w  rVp\        P                  ! VR4      P                  4       pV'       g   \        VRRV R	V R
24      # VR8X  d   RV/MRRV 2/p	\        V\        WYVR7      V4      p
RV RV
P                   2V
n        V
# )z<Shared TTS/STT metadata probe (voices/models list GET only).Úproviderr   rd   z(provider 'Úlocalu!   ' â€” no remote backend to probe)u    ' â€” no live probe implemented)Úwarnz' configured but z is not set)Úxiz
xi-api-keyrf   zBearer r,   rp   z) )Úupperr.   rj   ÚlowerÚ_LOCAL_AUDIO_PROVIDERSr   Ú_AUDIO_PROBESrh   ri   r_   r/   r   )rt   rN   r(   r   rv   r&   ra   rb   rk   r'   Úresults   &&&        r#   Ú_probe_audior   r   s3  € à�:‰:‹<€DØ—*‘*˜TÓ"×(Ð( b×-Ñ-¨jÓ9×@Ð@¸b×GÑGÓI×OÑOÓQ€HØÔ)Ô)Ü˜4 ¨;°x×7JÐ7JÀ7Ð6KÐKlÐ)mÓnÐnØ”}Ô$Ü˜4 ¨;°x°jÐ@`Ð)aÓbÐbÜ(¨Õ2Ñ€C�&Ü
�)Š)�G˜RÓ
 ×
&Ñ
&Ó
(€CßÜ˜4 ¨;°x°jÐ@QÐRYÐQZÐZfÐ)gÓhÐhØ%+¨t¤^ˆ|˜SÑ!¸/ÈWÐUXÐTYÈ?Ð9[€GÜ˜D¤)¨CÈ'Ô"RÐT[Ó\€FØ˜�z  F§M¡M ?Ð3€F„MØ€Mr"   rY   rx   r[   c               ó$   € V ^8„  d   QhRRRRRR/# )r%   r~   r   Úissuesú	list[str]r1   ÚNoner   )r)   s   "r#   r*   r*   ‰   s&   € ÷ Kñ K�Kð K¨ð K°tñ Kr"   c                óP  € \         P                  V P                  4      pVf(   \        V P                   RV P
                   R24       R # V! V P                  V P
                  4       V P                  R8X  d.   VP                  RV P                   RV P
                   24       R # R # )Nrg   u    â€” skippedr[   zLive probe failed: )Ú
_REPORTERSr.   r   r	   r   r   Úappend)r~   r�   Úreporters   && r#   Ú_reportrˆ   ‰   s   € Ü�~‰~˜fŸm™mÓ,€HØÒÜ�f—k‘k�] ! F§M¡M ?°,Ð?Ô@ÙÙˆV�[‰[˜&Ÿ-™-Ô(Ø‡}�}˜ÔØ�‰Ð+¨F¯K©K¨=¸¸&¿-¹-¸ÐIÖJñ r"   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r%   r   r   ÚfnzCallable[[], ProbeResult]r�   r‚   r1   r   r   )r)   s   "r#   r*   r*   “   s)   € ÷ 
ñ 
�3ð 
Ð5ð 
¸yð 
È[ñ 
r"   c                óN  €  V! 4       p\        W24       V#   \          d   p\        T RRT R24      p Rp?L.Rp?i\         d`   p\        T4      ;'       g    TP                  P
                  p\        T RRTP                  4       9   d   RT R2MRT R24      p Rp?L–Rp?ii ; i)z=Run one probe with a catch-all so a crash never kills doctor.r[   z(timed out: rZ   NÚtimerp   )ÚTimeoutErrorr   r8   r   Ú	__class__r   r{   rˆ   )r   rŠ   r�   r~   ÚexcÚmsgs   &&&   r#   Ú_run_oner‘   “   s¡   € ðkÙ“ˆô ˆFÔØ€Møô ô BÜ˜T 6¨\¸#¸¸aÐ+@ÓA�ûÜô kÜ�#‹h×0Ð0˜#Ÿ-™-×0Ñ0ˆÜ˜T 6ÀFÈcÏiÉiËkÔDY¨\¸#¸¸aÑ+@ÐabÐcfÐbgÐghÐ_iÓj�ûðkús%   ‚ –B$¡7·B$ÁB$ÁABÂB$c               ó    € V ^8„  d   QhRRRR/# )r%   r�   r‚   r1   zlist[ProbeResult]r   )r)   s   "r#   r*   r*       s   € ÷ ñ ˜Ið Ð*;ñ r"   c           
     óŒ  aa	€ ^ RI Hp V! 4       o \        SP                  R4      ;'       g    / P                  R\        4      4      o	\        RS	4      o	\        R4       \        P                  4        UUu. uF  w  r#\        W"V3V	3R llV 4      NK  	  pppVP                  \        RV	3R lV 4      4       SP                  R	4      ;'       g    / p\        V\        4      '       dM   V'       dE   \        V4       F4  pW%V,          3R
 V	3R lllpVP                  \        RV 2W`4      4       K6  	  M/VP                  \!        RRR4      4       \#        VR,          V 4       R F5  pVP                  \        VP%                  4       V3VV	3R llV 4      4       K7  	  V#   \
        \        3 d    \        o	 ELsi ; iu uppi )uÎ   Run one bounded, read-only probe per configured tool backend â€” sequential by design (predictable output
ordering). Appends a remediation line to ``issues`` per failed probe; skipped backends never append.)Úload_config_readonlyÚdoctorÚlive_probe_timeoutg      ð?z(Live Backend Probes (opt-in, real calls)c                ó"   <€ \        V .VOSN5!  # ©N)rl   )ÚnÚspecr(   s   &&€r#   Ú<lambda>Ú!run_live_checks.<locals>.<lambda>¬   s   ø€ ´¸aÐ1PÀ$Ð1PÈÔ1Pr"   ro   c                 ó   <€ \        S 4      # r˜   )rr   rC   s   €r#   r›   rœ   ¯   s
   ø€ ¬~¸gÔ/Fr"   Úmcp_serversc               ó   € V ^8„  d   QhRR/# )r%   r1   r   r   )r)   s   "r#   r*   Ú%run_live_checks.<locals>.__annotate__³   s   € ÷ nñ n°;ñ nr"   c                óž   <€ \        V\        4      '       g   \        R V  2RR4      # \        R V  2RR\        \	        WS4      4       R24      # )úMCP: rd   z(malformed config entry)rY   rp   z	 tool(s)))Ú
isinstancerO   r   ÚlenrT   )r™   Úer(   s   &&€r#   Ú_probeÚrun_live_checks.<locals>._probe³   sU   ø€ Ü! !¤T×*Ò*Ü&¨¨q¨c {°FÐ<VÓWÐWÜ" U¨1¨# ;°¸!¼CÔ@QÐRSÐX_Ó@`Ó<aÐ;bÐbkÐ8lÓmÐmr"   r¢   ÚMCPrd   z(no servers configured)c                ó   <€ \        V SS4      # r˜   )r   )ÚkrN   r(   s   &€€r#   r›   rœ   ¼   s   ø€ ¼\È!ÈVÐU\Ô=]r"   éÿÿÿÿ)ÚttsÚstt)Úhermes_cli.configr”   r;   r.   ÚDEFAULT_PROBE_TIMEOUTÚ	TypeErrorÚ
ValueErrorÚmaxr   Ú_KEYED_PROBESÚitemsr‘   r†   r£   rO   Úsortedr   rˆ   rz   )
r�   r”   r   rš   ÚresultsÚserversr¦   rt   rN   r(   s
   &       @@r#   Úrun_live_checksr¸       s|  ù€ õ 7Ù!Ó#€Fð(Ü˜Ÿ™ HÓ-×3Ð3°×8Ñ8Ð9MÔOdÓeÓfˆô �#�wÓ€GÜÐ7Ô8ô (×-Ñ-Ô/ô"á/‰JˆDô 	�¨4ÖPÐRXÖYÙ/ð ñ "ð ‡N�N”8˜IÔ'FÈÓOÔPØ�j‰j˜Ó'×-Ð-¨2€GÜ�'œ4× Ò §WÜ˜7–OˆDØ¨¥÷ nò nð �N‰Nœ8 e¨D¨6 N°FÓCÖDò $ð 	�‰”{ 5¨&Ð2KÓLÔMÜ�˜•˜VÔ$ÛˆØ�‰”x §
¡
£°t×.]Ð_eÓfÖgñ à€Nøô- ”zÐ"ô (Ü'‹ð(üó"s   ‘F" ®F" Á7G Æ"F=Æ<F=c               ó   € V ^8„  d   QhRR/# )r%   r�   r‚   r   )r)   s   "r#   r*   r*   À   s   € ÷ 	ñ 	¨	ñ 	r"   c                ó–   € \        V RR4      '       g   R#  \        V4      #   \         d   p\        RRT R24        Rp?R# Rp?ii ; i)zžCalled from ``run_doctor`` after the static checks; no-op (None) unless ``--live`` was passed.
A crash anywhere in the live subsystem must never break doctor.ÚliveFNzLive backend probes crashedrp   rZ   )r\   r¸   r8   r   )Úargsr�   r�   s   && r#   Úmaybe_run_live_checksr½   À   sL   € ô �4˜ ×'Ò'ÙðÜ˜vÓ&Ð&øÜô ÜÐ0°A°c°U¸!°*Ô=Ýûðús   —
" ¢A­AÁA)z.https://api.firecrawl.dev/v2/team/credit-usageÚFIRECRAWL_API_KEYÚBearer)z https://fal.ai/api/models?page=1ÚFAL_KEYÚKey>   r   Úedgerw   ÚpiperÚneuttsÚ	kittentts)z https://api.openai.com/v1/modelsÚOPENAI_API_KEYr¿   )z%https://api.groq.com/openai/v1/modelsÚGROQ_API_KEYr¿   )z#https://api.elevenlabs.io/v1/voicesÚELEVENLABS_API_KEYry   )NN)'r   Ú
__future__r   rh   Údataclassesr   Útypingr   r   r   Úhermes_cli.browser_runtimer   Úhermes_cli.doctorr   r	   Úhermes_cli.doctor_reportr
   r   r   Úutilsr   r¯   r³   r|   r}   r   r/   r9   rL   rT   r_   rl   rr   r   r…   rˆ   r‘   r¸   r½   r   r"   r#   Ú<module>rÐ      sÖ   ðñõ #ã 	Ý !ß +Ñ +å :ß 2ß EÑ EÝ *àÐ ð ÐbØ	ÐAð€ò
 OÐ àÐNØ
ÐOØÐUð€ð ÷ð ó ð÷Bõõ5õ&Gõxõ/õKõð( �h ¨
°F¸JÐG€
õKõ
õ÷@	r"   