
    `gjn?                     R   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mZ ddlm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ dee   f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f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 dedefdZ!dede"eef   fdZ#dedeeef   fdZ$d Z%y)u   
Dump command for hermes CLI.

Outputs a compact, plain-text summary of the user's Hermes setup
that can be copy-pasted into Discord/GitHub/Telegram for support context.
No ANSI colors, no checkmarks — just data.
    N)Path)get_hermes_homeget_env_pathget_project_rootload_config)load_hermes_dotenv)display_hermes_home)is_excluded_skill_pathreturnc                  6   	 t               } | j                  dd      }t	               }|j                         D ]  }|j                         }|r|j                  d      sd|vr+|j                         j                  d      r|t        d      d j                         }|j                  d      \  }}}|j                         }|s|j                         j                  d      s|j                  |        |S # t        t        f$ r t	               cY S w xY w)	ut  Return the set of env-var names assigned a non-empty value in ~/.hermes/.env.

    The managed backends (launchd / systemd / the desktop-spawned ``serve``
    process) load credentials from this file — NOT from an interactive shell's
    exports. ``hermes debug share`` runs in a terminal, so ``os.getenv`` reflects
    the shell's environment, which can include exported keys the managed backend
    never sees. Comparing against this set lets the dump flag that mismatch (the
    exact trap behind #48504-style "no web_search" reports: key exported in the
    shell, absent from .env, invisible to the launchd backend).
    zutf-8ignore)encodingerrors#=zexport Nz'")r   	read_textOSErrorUnicodeErrorset
splitlinesstrip
startswithlowerlenlstrip	partitionadd)env_pathtextnamesrawlinename_values           B/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/dump.py_dotenv_key_namesr'      s    >!!78!D eE  
yy{ts+s$::<""9-I(//1D,azz|EKKM''.IIdO
 L \" us   C< <DDproject_rootc           	         	 t        j                  g ddddt        |             }|j                  dk(  r|j                  j                         }|r|S 	 ddlm}  |d      }|r|S 	 y	# t        $ r Y !w xY w# t        $ r Y y	w xY w)
u  Return short git commit hash, or '(unknown)'.

    Source installs and dev images resolve this live via ``git rev-parse``.
    The published Docker image excludes ``.git`` from the build context, so
    that lookup always fails — we fall back to the baked-in build SHA written
    to ``<project_root>/.hermes_build_sha`` by the Dockerfile's
    ``HERMES_GIT_SHA`` build-arg (see ``hermes_cli/build_info.py``).
    The output format is identical regardless of source.
    )gitz	rev-parsez	--short=8HEADT   capture_outputr   timeoutcwdr   )get_build_sha   )short	(unknown))	
subprocessrunstr
returncodestdoutr   	Exceptionhermes_cli.build_infor1   )r(   resultr%   r1   bakeds        r&   _get_git_commitr>   6   s    5dAL!

 !MM'')E7A&L 
     s$   AA* A9 *	A65A69	BBc           	          	 t        j                  g ddddt        |             }|j                  dk(  r|j                  j                         }|r|S y# t        $ r Y yw xY w)u9  Return the date the HEAD commit was authored (YYYY-MM-DD), or ''.

    Resolves live via ``git log`` on source installs.  The published Docker
    image excludes ``.git``, so this returns '' there — the dump line simply
    drops the date suffix in that case (the baked SHA still identifies the
    build).
    )r*   logz-1z--format=%cdz--date=shortr+   Tr,   r-   r    )r5   r6   r7   r8   r9   r   r:   )r(   r<   r%   s      r&   _get_git_commit_daterB   [   sm    HdAL!

 !MM'')E   s   AA 	A! A!r%   c                     ddl m}  ||       S )u  Redact all but first 4 and last 4 chars.

    Thin wrapper over :func:`agent.redact.mask_secret`. Returns ``""`` for
    an empty value (matches the historical behavior of this helper —
    ``hermes dump`` formats empty values as blank, not as ``"(not set)"``).
    r   )mask_secret)agent.redactrD   )r%   rD   s     r&   _redactrF   s   s     )u    c                  n   	 ddl m}   |        }|j                  r0|j                  }|j                  rd}d| d|j
                  d    dS |j                  r|j                  sd|j                   dS d|j                   dS # t        $ r( t        j                  j                  d      rd	cY S d
cY S w xY w)z%Return a short gateway status string.r   )get_gateway_runtime_snapshotmanualz	running (z, pid )z	stopped ()linuxdarwinunknownzN/A)hermes_cli.gatewayrI   runningmanagerhas_process_service_mismatchgateway_pidsservice_installedservice_runningr:   sysplatformr   )rI   snapshotmodes      r&   _gateway_statusrZ   ~   s    TC/1##D44tfF8+@+@+C*DAFF%%h.F.Fx//0228++,A.. TLL334GHySeSTs$   AB 'B 3B *B4/B43B4hermes_homec                     | dz  }|j                         syd}|j                  d      D ]  }t        |      r|dz  } |S )zCount installed skills.skillsr   zSKILL.md   )is_dirrglobr
   )r[   
skills_dircountitems       r&   _count_skillsrd      sU    x'JE  , !$'
 LrG   configc                 `    | j                  di       }|j                  di       }t        |      S )zCount configured MCP servers.mcpservers)getr   )re   rg   rh   s      r&   _count_mcp_serversrj      s,    
**UB
Cggi$Gw<rG   c                 ,   | dz  dz  }|j                         sy	 t        |d      5 }t        j                  |      }ddd       j	                  dg       }t        d |D              }| d	t        |       d
S # 1 sw Y   >xY w# t        $ r Y yw xY w)zReturn cron jobs summary.cronz	jobs.json0z	utf-8-sig)r   Njobsc              3   F   K   | ]  }|j                  d d      sd  yw)enabledTr^   Nri   ).0js     r&   	<genexpr>z _cron_summary.<locals>.<genexpr>   s     ?1i(>Q?s   !!z
 active / z totalz(error reading))existsopenjsonloadri   sumr   r:   )r[   	jobs_filefdatarn   actives         r&   _cron_summaryr~      s    f${2I	! )k2 	 a99Q<D	 xx#???CI;f55		  	 
  ! !s'   B A;<B ;B B 	BBc                      i ddddddddd	d
dddddddddddddddddddddd } | j                         D cg c]  \  }}t        j                  |      s| c}}S c c}}w )!z3Return list of configured messaging platform names.telegramTELEGRAM_BOT_TOKENdiscordDISCORD_BOT_TOKENslackSLACK_BOT_TOKENwhatsappWHATSAPP_ENABLEDsignalSIGNAL_HTTP_URLemailEMAIL_ADDRESSsmsTWILIO_ACCOUNT_SIDmatrixMATRIX_HOMESERVER_URL
mattermostMATTERMOST_URLhomeassistant
HASS_TOKENdingtalkDINGTALK_CLIENT_IDfeishuFEISHU_APP_IDwecomWECOM_BOT_IDwecom_callbackWECOM_CALLBACK_CORP_IDweixinWEIXIN_ACCOUNT_IDqqbot	QQ_APP_ID)itemsosgetenv)checksr#   envs      r&   _configured_platformsr      s    (& 	" 	&	
 	# 	 	# 	) 	& 	 	( 	/ 	 	2 	%  	!F$ #),,.CYT3BIIcNDCCCs   A,$A,c                 V    | j                  di       }|j                  dd      }|r|S dS )z'Return the active memory provider name.memoryproviderrA   zbuilt-inrq   )re   memr   s      r&   _memory_providerr      s/    
**Xr
"Cwwz2&H8/Z/rG   c                 6   | j                  dd      }t        |t              rT|j                  d      xs( |j                  d      xs |j                  d      xs d}|j                  d      xs d}||fS t        |t              r|xs d}d}||fS d}d}||fS )z'Extract model and provider from config.modelrA   defaultr#   z	(not set)r   z(auto))ri   
isinstancedictr7   )re   	model_cfgr   r   s       r&   _get_model_and_providerr      s    

7B'I)T"i(jIMM',BjimmTZF[j_j==,8 (? 
Is	#([ (? (?rG   c                    ddl m} i }g d}|D ]  \  }}|j                  |i       }| j                  |i       }t        |t              rt        |t              sK|j                  |      }|j                  |      }	|	p|	|k7  svt        |	      || d| <    |j                  dg       }
| j                  dg       }||
k7  rt        |      |d<   | j                  dg       }|rt        |      |d<   |S )zFind non-default config values worth reporting.
    
    Returns a flat dict of dotpath -> value for interesting overrides.
    r   )DEFAULT_CONFIG))agent	max_turns)r   gateway_timeout)r   tool_use_enforcement)terminalbackend)r   docker_image)r   persistent_shell)browserallow_private_urls)compressionrp   )r   	threshold)display	streaming)r   skin)r   show_reasoning)privacy
redact_pii)ttsr   .toolsetsfallback_providers)hermes_cli.configr   ri   r   r   r7   )re   r   	overridesinteresting_pathssectionkeydefault_sectionuser_sectiondefault_valuser_valdefault_toolsetsuser_toolsets	fallbackss                r&   _config_overridesr      s   
 1I" * :(,,Wb9zz'2./40
<QU8V%))#.##C(H$;,/MI	3%(): &))*b9JJz2.M(( #M 2	* 

/4I*-i.	&'rG   c                 l
   t        | dd      }t               }t        |j                  t	               dz         t	               }t               }	 ddlm} t        |      }t        |      }	 t               }t        |      \  }	}
	 ddlm}  |       xs d	}|j!                  d
i       }|j!                  dd      }t"        j$                  j!                  d      xs dj'                         j)                         }|r3|t+        |      j'                         j)                         k7  r	| d| d}n|}	 ddl}|j                  }t/        j0                          dt/        j2                          dt/        j4                          }g }|j7                  d       | }|d| dz  }|r	|d| dz  }|j7                  d|        |j7                  d|        |j7                  dt8        j:                  j=                         d           |j7                  d|        |j7                  d|        |j7                  dt?                       |j7                  d|	        |j7                  d|
        |j7                  d |        |j7                  d       |j7                  d!       g d"}tA               }|D ]z  \  }}t#        jB                  |d      }|r|rtE        |      }n|rd#nd$}|r	||vr|d%z  }|s$|d&k(  r	 dd'l#m$}  |d&      jK                         rd(}|j7                  d)|d*d|        | |j7                  d       |j7                  d+       |j!                  d,d-g      }|j7                  d.|rd/jM                  |      nd	        |j7                  d0tO        |              |j7                  d1tQ        |              |j7                  d2tS                       tU               }|j7                  d3|rd/jM                  |      nd4        |j7                  d5tW        |              |j7                  d6tY        |              t[        |      }|rQ|j7                  d       |j7                  d7       |j]                         D ]  \  } }|j7                  d)|  d8|         |j7                  d9       d:jM                  |      }!t_        |!       y# t        $ r d}Y w xY w# t        $ r i }Y w xY w# t        $ r d	}Y zw xY w# t        $ r d}Y w xY w# t        $ r Y w xY w);z/Output a compact, copy-pasteable setup summary.	show_keysFz.env)r[   project_envr   )__version__r4   )get_active_profile_namez	(default)r   r   localTERMINAL_ENVrA   z7  (TERMINAL_ENV overrides config.yaml terminal.backend=rK   Nznot installed z--- hermes dump ---z []z (zversion:          zos:               zpython:           zopenai_sdk:       zprofile:          zhermes_home:      zmodel:            zprovider:         zterminal:         z	api_keys:))OPENROUTER_API_KEY
openrouter)OPENAI_API_KEYopenai)ANTHROPIC_API_KEY	anthropic)ANTHROPIC_TOKENanthropic_token)NOUS_API_KEYnous)GOOGLE_API_KEYzgoogle/gemini)GEMINI_API_KEYgemini)GLM_API_KEYzglm/zai)ZAI_API_KEYzai)KIMI_API_KEYkimi)MINIMAX_API_KEYminimax)DEEPSEEK_API_KEYdeepseek)DASHSCOPE_API_KEY	dashscope)HF_TOKENhuggingface)NVIDIA_API_KEYnvidia)OPENCODE_ZEN_API_KEYopencode_zen)OPENCODE_GO_API_KEYopencode_go)KILOCODE_API_KEYkilocode)FIRECRAWL_API_KEY	firecrawl)TAVILY_API_KEYtavily)BROWSERBASE_API_KEYbrowserbase)FAL_KEYfal)ELEVENLABS_API_KEY
elevenlabs)GITHUB_TOKENgithubr   znot setuE    (shell only — not in .env; managed/desktop backend may not see it)r   )	load_poolzset (auth pool)z  z<20z	features:r   z
hermes-cliz  toolsets:           z, z  mcp_servers:        z  memory_provider:    z  gateway:            z  platforms:          nonez  cron_jobs:          z  skills:             zconfig_overrides:z: z--- end dump ---
)0getattrr   r   parentr   r   
hermes_clir   ImportErrorr>   rB   r   r:   r   hermes_cli.profilesr   ri   r   environr   r   r7   r   rW   systemreleasemachineappendrV   versionsplitr	   r'   r   rF   agent.credential_poolr  has_credentialsjoinrj   r   rZ   r   r~   rd   r   r   print)"argsr   r   r(   r[   r   commitcommit_datere   r   r   r   profileterminal_cfgconfig_backendenv_backendr   r   
openai_veros_infolinesver_strapi_keysdotenv_keysenv_varlabelvalr   
_load_poolr   	platformsr   r   outputs"                                     r&   run_dumpr4    s"   k51I ~HOO$&/
 $%L!#K"* \*F&|4K .f5OE8?)+:{ ::j"-L!%%i9N::>>.17R>>@FFHK{c.&9&?&?&A&G&G&IIm   ./q2 	
 !%''

 "#1X%5%5%7$8(:J:J:L9MNGE	LL&'
 GF81~GR}A&&	LL%gY/0	LL%gY/0	LL%ckk&7&7&9!&<%=>?	LL%j\23	LL%gY/0	LL%&9&;%<=>	LL%eW-.	LL%hZ01	LL%gY/0 
LL	LLH6 $%K" 1ii$clG"e	G 7+-^^G u,Il+;;=/G 	r%AgY/0116 
LL	LLzz*|n5H	LL)$))H*={)[\]	LL)*<V*D)EFG	LL)*:6*B)CDE	LL)/*;)<=>%'I	LL))$))I*>QW)XYZ	LL)-*D)EFG	LL)-*D)EFG "&)IR()!) 	,HCLL2cU"SE*+	, 
LL#$YYuF	&Ms  "!"    4  %$
%`  sZ   S ,
S0 T 1T =T&S-,S-0S?>S?TTT#"T#&	T32T3)&__doc__rw   r   rW   r5   rV   pathlibr   r   r   r   r   r   hermes_cli.env_loaderr   hermes_constantsr	   agent.skill_utilsr
   r   r7   r'   r>   rB   rF   rZ   intrd   r   rj   r~   listr   r   tupler   r   r4   rG   r&   <module>r>     s!    	   
  Z Z 4 0 43s8 @"$ "3 "Jt  03 3 T T$
t 
 
t  !t ! !"DtCy D.0T 0c 0D U38_ 0d 0tCH~ 0firG   