
    `gji                     ^   d Z ddlZddlZddlZddlmZ  ee      j                  j                  j                         Z	ddl
mZmZ ddlmZmZ ddlmZmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddl m!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#fdZ)ddlm*Z+ d Z,y)zR
Status command for hermes CLI.

Shows the status of all Hermes Agent components.
    N)Path)	AuthErrorresolve_provider)Colorscolor)get_env_pathget_env_valueget_hermes_homeload_config)provider_label)&format_nous_portal_entitlement_messageget_nous_portal_account_info)get_nous_subscription_features)resolve_requested_provider)OPENROUTER_MODELS_URL)managed_nous_tools_enabledokreturnc                 n    | rt        dt        j                        S t        dt        j                        S )Nu   ✓u   ✗)r   r   GREENRED)r   s    D/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/status.py
check_markr      s'    	UFLL))

##    keyc                 R    ddl m}  || t        dt        j                              S )u1  Redact an API key for display.

    Thin wrapper over :func:`agent.redact.mask_secret`. Preserves the
    "(not set)" placeholder in dim color to match ``hermes config``'s
    output (previously this variant was missing the DIM color —
    consolidated via PR that also introduced ``mask_secret``).
    r   )mask_secret	(not set))empty)agent.redactr   r   r   DIM)r   r   s     r   
redact_keyr"       s     )s%VZZ"@AAr   c                 d   | rt        | t              syddlm}m} | j	                         }|sy|j                  d      r|dd dz   }	 |j                  |      }|j                  |j                  |j                        }|j                         j                  d	      S # t        $ r | cY S w xY w)
zFFormat ISO timestamps for status output, converting to local timezone.	(unknown)r   datetimetimezoneZNz+00:00)tzinfoz%Y-%m-%d %H:%M:%S %Z)
isinstancestrr&   r'   stripendswithfromisoformatr*   replaceutc	Exception
astimezonestrftime)valuer&   r'   textparseds        r   _format_iso_timestampr8   ,   s    
5#.+;;=D}}SCRy8#''-== ^^8<<^8F ''(>??  s   	9B! !B/.B/configc                    | j                  d      }t        |t              r7|j                  d      xs |j                  d      xs dj                         }n#t        |t              r|j                         }nd}|xs dS )z5Return the configured default model from config.yaml.modeldefaultname r   )getr+   dictr-   r,   )r9   	model_cfgr;   s      r   _configured_model_labelrB   ?   sj    

7#I)T"y)HY]]6-BHbOOQ	Is	#!Kr   c                  R   t               } 	 t        |       }|dk(  r^d}	 t               j	                  d      }t        |t              r#|j	                  d      xs dj                         }|st        d      rd}t        |      S # t        $ r	 | xs d}Y w xY w# t        $ r Y :w xY w)zBReturn the provider label matching current CLI runtime resolution.auto
openrouterr>   r;   base_urlOPENAI_BASE_URLcustom)r   r   r   r   r?   r+   r@   r-   r2   r	   r   )	requested	effectiveconfig_base_urlrA   s       r   _effective_provider_labelrL   K   s    *,I($Y/	 L  	#))'2I)T*#,==#<#B"I"I"K m,=> I)$$'  ('	(  		s#   B AB BB	B&%B&)	is_termuxc                 +   t        | dd      }t                t        t        dt        j                               t        t        dt        j                               t        t        dt        j                               t                t        t        dt        j                  t        j
                               t        dt                t        dt        j                  j                         d	           t               }t        d
t        |j                                d|j                         rdnd        	 t               }t        dt        |              t        dt!                       t                t        t        dt        j                  t        j
                               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/d0d1d2d3d4d5d6}d7t"        fd8}|j%                         D ]G  \  }}|dk(  r ||      }t'        |      }	t)        |      }
t        d9|d:d9t        |	       d|
        I d	d;lm}  |       }t)        |      }t        d9dd:d9t        t'        |             d|        t                t        t        d<t        j                  t        j
                               	 d	d=lm}m}m}m}  |       } |       } |       } |       }d>}|j7                  d?      sD|j7                  d@      s3|j7                  dA      s"|j7                  dB      s|j7                  dC      r	 t9               }t'        |j7                  d?      xs |xr |j:                        }t'        |j7                  dB      xs |xr |j<                        }|j7                  dD      }|rdE}n|rdF}ndG}t        d9dHd:d9t        |       d|        |j7                  dA      xs dI}|j7                  dJ      xs |r|j>                  nd>}tA        |j7                  dK            }tA        |j7                  dL            }|j7                  dM      rdNndO}|s|dIk7  s|rt        dP|        |r|rt        dQ|        |s|j7                  dK      rt        dR|        |s|s|j7                  dL      rt        dS|        |s|j7                  dM      rt        dT|        |rt        dU|        t'        |j7                  d?            } t        d9dVd:d9t        |        d| rdEndW        |j7                  dX      }!|!rt        dY|!        tA        |j7                  dZ            }"|j7                  dZ      rt        d[|"        |j7                  dD      r| st        dU|j7                  dD              t'        |j7                  d?            }#t        d9d\d:d9t        |#       d|#rdEnd]        |j7                  d^      }$|$rt        dY|$        |j7                  d_      }%|%rKd	d`l!m!}&m"}' t        dR|&jG                  tI        |%      daz  |'jJ                  b      jM                                 |j7                  dD      r|#st        dU|j7                  dD              t'        |j7                  d?            }(t        d9dcd:d9t        |(       d|(rdEndd        |j7                  de      })|(r|)rt        df|)        |j7                  dg      }*|*rt        dR|*        |j7                  dD      r|(st        dU|j7                  dD              	 d	dhlm'}+  |+       xs i },t'        |,j7                  d?            }-t        d9did:d9t        |-       d|-rdEndj        |,j7                  dX      }.|.rt        dY|.        |,j7                  dZ      r&t        d[tA        |,j7                  dZ                    |,j7                  dD      r|-st        dU|,j7                  dD              tQ               r:tS        |      }/t                t        t        dkt        j                  t        j
                               |/jT                  st        dl       nt        dm       |/j%                         D ]  }0|0jV                  rdn}1n]|0jX                  r|0jZ                  xs do}2dp|2 }1n;|0j\                  r|/jT                  rdq}1n |0j^                  drk(  r|/jT                  rds}1ndt}1t        d9|0j`                  dudt        |0jb                  xs |0jX                  xs |0jV                         d|1         nr|s|rnt                t        t        dkt        j                  t        j
                               te        |dvw      }3|3r#|3jg                         D ]  }4t        d9|4         t                t        t        dxt        j                  t        j
                               dydzd{d|d}d~d}5|5j%                         D ]P  \  }6}7d}8|7D ]  }9ti        |9      xs d}8|8s n t'        |8      }:|:rdnd};t        d9|6ddt        |:       d|;        R t!               dk(  rd	dl5m6}< |j7                  d      }=to        |=tp              r|=j7                  d      nd>xs ti        d      xs d}>	  |<ti        d      xs d|>d      }?|?dd|> }A}@nddts        |?       d|> }A}@t        d9dddt        @       dA        t                t        t        dt        j                  t        j
                               to        |j7                  d      tp              r|j7                  di       ni }Btw        jx                  dd      }C|CsBj7                  dd      }Ct        dC        |Cdk(  rQtw        jx                  dd      }Dtw        jx                  dd      }Et        d|Dxs d        t        dExs d        nSCdk(  r%tw        jx                  dd      }Ft        d|F        n)Cdk(  r$tw        jx                  dd      }Gt        d|G        tw        jx                  dd      }Ht        dt        t'        |H             d|Hrdnd        t                t        t        dt        j                  t        j
                               dddddddddddddddd}I|Ij%                         D ]  \  }\  }J}Ktw        jx                  |Jd      }Lt'        |L      }Md}N|Krtw        jx                  Kd      }NNsKdk(  rtw        jx                  dd      }NMrdndt}ONr	OdN dz  }Ot        d9|d:d9t        M       dO         	 d	dl=m>}P |Pj                         D ]C  }Q|Qj                         }:|:rdndt}RQj`                  };t        d9|;d:d9t        |:       d|R d       E 	 t                t        t        dt        j                  t        j
                               	 d	dlAmB}SmC}T  |S       }U|Uj                  }Vt        dt        |V       d|Vrdndś        t        dUj                          |Uj                  rt        d TUj                                Uj                  rt        dȫ       nPt               r#Uj                  st        dɫ       t        dʫ       n#Uj                  rUj                  st        d˫       t                t        t        dt        j                  t        j
                               t               dz  dz  }W|Wj                         rd	d>lO}X	 t        Wd׬ث      5 }YXj                  |Y      }Z|Zj7                  dg       }[|[D \cg c]  }\|\j7                  dd      s\ }]}\t        dts        |]       dts        [       dܝ       d>d>d>       nt        dޫ       t                t        t        dt        j                  t        j
                               d>}^	 d	dlRmS}_  |_       }`	 t        `dd>      }at        |a      rts         ad            }^`j                          	 ^^d	kD  rt        d^ d       nt               dz  dz  }b|bj                         rd	d>lO}X	 t        bdث      5 }YXj                  |Y      }Zto        |Ztp              r>Zj%                         D cdci c]"  \  }c}dt#        |c      j                  d      scd$ c}d}cni }et        dts        |e       d       d>d>d>       nt        d^^nd	        |r%t                t        t        dt        j                  t        j
                               tw        jx                  dd      }f|fr]	 d	d>lV}g|gj7                  t        ddf id      }h|hj                  dk(  }@t        dt        |@       d|@rdndhj                   d        	 d	d>lY}j|jj                  |jj                  |jj                        }k|kj                  d       |kj                  d      }l|kj                          |ld	k(  }mt        d|mrdnd        t                t        t        dt        j                               t        t        dt        j                               t        t        dt        j                               t                y># t        $ r i }Y w xY w# t        $ r i }i }i }i }Y ow xY w# t        $ r d>}Y w xY w# t        $ r i },Y w xY w# tt        $ r	 d\  }@}AY pw xY w# t        $ r Y w xY w# t        $ r t               r2t        dt        dt        j                                t        dͫ       nt        j                  j                  dΫ      r2t        dt        dt        j                                t        dϫ       nvt        j                  dk(  r2t        dt        dt        j                                t        dѫ       n1t        dt        dt        j                                t        dӫ       Y {w xY wc c}\w # 1 sw Y   xY w# t        $ r t        dݫ       Y w xY w# `j                          w xY w# t        $ r d>}^Y [w xY wc c}d}cw # 1 sw Y   xY w# t        $ r t        d       Y w xY w# t        $ r%}it        dt        d       di        Y d>}i~i$d>}i~iww xY w# t        $ r Y w xY w)z+Show status of all Hermes Agent components.deepFu   ┌─────────────────────────────────────────────────────────┐u@   │                 ⚕ Hermes Agent Status                  │u   └─────────────────────────────────────────────────────────┘u   ◆ Environmentz  Project:      z  Python:       r   z  .env file:     existsz	not foundz  Model:        z  Provider:     u   ◆ API Keys
OpenRouterOPENROUTER_API_KEYOpenAIOPENAI_API_KEY	Anthropic)ANTHROPIC_API_KEYANTHROPIC_TOKENzGoogle / Gemini)GOOGLE_API_KEYGEMINI_API_KEYDeepSeekDEEPSEEK_API_KEYz
xAI / GrokXAI_API_KEYz
NVIDIA NIMNVIDIA_API_KEY
Z.AI / GLMGLM_API_KEYKimiKIMI_API_KEYStepFun Step PlanSTEPFUN_API_KEYMiniMaxMINIMAX_API_KEYz
MiniMax-CNMINIMAX_CN_API_KEY	DeepInfraDEEPINFRA_API_KEY	FirecrawlFIRECRAWL_API_KEYTavilyTAVILY_API_KEYzBrowser UseBROWSER_USE_API_KEYBrowserbaseBROWSERBASE_API_KEYFAL_KEYELEVENLABS_API_KEYGITHUB_TOKEN)FAL
ElevenLabsGitHubr   c                 z    t        | t              r| D ]  }t        |      xs d}|s|c S  yt        |       xs dS )zBReturn first non-empty env var value from a str or tuple of names.r>   )r+   tupler	   )env_ref	candidatevs      r   _resolve_envz!show_status.<locals>._resolve_env   sG    gu%$ 	!),2H W%++r   z  z<12)get_anthropic_keyu   ◆ Auth Providers)get_nous_auth_statusget_codex_auth_statusget_qwen_auth_statusget_minimax_oauth_auth_statusN	logged_inaccess_tokenportal_base_urlinference_credential_present
error_codeerrorz	logged inz-not logged in (Nous inference key configured)z"not logged in (run: hermes portal)zNous Portalr$   inference_base_urlaccess_expires_atagent_key_expires_athas_refresh_tokenyesnoz    Portal URL: z    Inference:  z    Access exp: z    Key exp:    z    Refresh:    z    Error:      zOpenAI Codexz!not logged in (run: hermes model)
auth_storez    Auth file:  last_refreshz    Refreshed:  z
Qwen OAuthz)not logged in (run: qwen auth qwen-oauth)	auth_fileexpires_at_msr%   i  )tzzMiniMax OAuthz2not logged in (run: hermes auth add minimax-oauth)regionz    Region:     
expires_at)get_xai_oauth_auth_statusz	xAI OAuthz.not logged in (run: hermes auth add xai-oauth)u   ◆ Nous Tool Gatewayu!     Nous Portal   ✗ not logged inu+     Nous Portal   ✓ managed tools availablezactive via Nous subscriptionzconfigured providerzactive via z0included by subscription, not currently selectedmodalz%available via subscription (optional)znot configuredz<15z6managed web, image, TTS, STT, browser, and Modal tools)
capabilityu   ◆ API-Key Providers)r`   ZAI_API_KEYZ_AI_API_KEY)rb   )rd   )rf   )rg   )ri   )r_   zKimi / Moonshotrc   re   zMiniMax (China)rh   r>   
configuredz"not configured (run: hermes model)z<16z	LM Studio)probe_lmstudio_modelsr;   rF   LM_BASE_URLzhttp://127.0.0.1:1234/v1
LM_API_KEYg      ?)api_keyrF   timeoutzunreachable at Tzreachable (z model(s)) at )Fu    auth rejected — set LM_API_KEYu   ◆ Terminal BackendterminalTERMINAL_ENVbackendlocalz  Backend:      sshTERMINAL_SSH_HOSTTERMINAL_SSH_USERz  SSH Host:     r   z  SSH User:     dockerTERMINAL_DOCKER_IMAGEzpython:3.11-slimz  Docker Image: daytonaTERMINAL_DAYTONA_IMAGEz*nikolaik/python-nodejs:python3.11-nodejs20z  Daytona Image: SUDO_PASSWORDz  Sudo:         enableddisabledu   ◆ Messaging Platforms)TELEGRAM_BOT_TOKENTELEGRAM_HOME_CHANNEL)DISCORD_BOT_TOKENDISCORD_HOME_CHANNEL)WHATSAPP_ENABLEDN)SIGNAL_HTTP_URLSIGNAL_HOME_CHANNEL)SLACK_BOT_TOKENN)EMAIL_ADDRESSEMAIL_HOME_ADDRESS)TWILIO_ACCOUNT_SIDSMS_HOME_CHANNEL)DINGTALK_CLIENT_IDN)FEISHU_APP_IDFEISHU_HOME_CHANNEL)WECOM_BOT_IDWECOM_HOME_CHANNEL)WECOM_CALLBACK_CORP_IDN)WEIXIN_ACCOUNT_IDWEIXIN_HOME_CHANNEL)BLUEBUBBLES_SERVER_URLBLUEBUBBLES_HOME_CHANNEL)	QQ_APP_IDQQ_HOME_CHANNEL)YUANBAO_APP_IDYUANBAO_HOME_CHANNEL)TelegramDiscordWhatsAppSignalSlackEmailSMSDingTalkFeishuWeComzWeCom CallbackWeixinBlueBubblesQQBotYuanbaoQQBOT_HOME_CHANNELr   z (home: ))platform_registryz	 (plugin)u   ◆ Gateway Service)get_gateway_runtime_snapshot_format_gateway_pidsz  Status:       runningstoppedz  Manager:      z  PID(s):       zF  Service:      installed but not managing the current running gatewayz  Start with:   hermes gatewayzI  Note:         Android may stop background jobs when Termux is suspendedz%  Service:      installed but stoppedunknownz'  Manager:      Termux / manual processlinuxz  Manager:      systemd/manualdarwinz  Manager:      launchdzN/Az0  Manager:      (not supported on this platform)u   ◆ Scheduled Jobscronz	jobs.jsonz	utf-8-sig)encodingjobsz  Jobs:         z	 active, z totalz)  Jobs:         (error reading jobs file)z  Jobs:         0u   ◆ Sessions)	SessionDBlist_gateway_sessions)active_onlyz  Active:       z session(s)sessionszsessions.jsonzutf-8_z-  Active:       (error reading sessions file)u   ◆ Deep ChecksAuthorizationzBearer 
   )headersr      z  OpenRouter:   	reachablezerror (z error:    )z	127.0.0.1ieI  z  Port 18789:   zin use	availableu   ────────────────────────────────────────────────────────────z.  Run 'hermes doctor' for detailed diagnosticsz!  Run 'hermes setup' to configure)_getattrprintr   r   CYANBOLDPROJECT_ROOTsysversionsplitr   r   rQ   r   r2   rB   rL   r,   itemsboolr"   hermes_cli.authr}   r~   r   r   r   r?   r   r   r   r   r8   r&   r'   fromtimestampintr1   	isoformatr   r   r   nous_auth_presentmanaged_by_nousactivecurrent_providerincluded_by_defaultr   labelr   r   
splitlinesr	   hermes_cli.modelsr   r+   r@   lenr   osgetenvgateway.platform_registryr   plugin_entriescheck_fnhermes_cli.gatewayr   r   r   managergateway_pidshas_process_service_mismatch
_is_termuxservice_installedservice_runningr!   platform
startswithr
   jsonopenloadhermes_stater   callableclosehttpxr   status_codesocketAF_INETSOCK_STREAM
settimeout
connect_exOSError)nargsrO   env_pathr9   keysr|   r=   ry   r5   has_keydisplayr}   anthropic_valueanthropic_displayr~   r   r   r   nous_statuscodex_statusqwen_statusminimax_statusnous_account_infonous_logged_innous_inference_present
nous_error
nous_label
portal_urlinference_url
access_expkey_exprefresh_labelcodex_logged_incodex_auth_filecodex_last_refreshqwen_logged_inqwen_auth_fileqwen_expr&   r'   minimax_logged_inminimax_regionminimax_expr   xai_oauth_statusxai_oauth_logged_inxai_auth_filefeaturesfeaturestatecurrentmessagelineapikey_providerspnameenv_varskey_valevr   r  r   rA   basemodelsr   msgterminal_cfgterminal_envssh_hostssh_userdocker_imagedaytona_imagesudo_password	platforms	token_varhome_vartoken	has_tokenhome_channelstatusr   entry
status_strr   r   snapshot
is_running	jobs_filer  fdatar   jenabled_jobs_session_countr   _db_listersessions_filekr{   _entriesopenrouter_keyr  responseer  sockresultport_in_usesn                                                                                                                 r   show_statusrt  i   s!   4'D	G	%  D  FL  FQ  FQ  R  S	%RTZT_T_
`a	%  D  FL  FQ  FQ  R  S
 
G	%!6;;
<=	\N
+,	S[[..034
56~H	Z(9:;1IZX`k<l
mn 
4V<=
>?	689
:;
 
G	%V[[
9:.*.". 	=. 	?	.
 	&. 	m. 	&. 	m. 	. 	.. 	$. 	*. 	(. 	(. 	".  	,!." 	,#.$ * ).D., ,  	@g ;W%u+U#4*Bz'231WI>?	@ 2')O"?3	B{3r*T/-B"C!DAFWEX
YZ
 
G	%$fkk6;;
?@	
 	
 +,,.*,68 $??>*??,-??9:??<(	% < > $ 	?="3"="=N "67 	RP"3"P"P )J 
	D
9
	
]3r*^"<!=Q,	 !23B{J,- 	Q4E004  '{7J'KLJ#KOO4J$KLG(__-@AEtM{2j -.- 01)<= -./;??CY3Z 	*+)<= 01 -.<++K89O	
^C :o#>"?q);/R
S	U #&&|4O  123.|/?/?/OP' !3 456  !1!1'!: ;<=+//+67N	
\#bN!; <A(;.Y
Z	\ !__[1N  012/H/ !7!7H8LQYQ]Q]!7!^!h!h!j klmw !9 :;<^//<=	
_S!J/@$A#B!+;1e
f	h $''1N^  012 $$\2K ./'"+< !3!3G!< =>?=46<" /33K@A	
[R
+> ?@-;3c
d	f %((6M 01N+ !67G7K7KN7[!\ ]^_G$-@ !1!5!5g!> ?@A
 "#1&9e+V[[&++FG))56?@~~' 	AG&&6!22K6K%gY/,,1K1KJ'H,F,F?(Bw}}S):g6G6G6t7>>6t]d]t]t+u*vvwx}w~  A	A 
1 	e+V[[&++FG8O
 **, #4&k"# 
G	%'fkk
BC K-1032 ,113 Ax 	B#B'-2G	 ']
 *0T5+Qz*56aw?@A !"k1;JJw'	-7	4-H	j)d  RWderWs  R  xR	@*=3N3TRT_cmpqF~?4&!9C+c&k]. OC 	;s#1Z^$4AcU;<
 
G	%&V[[
AB1;FJJz<RTX1Y6::j"-_aL99^R0L#''	7;	\N
+,u990"5990"5 !8[ 9:; !8[ 9:;		!yy!8:LM /0		"		":<hi!-12IIor2M	Z](;<=QMy_i>j
kl
 
G	%)6;;
DE D@.<*890:7:>M1=I$ (1'8 A##y(		)R(K	99Xr2L,@ @99%6;L!*0@a00F4*Bz)45Qvh?@A$?&557 	TE)J)39IJKKEBuSkJz$:#;1ZL	RS		T 
G	%%v{{FKK
@AFY/1%%
 J!7 8z)W`9abc !1!1 234  $%9(:O:O%P$QRS00Z[\("7"723]^''0H0H9:$ 
G	%$fkk6;;
?@!F*[8I		? i+6 X!yy|xx++/Ja155D3IJJ(\):(;9SYKvVW	X 	!"
 
G	%V[[
9: N
*k	c#:DAG !$W%>!?IIK !nq&8  0<=')J6H!	G-': Ia99Q<D $D$/ *. !%A"1v005 1  68  ,S]O;GHI $~7Q^WX$YZ[
 e%v{{FKK@A #7<
I 99),7G.HI % 
 ))S0(B(8+SZ[c[o[oZppqQr9stu
	==1C1CDDOOA__%9:FJJL A+K$X+$NOP 
G	%
FJJ
'(	%@&**
MN	%3VZZ
@A	Gc  ^  	   	% $	%v  t  	@?GB	@`  2  F<$U9fjj%A$BCD;<\\$$W-$U9fjj%A$BCD23\\X%$U9fjj%A$BCD+,$U5&**%=$>?@DEF:  KX X
  	?=>	?, IIK  I I  GEFG0  I(E):(;8A3GHHI  		s  
AM  (AM 
AM* -AM< :5AN AAN# %C#AN3 )AS 6(ASAS6AS:&AS@ AS A3AT	 B*AS4 B+AT	 C8AT. D5AT!D:'ATE!AT!E?AT. G2AAU	 IA3AU: M AMMAMMAM'M&AM'M*AM9M8AM9M<ANN
ANNAN NAN N#	AN0N/AN0N3DASSASSASSASSAS SAS1S0AS1S4ATTAT	 T	ATTATTAT!T!AT+T&AT. T.AUUAUU		AU7UAU2U2AU7U:	AVVAV)-__doc__r  r   
subprocesspathlibr   __file__parentresolver   r   r   r   hermes_cli.colorsr   r   hermes_cli.configr   r	   r
   r   r  r   hermes_cli.nous_accountr   r   hermes_cli.nous_subscriptionr   hermes_cli.runtime_providerr   hermes_constantsr   tools.tool_backend_helpersr   r   r,   r   r"   r8   r@   rB   rL   rM   r  rt   r   r   <module>r     s    
 
  H~$$++335 7 + W W , H B 2 A$4 $C $
	BC 	BC 	B@C @&	 D 	 S 	 %3 %6 5Gr   