
    `gjD                        d Z ddlm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 dZ	 ddd	 	 	 	 	 	 	 	 	 dd	Zdd
ZddZd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  hermes memory setup|status — configure memory provider plugins.

Auto-detects installed memory providers via the plugin system.
Interactive curses-based UI for provider selection, then walks through
the provider's config schema. Writes config to config.yaml + .env.
    )annotationsN)Path)get_hermes_home)masked_secret_prompt)cancel_returnsc                   ddl m} ||}|D cg c]  \  }}|r| d| n| }}} || |||      }t                |S c c}}w )zInteractive single-select with arrow keys.

    items: list of (label, description) tuples.
    Returns selected index, or cancel_returns/default on escape/quit.
    r   )curses_radiolistz - )selectedr   )hermes_cli.curses_uir
   _clear_interactive_transition)	titleitemsdefaultr   r
   labeldescdisplay_itemsresults	            J/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/memory_setup.py_curses_selectr      sj     6 
 !E4  $5'TF.M  e]WUcdF!#Ms   A c                     t        d       y )Nz 
  Cancelled. No changes saved.
)print     r   _print_cancelled_setupr   4   s    	
./r   c                     t         j                  j                         syt         j                  j                  d       t         j                  j	                          y)zDClear stale curses content before entering a follow-up setup screen.Nz[2J[H)sysstdoutisattywriteflushr   r   r   r   r   8   s7    ::JJ_%JJr   c                0   |rd| dnd}|rt        d|  | d      }not        j                  j                  d|  | d       t        j                  j	                          t        j
                  j                         j                         }|xs |xs dS )z<Prompt for a value with optional default and secret masking.z []   : )r   r   r   r    r!   stdinreadlinestrip)r   r   secretsuffixvals        r   _promptr-   @   s     'r'!_RF"Rwvhb#9:

2eWVHB/0

ii  "((*!7=b!r   c                >   ddl }ddlm}  ||       }|sy|dz  }|j                         sy	 ddl}t        |d      5 }|j                  |      xs i }ddd       j                  dg       }|sydd	d
dd}	g }
|D ]B  }|	j                  ||j                  dd      j                  d      d         }	 t        |       D |
syt        ddj                  |
              ddlm} ddj                  |
       }	  |dg|
z   d      }|j$                  dk(  rt        ddj                  |
              nNt        ddj                  |
              |j&                  xs ddd }|rt        d|        t        d|        |j                  dg       }|D ]d  }|j                  d d      }|j                  d!d      }|j                  d"d      }|s<	 |j)                  t+        j                  |      d#d#d$%       f y# 1 sw Y   xY w# t        $ r Y yw xY w# t        $ r |
j                  |       Y w xY w# t        $ r&}t        d|        t        d|        Y d}~d}~ww xY w# t        $ r# |rt        d&| d'       t        d|        Y w xY w)(z1Install pip dependencies declared in plugin.yaml.r   N)find_provider_dirzplugin.yamlutf-8encodingpip_dependencieshonchomem0hindsight_client	hindsight)z	honcho-aimem0aizhindsight-clientzhindsight-all-_[z
  Installing dependencies: z, )_pip_installzuv pip install  z--quietx   )timeoutu     ✓ Installed u     ⚠ Failed to install r$          z  Run manually: u     ⚠ Install failed: external_dependenciesnamecheckinstallT   )rD   capture_outputr?   u   
  ⚠ 'z' not found. Install with:)
subprocessplugins.memoryr/   existsyamlopen	safe_load	Exceptiongetreplacesplit
__import__ImportErrorappendr   joinhermes_cli.tools_configr<   
returncodestderrrunshlex)provider_namerH   r/   
plugin_dir	yaml_pathrK   fmetapip_deps_IMPORT_NAMESmissingdepimport_namer<   
manual_cmdr   rX   eext_depsdep_name	check_cmdinstall_cmds                         r   _install_dependenciesrk   P   s   0"=1J]*I)g. 	+!>>!$*D	+
 xx*B/H .$	M G  #''S[[c-B-H-H-Ma-PQ	 {#  	)$))G*<)=
>?4"388G#4"56J/ykG3SA!$TYYw%7$89:,TYYw-?,@ABmm)r4C0FVHo&$ZL12 xx/4H 07762&GGGR(	ggi,0KK	*$tUV  0e	+ 	+ *  	 NN3	 *  /&qc*+ -../  0IhZ/IJKD./0se   H HH 4H<B	H> (I0HH 	HHH;:H;>	I-I((I-0(JJc                 l   	 ddl m} m}  |        }g }|D ]|  \  }}}	  |      }|s	 t	        |d      r|j                         ng }t        d |D              }	t        d |D              }
|	r|
rd}n|	rd}n|sd}nd	}|j                  |||f       ~ |S # t        $ r g }Y w xY w# t        $ r Y w xY w)
zxDiscover memory providers from plugins/memory/.

    Returns list of (name, description, provider_instance) tuples.
    r   )discover_memory_providersload_memory_providerget_config_schemac              3  >   K   | ]  }|j                  d         ywr*   NrO   .0r^   s     r   	<genexpr>z+_get_available_providers.<locals>.<genexpr>   s     :a!%%/:s   c              3  @   K   | ]  }|j                  d          ywrq   rr   rs   s     r   ru   z+_get_available_providers.<locals>.<genexpr>   s     Ba!%%/1Bs   zAPI key / localzrequires API keyzno setup neededlocal)rI   rm   rn   rN   hasattrro   anyrT   )rm   rn   rawresultsrC   r   	availableproviderschemahas_secretshas_non_secrets
setup_hints               r   _get_available_providersr      s    
R') G!$ 5dI	+D1H 
 29CV1W++-]_:6::B6BB?*J+J*J Jj(34)5* N3    		s"   B 
B'B$#B$'	B32B3c                   ddl m}m} t               }d}|D ]  \  }}}|| k(  s|||f} n |st	        d|  d       t	        d       y|\  }}}t                t        |        |       }	t        |	j                  d      t              si |	d<   t        |d      r&t        t                     }
|j                  |
|	       y||	d   d	<    ||	       t	        d
|        t	        d       y)z>Run memory setup for a specific provider, skipping the picker.r   load_configsave_configNz
  Memory provider 'z' not found.z8  Run 'hermes memory setup' to see available providers.
memory
post_setupr}   
  Memory provider: z"  Activation saved to config.yaml
)hermes_cli.configr   r   r   r   r   rk   
isinstancerO   dictrx   strr   r   )r[   r   r   	providersmatchrC   r   r}   r:   confighermes_homes              r   cmd_setup_providerr      s    :(*IE ) dH= 4*E
 %m_LABIJD!X!#$]Ffjj*D1xx&/+,K0 $(F8Z 	!$
()	
/0r   c                	  ' ddl m}m} t               }|st	        d       t	        d       yg }|D ]  \  }}}|j                  |d| f        |j                  d       t        |      dz
  }t        d	||t        
      }	|	t        k(  rt                y |       }
t        |
j                  d      t              si |
d<   |	t        |      k\  r'd|
d   d<    ||
       t	        d       t	        d       y||	   \  }}}t                t        |       t        |d      r&t!        t#                     }|j%                  ||
       yt        |d      r|j'                         ng }|
d   j                  |i       't        't              si 't#               dz  }i }|rtt	        d| d       |D ]_  }|d   }|j                  d|      }|j                  d      }|j                  d      }|rQt        |t              rA|j                  dd      }|j                  di       }'j                  |d      }|r	||v r||   }|j                  dd      }|j                  d      }|j                  d      }|j                  d      }|j                  d       }|r4t        |t              r$t)        'fd!|j+                         D              s|rs|sq|D cg c]  }|df }}'j                  ||      }d}|r||v r|j-                  |      }t        d"| ||t        
      } | t        k(  rt                 y||    '|<   |r|r t.        j0                  j                  |d      nd}!|!r,t        |!      d#kD  rd$|!d%d  nd&}"t3        | d'|" d(d)*      }#n#|rd+| nd}$|$rt	        |$       t3        |d)*      }#|#s|s|#||<   'j                  |      }|xs |}%t3        ||%rt!        |%      nd,      }#|#sL|#'|<   |sU||vs[|#||<   b ||
d   d<    ||
       t!        t#                     }'rt        |d-      r	 |j                  '|       |rt7        ||       t	        d/|        t	        d0       'rt	        d1       |rt	        d2       t	        d3       yc c}w # t4        $ r}&t	        d.|&        Y d}&~&nd}&~&ww xY w)4z)Interactive memory provider setup wizard.r   r   z'
  No memory provider plugins detected.z8  Install a plugin to ~/.hermes/plugins/ and try again.
Nu   — )zBuilt-in onlyu!   — MEMORY.md / USER.md (default)   zMemory provider setup)r   r   r   r$   r}   u%   
  ✓ Memory provider: built-in onlyz  Saved to config.yaml
r   ro   z.envz
  Configuring z:
keydescriptionr   default_fromfieldmapr*   Fchoicesenv_varurlwhenc              3  L   K   | ]  \  }}j                  |      |k(    y w)Nrr   )rt   kvprovider_configs      r   ru   zcmd_setup.<locals>.<genexpr>>  s%     P41a?..q1Q6Ps   !$r%      z...setz (current: z, blank to keep)T)r*   z  Get yours at )r   r   z#  Failed to write provider config: r   z!  Activation saved to config.yamlz  Provider config savedz  API keys saved to .envz$
  Start a new session to activate.
)r   r   r   r   r   rT   lenr   
_CANCELLEDr   r   rO   r   r   rk   rx   r   r   r   ro   allr   indexosenvironr-   rN   _write_env_vars)(argsr   r   r   r   rC   r   r:   builtin_idxr   r   r}   r   r~   env_path
env_writesr   r   r   r   	ref_fieldref_map	ref_value	is_secretr   r   r   r   cchoice_itemscurrentcurrent_idxselexistingmaskedr,   hinteffective_defaultrf   r   s(                                          @r   	cmd_setupr      s   :(*I89IJ E" ,dAdd4&M*+,	LLGHe*q.K5ukblmH: ]Ffjj*D1x 3y>!')x$F67()!(+D!X!# $ x&/+,K0-4X?R-SX'')Y[FX&**44Oot, 6)HJ c*+ 9	2E,C99]C0Dii	*G 99^4L
< >(,,Wb9	&**5"5+//	2>	g!5%i0G		(E2Iii	*Gii	*G))E"C 99V$D
4.P4::<PPy189AB99)--c7;w'1")--"8K$r$[,dno*$*,'.s|$:A2::>>'26r69(ma6Gs8BC=/2UF!TF+fX=M"NW[\C69_SE2rDd!$t4C7*-Jw' *--c2$+$6w!dFWC0A,B]ab+.OC(7*#<.1
7+s9	2x $(F8Z  o'(K78];	=  +>
 *-	!$
()	
-.'(()	
23q  :V  	=7s;<<	=s   R"R' '	S0SSc                   | j                   j                  dd       g }| j                         r | j                  d      j	                         }t               }g }|D ]k  }d|v r#|j                  dd      d   j                         nd}||v r+|j                  | d||           |j                  |       [|j                  |       m |j                         D ]   \  }}||vs|j                  | d|        " | j                  d	j                  |      d	z   d       	 dd
l}	| j                  |	j                  |	j                   z         y
# t"        $ r Y y
w xY w)z'Append or update env vars in .env file.T)parentsexist_okr0   r1   =r   r   r$   
N)parentmkdirrJ   	read_text
splitlinesr   rQ   r)   rT   addr   
write_textrU   statchmodS_IRUSRS_IWUSROSError)
r   r   existing_linesupdated_keys	new_linesline	key_matchr   r,   r   s
             r   r   r   ~  s\   OO$6N!++W+=HHJ5LI #58D[DJJsA&q)//1b	
"	{!Jy,A+BCDY'T"# $$& -Sl"uAcU^,- 		),t3gFt||dll23 s   %,E 	EEc           	     *   ddl m}  |       }|j                  di       }|j                  dd      }t        d       t        d       t        d|xs d	        t	               }d
}|D ]  \  }}}	||k(  s|	} n |r|j                  |i       }
|
}|rt        |d      r	 |j                  |
      }|r8t        d| d       |j                         D ]  \  }}t        d| d|         |rt        d       |j                         rt        d       nt        d       t        |d      r|j                         ng }|D cg c]  }|j                  d      s| }}|rt        d       |D ]s  }|j                  dd      }|j                  dd      }t        t        j                   j                  |            }|rdnd}d| d| }|r
|s|d| z  }t        |       u nt        d       t        d| d       |r3t        d       |D ]#  \  }}}||k(  rd nd}t        d!| d"| d#|        % t                y
# t        $ rF}t        |
t              rt        |
      n|
}t        |t              rt        |      |d<   Y d
}~d
}~ww xY wc c}w )$z$Show current memory provider config.r   )r   r   r}   r$   u   
Memory status
────────────────────────────────────────z  Built-in:  always activez  Provider:  u   (none — built-in only)Nget_status_configstatus_config_errorz
  z config:rA   r&   u   
  Plugin:    installed ✓u     Status:    available ✓u     Status:    not available ✗ro   r   z
  Missing:r   u   ✓u   ✗r=   u     → u   
  Plugin:    NOT installed ✗z  Install the 'z%' memory plugin to ~/.hermes/plugins/z
  Installed plugins:u    ← activeu       • z  ())r   r   rO   r   r   rx   r   rN   r   r   r   r   is_availablero   boolr   r   )r   r   r   
mem_configr[   r   r}   pnamer:   	candidater   display_configrf   r   r,   r~   r^   required_fieldsr   r   is_setmarkr   r   actives                            r   
cmd_statusr     s   -]FHb)JNN:r2M	
*+	
&'	M-E+EF
GH(*IH( q)M! H
 $..;(*=>C!)!;!;O!L Dx01*002 +SSEC5)*+ 01$$&23679@K^9_335eg.4"Ii8H1"I"I",', $"#%%	2"6eeE2.!%bjjnnW&=!>(.uE!%dV1WI6v fSEN2Dd$ 45OM?2WXY&'' 	8NE4&+}&<]"FHUG3tfAfX67	8 
GQ  C:D_VZ:[o!6apnd3<?FN#89C$ #Js$    H> JJ>	J;JJc                    t        | dd      }|dk(  r't        | dd      }|rt        |       yt        |        y|dk(  rt        |        yt        |        y)zRoute memory subcommands.memory_commandNsetupr}   status)getattrr   r   r   )r   subr}   s      r   r   r     sO    
$($
/C
g~4T2x(dO	44r   )r   )
r   r   r   zlist[tuple[str, str]]r   intr   z
int | Nonereturnr   )r   None)NF)r   r   r   z
str | Noner*   r   r   r   )r[   r   r   r   )r   list)r   r   r   r   r   r   )__doc__
__future__r   r   r   rZ   pathlibr   hermes_constantsr   hermes_cli.secret_promptr   r   r   r   r   r-   rk   r   r   r   r   r   r   r   r   r   <module>r      s    # 	 
   , 9
 
 "&  
  	60	" L0^!P#1LN4bFAPr   