
    `gjZ                        d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ  ej                         dk(  Zd d	 d
 d dZdddddZddZddZ	 	 d	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZy)u)  Lazy dependency bootstrapper for non-Python runtime deps.

Detection and prompting live here in Python — not in install.sh — because:
  1. shutil.which() works on every platform; install.sh needs bash.
  2. Detection is instant; spawning bash for a "is node installed?" check is waste.
  3. Python controls the UX (rich prompts, non-interactive fallback, TTY detection).

install.sh is still the *installation* backend because it has 1900 lines of
battle-tested OS detection and package-manager logic (apt/brew/pacman/dnf/
zypper/Termux/…).  Reimplementing that in Python would be huge duplication.

Deps that degrade gracefully (ripgrep → grep fallback, ffmpeg → skip conversion)
don't need ensure_dependency wired in — only hard-fail sites do (TUI needs node,
browser tool needs agent-browser).
    )annotationsN)Path)agent_browser_runnable)hermes_subprocess_envWindowsc                 0    t        j                  d      d uS )Nnodeshutilwhich     H/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/dep_ensure.py<lambda>r      s    FLL(4 r   c                 n    t        t        j                  d            xs t               xs
 t	               S )Nagent-browser)r   r   r   _has_system_browser_has_hermes_agent_browserr   r   r   r   r       s.    v||O<= 	' 	'$& r   c                 0    t        j                  d      d uS )Nrgr
   r   r   r   r   r   %   s    v||D)5 r   c                 0    t        j                  d      d uS )Nffmpegr
   r   r   r   r   r   &   s    fll8,D8 r   )r	   browserripgrepr   z,Node.js (required for browser tools and TUI)z1Browser engine (Chromium, for web browsing tools)zripgrep (fast file search)zffmpeg (TTS voice messages)c                 V    t         rd} nd} | D ]  }t        j                  |      s y y)N)chromemsedgechromium)zgoogle-chromezgoogle-chrome-stabler   zchromium-browserr   TF)_IS_WINDOWSr   r   )namesnames     r   r   r   1   s2    0c << r   c                     ddl m}   |        }t        r|dz  dz  j                         S |dz  dz  dz  j                         xs |dz  dz  dz  j                         S )	Nr   get_hermes_homer	   zagent-browser.cmdbinr   node_modulesz.bin)hermes_constantsr$   r   is_file)r$   homes     r   r   r   <   sk    0Dv 33<<>> 
		099; 	H>!F*_<EEGr   c                   | t        t              j                  } || j                  }t        rd}d}nd}d}||fD ]A  \  }}| dz  |z  }|j	                         r||fc S |dz  |z  }|j	                         s=||fc S  y)u   Locate the install script — bundled in wheel or in git checkout.

    On Windows, prefers install.ps1; on POSIX, prefers install.sh.
    Returns a (path, shell) tuple, or (None, None) if neither is found.
    )zinstall.ps1
powershell)z
install.shbashscriptsNN)r   __file__parentr   r(   )package_dir	repo_root	preferredfallbackscript_nameshellbundledrepos           r   _find_install_scriptr9   J   s     8n++&&	1	)*	0((3 U	)K7??E>!9${2<<>; r   c                :   t         j                  |       }|y |       ryt               \  }}|7|r4t        j                  | |       }t	        d| d       t	        d|  d       y|rdt
        j                  j                         rFt        j                  | |       }	 t        | d      j                         j                         }|dvry|d	k(  red
dlm} t        j                   d	      xs t        j                   d      }|s|rt	        d       y|dddt#        |      d| dt#         |             g	}	ndt#        |      d| g}	t%        d      }
d|
d<   t'        j(                  |	|
      }|j*                  d
k7  ry|r |       S y# t        t        f$ r Y yw xY w)zGEnsure a non-Python dependency is available. Returns True if available.FTz  z2 is not installed and no install script was found.z
  Install z manually and try again.z& is not installed. Install now? [Y/n] ) yyesr+   r   r#   pwshzG  PowerShell not found. Install PowerShell or run install.ps1 manually.z-ExecutionPolicyBypassz-Filez-Ensurez-HermesHomer,   z--ensure)inherit_credentialsfalseIS_INTERACTIVE)env)_DEP_CHECKSgetr9   _DEP_DESCRIPTIONSprintsysstdinisattyinputstriplowerEOFErrorKeyboardInterruptr'   r$   r   r   strr   
subprocessrun
returncode)depinteractivecheckscriptr6   descreplyr$   ps_bincmdrun_envresults               r   ensure_dependencyr^   j   s   
 OOC E}w(*MFE~$((c2DBtfNOPJse#;<=syy'') $$S#.	TF"HIJPPRXXZE ((4l+Cv||F/C_`S[s301
 s6{J4#>G 'G^^F AwC +, 		s   *F FF)returnboolr.   )r1   Path | Noner2   ra   r_   ztuple[Path | None, str | None])T)rT   rP   rU   r`   r_   r`   )__doc__
__future__r   osplatformr   rQ   rH   pathlibr   r'   r   tools.environments.localr   systemr   rD   rF   r   r   r9   r^   r   r   r   <module>ri      s    # 	    
  3 :hoo9, 5
 68	 ;B++	   $! $D 9	99 
9r   