
    i @                        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#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dS )*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titlestritemslist[tuple[str, str]]defaultintreturnc                D    ddl m} d |D             } || |||          S )zInteractive single-select with arrow keys.

    items: list of (label, description) tuples.
    Returns selected index, or default on escape/quit.
    r   )curses_radiolistc                *    g | ]\  }}|r| d | n|S )   ).0labeldescs      </home/piyush/.hermes/hermes-agent/hermes_cli/memory_setup.py
<listcomp>z"_curses_select.<locals>.<listcomp>   sD       E4 #-5D      )selectedcancel_returns)hermes_cli.curses_uir   )r   r   r
   r   display_itemss        r   _curses_selectr      sQ     655555    M E=7SZ[[[[r   Fr   
str | Nonesecretboolc                \   |rd| dnd}|rt           j                            d|  | d           t           j                                         t           j                                        rt          j        d          }nt           j                                                                        }nst           j                            d|  | d           t           j                                         t           j                                                                        }|p|pdS )z<Prompt for a value with optional default and secret masking.z [] r   : )prompt)	sysstdoutwriteflushstdinisattygetpassreadlinestrip)r   r
   r   suffixvals        r   _promptr0   %   s    '/_'____RF 
+
/e/V///000
9 	//,,,CC)$$&&,,..CC
/e/V///000
i  ""((**!7=b!r   provider_nameNonec           	     <   ddl }ddlm}  ||           }|sdS |dz  }|                                sdS 	 ddl}t          |          5 }|                    |          pi }ddd           n# 1 swxY w Y   n# t          $ r Y dS w xY w|                    dg           }|sdS dddd	d
}	g }
|D ]z}|	                    ||	                    dd          
                    d          d                   }	 t          |           V# t          $ r |
                    |           Y ww xY w|
sdS t          dd                    |
                      ddl}|                    d          }|s/t          d           t          d           t          d           dS 	 |                    |dddt&          j        dg|
z   ddd           t          dd                    |
                      n# |j        $ r}t          dd                    |
                      |j        pd                                dd         }|rt          d|            t          d t&          j         d!d!                    |
                      Y d}~n^d}~wt          $ rN}t          d"|            t          d t&          j         d!d!                    |
                      Y d}~nd}~ww xY w|                    d#g           }|D ]}|                    d$d%          }|                    d&d%          }|                    dd%          }|rR	 |                    |ddd'(           a# t          $ r* |r%t          d)| d*           t          d|            Y w xY wdS )+z1Install pip dependencies declared in plugin.yaml.r   N)find_provider_dirzplugin.yamlpip_dependencieshonchomem0hindsight_client	hindsight)z	honcho-aimem0aizhindsight-clientzhindsight-all-_[z
  Installing dependencies: z, uvu2     ⚠ uv not found — cannot install dependenciesz=  Install uv: curl -LsSf https://astral.sh/uv/install.sh | shz"  Then re-run: hermes memory setuppipinstallz--pythonz--quietTx   )checktimeoutcapture_outputu     ✓ Installed u     ⚠ Failed to install r          z(  Run manually: uv pip install --python  u     ⚠ Install failed: external_dependenciesnamer"   rB      )shellrD   rC   u   
  ⚠ 'z' not found. Install with:)
subprocessplugins.memoryr4   existsyamlopen	safe_load	Exceptiongetreplacesplit
__import__ImportErrorappendprintjoinshutilwhichrunr%   
executableCalledProcessErrorstderrdecode)r1   rL   r4   
plugin_dir	yaml_pathrO   fmetapip_deps_IMPORT_NAMESmissingdepimport_namer[   uv_pather`   ext_depsdep_name	check_cmdinstall_cmds                        r   _install_dependenciesrq   :   s   000000""=11J ]*I )__ 	+>>!$$*D	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+    xx*B//H  .$	 M G    #''S[[c-B-B-H-H-M-Ma-PQQ	 {#### 	  	  	 NN3	   	
>$))G*<*<
>
>???MMMll4  G CDDDNOOO3444_eY
CNINQXX 	 	
 	
 	

 	57!3!3556666( _ _ _=7););==>>>(/c))++DSD1 	#///"""]]]#((SZJ[J[]]^^^^^^^^ _ _ _*q**+++]]]#((SZJ[J[]]^^^^^^^^_
 xx/44H 0 07762&&GGGR((	ggi,, 	00T$       0 0 0 0JhJJJKKK...///0	0	0 0s   A9 	A-!A9 -A11A9 4A15A9 9
BB5DD'&D'AG0 0
K(:BJK(AK##K(
M$$1NNlistc                    	 ddl m} m}  |             }n# t          $ r g }Y nw xY wg }|D ]\  }}}	  ||          }|sn# t          $ r Y "w xY wt	          |d          r|                                ng }t          d |D                       }	t          d |D                       }
|	r|
rd}n|	rd}n|sd}nd	}|                    |||f           |S )
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   | ]}|                     d           V  dS r   NrS   r   rd   s     r   	<genexpr>z+_get_available_providers.<locals>.<genexpr>   s,      ::a!%%//::::::r   c              3  B   K   | ]}|                     d            V  dS rx   ry   rz   s     r   r{   z+_get_available_providers.<locals>.<genexpr>   s/      BBa!%%//1BBBBBBr   zAPI key / localzrequires API keyzno setup neededlocal)rM   rt   ru   rR   hasattrrv   anyrX   )rt   ru   rawresultsrI   r   	availableproviderschemahas_secretshas_non_secrets
setup_hints               r   _get_available_providersr      sp   
RRRRRRRR''))    G!$ 5 5dI	++D11H  	 	 	H	 29CV1W1W_++---]_::6:::::BB6BBBBB 	!? 	!*JJ 	!+JJ 	!*JJ Jj(34444Ns    $$A
AAc                :   ddl m}m} t                      }d}|D ]\  }}}|| k    r|||f} n|s$t	          d|  d           t	          d           dS |\  }}}t          |            |            }	t          |	                    d          t                    si |	d<   t          |d          r3t          t                                }
|                    |
|	           dS ||	d         d	<    ||	           t	          d
|            t	          d           dS )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   rY   rq   
isinstancerS   dictr~   r   r   r   )r1   r   r   	providersmatchrI   r   r   r<   confighermes_homes              r   cmd_setup_providerr      ss   ::::::::(**IE )  dH=  4*EE !  AmAAABBBIJJJD!X$[]]Ffjj**D11 xx&& /++,,K000 $(F8Z K	
($
(
()))	
011111r   c                0  & ddl m}m} t                      }|s t	          d           t	          d           dS g }|D ] \  }}}|                    |d| f           !|                    d           t          |          dz
  }t          d	||
          }	 |            }
t          |
	                    d          t                    si |
d<   |	t          |          k    s|	dk     r6d|
d         d<    ||
           t	          d           t	          d           dS ||	         \  }}}t          |           t          |d          r3t          t                                }|                    ||
           dS t          |d          r|                                ng }|
d         	                    |i           &t          &t                    si &t                      dz  }i }|rt	          d| d           |D ]}|d         }|	                    d|          }|	                    d          }|	                    d          }|ret          |t                    rP|	                    dd          }|	                    di           }&	                    |d          }|r||v r||         }|	                    dd          }|	                    d          }|	                    d          }|	                    d          }|	                    d           }|rDt          |t                    r/t#          &fd!|                                D                       sb|rc|sad" |D             }&	                    ||          }d}|r||v r|                    |          }t          d#| ||
          }||         &|<   |r|r t(          j        	                    |d          nd} | r:t          |           d$k    rd%| d&d          nd'}!t-          | d(|! d)d*+          }"n+|rd,| nd}#|#rt	          |#           t-          |d*+          }"|"r|r|"||<   _&	                    |          }|p|}$t-          ||$rt          |$          nd
          }"|"r|"&|<   |r	||vr|"||<   ||
d         d<    ||
           t          t                                }&rQt          |d-          rA	 |                    &|           n)# t.          $ r}%t	          d.|%            Y d}%~%nd}%~%ww xY w|rt1          ||           t	          d/|            t	          d0           &rt	          d1           |rt	          d2           t	          d3           dS )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   u%   
  ✓ Memory provider: built-in onlyz  Saved to config.yaml
r   rv   z.envz
  Configuring z:
keydescriptionr
   default_fromfieldmapr   Fchoicesenv_varurlwhenc              3  P   K   | ] \  }}                     |          |k    V  !d S Nry   )r   kvprovider_configs      r   r{   zcmd_setup.<locals>.<genexpr>)  s:      PP41a?..q11Q6PPPPPPr   c                    g | ]}|d fS )r"   r   )r   cs     r   r   zcmd_setup.<locals>.<listcomp>.  s    999AB999r   r      z...setz (current: z, blank to keep)T)r   z  Get yours at 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   rY   rX   lenr   r   rS   r   rq   r~   r   r   r   rv   allr   indexosenvironr0   rR   _write_env_vars)'argsr   r   r   r   rI   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   choice_itemscurrentcurrent_idxselexistingmaskedr/   hinteffective_defaultrl   r   s'                                         @r   	cmd_setupr      s   ::::::::(**I 8999IJJJ E" , ,dAdM4MM*++++	LLGHHHe**q.K5ukRRRH[]]Ffjj**D11 x 3y>>!!X\\')x$F6777()))!(+D!X $ x&& /++,,K000-4X?R-S-S[X'')))Y[FX&**444Oot,,   6)HJ 92****+++ 6	2 6	2E,C99]C00Dii	**G 99^44L 1
< > > 1(,,Wb99	&**5"55+//	2>>	 1g!5!5%i0G		(E22Iii	**Gii	**G))E""C 99V$$D 
4.. PPPP4::<<PPPPP  2y 299999)--c7;; 9w'11")--"8"8K$[$[[,TTT'.s|$$ 2:AI2:>>'2666r 569(mma6G6G28BCC=222UF!T"N"Nf"N"N"NW[\\\CC69A2S222rD $d!$t444C .7 .*-Jw' *--c22$+$6w!dFW,aC0A,B,B,B]abbb 2+.OC( 27*#<#<.1
7+ $(F8Z K o''((K =78];; =	=  +>>>> 	= 	= 	=;;;<<<<<<<<	=  .*---	
($
(
()))	
./// *())) +)***	
344444s   2T	 	
T/T**T/r   r   r   r   c                   | j                             dd           g }|                                 r(|                     d                                          }t                      }g }|D ]}d|v r.|                    dd          d                                         nd}||v r6|                    | d||                     |	                    |           p|                    |           |
                                D ]#\  }}||vr|                    | d|            $|                     d	                    |          d	z              d
S )z'Append or update env vars in .env file.T)parentsexist_okzutf-8)encoding=r   r   r"   
N)parentmkdirrN   	read_text
splitlinesr   rU   r-   rX   addr   
write_textrZ   )	r   r   existing_linesupdated_keys	new_linesline	key_matchr   r/   s	            r   r   r   f  sy   O$666N K!++W+==HHJJ55LI # #58D[[DJJsA&&q)//111b	
""	CCJy,ACCDDDY''''T""""$$&& - -Sl""^^c^^,,,		),,t344444r   c           	     .   ddl m}  |            }|                    di           }|                    dd          t          ddz              t          d           t          d	pd
            r|                    i           }|rBt          d d           |                                D ]\  }}t          d| d|            t                      }t          fd|D                       }|rt          d           |D ]\  }	}
}|	k    r|                                rt          d           nt          d           t          |d          r|	                                ng }d |D             }|rt          d           |D ]}|                    dd          }|                    dd          }t          t          j                            |                    }|rdnd}d| d| }|r
|s|d| z  }t          |            nn"t          d           t          d d           t                      }|r:t          d           |D ](\  }	}}
|	k    rd nd}t          d!|	 d"| d#|            )t                       d$S )%z$Show current memory provider config.r   )r   r   r   r"   z
Memory status
ux   ────────────────────────────────────────z  Built-in:  always activez  Provider:  u   (none — built-in only)z
  z config:rF   r#   c              3  ,   K   | ]\  }}}|k    V  d S r   r   )r   rI   r<   r1   s      r   r{   zcmd_status.<locals>.<genexpr>  s.      FFjdAqDM)FFFFFFr   u   
  Plugin:    installed ✓u     Status:    available ✓u     Status:    not available ✗rv   c                <    g | ]}|                     d           |S )r   ry   rz   s     r   r   zcmd_status.<locals>.<listcomp>  s)    *Q*Q*Qi@P@P*Q1*Q*Q*Qr   z
  Missing:r   r   u   ✓u   ✗rG   u     → u   
  Plugin:    NOT installed ✗z  Install the 'z%' memory plugin to ~/.hermes/plugins/z
  Installed plugins:u    ← activeu       • z  ()N)r   r   rS   rY   r   r   r   is_availabler~   rv   r   r   r   )r   r   r   
mem_configr   r   r/   r   foundpnamer<   pr   required_fieldsrd   r   r   is_setmarkr   r   activer1   s                         @r   
cmd_statusr     sC   ------[]]FHb))JNN:r22M	

+,,,	
'(((	
G-E+E
G
GHHH "Z$..;; 	+0000111+1133 + +S)S))C))****,..	FFFFIFFFFF 	Z1222(  q!M))~~'' ,;<<<<?@@@:A!EX:Y:Y!a!4!4!6!6!6_a*Q*Qf*Q*Q*Q* 
,!-000%4 , ,*+%%	2*>*>&'eeE2&6&6)-bjnnW.E.E)F)F06'AuuE'>d'>'>W'>'>#& !;v !;$(NSNN$:D %dE' ** 5666XMXXXYYY(**I 8'(((' 	8 	8NE4&+}&<&<]]"F6U66t66f667777	GGGGGr   c                    t          | dd          }|dk    rt          |            dS |dk    rt          |            dS t          |            dS )zRoute memory subcommands.memory_commandNsetupstatus)getattrr   r   )r   subs     r   r   r     s]    
$($
/
/C
g~~$	44r   )r   )r   r   r   r	   r
   r   r   r   )NF)r   r   r
   r   r   r   r   r   )r1   r   r   r2   )r   rr   )r   r2   )r   r   r   r   r   r2   )__doc__
__future__r   r+   r   r%   pathlibr   hermes_constantsr   r   r0   rq   r   r   r   r   r   r   r   r   r   <module>r      s<    # " " " " "  				 



       , , , , , ,\ \ \ \ \" " " " "*T0 T0 T0 T0n! ! ! !P!2 !2 !2 !2HF5 F5 F5 F5R5 5 5 5:7 7 7 7|     r   