§
    ‰eîi	•  ã                   óª  — d Z ddlZddl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mZmZ ddlmZmZ  ej        d¦  «        Zg d¢Zg d¢Zd	d
gZg d¢Z eh d£¦  «        Z eh d£¦  «        Z eh d£¦  «        Zdefd„Zdefd„Zdefd„Zdefd„Zdeddfd„Z dedefd„Z!dede"fd„Z#dedee         fd„Z$de"fd„Z%dedee         fd„Z&dede"fd„Z'e	 G d„ d¦  «        ¦   «         Z(dede)fd„Z*dede"fd „Z+dede,fd!„Z-dee(         fd"„Z.	 	 	 	 dEded$ee         d%e"d&e"d'e"defd(„Z/dFded)e"dee0         fd*„Z1dFded+e"defd,„Z2dededdfd-„Z3deddfd.„Z4defd/„Z5deddfd0„Z6defd1„Z7d2efd3„Z8ded4edefd5„Z9d6edee         fd7„Z:d8ed9eddfd:„Z;d8ede<e         fd;„Z=dGd<edee         defd=„Z>d>ed?edefd@„Z?defdA„Z@defdB„ZAdCedefdD„ZBdS )HuW  
Profile management for multiple isolated Hermes instances.

Each profile is a fully independent HERMES_HOME directory with its own
config.yaml, .env, memory, sessions, skills, gateway, cron, and logs.
Profiles live under ``~/.hermes/profiles/<name>/`` by default.

The "default" profile is ``~/.hermes`` itself â€” backward compatible,
zero migration needed.

Usage::

    hermes profile create coder          # fresh profile + bundled skills
    hermes profile create coder --clone  # also copy config, .env, SOUL.md
    hermes profile create coder --clone-all  # full copy of source profile
    coder chat                           # use via wrapper alias
    hermes -p coder chat                 # or via flag
    hermes profile use coder             # set as sticky default
    hermes profile delete coder          # remove profile + alias + service
é    N)Ú	dataclass)ÚPathÚPurePosixPathÚPureWindowsPath)ÚListÚOptionalz^[a-z0-9][a-z0-9_-]{0,63}$)	ÚmemoriesÚsessionsÚskillsÚskinsÚlogsÚplansÚ	workspaceÚcronÚhome)úconfig.yamlú.envúSOUL.mdzmemories/MEMORY.mdzmemories/USER.md)úgateway.pidúgateway_state.jsonúprocesses.json>   ústate.dbú	auth.lockú
.worktreesú
errors.logúhermes-agentústate.db-shmústate.db-walú.update_checkú.hermes_historyúhermes_state.dbúresponse_store.dbúresponse_store.db-shmúresponse_store.db-walÚbinr   ÚprofilesÚ	sandboxesÚaudio_cacheÚcheckpointsÚimage_cacheÚnode_modulesÚactive_profileÚdocument_cacheÚbrowser_screenshotsr   ú	auth.jsonr   r   r   >   ÚtmpÚrootÚsudoÚtestÚhermesÚdefault>   ÚacpÚmcpÚchatr   ÚdumpÚloginÚmodelÚsetupÚtoolsÚconfigÚdoctorÚhonchoÚlogoutr   ÚstatusÚupdateÚgatewayÚpairingÚpluginsÚprofileÚversionÚinsightsr
   ÚwhatsappÚ	uninstallÚreturnc                  ó$   — t          ¦   «         dz  S )aŽ  Return the directory where named profiles are stored.

    Anchored to the hermes root, NOT to the current HERMES_HOME
    (which may itself be a profile).  This ensures ``coder profile list``
    can see all profiles.

    In Docker/custom deployments where HERMES_HOME points outside
    ``~/.hermes``, profiles live under ``HERMES_HOME/profiles/`` so
    they persist on the mounted volume.
    r&   ©Ú_get_default_hermes_home© ó    ú5/home/div/.hermes/hermes-agent/hermes_cli/profiles.pyÚ_get_profiles_rootrS   x   s   € õ $Ñ%Ô%¨
Ñ2Ð2rQ   c                  ó"   — ddl m}   | ¦   «         S )zïReturn the default (pre-profile) HERMES_HOME path.

    In standard deployments this is ``~/.hermes``.
    In Docker/custom deployments where HERMES_HOME is outside ``~/.hermes``
    (e.g. ``/opt/data``), returns HERMES_HOME directly.
    r   ©Úget_default_hermes_root)Úhermes_constantsrV   rU   s    rR   rO   rO   †   s%   € ð 9Ð8Ð8Ð8Ð8Ð8Ø"Ð"Ñ$Ô$Ð$rQ   c                  ó$   — t          ¦   «         dz  S )z2Return the path to the sticky active_profile file.r,   rN   rP   rQ   rR   Ú_get_active_profile_pathrY   ‘   s   € å#Ñ%Ô%Ð(8Ñ8Ð8rQ   c                  ó4   — t          j        ¦   «         dz  dz  S )z)Return the directory for wrapper scripts.z.localr%   )r   r   rP   rQ   rR   Ú_get_wrapper_dirr[   –   s   € åŒ9‰;Œ;˜Ñ! EÑ)Ð)rQ   Únamec                 óp   — | dk    rdS t                                | ¦  «        st          d| ›d�¦  «        ‚dS )zARaise ``ValueError`` if *name* is not a valid profile identifier.r5   NzInvalid profile name z%. Must match [a-z0-9][a-z0-9_-]{0,63})Ú_PROFILE_ID_REÚmatchÚ
ValueError©r\   s    rR   Úvalidate_profile_namerb   Ÿ   sZ   € àˆyÒÐØˆÝ×Ò Ñ%Ô%ð 
Ýð* Dð *ð *ð *ñ
ô 
ð 	
ð
ð 
rQ   c                 óL   — | dk    rt          ¦   «         S t          ¦   «         | z  S )z4Resolve a profile name to its HERMES_HOME directory.r5   )rO   rS   ra   s    rR   Úget_profile_dirrd   ª   s*   € àˆyÒÐÝ'Ñ)Ô)Ð)ÝÑÔ $Ñ&Ð&rQ   c                 óT   — | dk    rdS t          | ¦  «                             ¦   «         S )z)Check whether a profile directory exists.r5   T)rd   Úis_dirra   s    rR   Úprofile_existsrg   ±   s,   € àˆyÒÐØˆtÝ˜4Ñ Ô ×'Ò'Ñ)Ô)Ð)rQ   c                 ó²  — | t           v rd| › d�S | t          v rd| › d�S t          ¦   «         }	 t          j        d| gddd¬¦  «        }|j        dk    rg|j                             ¦   «         }|t          || z  ¦  «        k    r/	 || z   	                    ¦   «         }d	|v rd
S n# t          $ r Y nw xY wd| › d|› d�S n# t          t          j        f$ r Y nw xY wd
S )z˜Return a human-readable collision message, or None if the name is safe.

    Checks: reserved names, hermes subcommands, existing binaries in PATH.
    ú'z' is a reserved namez$' conflicts with a hermes subcommandÚwhichTé   )Úcapture_outputÚtextÚtimeoutr   ú	hermes -pNz&' conflicts with an existing command (ú))Ú_RESERVED_NAMESÚ_HERMES_SUBCOMMANDSr[   Ú
subprocessÚrunÚ
returncodeÚstdoutÚstripÚstrÚ	read_textÚ	ExceptionÚFileNotFoundErrorÚTimeoutExpired)r\   Úwrapper_dirÚresultÚexisting_pathÚcontents        rR   Úcheck_alias_collisionr�   ¼   sL  € ð
 �ÐÐØ-�4Ð-Ð-Ð-Ð-ØÕ"Ð"Ð"Ø=�4Ð=Ð=Ð=Ð=õ #Ñ$Ô$€KðÝ”Ø�dˆO¨D°tÀQð
ñ 
ô 
ˆð Ô Ò!Ð!Ø"œM×/Ò/Ñ1Ô1ˆMà¥ K°$Ñ$6Ñ 7Ô 7Ò7Ð7ðØ*¨TÑ1×<Ò<Ñ>Ô>�GØ" gÐ-Ð-Ø#˜tð .øå ð ð ð Ø�DðøøøàS�tÐSÐSÀ=ÐSÐSÐSÐSð "øõ �zÔ8Ð9ð ð ð Øˆðøøøð ˆ4s6   ®AB; ÂB! Â B; Â!
B.Â+B; Â-B.Â.B; Â;CÃCc                  ó¶   — t          t          ¦   «         ¦  «        } | t          j                             dd¦  «                             t          j        ¦  «        v S )z!Check if ~/.local/bin is in PATH.ÚPATHÚ )rx   r[   ÚosÚenvironÚgetÚsplitÚpathsep)r}   s    rR   Ú_is_wrapper_dir_in_pathrŠ   Ý   sA   € åÕ&Ñ(Ô(Ñ)Ô)€KØ�"œ*Ÿ.š.¨°Ñ4Ô4×:Ò:½2¼:ÑFÔFÐFÐFrQ   c                 óì  — t          ¦   «         }	 |                     dd¬¦  «         n-# t          $ r }t          d|› d|› �¦  «         Y d}~dS d}~ww xY w|| z  }	 |                     d| › d�¦  «         |                     |                     ¦   «         j        t          j        z  t          j	        z  t          j
        z  ¦  «         |S # t          $ r }t          d|› d|› �¦  «         Y d}~dS d}~ww xY w)	z„Create a shell wrapper script at ~/.local/bin/<name>.

    Returns the path to the created wrapper, or None if creation failed.
    T©ÚparentsÚexist_oku   âš  Could not create ú: Nz#!/bin/sh
exec hermes -p z "$@"
u    âš  Could not create wrapper at )r[   ÚmkdirÚOSErrorÚprintÚ
write_textÚchmodÚstatÚst_modeÚS_IEXECÚS_IXGRPÚS_IXOTH)r\   r}   ÚeÚwrapper_paths       rR   Úcreate_wrapper_scriptrœ   ã   s7  € õ
 #Ñ$Ô$€KðØ×Ò $°ÐÑ6Ô6Ð6Ð6øÝð ð ð ÝÐ8 kÐ8Ð8°QÐ8Ð8Ñ9Ô9Ð9Øˆtˆtˆtˆtˆtøøøøðøøøð  Ñ%€LðØ×ÒÐ J¸TÐ JÐ JÐ JÑKÔKÐKØ×Ò˜<×,Ò,Ñ.Ô.Ô6½¼ÑEÍÌÑTÕW[ÔWcÑcÑdÔdÐdØÐøÝð ð ð ÝÐD°ÐDÐDÀÐDÐDÑEÔEÐEØˆtˆtˆtˆtˆtøøøøðøøøs-   �( ¨
A²AÁAÁA-C	 Ã	
C3ÃC.Ã.C3c                 óÐ   — t          ¦   «         | z  }|                     ¦   «         r@	 |                     ¦   «         }d|v r|                     ¦   «          dS n# t          $ r Y nw xY wdS )zARemove the wrapper script for a profile. Returns True if removed.ro   TF)r[   Úexistsry   Úunlinkrz   )r\   r›   r€   s      rR   Úremove_wrapper_scriptr    ù   sŠ   € å#Ñ%Ô%¨Ñ,€LØ×ÒÑÔð ð	à"×,Ò,Ñ.Ô.ˆGØ˜gÐ%Ð%Ø×#Ò#Ñ%Ô%Ð%Ø�tð &øõ ð 	ð 	ð 	ØˆDð	øøøàˆ5s   §,A Á
A#Á"A#c                   ó¦   — e Zd ZU dZeed<   eed<   eed<   eed<   dZe	e         ed<   dZ
e	e         ed<   d	Zeed
<   dZeed<   dZe	e         ed<   dS )ÚProfileInfoz$Summary information about a profile.r\   ÚpathÚ
is_defaultÚgateway_runningNr;   ÚproviderFÚhas_envr   Úskill_countÚ
alias_path)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rx   Ú__annotations__r   Úboolr;   r   r¦   r§   r¨   Úintr©   rP   rQ   rR   r¢   r¢     sž   € € € € € € à.Ð.Ø
€I€I�IØ
€J€J�JØÐÐÑØÐÐÑØ€Eˆ8�CŒ=ÐÐÑØ"€Hˆh�sŒmÐ"Ð"Ñ"Ø€GˆTÐÐÑØ€K�ÐÐÑØ!%€J�˜”Ð%Ð%Ñ%Ð%Ð%rQ   r¢   Úprofile_dirc                 óì  — | dz  }|                      ¦   «         sdS 	 ddl}t          |d¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «        }t          |t          ¦  «        r|dfS t          |t          ¦  «        r?|                     d¦  «        p|                     d¦  «        |                     d¦  «        fS dS # t          $ r Y dS w xY w)	zLRead model/provider from a profile's config.yaml. Returns (model, provider).r   )NNr   NÚrr;   r5   r¦   )	rž   ÚyamlÚopenÚ	safe_loadr‡   Ú
isinstancerx   Údictrz   )r±   Úconfig_pathr´   ÚfÚcfgÚ	model_cfgs         rR   Ú_read_config_modelr½     sI  € à Ñ-€KØ×ÒÑÔð ØˆzðØˆˆˆÝ�+˜sÑ#Ô#ð 	* qØ—.’. Ñ#Ô#Ð) rˆCð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*à—G’G˜G RÑ(Ô(ˆ	Ý�i¥Ñ%Ô%ð 	#Ø˜d�?Ð"Ý�i¥Ñ&Ô&ð 	aØ—=’= Ñ+Ô+ÐE¨y¯}ª}¸WÑ/EÔ/EÀyÇ}Â}ÐU_ÑG`ÔG`Ð`Ð`ØˆzøÝð ð ð Øˆzˆzðøøøs;   �C% ±AÁ	C% ÁAÁC% ÁAÁ1C% ÂAC% Ã%
C3Ã2C3c                 óV   — 	 ddl m}  || dz  d¬¦  «        duS # t          $ r Y dS w xY w)z<Check if a gateway is running for a given profile directory.r   )Úget_running_pidr   F)Úcleanup_staleN)Úgateway.statusr¿   rz   )r±   r¿   s     rR   Ú_check_gateway_runningrÂ   -  s[   € ðØ2Ð2Ð2Ð2Ð2Ð2Øˆ˜{¨]Ñ:È%ÐPÑPÔPÐX\Ð\Ð\øÝð ð ð Øˆuˆuðøøøs   ‚ š
(§(c                 ó¾   — | dz  }|                      ¦   «         sdS d}|                     d¦  «        D ])}dt          |¦  «        vrdt          |¦  «        vr|dz  }Œ*|S )z$Count installed skills in a profile.r   r   zSKILL.mdz/.hub/z/.git/é   )rf   Úrglobrx   )r±   Ú
skills_dirÚcountÚmds       rR   Ú_count_skillsrÉ   6  sw   € à˜xÑ'€JØ×ÒÑÔð ØˆqØ€EØ×Ò˜zÑ*Ô*ð ð ˆØ�3˜r™7œ7Ð"Ð" xµs¸2±w´wÐ'>Ð'>Ø�Q‰JˆEøØ€LrQ   c                  óH  — g } t          ¦   «         }t          ¦   «         }|                     ¦   «         rkt          |¦  «        \  }}|                      t          d|dt          |¦  «        |||dz                       ¦   «         t          |¦  «        ¬¦  «        ¦  «         t          ¦   «         }|                     ¦   «         rât          |                     ¦   «         ¦  «        D ]À}|                     ¦   «         sŒ|j        }t                               |¦  «        sŒ9t          |¦  «        \  }}||z  }|                      t          ||dt          |¦  «        |||dz                       ¦   «         t          |¦  «        |                     ¦   «         r|nd¬¦	  «	        ¦  «         ŒÁ| S )z4Return info for all profiles, including the default.r5   Tr   )r\   r£   r¤   r¥   r;   r¦   r§   r¨   FN)	r\   r£   r¤   r¥   r;   r¦   r§   r¨   r©   )r[   rO   rf   r½   Úappendr¢   rÂ   rž   rÉ   rS   ÚsortedÚiterdirr\   r^   r_   )	r&   r}   Údefault_homer;   r¦   Úprofiles_rootÚentryr\   r©   s	            rR   Úlist_profilesrÑ   F  s¹  € à€HÝ"Ñ$Ô$€Kõ ,Ñ-Ô-€LØ×ÒÑÔð Ý,¨\Ñ:Ô:‰ˆˆxØ�Š�ØØØÝ2°<Ñ@Ô@ØØØ! FÑ*×2Ò2Ñ4Ô4Ý% lÑ3Ô3ð	
ñ 	
ô 	
ñ 		ô 		ð 		õ 'Ñ(Ô(€MØ×ÒÑÔð Ý˜M×1Ò1Ñ3Ô3Ñ4Ô4ð 	ð 	ˆEØ—<’<‘>”>ð ØØ”:ˆDÝ!×'Ò'¨Ñ-Ô-ð ØÝ0°Ñ7Ô7‰OˆE�8Ø$ tÑ+ˆJØ�OŠO�KØØØ Ý 6°uÑ =Ô =ØØ!Ø ™×/Ò/Ñ1Ô1Ý)¨%Ñ0Ô0Ø)3×):Ò):Ñ)<Ô)<ÐF˜:˜:À$ð
ñ 
ô 
ñ 
ô 
ð 
ð 
ð €OrQ   FÚ
clone_fromÚ	clone_allÚclone_configÚno_aliasc                 ó2  — t          | ¦  «         | dk    rt          d¦  «        ‚t          | ¦  «        }|                     ¦   «         rt	          d| › d|› �¦  «        ‚d}|€|s|r\|€ddlm}  |¦   «         }nt          |¦  «         t          |¦  «        }|                     ¦   «         st          d|pd	› d
|› �¦  «        ‚|r;|r9t          j
        ||¦  «         t          D ]}||z                       d¬¦  «         ŒnÑ|                     dd¬¦  «         t          D ]}	||	z                       dd¬¦  «         Œ|�”t          D ]3}
||
z  }|                     ¦   «         rt          j        |||
z  ¦  «         Œ4t"          D ]Q}||z  }|                     ¦   «         r6||z  }|j                             dd¬¦  «         t          j        ||¦  «         ŒR|dz  }|                     ¦   «         s/	 ddlm} |                     |d¬¦  «         n# t,          $ r Y nw xY w|S )ac  Create a new profile directory.

    Parameters
    ----------
    name:
        Profile identifier (lowercase, alphanumeric, hyphens, underscores).
    clone_from:
        Source profile to clone from. If ``None`` and clone_config/clone_all
        is True, defaults to the currently active profile.
    clone_all:
        If True, do a full copytree of the source (all state).
    clone_config:
        If True, copy only config files (config.yaml, .env, SOUL.md).
    no_alias:
        If True, skip wrapper script creation.

    Returns
    -------
    Path
        The newly created profile directory.
    r5   uS   Cannot create a profile named 'default' â€” it is the built-in profile (~/.hermes).ú	Profile 'ú' already exists at Nr   ©Úget_hermes_homezSource profile 'Úactivez' does not exist at T©Ú
missing_okrŒ   r   )ÚDEFAULT_SOUL_MDzutf-8)Úencoding)rb   r`   rd   rž   ÚFileExistsErrorrW   rÚ   rf   r{   ÚshutilÚcopytreeÚ_CLONE_ALL_STRIPrŸ   r�   Ú_PROFILE_DIRSÚ_CLONE_CONFIG_FILESÚcopy2Ú_CLONE_SUBDIR_FILESÚparentÚhermes_cli.default_soulrÞ   r“   rz   )r\   rÒ   rÓ   rÔ   rÕ   r±   Ú
source_dirrÚ   ÚstaleÚsubdirÚfilenameÚsrcÚrelpathÚdstÚ	soul_pathrÞ   s                   rR   Úcreate_profilerò   t  sÖ  € õ8 ˜$ÑÔÐàˆyÒÐÝØañ
ô 
ð 	
õ " $Ñ'Ô'€KØ×ÒÑÔð SÝÐQ¨$ÐQÐQÀKÐQÐQÑRÔRÐRð €JØÐ Ð¨lÐØÐà8Ð8Ð8Ð8Ð8Ð8Ø(˜Ñ*Ô*ˆJˆJå! *Ñ-Ô-Ð-Ý(¨Ñ4Ô4ˆJØ× Ò Ñ"Ô"ð 	Ý#Ø[ :Ð#9°Ð[Ð[ÈzÐ[Ð[ñô ð ð ð +�Zð +åŒ˜
 KÑ0Ô0Ð0å%ð 	:ð 	:ˆEØ˜5Ñ ×(Ò(°DÐ(Ñ9Ô9Ð9Ð9ð	:ð 	×Ò $°ÐÑ6Ô6Ð6Ý#ð 	Fð 	FˆFØ˜6Ñ!×(Ò(°ÀÐ(ÑEÔEÐEÐEð Ð!Ý/ð >ð >�Ø  8Ñ+�Ø—:’:‘<”<ð >Ý”L  k°HÑ&<Ñ=Ô=Ð=øõ /ð +ð +�Ø  7Ñ*�Ø—:’:‘<”<ð +Ø%¨Ñ/�CØ”J×$Ò$¨T¸DÐ$ÑAÔAÐAÝ”L  cÑ*Ô*Ð*øð ˜iÑ'€IØ×ÒÑÔð ð	Ø?Ð?Ð?Ð?Ð?Ð?Ø× Ò  ¸7Ð ÑCÔCÐCÐCøÝð 	ð 	ð 	ØˆDð	øøøð Ðs   Ç)H È
HÈHÚquietc                 ó
  — t          t          ¦  «        j        j                             ¦   «         }	 t	          j        t          j        ddgi t          j	        ¥dt          | ¦  «        i¥t          |¦  «        ddd¬¦  «        }|j        dk    rD|j                             ¦   «         r+t          j        |j                             ¦   «         ¦  «        S |sat!          d|j        › �¦  «         |j                             ¦   «         r1t!          d	|j                             ¦   «         d
d…         › �¦  «         d
S # t          j        $ r |st!          d¦  «         Y d
S t&          $ r}|st!          d|› �¦  «         Y d
}~d
S d
}~ww xY w)z¼Seed bundled skills into a profile via subprocess.

    Uses subprocess because sync_skills() caches HERMES_HOME at module level.
    Returns the sync result dict, or None on failure.
    z-cziimport json; from tools.skills_sync import sync_skills; r = sync_skills(quiet=True); print(json.dumps(r))ÚHERMES_HOMETé<   )ÚenvÚcwdrl   rm   rn   r   u%   âš  Skill seeding returned exit code z  NéÈ   u!   âš  Skill seeding timed out (60s)u   âš  Skill seeding failed: )r   Ú__file__rè   Úresolvers   rt   ÚsysÚ
executabler…   r†   rx   ru   rv   rw   ÚjsonÚloadsr’   Ústderrr|   rz   )r±   ró   Úproject_rootr~   rš   s        rR   Úseed_profile_skillsr  Ò  sª  € õ �‘>”>Ô(Ô/×7Ò7Ñ9Ô9€LðÝ”ÝŒ^˜TðAðBð @•2”:Ð?˜}­c°+Ñ.>Ô.>Ð?Ð?Ý�LÑ!Ô!Ø d°Bð
ñ 
ô 
ˆð Ô Ò!Ð! f¤m×&9Ò&9Ñ&;Ô&;Ð!Ý”:˜fœm×1Ò1Ñ3Ô3Ñ4Ô4Ð4Øð 	:ÝÐM¸&Ô:KÐMÐMÑNÔNÐNØŒ}×"Ò"Ñ$Ô$ð :ÝÐ8˜6œ=×.Ò.Ñ0Ô0°°#°Ô6Ð8Ð8Ñ9Ô9Ð9ØˆtøÝÔ$ð ð ð Øð 	7ÝÐ5Ñ6Ô6Ð6ØˆtˆtÝð ð ð Øð 	4ÝÐ2¨qÐ2Ð2Ñ3Ô3Ð3Øˆtˆtˆtˆtˆtøøøøðøøøs%   ²BD7 ÃA#D7 Ä7 FÅ	FÅ#E=Å=FÚyesc                 ó†  — t          | ¦  «         | dk    rt          d¦  «        ‚t          | ¦  «        }|                     ¦   «         st	          d| › d�¦  «        ‚t          |¦  «        \  }}t          |¦  «        }t          |¦  «        }t          d| › �¦  «         t          d|› �¦  «         |rt          d|› �|rd|› d	�nd
z   ¦  «         |rt          d|› �¦  «         dg}t          ¦   «         | z  }| 
                    ¦   «         }	|	r|                     d|› d	�¦  «         t          d¦  «         |D ]}
t          d|
› �¦  «         Œ|rt          d¦  «         |stt          ¦   «          	 t          d| › d�¦  «                             ¦   «         }n(# t          t          f$ r t          d¦  «         |cY S w xY w|| k    rt          d¦  «         |S t!          | |¦  «         |rt#          |¦  «         |	r!t%          | ¦  «        rt          d|› �¦  «         	 t'          j        |¦  «         t          d|› �¦  «         n,# t*          $ r}t          d|› d|› �¦  «         Y d}~nd}~ww xY w	 t-          ¦   «         }|| k    rt/          d¦  «         t          d¦  «         n# t*          $ r Y nw xY wt          d| › d�¦  «         |S )zÒDelete a profile, its wrapper script, and its gateway service.

    Stops the gateway if running. Disables systemd/launchd service first
    to prevent auto-restart.

    Returns the path that was removed.
    r5   zZCannot delete the default profile (~/.hermes).
To remove everything, use: hermes uninstallr×   ú' does not exist.z

Profile: z	Path:    z	Model:   z (rp   r„   z	Skills:  z;All config, API keys, memories, sessions, skills, cron jobszCommand alias (z
This will permanently delete:u     â€¢ u0     âš  Gateway is running â€” it will be stopped.zType 'z' to confirm: z
Cancelled.z
Cancelled.u   âœ“ Removed u   âš  Could not remove r�   Nu#   âœ“ Active profile reset to defaultz

Profile 'z
' deleted.)rb   r`   rd   rf   r{   r½   rÂ   rÉ   r’   r[   rž   rË   Úinputrw   ÚKeyboardInterruptÚEOFErrorÚ_cleanup_gateway_serviceÚ_stop_gateway_processr    rá   Úrmtreerz   Úget_active_profileÚset_active_profile)r\   r  r±   r;   r¦   Ú
gw_runningr¨   Úitemsr›   Úhas_wrapperÚitemÚconfirmrš   rÛ   s                 rR   Údelete_profiler  ó  s²  € õ ˜$ÑÔÐàˆyÒÐÝð:ñ
ô 
ð 	
õ
 " $Ñ'Ô'€KØ×ÒÑÔð EÝÐ C¨DÐ CÐ CÐ CÑDÔDÐDõ )¨Ñ5Ô5�O€Eˆ8Ý'¨Ñ4Ô4€JÝ Ñ,Ô,€Kå	Ð
˜Ð
Ð
ÑÔÐÝ	Ð
#�kÐ
#Ð
#Ñ$Ô$Ð$Øð LÝÐ!˜%Ð!Ð!¸Ð%IÐ%5¨(Ð%5Ð%5Ð%5Ð%5ÀrÑJÑKÔKÐKØð )ÝÐ'˜+Ð'Ð'Ñ(Ô(Ð(ð 	Fð€Eõ
 $Ñ%Ô%¨Ñ,€LØ×%Ò%Ñ'Ô'€KØð 8Ø�ŠÐ6 |Ð6Ð6Ð6Ñ7Ô7Ð7å	Ð
,Ñ-Ô-Ð-Øð ð ˆÝˆo�tˆoˆoÑÔÐÐØð CÝÐAÑBÔBÐBð ð 	Ý‰Œˆð	ÝÐ9 TÐ9Ð9Ð9Ñ:Ô:×@Ò@ÑBÔBˆGˆGøÝ!¥8Ð,ð 	ð 	ð 	Ý�.Ñ!Ô!Ð!ØÐÐÐð	øøøð �dŠ?ˆ?Ý�,ÑÔÐØÐõ ˜T ;Ñ/Ô/Ð/ð ð +Ý˜kÑ*Ô*Ð*ð ð 1Ý  Ñ&Ô&ð 	1ÝÐ/ Ð/Ð/Ñ0Ô0Ð0ð:ÝŒ�kÑ"Ô"Ð"ÝÐ*˜[Ð*Ð*Ñ+Ô+Ð+Ð+øÝð :ð :ð :ÝÐ8 kÐ8Ð8°QÐ8Ð8Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð:øøøðÝ#Ñ%Ô%ˆØ�TŠ>ˆ>Ý˜yÑ)Ô)Ð)ÝÐ7Ñ8Ô8Ð8øøÝð ð ð Øˆðøøøõ 
Ð
(˜Ð
(Ð
(Ð
(Ñ)Ô)Ð)ØÐs<   Å-%F Æ"F8Æ7F8È&H> È>
I'ÉI"É"I'É+2J Ê
J+Ê*J+c                 ó\  — ddl }t          j                             d¦  «        }	 t	          |¦  «        t          j        d<   ddlm}m} |                     ¦   «         dk    r¼ |¦   «         }t          j
        ¦   «         dz  dz  dz  |› d	�z  }|                     ¦   «         r{t          j        d
dd|gddd¬¦  «         t          j        d
dd|gddd¬¦  «         |                     d¬¦  «         t          j        g d¢ddd¬¦  «         t          d|› d�¦  «         nƒ|                     ¦   «         dk    rk |¦   «         }|                     ¦   «         rMt          j        ddt	          |¦  «        gddd¬¦  «         |                     d¬¦  «         t          d¦  «         n)# t           $ r}	t          d|	› �¦  «         Y d}	~	nd}	~	ww xY w|�|t          j        d<   dS dt          j        v rt          j        d= dS dS # |�|t          j        d<   ndt          j        v rt          j        d= w xY w)z9Disable and remove systemd/launchd service for a profile.r   Nrõ   )Úget_service_nameÚget_launchd_plist_pathÚLinuxz.configÚsystemdÚuserz.serviceÚ	systemctlú--userÚdisableTFé
   )rl   Úcheckrn   ÚstoprÜ   )r  r  zdaemon-reloadu   âœ“ Service z removedÚDarwinÚ	launchctlÚunloadu   âœ“ Launchd service removedu   âš  Service cleanup: )Úplatformr…   r†   r‡   rx   Úhermes_cli.gatewayr  r  Úsystemr   r   rž   rs   rt   rŸ   r’   rz   )
r\   r±   Ú	_platformÚold_homer  r  Úsvc_nameÚsvc_fileÚ
plist_pathrš   s
             rR   r	  r	  O  sº  € à Ð Ð Ð õ Œz�~Š~˜mÑ,Ô,€Hð&*Ý$'¨Ñ$4Ô$4�Œ
�=Ñ!ØOÐOÐOÐOÐOÐOÐOÐOà×ÒÑÔ Ò(Ð(Ø'Ð'Ñ)Ô)ˆHÝ”y‘{”{ YÑ.°Ñ:¸VÑCÈÐF[ÐF[ÐF[Ñ[ˆHØ�ŠÑ Ô ð 9Ý”Ø  (¨I°xÐ@Ø#'¨u¸bðñ ô ð õ ”Ø  (¨F°HÐ=Ø#'¨u¸bðñ ô ð ð —’¨4�Ñ0Ô0Ð0Ý”Ø<Ð<Ð<Ø#'¨u¸bðñ ô ð õ Ð7 XÐ7Ð7Ð7Ñ8Ô8Ð8øà×ÒÑÔ 8Ò+Ð+Ø/Ð/Ñ1Ô1ˆJØ× Ò Ñ"Ô"ð 6Ý”Ø  (­C°
©O¬OÐ<Ø#'¨u¸bðñ ô ð ð ×!Ò!¨TÐ!Ñ2Ô2Ð2ÝÐ4Ñ5Ô5Ð5øøÝð +ð +ð +ÝÐ) aÐ)Ð)Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*øøøøð+øøøð ÐØ(0�BŒJ�}Ñ%Ð%Ð%Ø�bœjÐ(Ð(Ý”
˜=Ð)Ð)Ð)ð )Ð(øð ÐØ(0�BŒJ�}Ñ%Ð%Ø�bœjÐ(Ð(Ý”
˜=Ð)Ð)Ð)Ð)Ð)s0   ¥E;F! Æ G< Æ!
GÆ+GÆ=G< ÇGÇG< Ç</H+c                 óF  — ddl }ddl}| dz  }|                     ¦   «         sdS 	 |                     ¦   «                              ¦   «         }|                     d¦  «        rt          j        |¦  «        ndt          |¦  «        i}t          |d         ¦  «        }t          j
        ||j        ¦  «         t          d¦  «        D ]R}|                     d¦  «         	 t          j
        |d¦  «         Œ.# t          $ r t          d|› d	�¦  «         Y  dS w xY w	 t          j
        ||j        ¦  «         n# t          $ r Y nw xY wt          d
|› d	�¦  «         dS # t          t"          f$ r t          d¦  «         Y dS t$          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w)z0Stop a running gateway process via its PID file.r   Nr   ú{Úpidé   g      à?u   âœ“ Gateway stopped (PID rp   u   âœ“ Gateway force-stopped (PID u   âœ“ Gateway already stoppedu   âš  Could not stop gateway: )ÚsignalÚtimerž   ry   rw   Ú
startswithrþ   rÿ   r°   r…   ÚkillÚSIGTERMÚrangeÚsleepÚProcessLookupErrorr’   ÚSIGKILLÚPermissionErrorrz   )	r±   Ú_signalÚ_timeÚpid_fileÚrawÚdatar-  Ú_rš   s	            rR   r
  r
    sý  € àÐÐÐØÐÐÐà˜]Ñ*€HØ�?Š?ÑÔð Øˆð2Ø× Ò Ñ"Ô"×(Ò(Ñ*Ô*ˆØ"%§.¢.°Ñ"5Ô"5ÐL�tŒz˜#‰Œˆ¸EÅ3ÀsÁ8Ä8Ð;LˆÝ�$�u”+ÑÔˆÝ
Œ��W”_Ñ%Ô%Ð%å�r‘”ð 	ð 	ˆAØ�KŠK˜ÑÔÐðÝ”˜˜Q‘”��øÝ%ð ð ð ÝÐ8°#Ð8Ð8Ð8Ñ9Ô9Ð9Ø���ðøøøð	ÝŒG�C˜œÑ)Ô)Ð)Ð)øÝ!ð 	ð 	ð 	ØˆDð	øøøåÐ6°Ð6Ð6Ð6Ñ7Ô7Ð7Ð7Ð7øÝ¥Ð0ð -ð -ð -ÝÐ+Ñ,Ô,Ð,Ð,Ð,Ð,Ýð 2ð 2ð 2ÝÐ0¨QÐ0Ð0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð2øøøsf   ¥B5E ÃC1Ã0E Ã1DÄE ÄDÄE ÄD2 Ä1E Ä2
D?Ä<E Ä>D?Ä?E Å F Å:	F ÆFÆF c                  ó´   — t          ¦   «         } 	 |                      ¦   «                              ¦   «         }|sdS |S # t          t          t
          f$ r Y dS w xY w)ztRead the sticky active profile name.

    Returns ``"default"`` if no active_profile file exists or it's empty.
    r5   )rY   ry   rw   r{   ÚUnicodeDecodeErrorr‘   )r£   r\   s     rR   r  r  ¥  sk   € õ
 $Ñ%Ô%€DðØ�~Š~ÑÔ×%Ò%Ñ'Ô'ˆØð 	Ø�9ØˆøÝÕ1µ7Ð;ð ð ð Øˆyˆyðøøøs   �(< º< ¼AÁAc                 óŒ  — t          | ¦  «         | dk    r$t          | ¦  «        st          d| › d| › �¦  «        ‚t          ¦   «         }|j                             dd¬¦  «         | dk    r|                     d¬¦  «         d	S |                     d¦  «        }|                     | dz   ¦  «         | 	                    |¦  «         d	S )
zlSet the sticky active profile.

    Writes to ``~/.hermes/active_profile``. Use ``"default"`` to clear.
    r5   r×   ú8' does not exist. Create it with: hermes profile create TrŒ   rÜ   ú.tmpú
N)
rb   rg   r{   rY   rè   r�   rŸ   Úwith_suffixr“   Úreplace)r\   r£   r0   s      rR   r  r  ´  sê   € õ
 ˜$ÑÔÐØˆyÒÐ¥°Ñ!5Ô!5ÐÝð<˜ð <ð <Ø59ð<ð <ñ
ô 
ð 	
õ
 $Ñ%Ô%€DØ„K×Ò˜d¨TÐÑ2Ô2Ð2ØˆyÒÐà�Š˜tˆÑ$Ô$Ð$Ð$Ð$ð ×Ò˜vÑ&Ô&ˆØ�Š�t˜d‘{Ñ#Ô#Ð#Ø�Š�DÑÔÐÐÐrQ   c                  ó°  — ddl m}   | ¦   «         }|                     ¦   «         }t          ¦   «                              ¦   «         }||k    rdS t	          ¦   «                              ¦   «         }	 |                     |¦  «        }|j        }t          |¦  «        dk    r(t           	                    |d         ¦  «        r|d         S n# t          $ r Y nw xY wdS )a%  Infer the current profile name from HERMES_HOME.

    Returns ``"default"`` if HERMES_HOME is not set or points to ``~/.hermes``.
    Returns the profile name if HERMES_HOME points into ``~/.hermes/profiles/<name>``.
    Returns ``"custom"`` if HERMES_HOME is set to an unrecognized path.
    r   rÙ   r5   rÄ   Úcustom)rW   rÚ   rû   rO   rS   Úrelative_toÚpartsÚlenr^   r_   r`   )rÚ   Úhermes_homeÚresolvedÚdefault_resolvedrÏ   ÚrelrJ  s          rR   Úget_active_profile_namerP  Ì  sé   € ð 1Ð0Ð0Ð0Ð0Ð0Ø!�/Ñ#Ô#€KØ×"Ò"Ñ$Ô$€Hå/Ñ1Ô1×9Ò9Ñ;Ô;ÐØÐ#Ò#Ð#Øˆyå&Ñ(Ô(×0Ò0Ñ2Ô2€MðØ×"Ò" =Ñ1Ô1ˆØ”	ˆÝˆu‰:Œ:˜Š?ˆ?�~×3Ò3°E¸!´HÑ=Ô=ˆ?Ø˜”8ˆOøøÝð ð ð Øˆðøøøð ˆ8s   Á.AC Ã
CÃCÚroot_dirc                 ó>   ‡ — dt           dt          dt          fˆ fd„}|S )zØReturn an *ignore* callable for :func:`shutil.copytree`.

    At the root level it excludes everything in ``_DEFAULT_EXPORT_EXCLUDE_ROOT``.
    At all levels it excludes ``__pycache__``, sockets, and temp files.
    Ú	directoryÚcontentsrL   c                 ó&  •— t          ¦   «         }|D ]L}|dk    s|                     d¦  «        r|                     |¦  «         Œ3|dv r|                     |¦  «         ŒMt          | ¦  «        ‰k    r|                     d„ |D ¦   «         ¦  «         |S )NÚ__pycache__)z.sockrC  )zpackage.jsonzpackage-lock.jsonc              3   ó,   K  — | ]}|t           v ¯|V — Œd S ©N)Ú_DEFAULT_EXPORT_EXCLUDE_ROOT)Ú.0Úcs     rR   ú	<genexpr>z:_default_export_ignore.<locals>._ignore.<locals>.<genexpr>ý  s-   è è € ÐTÐT °!Õ7SÐ2SÐ2S˜1Ð2SÐ2SÐ2SÐ2SÐTÐTrQ   )ÚsetÚendswithÚaddr   rC   )rS  rT  ÚignoredrÐ   rQ  s       €rR   Ú_ignorez'_default_export_ignore.<locals>._ignoreò  s£   ø€ Ý‘u”uˆØð 	#ð 	#ˆEà˜Ò%Ð%¨¯ªÐ8IÑ)JÔ)JÐ%Ø—’˜EÑ"Ô"Ð"Ð"àÐ?Ð?Ð?Ø—’˜EÑ"Ô"Ð"øå�	‰?Œ?˜hÒ&Ð&Ø�NŠNÐTÐT hÐTÑTÔTÑTÔTÐTØˆrQ   )rx   Úlistr]  )rQ  ra  s   ` rR   Ú_default_export_ignorerc  ë  s=   ø€ ð�3ð ­$ð µ3ð ð ð ð ð ð ð €NrQ   Úoutput_pathc                 óB  ‡	— ddl }t          | ¦  «         t          | ¦  «        }|                     ¦   «         st	          d| › d�¦  «        ‚t          |¦  «        }t          |¦  «                             d¦  «                             d¦  «        }| dk    rˆ|                     ¦   «         5 }t          |¦  «        dz  }t          j
        ||t          |¦  «        ¬¦  «         t          j        |d	|d¦  «        }t          |¦  «        cddd¦  «         S # 1 swxY w Y   |                     ¦   «         5 }t          |¦  «        | z  }d
dhŠ	t          j
        ||ˆ	fd„¬¦  «         t          j        |d	|| ¦  «        }t          |¦  «        cddd¦  «         S # 1 swxY w Y   dS )zMExport a profile to a tar.gz archive.

    Returns the output file path.
    r   Nr×   r  z.tar.gzz.tgzr5   )ÚignoreÚgztarr/   r   c                 ó(   •— ‰t          |¦  «        z  S rX  )r]  )ÚdrT  Ú_CREDENTIAL_FILESs     €rR   ú<lambda>z export_profile.<locals>.<lambda>(  s   ø€ Ð'8½3¸x¹=¼=Ñ'H€ rQ   )Útempfilerb   rd   rf   r{   r   rx   ÚremovesuffixÚTemporaryDirectoryrá   râ   rc  Úmake_archive)
r\   rd  rl  r±   ÚoutputÚbaseÚtmpdirÚstagedr~   rj  s
            @rR   Úexport_profilert    s9  ø€ ð
 €O€O€Oå˜$ÑÔÐÝ! $Ñ'Ô'€KØ×ÒÑÔð EÝÐ C¨DÐ CÐ CÐ CÑDÔDÐDå�+ÑÔ€Fåˆv‰;Œ;×#Ò# IÑ.Ô.×;Ò;¸FÑCÔC€DàˆyÒÐð ×(Ò(Ñ*Ô*ð 	 ¨fÝ˜&‘\”\ IÑ-ˆFÝŒOØØÝ-¨kÑ:Ô:ðñ ô ð õ
 Ô(¨¨w¸À	ÑJÔJˆFÝ˜‘<”<ð	 ð 	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð 
×	$Ò	$Ñ	&Ô	&ð 	¨&Ý�f‘” Ñ$ˆØ(¨&Ð1ÐÝŒØØØHÐHÐHÐHð	
ñ 	
ô 	
ð 	
õ
 Ô$ T¨7°F¸DÑAÔAˆÝ�F‰|Œ|ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s&   Â)ADÄDÄDÄ1AFÆFÆFÚmember_namec                 óp  — |                       dd¦  «        }t          |¦  «        }t          | ¦  «        }|r/|                     ¦   «         s|                     ¦   «         s|j        rt          d| › �¦  «        ‚d„ |j        D ¦   «         }|rt          d„ |D ¦   «         ¦  «        rt          d| › �¦  «        ‚|S )z4Return safe path parts for a profile archive member.ú\ú/zUnsafe archive member path: c                 ó   — g | ]}|d v¯|‘Œ	S ))r„   ú.rP   ©rZ  Úparts     rR   ú
<listcomp>z4_normalize_profile_archive_parts.<locals>.<listcomp><  s"   € ÐHÐHÐH�d°$¸iÐ2GÐ2GˆTÐ2GÐ2GÐ2GrQ   c              3   ó"   K  — | ]
}|d k    V — ŒdS )z..NrP   r{  s     rR   r\  z3_normalize_profile_archive_parts.<locals>.<genexpr>=  s&   è è € Ð7Ð7¨˜ šÐ7Ð7Ð7Ð7Ð7Ð7rQ   )rF  r   r   Úis_absoluteÚdriver`   rJ  Úany)ru  Únormalized_nameÚ
posix_pathÚwindows_pathrJ  s        rR   Ú _normalize_profile_archive_partsr…  .  sé   € à!×)Ò)¨$°Ñ4Ô4€OÝ˜Ñ/Ô/€JÝ" ;Ñ/Ô/€Lð ðGà×!Ò!Ñ#Ô#ðGð ×#Ò#Ñ%Ô%ðGð Ôð	Gõ ÐE¸ÐEÐEÑFÔFÐFàHÐH˜jÔ.ÐHÑHÔH€EØð G•CÐ7Ð7°Ð7Ñ7Ô7Ñ7Ô7ð GÝÐE¸ÐEÐEÑFÔFÐFØ€LrQ   ÚarchiveÚdestinationc           	      ó*  — ddl }|                     | d¦  «        5 }|                     ¦   «         D �]H}t          |j        ¦  «        } |j        |Ž }|                     ¦   «         r|                     dd¬¦  «         ŒM|                     ¦   «         st          d|j        › �¦  «        ‚|j
                             dd¬¦  «         |                     |¦  «        }|€t          d|j        › �¦  «        ‚|5  t          |d¦  «        5 }t          j        ||¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   	 t          j        ||j        d	z  ¦  «         �Œ9# t"          $ r Y �ŒFw xY w	 ddd¦  «         dS # 1 swxY w Y   dS )
zAExtract a profile archive without allowing path escapes or links.r   Núr:gzTrŒ   z!Unsupported archive member type: zCannot read archive member: Úwbiÿ  )Útarfilerµ   Ú
getmembersr…  r\   ÚjoinpathÚisdirr�   Úisfiler`   rè   Úextractfilerá   Úcopyfileobjr…   r”   Úmoder‘   )	r†  r‡  r‹  ÚtfÚmemberrJ  ÚtargetÚ	extractedrð   s	            rR   Ú_safe_extract_profile_archiver—  B  so  € à€N€N€Nà	�Š�g˜vÑ	&Ô	&ð ¨"Ø—m’m‘o”oð 	ñ 	ˆFÝ4°V´[ÑAÔAˆEØ)�[Ô)¨5Ð1ˆFà�|Š|‰~Œ~ð Ø—’ T°D�Ñ9Ô9Ð9Øà—=’=‘?”?ð Ý ØE¸¼ÐEÐEñô ð ð ŒM×Ò¨°tÐÑ<Ô<Ð<ØŸš vÑ.Ô.ˆIØÐ Ý Ð!MÀÄÐ!MÐ!MÑNÔNÐNàð 3ð 3�D ¨Ñ.Ô.ð 3°#ÝÔ" 9¨cÑ2Ô2Ð2ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð 3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ðÝ”˜ ¤¨uÑ!4Ñ5Ô5Ð5Ñ5øÝð ð ð Ø‘ðøøøð/	ðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s~   ›CFÃ4D>ÄD'	ÄD>Ä'D+Ä+D>Ä.D+Ä/D>Ä2FÄ>EÅFÅEÅFÅ
E)Å'FÅ)
E7Å3FÅ6E7Å7FÆFÆFc                 óæ   — ddl }|                     | d¦  «        5 }d„ |                     ¦   «         D ¦   «         }|sd„ |                     ¦   «         D ¦   «         }ddd¦  «         n# 1 swxY w Y   |S )a  Return the archive's top-level directory names.

    Profile imports expect exactly one root directory. Inspecting the archive
    before extraction lets us stage the import safely instead of mutating a
    live profile tree first and reconciling names later.
    r   Nr‰  c                 ó”   — h | ]E}t          |j        ¦  «        }t          |¦  «        d k    s|                     ¦   «         ¯=|d         ’ŒFS )rÄ   r   )r…  r\   rK  rŽ  )rZ  r”  rJ  s      rR   ú	<setcomp>z1_inspect_profile_archive_roots.<locals>.<setcomp>l  sP   € ð 
ð 
ð 
àÝ:¸6¼;ÑGÔG�Ý�5‰zŒz˜AŠ~ˆ~ §¢¡¤ˆ~ð �!ŒHð ˆ~ˆ~rQ   c                 ój   — h | ]0}|                      ¦   «         ¯t          |j        ¦  «        d          ’Œ1S )r   )rŽ  r…  r\   )rZ  r”  s     rR   rš  z1_inspect_profile_archive_roots.<locals>.<setcomp>s  sE   € ð ð ð àØ—<’<‘>”>ðÝ0°´Ñ=Ô=¸aÔ@ðð ð rQ   )r‹  rµ   rŒ  )r†  r‹  r“  Útop_dirss       rR   Ú_inspect_profile_archive_rootsr�  b  sÐ   € ð €N€N€Nà	�Š�g˜vÑ	&Ô	&ð ¨"ð
ð 
àŸ-š-™/œ/ð
ñ 
ô 
ˆð ð 	ðð à Ÿmšm™oœoðñ ô ˆHðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð €Os   ›?A&Á&A*Á-A*Úarchive_pathc                 óÈ  — ddl }t          | ¦  «        }|                     ¦   «         st          d|› �¦  «        ‚t	          |¦  «        }t          |¦  «        dk    r|                     ¦   «         nd}|p|}|st          d¦  «        ‚|€t          d¦  «        ‚|dk    rt          d¦  «        ‚t          |¦  «         t          |¦  «        }|                     ¦   «         rt          d	|› d
|› �¦  «        ‚t          ¦   «         }|                     dd¬¦  «         |                     d¬¦  «        5 }	t          |	¦  «        }
t          ||
¦  «         |
|z  }|                     ¦   «         st          d|› �¦  «        ‚|}||k    r|
|z  }|                     |¦  «         t#          j        t'          |¦  «        t'          |¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   |S )z§Import a profile from a tar.gz archive.

    If *name* is not given, infers it from the archive's top-level directory.
    Returns the imported profile directory.
    r   NzArchive not found: rÄ   zpCannot determine profile name from archive. Specify it explicitly: hermes profile import <archive> --name <name>z=Profile archive must contain exactly one top-level directory.r5   u•   Cannot import as 'default' â€” that is the built-in root profile (~/.hermes). Specify a different name: hermes profile import <archive> --name <name>r×   rØ   TrŒ   Úhermes_profile_import_)Úprefixz,Profile archive root is missing or invalid: )rl  r   rž   r{   r�  rK  Úpopr`   rb   rd   rà   rS   r�   rn  r—  rf   Úrenamerá   Úmoverx   )rž  r\   rl  r†  rœ  Úarchive_rootÚinferred_namer±   rÏ   rr  Ústaging_rootr–  Úfinal_sources                rR   Úimport_profiler©  {  sm  € ð €O€O€Oå�<Ñ Ô €GØ�>Š>ÑÔð AÝÐ ?°gÐ ?Ð ?Ñ@Ô@Ð@å-¨gÑ6Ô6€HÝ%(¨¡]¤]°aÒ%7Ð%7�8—<’<‘>”>�>¸T€LØÐ(˜L€MØð 
ÝðSñ
ô 
ð 	
ð ÐÝØKñ
ô 
ð 	
ð ˜	Ò!Ð!ÝðVñ
ô 
ð 	
õ
 ˜-Ñ(Ô(Ð(Ý! -Ñ0Ô0€KØ×ÒÑÔð \ÝÐZ¨-ÐZÐZÈ[ÐZÐZÑ[Ô[Ð[å&Ñ(Ô(€MØ×Ò ¨tÐÑ4Ô4Ð4à	×	$Ò	$Ð,DÐ	$Ñ	EÔ	Eð 9ÈÝ˜F‘|”|ˆÝ% g¨|Ñ<Ô<Ð<à  <Ñ/ˆ	Ø×ÒÑ!Ô!ð 	ÝØM¸|ÐMÐMñô ð ð !ˆØ˜=Ò(Ð(Ø'¨-Ñ7ˆLØ×Ò˜\Ñ*Ô*Ð*åŒ•C˜Ñ%Ô%¥s¨;Ñ'7Ô'7Ñ8Ô8Ð8ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð" Ðs   Ä/BGÇGÇGÚold_nameÚnew_namec                 ój  — t          | ¦  «         t          |¦  «         | dk    rt          d¦  «        ‚|dk    rt          d¦  «        ‚t          | ¦  «        }t          |¦  «        }|                     ¦   «         st	          d| › d�¦  «        ‚|                     ¦   «         rt          d|› d�¦  «        ‚t          |¦  «        rt          | |¦  «         t          |¦  «         | 
                    |¦  «         t          d|j        › d|j        › �¦  «         t          | ¦  «         t          |¦  «        }|s"t          |¦  «         t          d	|› �¦  «         nt          d
|› d|› �¦  «         	 t!          ¦   «         | k    r!t#          |¦  «         t          d|› �¦  «         n# t$          $ r Y nw xY w|S )zrRename a profile: directory, wrapper script, service, active_profile.

    Returns the new profile directory.
    r5   z"Cannot rename the default profile.u.   Cannot rename to 'default' â€” it is reserved.r×   r  z' already exists.u   âœ“ Renamed u    â†’ u   âœ“ Alias updated: u   âš  Cannot create alias 'u   ' â€” u   âœ“ Active profile updated: )rb   r`   rd   rf   r{   rž   rà   rÂ   r	  r
  r£  r’   r\   r    r�   rœ   r  r  rz   )rª  r«  Úold_dirÚnew_dirÚ	collisions        rR   Úrename_profiler°  ½  sÿ  € õ
 ˜(Ñ#Ô#Ð#Ý˜(Ñ#Ô#Ð#à�9ÒÐÝÐ=Ñ>Ô>Ð>Ø�9ÒÐÝÐIÑJÔJÐJå˜hÑ'Ô'€GÝ˜hÑ'Ô'€Gà�>Š>ÑÔð IÝÐ G¨HÐ GÐ GÐ GÑHÔHÐHØ‡~‚~ÑÔð GÝÐE¨(ÐEÐEÐEÑFÔFÐFõ ˜gÑ&Ô&ð 'Ý  ¨7Ñ3Ô3Ð3Ý˜gÑ&Ô&Ð&ð ‡N‚N�7ÑÔÐÝ	Ð
:˜œÐ
:Ð
:¨G¬LÐ
:Ð
:Ñ;Ô;Ð;õ ˜(Ñ#Ô#Ð#Ý% hÑ/Ô/€IØð GÝ˜hÑ'Ô'Ð'ÝÐ. HÐ.Ð.Ñ/Ô/Ð/Ð/åÐE¨(ÐEÐE¸)ÐEÐEÑFÔFÐFðÝÑÔ 8Ò+Ð+Ý˜xÑ(Ô(Ð(ÝÐ;°Ð;Ð;Ñ<Ô<Ð<øøÝð ð ð Øˆðøøøð €Ns   Å/3F# Æ#
F0Æ/F0c                  ó   — dS )z;Generate a bash completion script for hermes profile names.az  # Hermes Agent profile completion
# Add to ~/.bashrc: eval "$(hermes completion bash)"

_hermes_profiles() {
    local profiles_dir="$HOME/.hermes/profiles"
    local profiles="default"
    if [ -d "$profiles_dir" ]; then
        profiles="$profiles $(ls "$profiles_dir" 2>/dev/null)"
    fi
    echo "$profiles"
}

_hermes_completion() {
    local cur prev
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Complete profile names after -p / --profile
    if [[ "$prev" == "-p" || "$prev" == "--profile" ]]; then
        COMPREPLY=($(compgen -W "$(_hermes_profiles)" -- "$cur"))
        return
    fi

    # Complete profile subcommands
    if [[ "${COMP_WORDS[1]}" == "profile" ]]; then
        case "$prev" in
            profile)
                COMPREPLY=($(compgen -W "list use create delete show alias rename export import" -- "$cur"))
                return
                ;;
            use|delete|show|alias|rename|export)
                COMPREPLY=($(compgen -W "$(_hermes_profiles)" -- "$cur"))
                return
                ;;
        esac
    fi

    # Top-level subcommands
    if [[ "$COMP_CWORD" == 1 ]]; then
        local commands="chat model gateway setup status cron doctor dump config skills tools mcp sessions profile update version"
        COMPREPLY=($(compgen -W "$commands" -- "$cur"))
    fi
}

complete -F _hermes_completion hermes
rP   rP   rQ   rR   Úgenerate_bash_completionr²  ó  s   € ð-ð -rQ   c                  ó   — dS )z:Generate a zsh completion script for hermes profile names.a  #compdef hermes
# Hermes Agent profile completion
# Add to ~/.zshrc: eval "$(hermes completion zsh)"

_hermes() {
    local -a profiles
    profiles=(default)
    if [[ -d "$HOME/.hermes/profiles" ]]; then
        profiles+=("${(@f)$(ls $HOME/.hermes/profiles 2>/dev/null)}")
    fi

    _arguments \
        '-p[Profile name]:profile:($profiles)' \
        '--profile[Profile name]:profile:($profiles)' \
        '1:command:(chat model gateway setup status cron doctor dump config skills tools mcp sessions profile update version)' \
        '*::arg:->args'

    case $words[1] in
        profile)
            _arguments '1:action:(list use create delete show alias rename export import)' \
                        '2:profile:($profiles)'
            ;;
    esac
}

_hermes "$@"
rP   rP   rQ   rR   Úgenerate_zsh_completionr´  %  s   € ðð rQ   Úprofile_namec                 óº   — t          | ¦  «         t          | ¦  «        }| dk    r)|                     ¦   «         st          d| › d| › �¦  «        ‚t	          |¦  «        S )z¼Resolve a profile name to a HERMES_HOME path string.

    Called early in the CLI entry point, before any hermes modules
    are imported, to set the HERMES_HOME environment variable.
    r5   r×   rB  )rb   rd   rf   r{   rx   )rµ  r±   s     rR   Úresolve_profile_envr·  H  s€   € õ ˜,Ñ'Ô'Ð'Ý! ,Ñ/Ô/€Kà�yÒ Ð ¨×);Ò);Ñ)=Ô)=Ð ÝðD˜ð Dð DØ5AðDð Dñ
ô 
ð 	
õ
 ˆ{ÑÔÐrQ   )NFFF)FrX  )Cr­   rþ   r…   Úrerá   r•   rs   rü   Údataclassesr   Úpathlibr   r   r   Útypingr   r   Úcompiler^   rä   rå   rç   rã   Ú	frozensetrY  rq   rr   rS   rO   rY   r[   rx   rb   rd   r¯   rg   r�   rŠ   rœ   r    r¢   Útupler½   rÂ   r°   rÉ   rÑ   rò   r¸   r  r  r	  r
  r  r  rP  rc  rt  r…  r—  r]  r�  r©  r°  r²  r´  r·  rP   rQ   rR   ú<module>r¿     sp  ððð ð* €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø !Ð !Ð !Ð !Ð !Ð !Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !à�”Ð9Ñ:Ô:€ðð ð €ð"ð ð Ð ð ØðÐ ðð ð Ð ð  )˜yð *ð *ð *ñ  ô  Ð ð2 �)ð ð ð ñ ô €ð
  �ið !ð !ð !ñ ô Ð ð3˜Dð 3ð 3ð 3ð 3ð% $ð %ð %ð %ð %ð9 $ð 9ð 9ð 9ð 9ð
*˜$ð *ð *ð *ð *ð
 ð 
¨ð 
ð 
ð 
ð 
ð'˜#ð ' $ð 'ð 'ð 'ð 'ð*˜ð * ð *ð *ð *ð *ð ð ¨°¬ð ð ð ð ðBG ð Gð Gð Gð Gð ð ¨°¬ð ð ð ð ð, ð ¨ð ð ð ð ð& ð
&ð 
&ð 
&ð 
&ð 
&ñ 
&ô 
&ñ „ð
&ð Dð ¨Uð ð ð ð ð&¨ð °ð ð ð ð ð	˜tð 	¨ð 	ð 	ð 	ð 	ð +�t˜KÔ(ð +ð +ð +ð +ð` !%ØØØð[ð [Ø
ð[à˜”ð[ð ð[ð ð	[ð
 ð[ð 
ð[ð [ð [ð [ð|ð  Tð °$ð À8ÈDÄ>ð ð ð ð ðBYð Y˜ð Y 4ð Y°Dð Yð Yð Yð Yðx-* 3ð -*°Tð -*¸dð -*ð -*ð -*ð -*ð`2 tð 2°ð 2ð 2ð 2ð 2ðL˜Cð ð ð ð ð˜Sð  Tð ð ð ð ð0 ð ð ð ð ð> Tð ð ð ð ð0(˜ð (¨3ð (°4ð (ð (ð (ð (ðV°#ð ¸$¸s¼)ð ð ð ð ð(¨4ð ¸dð Àtð ð ð ð ð@¨Dð °S¸´Xð ð ð ð ð2;ð ; ð ;¨H°S¬Mð ;ÀTð ;ð ;ð ;ð ;ðD/˜Sð /¨Cð /°Dð /ð /ð /ð /ðl/ #ð /ð /ð /ð /ðd ð ð ð ð ðF cð ¨cð ð ð ð ð ð rQ   