
    `gj+                       d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZ dd
lmZmZ dZdZdZdZ dZ!e G d d             Z"ddZ#ddZ$ddZ%ddZ&ddZ'd dZ(d!dZ)d"dZ*d"dZ+d#dZ,y)$u&  MCP picker — interactive `hermes mcp picker` (also the default `hermes mcp`).

Lists every catalog entry plus any custom MCP servers the user has added via
``hermes mcp add``, lets them pick one, and routes to install / enable /
disable / uninstall / configure-tools flows.

Mirrors the `hermes plugin` picker UX: arrow keys to navigate, ENTER on a row
to act on it. The action depends on current status:

  not installed (catalog)   → install  (clone/bootstrap if needed, prompt for creds)
  installed / disabled      → enable
  installed / enabled       → submenu: configure tools / disable / uninstall / reinstall
  custom (non-catalog)      → submenu: configure tools / enable / disable / remove

The picker loops until the user hits ESC/q so they can manage multiple
entries in one session.
    )annotationsN)	dataclass)ListOptional)Colorscolor)prompt_yes_no)curses_single_select)	CatalogEntryCatalogErrorcatalog_diagnosticsinstall_entry
is_enabledis_installedlist_cataloginstalled_serversuninstall_entry)load_configsave_config	availablezinstalled (disabled)enabledu   custom — enabledu   custom — disabledc                  P    e Zd ZU dZded<   ded<   ded<   dZded<   ed
d	       Zy)_RowzA row in the picker. ``entry`` is set for catalog rows; for custom
    user-added MCPs only ``name`` + ``description`` + status are populated.strnamedescriptionstatusNzOptional[CatalogEntry]entryc                    | j                   d u S )N)r   )selfs    H/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/mcp_picker.py	is_customz_Row.is_custom@   s    zzT!!    )returnbool)__name__
__module____qualname____doc____annotations__r   propertyr"    r#   r!   r   r   6   s7    O IK$(E!(" "r#   r   c            	        t               } | D ch c]  }|j                   }}g }| D ]r  }t        |j                        st        }n"t	        |j                        rt
        }nt        }|j                  t        |j                  |j                  ||             t t        t               j                               D ]  \  }}||v r|j                  dd      }t        |t              r|j!                         dv }|rt"        nt$        }|j                  d      xs |j                  d      xs d}	|j                  t        |t        |	      |              |S c c}w )	zDReturn catalog rows + any custom (non-catalog) MCPs found in config.)r   r   r   r   r   T>   1yestrueurlcommandz(no transport))r   r   r   )r   r   r   _STATUS_NOT_INSTALLEDr   _STATUS_ENABLED_STATUS_DISABLEDappendr   r   sortedr   itemsget
isinstancer   lower_STATUS_CUSTOM_ENABLED_STATUS_CUSTOM_DISABLED)
catalog_entriesecatalog_namesrowsr   r   r   cfgr   descs
             r!   _build_rowsrD   E   s5   "nO%45QVV5M5D  
EJJ'*F

#$F%FZZ!--		

" -/5578 	K	c= '')T*gs#mmo)==G+2'8Owwu~G!3G7GDdD	&IJ	K K? 6s   Ec                V    | j                   dd| j                  dd| j                   S )N<18 <24)r   r   r   )rows    r!   _format_rowrJ   j   s+    hhs^1SZZ,Acoo->??r#   c          	     >   t               }|j                  d      xs i }|j                  |       }|s(t        t        d|  dt        j
                               y ||d<   ||d<   t        |       t        t        d|  d|rdnd dt        j                               y )	Nmcp_servers  'z' is not installed.r   u     ✓ 'z' disabledz8. Start a new Hermes session for changes to take effect.)r   r9   printr   r   REDr   GREEN)r   enablerB   serversservers        r!   _enable_disablerU   q   s    
-Cggm$*G[[Fec$23VZZ@AF9 C	%
$rv):> ?A 	A r#   c                H    ddl }ddlm}  ||j                  |              y)zOpen the tool selection checklist for an already-installed MCP.

    Delegates to the existing ``cmd_mcp_configure`` flow which probes the
    server, displays a checklist, and writes ``tools.include``.
    r   N)cmd_mcp_configure)r   )argparsehermes_cli.mcp_configrW   	Namespace)r   rX   rW   s      r!   _configure_toolsr[      s      7h((d(34r#   c                \   t               }|j                  d      xs i }| |vr(t        t        d|  dt        j
                               yt        d|  dd      sy|| = |s|j                  dd       n||d<   t        |       t        t        d	|  d
t        j                               y)z0Remove a non-catalog MCP entry from config.yaml.rL   rM   z' is not configured.NzRemove 'z' from mcp_servers?Fdefaultu     ✓ Removed '')
r   r9   rO   r   r   rP   r	   popr   rQ   )r   rB   rS   s      r!   _remove_customra      s    
-Cggm$*G7ec$34fjjAB8D6)<=uMt$$M	%/$q)6<<
89r#   c                   | j                   r.t        | j                        s	 t        | j                   d       y| j                   r-t        | j                        st        | j                  d       y| j                  rdt        | j                        sdnddg}t        d	| j                   d
|      }|y|dk(  rt        | j                         y|dk(  r,t        | j                  t        | j                                y|dk(  rt        | j                         yt                t        t        d| j                   dt        j                               g d}t        d	| j                   d|      }|y|dk(  rt        | j                         y|dk(  rt        | j                  d       y|dk(  rt!        d| j                   dd      ryt#        | j                        r2t        t        d| j                   dt        j$                               yt        t        d| j                   dt        j                               yy|dk(  r'	 | j                   J t        | j                   d       yy# t        $ r0}t        t        d| t        j                               Y d}~yd}~ww xY w# t        $ r0}t        t        d| t        j                               Y d}~yd}~ww xY w)z2Act on the picked row based on its current status.TrR        ✗ install failed: N(Configure tools (probe server + re-pick)EnableDisablezRemove from configzAction for 'z
' (custom)r         rM   z' is already enabled.)re   z3Disable (keep config, stop loading on next session)z.Uninstall (remove config and any cloned files)z/Reinstall (re-clone, re-prompt for credentials)r_   FzUninstall 'z'?r]   u     ✓ Uninstalled 'uI   '. Credentials in .env preserved — delete manually if no longer needed.z' was not installed   u     ✗ reinstall failed: )r   r   r   r   r   rO   r   r   rP   r   rU   r"   r
   r[   ra   DIMr	   r   rQ   )rI   excactionschoices       r!   _handle_rowro      s    yychh/	E#))D1 	 yyCHH-. }} 7&sxx0Hi 

 &SXXJj&I7S>Q;SXX&
 		 q[CHHCHH1E-EF 	 q[388$ 
G	%#chhZ45vzz
BCG "L
!"<gFF~{"	1/	1;sxxj3UCsxx(e)#(( 4] ]LL  ec#((+>?LM D 
1	G99(((#))D1 
m  	E%06

CDD	Et  	G%23%8&**EFF	Gs/   I; %J7 ;	J4&J//J47	K0 &K++K0c                   | s8t                t        t        dt        j                               t                yt                t        t        dt        j                  t        j
                  z                t                t        dddddd	d
       t        dd dd dd        | D ]  }t        dt        |               t                t        t        dt        j                               t               }|D cg c]  }|d   dk(  s| }}|rFt                |D ]-  \  }}}t        t        d| dt        j                               / t                t                yc c}w )zxPlain-text catalog dump used as a fallback when curses can't run, and
    as the default output of `hermes mcp catalog`.z'  No MCPs in the catalog or configured.Nz#  MCP Catalog + configured servers:z  NamerF   rG   StatusrH   z Descriptionz------------------z------------------------z-----------z:  Install: hermes mcp install <name>    Picker: hermes mcprh   future_manifestu     ⚠ 'uH   ' requires a newer Hermes — run `hermes update` to install this entry.)	rO   r   r   rk   CYANBOLDrJ   r   YELLOW)rA   rI   diagsdfuturer   _msgs           r!   _print_rows_textr|      sE    e=vzzJK	G	%5v{{V[[7P
QR	G	Bvcl!HS>
67	Bxj(1XJ
/0 ';s#$%&'	G	%D

   !E<A!A$*;";a<F<" 	LD!S%$  ) ) 	 		G =s   E+E+c                 *    t        t                      y)uQ   `hermes mcp catalog` — print the curated list + custom servers, no interaction.N)r|   rD   r,   r#   r!   show_catalogr~     s    []#r#   c                    t         j                  j                         st        t	                      y	 t	               } | st        |        y| D cg c]  }t        |       }}t        d|      }|yt        | |          Nc c}w )u   `hermes mcp picker` (and default `hermes mcp`) — interactive selector.

    Loops until the user hits ESC/q. After each action the picker re-renders
    so the user can manage several entries in one session.
    NuA   MCP Catalog  —  ↑↓ navigate  ENTER act on entry  ESC/q quit)sysstdinisattyr|   rD   rJ   r
   ro   )rA   rlabelsidxs       r!   
run_pickerr     s     99'
}T"*./Q+a.//"O
 ;DI  0s   Bc                   ddl m}  ||       }|(t        t        d|  dt        j
                               y	 t        |d       y# t        $ r0}t        t        d	| t        j
                               Y d}~yd}~ww xY w)
u   `hermes mcp install <name>` — non-interactive entry-point.

    Returns 0 on success, non-zero on failure (so the CLI can propagate
    exit codes).
    r   )	get_entryNu     ✗ 'zK' is not in the catalog. Run `hermes mcp catalog` to see available entries.rh   Trc   rd   )hermes_cli.mcp_catalogr   rO   r   r   rP   r   r   )
identifierr   r   rl   s       r!   install_by_namer   -  s     1j!E}ej\ "A AJJ
 	
 eD)   e,SE2FJJ?@s   A 	B&A<<B)r$   
List[_Row])rI   r   r$   r   )r   r   rR   r%   r$   None)r   r   r$   r   )rI   r   r$   r   )rA   r   r$   r   )r$   r   )r   r   r$   int)-r)   
__future__r   r   dataclassesr   typingr   r   hermes_cli.colorsr   r   hermes_cli.cli_outputr	   hermes_cli.curses_uir
   r   r   r   r   r   r   r   r   r   r   hermes_cli.configr   r   r3   r5   r4   r<   r=   r   rD   rJ   rU   r[   ra   ro   r|   r~   r   r   r,   r#   r!   <module>r      s   $ # 
 ! ! + / 5
 
 
 7
 $ ) - /  " " ""J@"	5:$AGN#L$
6r#   