+
    jHàjòl  ã                  ó¬  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
Ht ^ RIHt ^ RIHtHtHtHtHtHtHt ^ RIHt ^ RIHt ^ RIHtHtH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$RNt%R R lt&R R lt'R R lt(R R lt)R R lt*RR /t+R!],R"&   R# R$ lt-R% R& lt.]! 4       R' R( l4       t/0 ROmt0R, R- lt1R. R/ lt2R0 R1 lt3R2 R3 lt4R4 R5 lt5R6 R7 lt6R+]2R)]4R*]5/t7]! 4       R8 R9 l4       t8R: R; lt9R< R= lt:R> R? lt;R@ RA lt<]! 4       RB RC l4       t=RD RE lt>RF RG lt?]! 4       RH RI l4       t@]! RJRK4      RL RM l4       tAR# )PzÿExternal-tool checks for hermes doctor: terminal backends, git/rg, Node + agent-browser, npm audit, tool availability.
Split out of ``hermes_cli/doctor.py``, which re-exports every name so ``hermes_cli.doctor.<name>`` keeps resolving (and monkeypatching).)ÚannotationsN)ÚPath)Ú_system_package_install_cmd)ÚFindingÚ_fail_and_issueÚ
check_boolÚ
check_infoÚcheck_okÚ
check_warnÚdoctor_check)Údescribe_vercel_auth)Ú	is_termux)Údocker_runtime_nameÚdocker_runtime_start_hintÚfind_dockerc               ó    € V ^8„  d   QhRRRR/# )é   ÚcmdÚstrÚreturnú
str | None© )Úformats   "Ú</home/ubuntu/.hermes/hermes-agent/hermes_cli/doctor_tools.pyÚ__annotate__r      s   € ÷ ñ �Sð ˜Zñ ó    c                óT   €  \         P                  ! V 4      #   \         d     R# i ; i)zCshutil.which wrapper resilient to platform monkeypatching in tests.N)ÚshutilÚwhichÚ	Exception)r   s   &r   Ú_safe_whichr       s(   € ðÜ�|Š|˜CÓ Ð øÜô Úðús   ‚ ˜'¦'c               ó    € V ^8„  d   QhRRRR/# )r   Únamer   r   zPath | Noner   )r   s   "r   r   r      s   € ÷ ?ñ ?˜ð ? ñ ?r   c                óh   €  ^ RI Hp V! V 4      pTe   TP                  # R#   \         d     R# i ; i)z†Use PM's current selection, including writable payload extensions.

Old facts are diagnostic evidence, not an available runtime tool.
)Úinstalled_packageN)Úpmr$   r   Úbinary)r"   r$   Ú	installeds   &  r   Ú_pm_tool_pathr(      s@   € ð
Ý(á% dÓ+ˆ	ð  )Ò4ˆ9×ÑÐ>¸$Ð>øô ô Úðús   ‚" ¢1°1c               ó    € V ^8„  d   QhRRRR/# )r   Úcommandr   r   r   r   )r   s   "r   r   r   )   s   € ÷ ñ  Sð ¨Zñ r   c                ó”  €  ^ RI p^ RI HpHp ^ RIHp VP                  4       pVP                  4        F~  pVP                  V4      p\        Wt4      '       g   K'  VP                  V4      pV'       g   KB  \        V4      P                  P                  R4      P                  R4      V 8X  g   K|  Vu # 	  R#   \         d     R# i ; i)uË   The pm package that provisions *command*, derived from pm's own
package definitions (binary_rel â†’ executable basename) â€” no restated
name table, so new pm packages are covered without doctor changes.N)ÚregistryÚstore)ÚBinaryPackagez.exez.cmd)r%   r,   r-   Úpm.packagesr.   Úcurrent_targetÚall_packagesÚget_packageÚ
isinstanceÚ_relr   r"   Úremovesuffixr   )	r*   r%   r,   r-   r.   ÚtargetÚpackage_nameÚpackageÚrels	   &        r   Ú_pm_package_for_commandr:   )   s¤   € ðÛß&Ý-à×%Ñ%Ó'ˆØ$×1Ñ1Ö3ˆLØ×*Ñ*¨<Ó8ˆGÜ˜'×1Ô1Ø—l‘l 6Ó*�ß‘3œ4 ›9Ÿ>™>×6Ñ6°vÓ>×KÑKÈFÓSÐW^Ö^Ø'Ò'ñ 4ñ øô ô Úðús*   ‚AB8 ÁB8 Á65B8 Â0B8 Â4B8 Â8CÃCc               ó    € V ^8„  d   QhRRRR/# )r   r"   r   r   ztuple[str | None, str]r   )r   s   "r   r   r   >   s   € ÷ !ñ !�sð !Ð5ñ !r   c                óœ   € V \        V 4      3 F/  pV'       g   K  \        V4      pV'       g   K"  \        V4      R3u # 	  \        V 4      R3# )a  Resolve the tool Hermes would actually run: the pm store first
(pinned installs run tools out of the store, which nothing puts on
PATH), then PATH. *name* is the command ("rg"); its pm package
("ripgrep") is resolved from pm's own definitions. Returns
``(path, ok-row detail)``.z
(pm store)Ú )r:   r(   r   r    )r"   r7   Ústageds   &  r   Ú_doctor_toolr?   >   sO   € ð Ô6°tÓ<Ó=ˆßÙÜ˜|Ó,ˆß‰6Ü�v“; Ð,Ò,ñ >ô �tÓ˜bÐ Ð r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   ú	list[str]ÚtimeoutÚintr   Úboolr   )r   s   "r   r   r   M   s!   € ÷ ñ �ð  Sð °4ñ r   c                óŒ   €  \         P                  ! V 3RRRV/VB P                  ^ 8H  #   \         P                   d     R# i ; i)zFTrue when *cmd* exits 0 within *timeout*; a timeout counts as failure.Úcapture_outputTrB   F)Ú
subprocessÚrunÚ
returncodeÚTimeoutExpired)r   rB   Úkws   &&,r   Ú_run_okrL   M   sI   € ðÜ�~Š~˜cÑN°$ÐNÀÐNÈ2ÑN×YÑYÐ]^Ñ^Ð^øÜ×$Ñ$ô Úðús   ‚'* ªAÁAc               ó    € V ^8„  d   QhRRRR/# )r   Únode_installedrD   r   rA   r   )r   s   "r   r   r   U   s   € ÷ ?ñ ?°ð ?¸ñ ?r   c                óˆ   € V '       d   . MR .pVRR.,          p\        V^4       UUu. uF  w  r#V RV 2NK  	  upp# u uppi )zpkg install nodejsznpm install -g agent-browserzagent-browser installz) )Ú	enumerate)rN   ÚstepsÚiÚsteps   &   r   Ú_termux_browser_setup_stepsrT   U   sM   € ß ‰BÐ';Ð&<€EØ	Ð,Ð.EÐFÕF€EÜ*3°E¸1Ô*=Ô>Ñ*=™w˜qˆqˆc��D�6‹NÑ*=Ò>Ð>ùÓ>s   ¨>c               ó    € V ^8„  d   QhRRRR/# ©r   ÚitemÚdictr   rD   r   )r   s   "r   r   r   c   s   € ÷ Xñ X Tð X¨dñ Xr   c                óV  € V P                  R4      ;'       g    . pV P                  R4      R8H  ;'       dt    \        P                  P                  R4      '       * ;'       dH    \        V4      ;'       d5    \        ;QJ d    R V 4       F  '       d   K   R# 	  R# ! R V 4       4      # )zQReturn True when Kanban is unavailable only because this is not a worker process.Útoolsr"   ÚkanbanÚHERMES_KANBAN_TASKc              3  óV   "  € T F  p\        V4      P                  R 4      x € K!  	  R# 5i)Úkanban_N)r   Ú
startswith)Ú.0Útools   & r   Ú	<genexpr>Ú-_is_kanban_worker_env_gate.<locals>.<genexpr>g   s$   é € Ð#VÑPUÈ¤C¨£I×$8Ñ$8¸×$CÐ$CÓPUùs   ‚')FT)ÚgetÚosÚenvironrD   Úall)rW   rZ   s   & r   Ú_is_kanban_worker_env_gaterh   c   s�   € à�H‰H�WÓ×#Ð# €EØ�H‰H�VÓ Ñ(÷ Wð W´·±·±Ð@TÓ1UÔ-U÷ Wð WÜ�U“÷Wð Wß #£Ñ#VÑPUÓ#V§¤ðXÚ #ðXØ #Ñ#VÑPUÓ#VÓ VðXr   c               ó    € V ^8„  d   QhRRRR/# )r   Útoolsetr   r   r   )r   s   "r   r   r   j   s   € ÷ ñ ¨cð °cñ r   c                ób   € V R8X  d(   \         P                  P                  R4      '       g   R# R# )zKOptional explanatory suffix for toolsets whose doctor status needs context.r[   r\   z;(runtime-gated; loaded only for dispatcher-spawned workers)r=   )re   rf   rd   )rj   s   &r   Ú _doctor_tool_availability_detailrl   j   s#   € à�(Ô¤2§:¡:§>¡>Ð2F×#GÒ#GÙLÙr   c               ó   € V ^8„  d   QhRR/# )r   r   zlist[tuple[str, str, str]]r   )r   s   "r   r   r   q   s   € ÷ ñ Ð%?ñ r   c                 óž  € . p  ^ RI HpHp ^ RIHpHp V! 4        RT3RT33 F€  w  rV T! 4       pTf   T P                  RTR34       K'  \        TRR4      ;'       g    \        T4      P                  pT P                  T! T4      '       d
   R	TR
T R23MRTR
T R234       K‚  	  T #   \         d    T u # i ; i  \         d    Rp L›i ; i)a  Return ``(status, label, detail)`` rows (status ``ok``/``warn``) for web search/extract readiness.

Uses the same active-provider resolvers as the tools but reports ``is_available()``
readiness, so an explicitly selected but unconfigured backend does not look healthy.

See #78412.
)Úget_active_extract_providerÚget_active_search_provider)Ú_ensure_web_plugins_loadedÚ_provider_is_readyz
web searchzweb extractNÚwarnz$(no provider selected or registered)r"   ÚokÚ(Ú)z# selected; provider not configured))Úagent.web_search_registryro   rp   Útools.web_toolsrq   rr   r   ÚappendÚgetattrÚtypeÚ__name__)	Úrowsro   rp   rq   rr   Ú
capabilityÚgetterÚproviderr"   s	            r   Ú_doctor_web_capability_rowsr�   q   sõ   € ð (*€DðßeßRá"Ô$ð !-Ð.HÐIÈMÐ[vÐKwÓxÑˆ
ð	Ù“xˆHð ÒØ�K‰K˜ Ð-SÐTÔUÙÜ�x ¨Ó.×IÐI´$°x³.×2IÑ2IˆØ�‰Ñ7IÈ(×7SÒ7S�T˜:¨¨4¨&° {Ñ3Ø  *°°$°Ð7ZÐ.[Ð\ö	^ñ yð €Køô ô ØŠðûô
 ô 	ØŠHð	ús"   „B) ©B<Â)B9Â8B9Â<CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú	availablerA   Úunavailableú
list[dict]r   ztuple[list[str], list[dict]]r   )r   s   "r   r   r   �   s#   € ÷ 2ñ 2¸ð 2ÐQ[ð 2Ð`|ñ 2r   c                ó®   € \        V 4      . r2V FA  p\        V4      '       g   VP                  V4       K'  RV9  g   K0  VP                  R4       KC  	  W#3# )z>Adjust runtime-gated tool availability for doctor diagnostics.r[   )Úlistrh   ry   )rƒ   r„   Úupdated_availableÚupdated_unavailablerW   s   &&   r   Ú)_apply_doctor_tool_availability_overridesrŠ   �   sS   € ä-1°)«_¸bÐ*ÛˆÜ)¨$×/Ò/Ø×&Ñ& tÖ,ØÐ.Ö.Ø×$Ñ$ XÖ.ñ	 ð
 Ð1Ð1r   c               ó   € V ^8„  d   QhRR/# )r   r   zset[str] | Noner   )r   s   "r   r   r   š   s   € ÷ ñ ¨/ñ r   c                 ó¬   €  ^ RI Hp  ^ RIHp T! V ! 4       ;'       g    / R4       Uu0 uF  p\	        V4      kK  	  up# u upi   \
         d     R# i ; i)zHReturn toolsets enabled for the CLI, or None if config resolution fails.)Úload_config)Ú_get_platform_toolsÚcliN)Úhermes_cli.configr�   Úhermes_cli.tools_configrŽ   r   r   )r�   rŽ   rj   s      r   Ú _enabled_cli_toolsets_for_doctorr’   š   sP   € ðÝ1Ý?Ù,?ÁÃ×@SÐ@SÐQSÐUZÔ,[Ó\Ñ,[ ”�G–Ñ,[Ñ\Ð\ùÒ\øÜô Úðús$   ‚A ž
A ¨?¼A ¿A ÁAÁAÚ	image_genuf   (image generation unavailable â€” check the provider selection and its key or SDK with 'hermes tools')zdict[str, str]Ú_TOOLSET_SETUP_HINTSc               ó    € V ^8„  d   QhRRRR/# rV   r   )r   s   "r   r   r   ¬   s   € ÷ nñ n�tð n ñ nr   c                ó¨   € \        V P                  R 4      ;'       g2    V P                  R4      ;'       g    V P                  R4      \        9   4      # )Úmissing_varsÚenv_varsr"   )rD   rd   r”   )rW   s   &r   Ú_setup_gatedr™   ¬   s>   € Ü�—‘˜Ó(×lÐl¨D¯H©H°ZÓ,@×lÐlÀDÇHÁHÈVÓDTÔXlÑDlÓmÐmr   c               ó    € V ^8„  d   QhRRRR/# )r   r„   r…   r   r   )r   s   "r   r   r   °   s   € ÷ Qñ Q°zð QÀjñ Qr   c                óø   € V  Uu. uF  p\        V4      '       g   K  VNK  	  pp\        4       pVf   V# V Uu. uF0  p\        VP                  R4      ;'       g    R4      V9   g   K.  VNK2  	  up# u upi u upi )zaFilter unavailable setup-gated toolsets (missing key OR setup hint) to those enabled for the CLI.r"   r=   )r™   r’   r   rd   )r„   rW   Úapi_key_unavailableÚenabled_toolsetsrR   s   &    r   Ú%_missing_api_key_toolsets_for_summaryrž   °   s•   € á,7ÓN©K D¼<È×;MŸ4˜4©KÐÐNÜ7Ó9ÐØ"2Ò":Ðð  QÑL_ó  AQÑL_ÀqÔcfÐgh×glÑglÐmsÓgt×gzÐgzÐxzÓc{ð  @Pñ  dPÇÀÑL_ñ  AQð  Qùò Oùò AQs   …A2�A2¹!A7Á	A7Á)A7c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Ú
should_fixrD   Úfr   r   ÚNoner   )r   s   "r   r   r   ¸   s&   € ÷ [ñ [ $ð [¨7ð [°tñ [r   c                óÖ   € \        R 4      w  r#\        R4      w  rE\        VR V3R4       \        VRV R2P                  4       3R4      '       g   \        R\	        R4       24       R# R# )	ÚgitÚrgzripgrep (rg)z (faster file search)zInstall for faster search: ÚripgrepN)zgit not foundú
(optional))zripgrep (rg) not foundz (file search uses grep fallback))r?   r   Ústripr   r   )r¡   r¢   r¥   Ú
git_detailr¦   Ú	rg_details   &&    r   Ú_check_git_and_rgr¬   ·   su   € ä" 5Ó)�O€CÜ  Ó&�M€BÜˆs�U˜JÐ'Ð)HÔIÜ�b˜>¨i¨[Ð8MÐ+N×+TÑ+TÓ+VÐWØT÷Vò VäÐ0Ô1LÈYÓ1WÐ0XÐYÖZñVr   ÚdaytonaÚvercel_sandboxÚsshc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úterminal_envr   Úrunning_in_containerrD   ÚissuesrA   r   r£   r   )r   s   "r   r   r   Ä   s*   € ÷ <ñ <¨ð <À4ð <ÐQZð <Ð_cñ <r   c                óà  € \        4       pV R 8X  d‹   V'       g   \        RRRV4       R# \        V4      p\        V4      pVR8X  d   V R2MV R2p\	        \        VR.^
R7      YDR8X  d   R	MR
3VR3V^ ,          P                  4        VR,           R2V4       R# V'       d   \        \        V4      R4       R# \        4       '       d   \        R4       R# V'       g   \        RR4       R# R# )ÚdockerzDocker or Podman not installedz*(needed for the 'docker' terminal backend)zKInstall Docker or Podman, or run `hermes setup terminal` to switch backend.ÚDockerz daemon not runningz not reachableÚversion)rB   z(daemon running)z(reachable):é   NNz3, or run `hermes setup terminal` to switch backend.r¨   zCDocker backend is not available inside Termux (expected on Android)zDocker/Podman not foundN)r   r   r   r   Ú_requirerL   Úupperr	   Ú
_is_termuxr   r
   )r±   r²   r³   Ú
docker_exeÚruntimeÚhintÚunreachables   &&&    r   Ú_check_docker_backendrÀ   Ä   së   € Ü“€JØ�xÔßÜÐ<Ð>jØiÐkqösô *¨*Ó5ˆGÜ,¨ZÓ8ˆDà3:¸hÔ3F�7�)Ð.Ñ/ÈwÈiÐWeÐLfð ô
 ”W˜j¨)Ð4¸bÔAØÀÔ5HÑ1ÈmÐ\Ø!Ð#OÐPØ˜Q�Ÿ™›Ð(¨¨b­¨
Ð2eÐfÐhnöp÷ 
ÜÔ$ ZÓ0°,Ö?Ü	�ŠÜÐXÖYß!ÜÐ,¨lÖ;ñ "r   c               ó    € V ^8„  d   QhRRRR/# ©r   r³   rA   r   r£   r   )r   s   "r   r   r   Þ   s   € ÷ Hñ H˜yð H¨Tñ Hr   c           
     ó†  € \         P                  ! R 4      pV'       g   \        RRRV 4      # R R 4       w  r#p. ROpV'       d   VRV.,          pV'       d)   VR\         P                  P	                  V4      .,          pYR'       d   V RV 2MTR.,          p\        \        V^R	R
RR7      RV 2RV 2R3RV 2V 4       R# )ÚTERMINAL_SSH_HOSTzSSH host not configuredz'(needed for the 'ssh' terminal backend)z<run `hermes setup terminal` and enter the SSH host and user.c              3  óT   "  € T F  p\         P                  ! R V 24      x € K   	  R# 5i)ÚTERMINAL_SSH_N)re   Úgetenv)r`   Úks   & r   rb   Ú%_check_ssh_backend.<locals>.<genexpr>ã   s%   é € Ð"cÑKbÀa¤2§9¢9¨}¸Q¸CÐ-@×#AÐ#AÓKbùs   ‚&(z-pz-iÚ@zecho okTúutf-8Úreplace)rB   ÚtextÚencodingÚerrorszSSH connection to r=   zCheck SSH configuration for N)ÚUSERÚPORTÚKEY)r¯   ú-ozConnectTimeout=5rÓ   zBatchMode=yes)re   rÇ   r   ÚpathÚ
expanduserr¹   rL   )r³   Ússh_hostÚssh_userÚssh_portÚssh_keyr   s   &     r   Ú_check_ssh_backendrÚ   Þ   sÚ   € Ü�yŠyÐ,Ó-€HßÜÐ8Ð:cØ]Ð_eógð 	gá"cÑKbÓ"cÑ€H˜Ú
B€CßØ��hÐÕˆßØ�”b—g‘g×(Ñ(¨Ó1Ð2Õ2ˆØ®ˆxˆj˜˜(˜Ñ$°hÀ	ÐJÕJ€CÜŒW�S "¨4¸'È)ÔTØ! ( Ð,Ð1CÀHÀ:Ð/NÐPRÐ.SÐWsÐt|Ðs}ÐU~ð  AGöHr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úissuer   r³   rA   r   r£   r   )r   s   "r   r   r   î   s!   € ÷ ñ  3ð °	ð ¸dñ r   c                óT   € \        WVRR7      '       g   VP                  V4       R# R# )zL``check_ok(*ok)`` when *cond*, else ``check_fail(*bad)`` and record *issue*.T)ÚfailN)r   ry   )Úcondrt   ÚbadrÜ   r³   s   &&&&&r   r¹   r¹   î   s"   € ä�d ¨$×/Ó/Ø�‰�eÖñ 0r   c               ó    € V ^8„  d   QhRRRR/# rÂ   r   )r   s   "r   r   r   ô   s   € ÷ añ a 9ð a°ñ ar   c                ó²   € \        \        P                  ! R 4      R	R
RV 4        ^ RIHp \        RR4       R#   \         d    \        RRRT 4        R# i ; i)ÚDAYTONA_API_KEYz2run `hermes setup terminal` (Daytona) to enter it.)ÚDaytonazdaytona SDKú(installed)zdaytona SDK not installedú(run hermes setup terminal)zARun hermes setup terminal and select Daytona, then restart HermesN)zDaytona API keyz(configured))zDaytona API key missingz+(needed for the 'daytona' terminal backend))r¹   re   rÇ   r­   rä   r	   ÚImportErrorr   )r³   rä   s   & r   Ú_check_daytona_backendrè   ô   sc   € ÜŒR�YŠYÐ(Ó)Ð+NØWØAÀ6ôKðaÝ#Ü� Ö.øÜô aÜÐ3Ð5Rð  UXð  Z`÷  	aðaús   ¥9 ¹AÁAc               ó    € V ^8„  d   QhRRRR/# rÂ   r   )r   s   "r   r   r   ÿ   s   € ÷ Nñ N )ð N°ñ Nr   c           
     óˆ  € ^ RI Hp \        P                  ! RR4      P	                  4       ;'       g    RpRP                  V4      p\        W!9   RRV R23RRV R	V R23R
V 2V 4       \        \        P                  ! RR4      P	                  4       R9   RRRV 4       \        \        P                  P                  R4      RJRR RV 4       \        4       pVP                  '       d   \        RRVP                   R24       MZVP                  P                  R4      '       d   \        RRVP                   R2RV 4       M\        RRVP                   R2RV 4       VP                    F  p\#        RV 24       K  	  \        P                  ! RR4      P%                  4       R!9   p\#        V'       d	   R4       R# R4       R# )"é    )Ú_SUPPORTED_VERCEL_RUNTIMESÚTERMINAL_VERCEL_RUNTIMEÚnode24ú, zVercel runtimeru   rv   zVercel runtime unsupportedz; use z'Set TERMINAL_VERCEL_RUNTIME to one of: ÚTERMINAL_CONTAINER_DISKÚ51200zSVercel Sandbox does not support custom container_disk; use the shared default 51200ÚvercelNzHRun hermes setup terminal and select Vercel Sandbox, then restart HermeszVercel authÚpartialzVercel auth incompletez@Set VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_ID togetherzVercel auth not configuredzVConfigure Vercel Sandbox auth with VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_IDzVercel auth ÚTERMINAL_CONTAINER_PERSISTENTÚtruez^Vercel persistence: snapshot filesystem only; live processes do not survive sandbox recreationz(Vercel persistence: ephemeral filesystem>   r=   Ú0rñ   )zVercel disk settingz(uses platform default))zVercel custom disk unsupportedz((reset terminal.container_disk to 51200))z
vercel SDKrå   )zvercel SDK not installedræ   >   Ú1ÚonÚyesrõ   )Útools.terminal_tool_backendsrì   re   rÇ   r©   Újoinr¹   Ú	importlibÚutilÚ	find_specr   rt   r	   Úlabelr_   r   Údetail_linesr   Úlower)r³   rì   r½   Ú	supportedÚauth_statusÚlineÚ
persistents   &      r   Ú_check_vercel_backendr  ÿ   sä  € ÝGÜ�iŠiÐ1°8Ó<×BÑBÓD×PÐPÈ€GØ—	‘	Ð4Ó5€IÜˆWÑ2Ð5EÈÈ7È)ÐSTÀ~Ð4VØ*¨a°¨y¸¸y¸kÈÐ,KÐLÐPwð  yBð  xCð  ODð  FLôMäŒR�YŠYÐ0°'Ó:×@Ñ@ÓBÐFXÑXØ?ð  BPØbÐdjôlô ŒY�^‰^×%Ñ% hÓ/°tÐ;Ð=ZØHØWÐY_ôaô 'Ó(€KØ‡~‡~€~Ü� ! K×$5Ñ$5Ð#6°aÐ 8Õ9Ø	×	Ñ	×	%Ñ	% i×	0Ò	0ÜÐ0°A°k×6GÑ6GÐ5HÈÐ2Jð  MOð  QWõ  	XäÐ4¸¸+×:KÑ:KÐ9LÈAÐ6Nð  Qið  kqô  	rØ×(Ô(ˆÜ�\ $ Ð(Ö)ñ )ä—’Ð:¸FÓC×IÑIÓKÐOiÑi€JÜßð pö NØ"LöNr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r±   r   r³   rA   r   r£   r   )r   s   "r   r   r     s&   € ÷ Sñ S¨ð S°Yð SÀ4ñ Sr   c           	     ó  €  ^ RI Hp V! 4        ^ RIHp V! V 4      pVf   \        RV  R2RRV4      # VP                  4        F&  w  rVp\        WVV3Wg3VP                  R4      V4       K(  	  R#   \         d    Rp Lai ; i)	rë   )Údiscover_plugins)Úget_providerNzUnknown terminal backend 'Ú'z,(no built-in or plugin backend by that name)zRFix terminal.backend in config.yaml, or install/enable the plugin that provides itz())	Úhermes_cli.pluginsr	  Úagent.terminal_env_registryr
  r   r   Údoctor_checksr¹   r©   )r±   r³   r	  r
  r€   rt   rÿ   Údetails   &&      r   Ú_check_plugin_backendr    s”   € ðÝ7ÙÔÝ<Ù Ó-ˆð ÒÜÐ!;¸L¸>ÈÐKÐM{ØsÐu{ó}ð 	}à%×3Ñ3Ö5Ñˆ�6Ü�˜V�_ u o°v·|±|ÀDÓ7IÈ6ÖRó 6øô ô ØŠðús   ‚A/ Á/A?Á>A?c               ó$   € V ^8„  d   QhRRRRRR/# r    r   )r   s   "r   r   r   ,  s!   € ÷ 6ñ 6¨ð 6°ð 6¸Tñ 6r   c                ór  € \         P                  ! RR4      p ^ RIHp V! 4       pV'       d   VR8w  d   \        R4       Rp\        W$VP                  4       V\        9   d    \        V,          ! VP                  4       R# V\        9  d   \        W!P                  4       R# R#   \         d    Rp L�i ; i)zJDocker/SSH/Daytona/Vercel/plugin terminal backends, gated on TERMINAL_ENV.ÚTERMINAL_ENVÚlocal)Úis_containerFrµ   uk   Running inside a container â€” using local terminal backend (docker-in-docker is not configured by default)N)re   rÇ   Úhermes_constantsr  r   r   rÀ   r³   Ú_BACKEND_CHECKSÚ_BUILTIN_TERMINAL_BACKENDSr  )r¡   r¢   r±   Ú_is_containerr²   s   &&   r   Ú_check_terminal_backendr  +  sœ   € ô —9’9˜^¨WÓ5€Lð%ÝBÙ,›Ð÷
  °Ô 8Üð  Aô  	BØˆÜ˜,¸a¿h¹hÔGØ”Ô&Ü˜Ö% a§h¡hÖ/Ø	Ô7Ô	7Ü˜l¯H©HÖ5ñ 
8øô ô %Ø$Òð%ús   ™B& Â&B6Â5B6c               ó    € V ^8„  d   QhRRRR/# )r   r¡   rD   r   r   )r   s   "r   r   r   @  s   € ÷ ñ  Tð ¨dñ r   c                ó¶  €  ^ RI Hp V! RR7      pV'       g@   V '       d8   \        4       '       g(    ^ RIp^ RI Hp VP                  RRR7       V! RR7      pV'       d   \        RR	V R
24       R# \        4       '       d   \        RRRR7       R# \        RR4       R#   \         d    Rp Lži ; i  \         d   p\        RR	T R
24        Rp?L{Rp?ii ; i)zJRead the runtime's installed selection; only --fix may acquire through PM.)Ú_find_agent_browserF)ÚvalidateNzagent-browserT)Úexplicitzagent-browser install failedru   rv   zCagent-browser is not installed (expected in the tested Termux path)zUInstall it manually later with: npm install -g agent-browser && agent-browser install©rN   zagent-browser not installedz&(run: hermes pm install agent-browser))	Útools.browser_tool_installr  r   r»   r%   Úensurer
   r	   Ú_termux_browser_hints)r¡   r  Úresolvedr%   Úexcs   &    r   Ú_check_agent_browserr&  @  sÓ   € ðÝBÙ&°Ô6ˆ÷ Ÿ
¬:¯<ª<ð	CÛÝFØ�I‰I�o°ˆIÔ5Ù*°EÔ:ˆH÷ Ü� A h Z¨q /Ô2ÙÜ‡|‚|ÜÐcØuð  GKõ	Lñ ô 	Ð0Ð2ZÔ[Ùøô% ô ØŠðûô ô 	CÜÐ5¸¸3¸%¸q°z×BÑBûð	Cús(   ‚B  ²&B3 Â B0Â/B0Â3CÂ>CÃCc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úlinesr   rN   rD   r   r£   r   )r   s   "r   r   r   Z  s!   € ÷ ñ  #ð °tð Àñ r   c                ó€   € V F  p\        V4       K  	  \        R 4       \        V R7       F  p\        V4       K  	  R# )zTermux browser setup:r   N)r   rT   )rN   r(  r  rS   s   $*  r   r#  r#  Z  s5   € ÛˆÜ�4Öñ äÐ&Ô'Ü+¸>×JˆÜ�4Öó Kr   c               ó   € V ^8„  d   QhRR/# ©r   r   r£   r   )r   s   "r   r   r   b  s   € ÷ ?ñ ?˜ñ ?r   c                 ó(  €  ^ RI Hp  ^ RIHp ^ RIHp ^ RIHp ^ RIH	p T ! 4       '       g-   \        T! 4       4      '       g   T! 4       f   T! 4       '       d   R# \        T! 4       RR	4      '       g   \        R4       R# R#   \         d     R# i ; i)
a2  Playwright Chromium presence, using the exact predicate browser_tool uses to hide browser_* tools.

Lazy import: browser_tool is ~150KB; an import failure is a separate bug surfaced elsewhere. Camofox, a
CDP override, a cloud provider, or Lightpanda all bypass the local Chromium requirement (no warning).
)Ú_is_camofox_mode)Ú_get_cloud_provider)Ú_get_cdp_override_raw)Ú_chromium_installed)Ú_using_lightpanda_engineNz(Install with: hermes pm install chromium)zPlaywright Chromiumz(browser engine))z!Playwright Chromium not installedz/(browser_* tools will be hidden from the agent))Útools.browser_toolr-  Útools.browser_tool_cloudr.  Útools.browser_tool_cdpr/  r!  r0  Ú&tools.browser_tool_lightpanda_fallbackr1  r   rD   r   r   )r-  r.  r/  r0  r1  s        r   Ú_check_chromiumr6  b  s‚   € ðÝ7Ý@Ý@ÝBÝSñ ×ÒœTÑ"7Ó"9×:Ò:Ñ>QÓ>SÒ>_Ñc{×c}Òc}ÙÜÑ)Ó+Ð-XØn÷pò päÐ=Ö>ñpøô	 ô Úðús   ‚B ÂBÂBc               ó   € V ^8„  d   QhRR/# r+  r   )r   s   "r   r   r   w  s   € ÷ ,ñ ,˜4ñ ,r   c                 óZ  €  ^ RI Hp Hp ^ RIHpHp T ! 4       '       g   R#  T! 4       w  rET'       g   \        RRT R24       \        R	4       R# \        T! 4       R
RT R23R4      '       g   \        T4       R# R#   \         d     R# i ; i  \         d   pRRT 2rT Rp?LzRp?ii ; i)z‰Lightpanda engine (browser.engine / AGENT_BROWSER_ENGINE); independent of Node since Browser Use mode spawns ``lightpanda serve`` itself.)r1  Úlightpanda_engine_status)ÚLIGHTPANDA_INSTALL_HINTÚfind_lightpanda_binaryNFzstatus check failed: z%browser.engine=lightpanda is shadowedru   rv   uZ   Fix: pick Lightpanda in `hermes tools` â†’ Browser Automation, or set browser.engine: autoÚ
Lightpanda)z(Lightpanda selected but binary not foundz/(browser tools will fail until it is installed))
r5  r1  r9  Útools.browser_lightpandar:  r;  r   r
   r   r   )r1  r9  r:  r;  ÚusedÚreasonÚes          r   Ú_check_lightpandarA  w  sµ   € ðßmß\ñ $×%Ò%Ùð:Ù/Ó1‰ˆ÷ ÜÐ:¸aÀ¸xÀq¸MÔJÜÐoÖpÜÑ.Ó0°<À1ÀVÀHÈAÀÐ2OØw÷yò yäÐ*Ö+ñyøô ô Úðûô ô :ØÐ 5°a°SÐ9�fûð:ús(   ‚A= ¢	B Á=BÂBÂB*ÂB%Â%B*c               ó$   € V ^8„  d   QhRRRRRR/# r    r   )r   s   "r   r   r   Ž  s!   € ÷ ñ ¨ð °ð ¸Tñ r   c                óB  € \        R4      '       g"   \        4       '       d   \        R4      '       d   \        R4       M+\        4       '       d   \	        RRRR7       M\        RR4       \        V 4      '       d   \        4       '       g   \        4        \        4        R	# )
zJNode.js, agent-browser resolution, Playwright Chromium, Lightpanda engine.ÚnodezNode.jszHNode.js not found (browser tools are optional in the tested Termux path)z2Install Node.js on Termux with: pkg install nodejsFr   zNode.js not foundz3(optional; PM agent-browser is a native executable)N)	r(   r»   r    r	   r#  r
   r&  r6  rA  )r¡   r¢   s   &&r   Ú_check_node_and_browserrE  �  sk   € ô �V×Ò¤§¢´+¸f×2EÒ2EÜ�ÕÜ	�ŠÜÐhØRÐchö	jô 	Ð&Ð(]Ô^Ü˜J×'Ò'´
·²ÜÔÜÖr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚnrC   r   r   r   )r   s   "r   r   r   �  s   € ÷ <ñ <ˆsð <�sñ <r   c                ó   € V ^8X  d   R# R# )r¸   ÚvulnerabilityÚvulnerabilitiesr   )rG  s   &r   Ú_pluralrK  �  s   € Ø 1œfˆ?Ð;Ð*;Ð;r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Únpm_binr   rÿ   Úaudit_extrarA   Úmanual_issuesr   r£   r   )r   s   "r   r   r   ¡  s1   € ÷ )ñ )˜ð )¨Sð )¸yð )ÐYbð )Ðgkñ )r   c                ó,  a€ ^ RI p^ RIHp  \        P                  ! V RR.VO\        V4      RRRR^V! 4       RR	7	      pVP                  P                  4       '       d   VP                  VP                  4      M/ pVP                  R
/ 4      P                  R/ 4      oV3R lR 4       w  ršpWš,           V,           p\        V4      ;'       d    V^ ,          R8H  pV^ 8X  d   \        V R2R4       R# V	^ 8”  g   V
^ 8”  dc   Rp\        V R2RV	 RV
 RV RV R2	4       V'       d   \        R4       M\        R4       VP                  V RV R\        V4       R24       R# \        V R2RV R\        V4       R24       R#   \          d     R# i ; i)uJ  Run one `npm audit --json` and report; any failure is silently skipped.

Every row here audits a tree whose versions come from a COMMITTED lockfile
(`npm ci` in `_run_npm_install_deterministic` reifies exactly that state on
every `hermes update`), so a local `npm audit fix` never persists â€” the next
update's deterministic install restores the pinned (vulnerable) versions and
the finding reappears. The durable remedy in every case is a lockfile bump
on main (update `package-lock.json` and ship it); the doctor therefore never
prescribes a local mutating fix command. See #116774.
N)Úwith_hermes_node_pathÚauditz--jsonTrË   rÌ   F)ÚcwdrF   rÍ   rÎ   rÏ   rB   ÚenvÚcheckÚmetadatarJ  c              3  óH   <"  € T F  pSP                  V^ 4      x € K  	  R# 5i)rë   N©rd   )r`   rÈ   Úcountss   & €r   rb   Ú_audit_one.<locals>.<genexpr>µ  s!   øé € Ð#_Ñ>^¸ F§J¡J¨q°!×$4Ð$4Ó>^ùs   ƒ"ú--workspacez depsz(no known vulnerabilities)uŠ   fix is an upstream lockfile bump â€” a local manual fix does not persist (the next `hermes update` reinstalls from the committed lockfile)ru   z critical, z high, u    moderate â€” rv   u¨     ^ workspace audit includes runtime and build dependencies; if manual npm remediation errors with an arborist crash it's a known npm bug â€” clears via a lockfile bumpuT     ^ runtime dependency tree; report/pin the fix in package-lock.json â€” see #116774z has z npm z›; wait for an upstream lockfile fix, then update your installation (Docker: pull a rebuilt image; recreating the same image restores the same dependencies)z
 moderate )ÚcriticalÚhighÚmoderate)Újsonr  rQ  rG   rH   r   Ústdoutr©   Úloadsrd   rD   r	   r
   r   ry   rK  r   )rM  Únpm_dirrÿ   rN  rO  r_  rQ  Úaudit_resultÚ
audit_datar\  r]  r^  ÚtotalÚworkspace_scopedÚremedyrY  s   &&&&&          @r   Ú
_audit_onerh  ¡  s²  ø€ ó Ý6ðä!—~’~ w°¸Ð&PÀKÐ&PÔVYÐZaÓVbØ59ÀÈwÐ_hÐrtÙ*?Ó*AÈôPˆð 9E×8KÑ8K×8QÑ8Q×8SÒ8S�T—Z‘Z × 3Ñ 3Ô4ÐY[ˆ
Ø—‘ 
¨BÓ/×3Ñ3Ð4EÀrÓJˆÜ#_Ñ>^Ó#_Ñ ˆ˜Ø• (Õ*ˆÜ Ó,×PÐP°¸QµÀ=Ñ1PÐØ�AŒ:Ü˜�w˜e�_Ð&BÖCØ˜Œ\˜T AœXð[ˆFä˜%˜ �¨!¨H¨:°[ÀÀÀgÈhÈZÐWeÐflÐemÐmnÐ(oÔpßÜð oõ pô ÐqÔrØ× Ñ Ø�'˜˜u˜g U¬7°5«>Ð*:ð ;}ð }öô
 ˜�w˜e�_¨¨(¨°:¼gÀhÓ>OÐ=PÐPQÐ&RÖSøÜô Úðús&   �AF ÁBF Ã3A.F Å#F ÆFÆFc               ó$   € V ^8„  d   QhRRRRRR/# r    r   )r   s   "r   r   r   Î  s!   € ÷ &ñ & ð &¨'ð &°dñ &r   c                ó"  € ^ RI Hp \        R4      pV'       d   \        V4      M\	        4       '       d   \        R4      MRpV'       dp    ^ RIHp V! 4       pVRR.3VR	R
R.3VRR
R.3VR. 33 FF  w  rxp	V	'       d   TMTR,          P                  4       '       g   K/  \        WGW‰VP                  4       KH  	  \	        4       '       d&   \        R4       \         F  p
\        V
4       K  	  R# R#   \         d    TR,          R,          p Lµi ; i)a‹  npm audit per Node package tree (root, web/ui-tui workspaces, WhatsApp bridge).

PROJECT_ROOT is audited with --workspaces=false so the apps/* glob (Electron, node-pty, ...) is never
resolved for a routine check; web and ui-tui via --workspace. The WhatsApp bridge may live under a writable
HERMES_HOME mirror rather than the (possibly read-only) Docker install tree, hence the shared resolver.
©ÚPROJECT_ROOTÚnpmN)Úresolve_whatsapp_bridge_dirÚscriptszwhatsapp-bridgezRoot npm packagez--workspaces=falsezweb workspacer[  Úwebzui-tui workspacezui-tuizWhatsApp bridgeÚnode_moduleszTermux compatibility fallbacks:)Úhermes_cli.doctorrl  r(   r   r»   r    Ú!gateway.platforms.whatsapp_commonrn  r   Úexistsrh  rO  r   Ú"_TERMUX_INSTALL_ALL_FALLBACK_NOTES)r¡   r¢   rl  r>   rM  rn  Úwhatsapp_bridge_dirrb  rÿ   rN  Únotes   &&         r   Ú_check_npm_auditrx  Í  s  € õ /Ü˜5Ó!€Fß#Œc�&ŒkÄ
ÇÂ¬+°eÔ*<ÐRV€Gßð
	Oõ VÙ"=Ó"?Ðð Ð-Ð0DÐ/EÐFØ˜?¨]¸EÐ,BÐCØÐ-°¸xÐ/HÐIØ Ð"3°RÐ8ó	,
Ñ'ˆG˜K÷ "-‘°'¸^ÕK×SÑS×UÔUÜ˜7¨UÀÇÁÖQñ	,
ô ‡|‚|ÜÐ4Ô5ß6ˆDÜ�tÖó 7ñ øô ô 	OØ".°Õ":Ð=NÕ"NÒð	Oús   ÁC0 Ã0DÄDz!Could not check tool availabilityz({e})c               ó$   € V ^8„  d   QhRRRRRR/# r    r   )r   s   "r   r   r   ø  s&   € ÷ añ a¨ð a°'ð a¸dñ ar   c                ó‚  € ^ RI Hp \        P                  P	                  ^ \        V4      4       ^ RIHpHp \        V! 4       !  w  rV. pRV9   g;   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       dT   \        4       pV'       dB   V Uu. uF  qˆR8w  g   K  VNK  	  ppV U	u. uF  q™P                  R4      R8w  g   K  V	NK  	  pp	V F8  p\        VP                  V/ 4      P                  RV4      \        V4      4       K:  	  V F  w  r«pV
R8X  d   \        M\        ! W¼4       K!  	  V F„  p	V	P                  R	4      ;'       g    V	P                  R
4      ;'       g    . pV'       d   RRP!                  V4       R2M\"        P                  V	R,          R4      p\        V	R,          V4       K†  	  \%        V4      pV'       g;   \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       d   VP&                  P)                  R4       R# R# u upi u up	i )rë   rk  )Úcheck_tool_availabilityÚTOOLSET_REQUIREMENTSrp  c              3  óH   "  € T F  qP                  R 4      R8H  x € K  	  R# 5i)r"   rp  NrX  )r`   rW   s   & r   rb   Ú+_check_tool_availability.<locals>.<genexpr>  s   é € Ð SÁ{¸t§¡¨&Ó!1°UÖ!:Ã{ùs   ‚ "TFr"   rt   r—   r˜   z	(missing rï   rv   z(system dependency not met)c              3  ó2   "  € T F  w  p q!R 8g  x € K  	  R# 5i)rt   Nr   )r`   ÚstatusÚ_s   &  r   rb   r~    s   é € ÐG¹h©l¨f°a¸ Tž>»hùs   ‚zERun 'hermes setup' to configure missing API keys for full tool accessN)rr  rl  ÚsysrÔ   Úinsertr   Úmodel_toolsr{  r|  rŠ   Úanyr�   rd   r	   rl   r
   rû   r”   rž   r³   ry   )r¡   r¢   rl  r{  r|  rƒ   r„   Úweb_rowsÚtidrW   r€  rÿ   r  r˜   Úapi_disableds   &&             r   Ú_check_tool_availabilityr‰  ÷  sÈ  € å.Ü‡H�H‡O�O�A”s˜<Ó(Ô)ßIÜFÑH_ÓHaÑbÑ€Ið €Hà�	ÔŸS›SÑ SÁ{Ó SŸSŸSšSÑ SÁ{Ó S×SÒSÜ.Ó0ˆßÙ(1ÓB©	 ¸E±\Ÿ˜©	ˆIÐBÙ,7ÓU©K D¿8¹8ÀFÓ;KÈuÑ;TŸ4˜4©KˆKÐUÛˆÜÐ%×)Ñ)¨#¨rÓ2×6Ñ6°v¸sÓCÔEeÐfiÓEjÖkñ ã!)Ñˆ�vØ˜t”^�¬Ð	3°UÖCñ "*ãˆØ—8‘8˜NÓ+×IÐI¨t¯x©x¸
Ó/C×IÐIÀrˆß7?�9˜TŸY™Y xÓ0Ð1°Ñ3ÔEY×E]ÑE]Ð^bÐciÕ^jð  mJó  FKˆÜ�4˜•< Ö(ñ ô 9¸ÓE€Lß—s“sÑG¹hÓG—s—s’sÑG¹hÓG×GÒGØ	�‰�‰Ð_Ö`ñ Hùò CùÚUs   Â!H7Â.H7Â:H<ÃH<)z=Termux uses the Hermes APT package: pkg install hermes-agent.zNMatrix E2EE extra is excluded on Termux (python-olm currently fails to build).zYLocal faster-whisper extra is excluded on Termux (ctranslate2/av build path unavailable).zaSTT fallback: use Groq Whisper (set GROQ_API_KEY) or OpenAI Whisper (set VOICE_TOOLS_OPENAI_KEY).>   r¯   r  Úmodalrµ   r­   Úmanaged_modalr®   )BÚ__conditional_annotations__Ú__doc__Ú
__future__r   Úimportlib.utilrü   re   r   rG   r‚  Úpathlibr   Úhermes_cli.doctor_platformr   Úhermes_cli.doctor_reportr   r   r   r   r	   r
   r   Úhermes_cli.vercel_authr   r  r   r»   Útools.environments.dockerr   r   r   r    r(   r:   r?   rL   rT   ru  rh   rl   r�   rŠ   r’   r”   Ú__annotations__r™   rž   r¬   r  rÀ   rÚ   r¹   rè   r  r  r  r  r&  r#  r6  rA  rE  rK  rh  rx  r‰  )rŒ  s   @r   Ú<module>r–     sy  øðôLõ #ã Û 	Û Û Û 
Ý Ý Bß y× yÑ yÝ 7Ý 4ß aÑ aõõ?õõ*!õõ?ð&Ð "õXõõõ<2õð Ðyð(Ð �nó õ
nõQñ ƒô[ó ð[ò oÐ õ<õ4Hõ õaõNõ4Sð Ð,¨iÐ9OÐQaÐcxÐy€ñ ƒô6ó ð6õ(õ4õ?õ*,ñ, ƒôó ðõ<õ)ñX ƒô&ó ð&ñR Ð1°7Ó;ôaó <òar   