
    i              
       R   d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	 de
eeef                  fdZ e            Zdee         de
e         fdZdee         fd	Zd
dddee         dedeee                  de
e         fdZd
dddee         dedeee                  ddfdZdS )aN  
Unified self-relaunch for Hermes CLI.

Preserves critical flags (--tui, --dev, --profile, --model, etc.) across
process replacement so that ``hermes sessions browse`` or post-setup relaunch
doesn't silently drop the user's UI mode or other preferences.

Also works when ``hermes`` is not on PATH (e.g. ``nix run`` or ``python -m``).
    N)OptionalSequence)PRE_ARGPARSE_INHERITED_FLAGSbuild_top_level_parserreturnc                  b   t                      \  } }}g }t                      }| |fD ]m}|j        D ]c}|j        s
t	          |dd          s|j        dk    }|j        D ]4}||f}	|	|vr*|                    |	           |                    |	           5dn|                    t                     |S )u(  Build the ``(option_string, takes_value)`` table of flags that must
    survive a self-relaunch, by introspecting the real parser used by
    ``hermes`` itself.

    A flag participates if its argparse Action carries
    ``inherit_on_relaunch = True`` — set by ``_parser._inherited_flag``.
    inherit_on_relaunchFr   )
r   set_actionsoption_stringsgetattrnargsaddappendextendr   )
parser_subparserschat_parsertableseenpactiontakes_valueoptkeys
             8/home/piyush/.hermes/hermes-agent/hermes_cli/relaunch.py_build_inherited_flag_tabler      s     (>'?'?$FK$&E"%%%Dk" & &j 
	& 
	&F( 6#8%@@  ,!+K, & &K(d??HHSMMMLL%%%	&
	& 
LL-...L    argvc                    g }d}|t          |           k     r| |         }d|v rL|                    dd          d         }t          D ]"\  }}||k    r|                    |            n#|dz  }kt          D ]{\  }}||k    rp|                    |           |rW|dz   t          |           k     rA| |dz                                d          s#|                    | |dz                       |dz  } n||dz  }|t          |           k     |S )zDPull out flags that should carry over into a self-relaunched hermes.r   =   -)lensplit_INHERITED_FLAGS_TABLEr   
startswith)r   flagsiargr   flag_r   s           r   _extract_inherited_flagsr-   6   sB   E	A
c$ii--1g#::))C##A&C1  a$;;LL%%%E  FA!7 	 	D+d{{S!!! 1q53t99#4#4T!a%[=S=STW=X=X#4LLa!e---FA  	
Q% c$ii--& Lr   c                      t           j        d         } t          j                            |           r@t          j                            |           r!t          j        | t          j                  r| S |                     d          s_t          j                            |           r@t          j        	                    |           }t          j        |t          j                  r|S t          j        d          }|r|S dS )u   Find the hermes entry point.

    Priority:
      1. ``sys.argv[0]`` if it resolves to a real executable.
      2. ``shutil.which("hermes")`` on PATH.
      3. ``None`` → caller should fall back to ``python -m hermes_cli.main``.
    r   r#   hermesN)sysr   ospathisabsisfileaccessX_OKr'   abspathshutilwhich)argv0abs_pathpath_bins      r   resolve_hermes_binr=   P   s     HQKE 
w}}U u 5 5 ")E27:S:S  C   RW^^E%:%: 7??5))9Xrw'' 	O |H%%H 4r   Tpreserve_inheritedoriginal_argv
extra_argsr?   r@   c                "   t                      }|r|g}nt          j        ddg}|t          |          n t          t          j        dd                   }|r"|                    t          |                     |                    |            |S )a  Construct an argv list for replacing the current process with hermes.

    Args:
        extra_args: Arguments to append (e.g. ``["--resume", id]``).
        preserve_inherited: Whether to carry over UI / behaviour flags
            tagged with ``inherit_on_relaunch`` in the parser.
        original_argv: The original argv to scan for flags (defaults to
            ``sys.argv[1:]``).
    z-mzhermes_cli.mainNr"   )r=   r0   
executablelistr   r   r-   )rA   r?   r@   bin_pathr   srcs         r   build_relaunch_argvrG   l   s     "##H 9z&78!.!:$}


SXabb\@R@RC 3,S11222KK
Kr   c                `    t          | ||          }t          j        |d         |           dS )z;Replace the current process with a fresh hermes invocation.r>   r   N)rG   r1   execvp)rA   r?   r@   new_argvs       r   relaunchrK      s>     #'9  H Ihqk8$$$$$r   )__doc__r1   r8   r0   typingr   r   hermes_cli._parserr   r   rD   tuplestrboolr   r&   r-   r=   rG   rK    r   r   <module>rS      s    
			  



 % % % % % % % %       T%T	*:%;    : 5466 8C= T#Y    4HSM    >  $-1	    HSM*	
 
#Y   D  $-1	
% 
% 
%
% 
% HSM*	
%
 

% 
% 
% 
% 
% 
%r   