+
    ri                    6   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHt ^ RIHt ^ RIHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtH t H!t!H"t"H#t#H$t$H%t%H&t&H't' ^ RI(H)t)H*t*H+t+H,t,H-t-H.t.H/t/ ^ RI0H1t1H2t2H3t3H4t4H5t5H6t6H7t7H8t8H9t9H:t:H;t;H<t< ^ RI=H>t>H?t?H@t@HAtAHBtBHCtCHDtD ^ R	IEHFtF ^ R
IGHHtHHItIHJtJHKtK  ^ RILHMtMHNtNHOtOHPtPHQtQHRtRHStSHTtTHUtUHVtV RtZR R lt[R R lt\R t]R t^R t_R t`R taR tbR tcR tdR  teR! tfR" tgR# thRAR$ ltiR% tjR& tkR' tlR( tmR) tnR* toR+ tpR, tqR- trR. tsR/ ttR0 tuR1 tvR2 twR3 txR4 tyR5 tzR6 t{R7 t|R8 t}R9 t~R: tR; tR< R= ltR> tR? R@ ltR#   ]W d3    R tMR tNR tOR tPR tQR tRR tS/ tT]P                  ! 4       tU]Y! 4       tV Li ; i)Bz
Hermes Web UI -- Route handlers for GET and POST endpoints.
Extracted from server.py (Sprint 11) so server.py is a thin shell.
N)Path)parse_qs)parse_reasoning_effort)	STATE_DIRSESSION_DIRDEFAULT_WORKSPACEDEFAULT_MODELSESSIONSSESSIONS_MAXLOCKSTREAMSSTREAMS_LOCKCANCEL_FLAGSSERVER_START_TIMECLI_TOOLSETS_INDEX_HTML_PATHget_available_modelsclamp_reasoning_effort
IMAGE_EXTSMD_EXTSMIME_MAPMAX_FILE_BYTESMAX_UPLOAD_BYTES	CHAT_LOCKload_settingssave_settings)requirebadsafe_resolvejt	read_body_security_headers)Sessionget_sessionnew_sessionall_sessions
title_from_write_session_indexSESSION_INDEX_FILEload_projectssave_projectsimport_cli_sessionget_cli_sessionsget_cli_session_messages)load_workspacessave_workspacesget_last_workspaceset_last_workspacelist_dirread_file_contentsafe_resolve_ws)handle_upload)_sse_run_agent_streamingcancel_stream_ensure_final_response_message)
has_pendingpop_pendingsubmit_pendingapprove_sessionapprove_permanentsave_permanent_allowlistis_approved_pending_lock_permanent_approvedc                      R # F aks   *,'/home/ubuntu/hermes-webui/api/routes.py<lambda>rL   /   s    %    c                      R # NrG   rH   s   *,rK   rL   rL   0       $rM   c                      R # rO   rG   rH   s   *,rK   rL   rL   1   s    TrM   c                      R # rO   rG   rH   s   *,rK   rL   rL   2   s    drM   c                      R # rO   rG   rH   s   *,rK   rL   rL   3   s    rM   c                      R # rO   rG   rH   s   *,rK   rL   rL   4   s    trM   c                      R # )TrG   rH   s   *,rK   rL   rL   5   rP   rM   u
  <!doctype html>
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>{{BOT_NAME}} — Sign in</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{background:#1a1a2e;color:#e8e8f0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
  height:100vh;display:flex;align-items:center;justify-content:center}
.card{background:#16213e;border:1px solid rgba(255,255,255,.08);border-radius:16px;padding:36px 32px;
  width:320px;text-align:center;box-shadow:0 8px 32px rgba(0,0,0,.3)}
.logo{width:48px;height:48px;border-radius:12px;background:linear-gradient(145deg,#e8a030,#e94560);
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:20px;color:#fff;
  margin:0 auto 12px;box-shadow:0 2px 12px rgba(233,69,96,.3)}
h1{font-size:18px;font-weight:600;margin-bottom:4px}
.sub{font-size:12px;color:#8888aa;margin-bottom:24px}
input{width:100%;padding:10px 14px;border-radius:10px;border:1px solid rgba(255,255,255,.1);
  background:rgba(255,255,255,.04);color:#e8e8f0;font-size:14px;outline:none;margin-bottom:14px;
  transition:border-color .15s}
input:focus{border-color:rgba(124,185,255,.5);box-shadow:0 0 0 3px rgba(124,185,255,.1)}
button{width:100%;padding:10px;border-radius:10px;border:none;background:rgba(124,185,255,.15);
  border:1px solid rgba(124,185,255,.3);color:#7cb9ff;font-size:14px;font-weight:600;cursor:pointer;
  transition:all .15s}
button:hover{background:rgba(124,185,255,.25)}
.err{color:#e94560;font-size:12px;margin-top:10px;display:none}
</style></head><body>
<div class="card">
  <div class="logo">{{BOT_NAME_INITIAL}}</div>
  <h1>{{BOT_NAME}}</h1>
  <p class="sub">Enter your password to continue</p>
  <form onsubmit="doLogin(event);return false">
    <input type="password" id="pw" placeholder="Password" autofocus
           onkeydown="if(event.key==='Enter'){doLogin(event);event.preventDefault();}">
    <button type="submit">Sign in</button>
  </form>
  <div class="err" id="err"></div>
</div>
<script>
async function doLogin(e){
  e.preventDefault();
  const pw=document.getElementById('pw').value;
  const err=document.getElementById('err');
  err.style.display='none';
  try{
    const res=await fetch('/api/auth/login',{method:'POST',
      headers:{'Content-Type':'application/json'},
      body:JSON.stringify({password:pw}),credentials:'include'});
    const data=await res.json();
    if(res.ok&&data.ok){window.location.href='/';}
    else{err.textContent=data.error||'Invalid password';err.style.display='block';}
  }catch(ex){err.textContent='Connection failed';err.style.display='block';}
}
</script></body></html>c                $    V ^8  d   QhR\         /#    returnbool)formats   "rK   __annotate__r]   r   s     x x4 xrM   c                P   VP                   R9   d$   \        V \        P                  ! RR7      RR7      # VP                   R8X  d   \        P
                  ! \        4       P                  R4      ;'       g    R4      p\        P                  RV4      P                  R	V^ ,          P                  4       4      p\        WRR7      # VP                   R
8X  dR   ^ RIHpHpHp RpV! 4       '       d$   V! V 4      p\        T;'       d	    V! V4      4      p\!        V RV! 4       RV/4      # VP                   R8X  d$   V P#                  ^4       V P%                  4        R# VP                   R8X  dp   \&        ;_uu_ 4        \)        \*        4      p	RRR4       \!        V RRR\)        \,        4      RX	R\/        \0        P0                  ! 4       \2        ,
          ^4      /4      # VP                   R8X  d   \!        V \5        4       4      # VP                   R8X  d(   \        4       p
V
P7                  RR4       \!        W
4      # VP                   P9                  R4      '       d   \;        W4      # VP                   R8X  d   \=        VP>                  4      P                  RR.4      ^ ,          pV'       g   \!        V RR /R!R"7      #  \A        V4      p\!        V R#VPC                  4       R$VPD                  R%\G        VR%. 4      /,          /4      # VP                   R58X  d   \Q        4       p\        4       p
V
P                  R64      '       dC   \M        4       pV Uu0 uF  qR,          kK  	  ppV Uu. uF  qR,          V9  g   K  VNK  	  ppM. pVV,           pVPS                  R7 RR87       \!        V RVR9\)        V4      /4      # VP                   R:8X  d   \!        V R;\U        4       /4      # VP                   R<8X  d   \W        W4      # VP                   R=8X  d!   \!        V R>\Y        4       R?\[        4       /4      # VP                   R@8X  d   \]        W4      # VP                   RA8X  d   \_        W4      # VP                   RB8X  d   ^ RCI0H1p V! 4        ^ RDI0H2p V! 4       pVP                  RE/ 4      pVP                  RF/ 4      p. p\g        V\h        4      '       d   VPk                  4        F~  w  ppRp\g        V\h        4      '       d   VP                  RGR4      pM8\g        V\l        4      '       d#   VRH,          \)        V4      ^P8  d   RIMR,           pVPo                  RJVRGV/4       K  	  \!        V RFV/4      # VP                   RK8X  d   \=        VP>                  4      pVP                  RR.4      ^ ,          pV'       g   \O        V RL4      #  \A        V4      p^ RMI8H9p  T ! \u        TPv                  4      4      p!\!        T RNT!/4      # VP                   RO8X  d   \        4       p
V
P                  RPR4      '       g   \!        V RQR/4      # \=        VP>                  4      pVP                  RRRS.4      ^ ,          RT8H  p"VP                  RURS.4      ^ ,          RT8X  d?   V Px                  ^ ,          RV8X  d'   \!        V RWRJRWRX^RYRZR[R\R]R^/RERJRERX^RYR_R[R`R]R^/Ra^ /4      # ^ RbI=H>p# \!        V V#! V"Rc7      4      # VP                   Rd8X  dE   \=        VP>                  4      P                  ReR.4      ^ ,          p$\!        V RfV$\*        9   ReV$/4      # VP                   Rg8X  d_   \=        VP>                  4      P                  ReR.4      ^ ,          p$V$'       g   \O        V Rh4      # \        V$4      p%\!        V RRRiV%ReV$/4      # VP                   Rj8X  d   \        W4      # VP                   Rk8X  d   \        W4      # VP                   Rl8X  d   \        W4      # VP                   Rm8X  d   \        W4      # VP                   Rn8X  d4   V Px                  ^ ,          RV8w  d   \!        V RRo/R4R"7      # \        W4      # VP                   Rp8X  d   ^ RqIEHFp& \!        V RrV&! RRs7      /4      # VP                   Rt8X  d   \        W4      # VP                   Ru8X  d   \        W4      # VP                   Rv8X  dZ   ^ RwIIHJp' V'! 4       p(\g        V(\l        4      '       d   \        P                  ! V(4      MT(p)\!        V RxV)P                  Rx. 4      /4      # VP                   Ry8X  Ed   ^ RzIIHMp*HNp+ \=        VP>                  4      pVP                  RJR.4      ^ ,          pV'       g   \!        V RR{/R!R"7      # VP                  R|R.4      ^ ,          p,V,'       Ed   ^ RIOp-V-P                  R}V4      '       d   \O        V R~R!4      # Rp.V+P                  V4       F  p/V/P                  4       '       g   K  T/p. M	  V.'       g   \O        V RR44      # V.V,,          P                  4       p0V0P                  V.P                  4       4       T0P                  4       '       d   T0P                  4       '       g   \O        T RR44      # \!        T RT0P                  RR7      RT,/4      # V*! V4      p(\g        V(\l        4      '       d   \        P                  ! V(4      MT(p)RV)9  d   / V)R&   \!        V V)4      # VP                   R8X  d   \        V 4      # VP                   R8X  d#   ^ RIYHZp1H[p2 \!        V RV1! 4       RfV2! 4       /4      # VP                   R8X  d,   ^ RIYH[p2H\p3 \!        V RJV2! 4       R\m        V3! 4       4      /4      # VP                   R8X  d   \        V 4      # R#   + '       g   i     E
L$; i  \H         Ed    \K        T4      pT'       d   Rp\M        4        F  pTR,          T8X  g   K  Tp M	  RTR&T;'       g    / P                  R&R'4      R(T;'       g    / P                  R(R4      R)T;'       g    / P                  R)R*4      R+\)        T4      R,T;'       g    / P                  R,^ 4      R-T;'       g    / P                  R-^ 4      R.RR/RR0RR1T;'       g    / P                  R14      R2RR$TR%. /p\!        T R#T/4      u # \O        T R3R44      u # i ; iu upi u upi   \H         d    \O        T R3R44      u # i ; i  \         d    \O        T RR!4      u # i ; i)z>Handle all GET routes. Returns True if handled, False for 404.utf-8encodingztext/html; charset=utf-8)content_typez/loginbot_nameHermesz{{BOT_NAME}}z{{BOT_NAME_INITIAL}}z/api/auth/status)is_auth_enabledparse_cookieverify_sessionFauth_enabled	logged_inz/favicon.icoTz/healthNstatusoksessionsactive_streamsuptime_secondsz/api/models/api/settingspassword_hash/static/z/api/session
session_id errorsession_id is required  rj   sessionmessages
tool_callstitleCLI Session	workspacemodelunknownmessage_count
created_at
updated_atpinnedarchived
project_idprofileis_cli_sessionSession not found  z/api/sessionsshow_cli_sessionsc                 :    V P                  R ^ 4      ;'       g    ^ # )r   )get)ss   &rK   rL   handle_get.<locals>.<lambda>   s    !%%a"8"="=A"=rM   )keyreverse	cli_countz/api/projectsprojectsz/api/session/exportz/api/workspaces
workspaceslastz/api/sessions/searchz	/api/listz/api/personalitiesreload_config
get_configagentpersonalitiesdescriptionNP   N...namez/api/git-infosession_id required)git_info_for_workspacegitz/api/updates/checkcheck_for_updatesdisabledforce01simulatez	127.0.0.1webuibehindcurrent_shaabc1234
latest_shadef5678branchmasteraaa0001bbb0002
checked_at)r   )r   z/api/chat/stream/status	stream_idactivez/api/chat/cancelzstream_id required	cancelledz/api/chat/streamz/api/file/rawz	/api/filez/api/approval/pendingz/api/approval/inject_test	not foundz
/api/crons	list_jobsjobsinclude_disabledz/api/crons/outputz/api/crons/recentz/api/skills)skills_listskillsz/api/skills/content)
skill_view
SKILLS_DIRname requiredfilez[*?\[\]]Invalid skill nameSkill not foundzInvalid file pathFile not foundcontentpathlinked_filesz/api/memoryz/api/profiles)list_profiles_apiget_active_profile_nameprofilesz/api/profile/active)r   get_active_hermes_home/api/profile/config)/z/index.html)^r   r    r   	read_text_htmlescaper   r   _LOGIN_PAGE_HTMLreplaceupperapi.authre   rf   rg   r[   r   send_responseend_headersr   lenr   r	   roundtimer   r   pop
startswith_serve_staticr   queryr$   compactry   getattrKeyErrorr.   r-   r   r&   sortr*   _handle_session_exportr/   r1   _handle_sessions_search_handle_list_dir
api.configr   r   
isinstancedictitemsstrappendapi.workspacer   r   r}   client_addressapi.updatesr   r9   _handle_sse_stream_handle_file_raw_handle_file_read_handle_approval_pending_handle_approval_inject	cron.jobsr   _handle_cron_output_handle_cron_recenttools.skills_toolr   jsonloadsr   r   researchrglobis_dirresolverelative_to
ValueErrorexistsis_file_handle_memory_readapi.profilesr   r   r   _handle_profile_config_read)4handlerparsed_bn_pagere   rf   rg   ri   cv	n_streamssettingssidr   msgscli_metacssesswebui_sessionscli	webui_idsdeduped_climerged_reload_cfg_get_cfg_cfg	agent_cfgraw_personalitiesr   r   valuedescqsr   infor   r   r   r   r   _skills_listrawdata_skill_viewr   	file_path_re	skill_dirptargetr   r   r   s4   &&                                                  rK   
handle_getr)  r   s    {{***44gF8: 	: {{hll=?..z:FFhG ((=EEF\^abc^d^j^j^lm.HII{{((JJ	g&BR66N2$67I>?+<k9UVV{{n$c"G$7$7$9${{i\s7|9\dJHieDIIK2C$CQG
  	 {{m#.011{{o% ?_d+##{{j))W--{{n$v||$((t<Q?Ww(@A#NN 	:C AWy!))+AJJgar:9 +   @ {{o%% ?<<+,,"$C2@A.Q<.IA&)Nc|_I-M11cKNKK+-=tL:v{C<LMNN{{o%:}788{{++%g66{{''<):FDVDXYZZ{{,,&w77{{k!00{{** 	<5zHHWb)	%MM/2>'..0668eeT** 99]B7Ds++ :#e*r/rJD$$fdM4%HI  9 ?M:;;{{o%fll#ff\B4(+w 566	:C A 	9%d1;;&785$-(({{** ?||/66Wz4011fll#w&q)S066*se$Q'3.73I3I!3LP[3[W&'8QyR^`iksu}~&'8QyR^`iksu}~a  
 	2+%899{{//V\\*..{RDA!D	8Y'%9;	RSS{{((V\\*..{RDA!D	w 455!),	4{I{IVWW{{((!'22{{o%00{{k! 11{{--'88{{11!!!$3Ww4SAA&w77 {{l"'69d#CDEE{{))"733{{))"733 {{m#An",S#"6"6tzz#C8TXXh%;<=={{++Kfll#vvfrd#A&Ag'A#NNFF6B4(+	9zz+t,,7$8#>>I%%d+88::1ye ,S2CS%II)+446F##I$5$5$78==??&..*:*:7$4c::Wy&*:*:G*:*LfV_`aa$",S#"6"6tzz#C%btN';$ {{m#"7++ {{o%K:'8':HF]F_`aa{{++P6#:#<fcJ`JbFcdee {{++*733A \\:  	:+C0D*,B,'3.#% -
 !#hnn"11'=I(..b!5!5k2!Fhnn"11'9E#SY 8>>r"6"6|Q"G 8>>r"6"6|Q"Ge $B33I>$d "  9d"344w 3S995	:B BNb  	:w 3S99	:l Lc'3F&LLLs   :n%;An9 s"#s'7s' s, 6t
 %n6	99s7s	s%s&s(s!s&'sss,tt
t%$t%c                $    V ^8  d   QhR\         /# rW   rZ   )r\   s   "rK   r]   r]   o  s     A AD ArM   c                R,  a* VP                   R8X  d   \        V 4      # \        V 4      o*VP                   R8X  d   S*P                  R4      p\	        S*P                  R4      T\        T;'       g    \        S*P                  RR4      4      R7      p\        V RVP                  4       R	VP                  /,          /4      # VP                   R
8X  d   \        V S*RR7      # VP                   R8X  d   \        V S*RR7      # VP                   R8X  d   \        S*RR4       \        S*R,          4      p\        S*R,          4      P#                  4       R,          ;'       g    RTn        TP'                  4        \        T RTP                  4       /4      # VP                   R8X  Ed   \        S*R4       RS*9  d   \        T R4      # S*R,          pS*R,          P#                  4       p \        T4      pRpT'       Ed?   ^ RIHp T! 4        ^ RIHp	 T	! 4       p
T
P                  R/ 4      pTP                  R/ 4      p\/        T\0        4      '       d   Yl9  d   \        T RT R2R4      # Y,          p\/        T\0        4      '       d   TP                  R R4      ;'       g    TP                  R!R4      .pTP                  R"4      '       d   TP3                  R#TR",           24       TP                  R$4      '       d   TP3                  R%TR$,           24       R&P5                  R' T 4       4      pM\        T4      pT'       d   TMRTn        TP'                  4        \        T R(RR)TP6                  R!T/4      # VP                   R*8X  Ed   \        S*R4       \        S*R,          4      p\        \9        S*P                  RTP:                  4      4      P=                  4       P?                  4       4      pS*P                  RTP@                  4      pYn        Y#n         \        TS*P                  RTPB                  ;'       g    R4      4      Tn!        TP'                  4        \E        T4       \        T RTP                  4       R	TP                  /,          /4      # VP                   R+8X  d   S*P                  RR4      pV'       g   \        V R,4      # \F        ;_uu_ 4        \H        PJ                  ! VR4       RRR4       \L        V R-2,          pVPO                  RR.7       \R        PN                  ! RR.7        ^ R/I*H+p V! V4       \        V R(R/4      # VP                   R08X  db   \        S*R4       \        S*R,          4      p. Tn	        . Tn,        RTn        TP'                  4        \        T R(RRTP                  4       /4      # VP                   R18X  d   \        S*R4       S*P                  R24      f   \        T R34      # \        S*R,          4      p\[        S*R2,          4      pTP                  RT Tn	        TP'                  4        \        T R(RRTP                  4       R	TP                  /,          /4      # VP                   R48X  d   \]        V S*4      # VP                   R58X  d   \_        V S*4      # VP                   R68X  d   \a        V S*4      # VP                   R78X  d   \c        V S*4      # VP                   R88X  d   \e        V S*4      # VP                   R98X  d   \g        V S*4      # VP                   R:8X  d   \i        V S*4      # VP                   R;8X  d   \k        V S*4      # VP                   R<8X  d   \m        V S*4      # VP                   R=8X  d   \o        V S*4      # VP                   R>8X  d   \q        V S*4      # VP                   R?8X  d   \s        V S*4      # VP                   R@8X  d   \u        V S*4      # VP                   RA8X  d   \w        V S*4      # VP                   RB8X  d   \y        V S*4      # VP                   RC8X  d   \{        V S*4      # VP                   RD8X  d   \}        V S*4      # VP                   RE8X  d   \        V S*4      # VP                   RF8X  d   \        V S*4      # VP                   RG8X  d   \        V S*4      # VP                   RH8X  dP   S*P                  RR4      P#                  4       pV'       g   \        V RI4      #  ^ RJIBHCp V! V4      p\        V V4      # VP                   RL8X  d   S*P                  RR4      P#                  4       pV'       g   \        V RI4      # ^ RIFpVP                  RMV4      '       g   \        V RN4      # S*P                  RO4      pVe>   \        V4      P#                  4       pVP                  RMV4      '       g   \        V RP4      #  ^ RQIBHHp V! VV\        S*P                  RRR4      4      RS7      p\        V R(RRTV/4      # VP                   RU8X  dP   S*P                  RR4      P#                  4       pV'       g   \        V RI4      #  ^ RVIBHKp V! V4      p\        V V4      # VP                   RW8X  d   \        V S*4      # VP                   RX8X  dh   RYS*9   d8   \        S*RY,          4      ;'       g    RP#                  4       ;'       g    RZS*RY&   \        S*4      pVPK                  R[R4       \        V V4      # VP                   R\8X  dm   \        S*R4       \        S*R,          4      p\        S*P                  R]R4      4      TnN        TP'                  4        \        T R(RRTP                  4       /4      # VP                   R^8X  dm   \        S*R4       \        S*R,          4      p\        S*P                  R_R4      4      TnO        TP'                  4        \        T R(RRTP                  4       /4      # VP                   R`8X  dm   \        S*R4       \        S*R,          4      pS*P                  Ra4      ;'       g    RTnP        TP'                  4        \        T R(RRTP                  4       /4      # VP                   Rb8X  d   \        S*R4       ^ RIFpS*R,          P#                  4       Rc,          pT'       g   \        T Rd4      # S*P                  Re4      pT'       d%   TP                  RfT4      '       g   \        T Rg4      # \        4       pRa\        P                  ! 4       P                  Rh,          RTReTRi\        P                  ! 4       /pTP3                  T4       \        T4       \        T R(RRjT/4      # VP                   Rk8X  d   \        S*RaR4       ^ RIFp\        4       p\        T*3Rl lT 4       R4      pT'       g   \        T RmR4      # S*R,          P#                  4       Rc,          TR&   ReS*9   d;   S*Re,          pT'       d%   TP                  RfT4      '       g   \        T Rg4      # TTRe&   \        T4       \        T R(RRjT/4      # VP                   Rn8X  Ed   \        S*Ra4       \        4       p\        T*3Ro lT 4       R4      pT'       g   \        T RmR4      # T Uu. uF  pTRa,          S*Ra,          8w  g   K  TNK  	  pp\        T4       \R        P                  ! 4       '       d    \        P                  ! \R        P                  ! RpRq7      4      pT FL  pTP                  Ra4      S*Ra,          8X  g   K"   \        TR,          4      pRTnP        TP'                  4        KN  	  \        T R(R/4      # VP                   Rr8X  d   \        V S*4      # VP                   Rs8X  d>   S*P                  RtR4      pVR9  d   \        V Ru4      # ^ RvI]H^p  \        V V ! V4      4      # VP                   Rw8X  d   \        V S*4      # VP                   Rx8X  d   ^ RyI`Hap!Hbp"Hcp#Hdp$ V$! 4       '       g   \        V R(RRzR{/4      # S*P                  R|R4      p%V!! V%4      '       g   \        V R}R~4      # V"! 4       p&V P                  ^4       V P                  RR4       V P                  RR4       \        V 4       V#! V V&4       V P                  4        V P                  P                  \        P                  ! R(R/4      P                  4       4       R# VP                   R8X  d   ^ RI`Hmp'Hnp(Hop) V)! V 4      p&V&'       d	   V(! V&4       V P                  ^4       V P                  RR4       V P                  RR4       \        V 4       V'! V 4       V P                  4        V P                  P                  \        P                  ! R(R/4      P                  4       4       R# R#   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  + '       g   i     EL; i  \P         d     ELi ; i  \P         d     ELi ; i  \P         d     ELi ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  \        \        3 d!   p\        T \        T4      R4      u Rp?# Rp?i\         d!   p\        T \        T4      RK4      u Rp?# Rp?ii ; i  \        \        \        3 d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \        \        3 d    p\        T \        T4      4      u Rp?# Rp?i\         d!   p\        T \        T4      RK4      u Rp?# Rp?ii ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \          d    \        T RR4      u # i ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \         d    p\        T \        T4      4      u Rp?# Rp?ii ; iu upi   \P         d     EK  i ; i  \P         d     ELi ; i)z?Handle all POST routes. Returns True if handled, False for 404.z/api/uploadz/api/session/newr~   r}   reasoning_effortrs   )r}   r~   r,  rx   ry   z/api/sessions/cleanupF)	zero_onlyz"/api/sessions/cleanup_zero_messageTz/api/session/renamerr   r{   Nr   r   r   Untitledz/api/personality/setr   zMissing required field: namer   r   r   r   zPersonality "z" not found in config.yamlsystem_promptprompttonezTone: stylezStyle: 
c              3   8   "   T F  q'       g   K  Vx  K  	  R # 5irO   rG   .0r'  s   & rK   	<genexpr>handle_post.<locals>.<genexpr>  s     "9eq11es   	
rk   personalityz/api/session/updatez/api/session/deleteru   z.json
missing_ok)delete_cli_sessionz/api/session/clearz/api/session/truncate
keep_countz%Missing required field(s): keep_countz/api/chat/startz	/api/chatz/api/crons/createz/api/crons/updatez/api/crons/deletez/api/crons/runz/api/crons/pausez/api/crons/resumez/api/file/deletez/api/file/savez/api/file/createz/api/file/renamez/api/file/create-dirz/api/workspaces/addz/api/workspaces/removez/api/workspaces/renamez/api/approval/respondz/api/skills/savez/api/skills/deletez/api/memory/writez/api/profile/switchzname is required)switch_profile  z/api/profile/createz^[a-z0-9][a-z0-9_-]{0,63}$zKInvalid profile name: lowercase letters, numbers, hyphens, underscores only
clone_fromzInvalid clone_from name)create_profile_apiclone_config)r@  rB  r   z/api/profile/delete)delete_profile_apir   ro   rc   rd   rp   z/api/session/pinr   z/api/session/archiver   z/api/session/mover   z/api/projects/create:N   Nr   colorz^#[0-9a-fA-F]{3,8}$zInvalid color format:N   Nr   projectz/api/projects/renamec              3   T   <"   T F  qR ,          SR ,          8X  g   K  Vx  K  	  R# 5ir   NrG   r6  r'  bodys   & rK   r7  r8    !     R1lOtL?Q,QQQ   (
(zProject not foundz/api/projects/deletec              3   T   <"   T F  qR ,          SR ,          8X  g   K  Vx  K  	  R# 5irI  rG   rJ  s   & rK   r7  r8    rL  rM  r_   r`   z/api/session/importz/api/updates/applyr(  z!target must be "webui" or "agent")apply_updatez/api/session/import_cliz/api/auth/login)verify_passwordcreate_sessionset_auth_cookiere   messagezAuth not enabledpasswordzInvalid passwordi  Content-Typezapplication/jsonCache-Controlno-storez/api/auth/logout)clear_auth_cookieinvalidate_sessionrf   )r   r   )pr   r6   r!   r   r%   r   r   r   r   ry   _handle_sessions_cleanupr   r   r   r   r$   r   stripr{   saver   r   r   r   r   r   joinr9  r   r}   
expanduserr   r~   r,  r2   r   r	   r   r   unlink	Exceptionr)   
api.modelsr<  rz   int_handle_chat_start_handle_chat_sync_handle_cron_create_handle_cron_update_handle_cron_delete_handle_cron_run_handle_cron_pause_handle_cron_resume_handle_file_delete_handle_file_save_handle_file_create_handle_file_rename_handle_create_dir_handle_workspace_add_handle_workspace_remove_handle_workspace_rename_handle_approval_respond_handle_skill_save_handle_skill_delete_handle_memory_writer  r>  FileNotFoundErrorRuntimeErrorr   matchrA  r[   FileExistsErrorrC  _handle_profile_config_writer   r   r   r   r*   uuiduuid4hexr   r+   nextr  r   r   r   _handle_session_importr   rO  _handle_session_import_clir   rP  rQ  rR  re   r   send_headerr"   r   wfilewritedumpsencoderX  rY  rf   )+r  r  r~   r   er  r   r0  _reload_cfg2	_get_cfg2_cfg2r  r  r  partsnew_wsr'  r<  keepr>  resultr%  r@  rA  rC  savedrE  r   projindexentryr(  rO  rP  rQ  rR  re   rT  
cookie_valrX  rY  rf   rK  s+   &&                                        @rK   handle_postr  o  sD    {{m#W%%WD{{((!hh{+3&&+R0
 9aiikZ4L&LMNN{{--'GG{{::'FF{{++T<1T,/0Qd7m$**,S1??Z	9aiik233{{,,T<(w >??< F|!!#	:C A
 4@N:KE		'2.I )or B/66$:W7mD69S$TVYZZ%+E%&&?B7RR599Xr;RS99V$$LL6%-!9:99W%%LL75>*:!;<"9e"99U $$	4}ammXvVWW{{++T<(T,/0QT$((;<=HHJRRTU!''*3HH'););)A)ArB
 	
6"9aiikZ4L&LMNN{{++hh|R(3w(@AAT8<<T*TSE-'XXX&&&$7	5s#4,''{{**T<(T,/0Q
jAG!&&(4y!))+>??{{--T<(88L!)w GHHT,/0Q4%&ZZ&
4y!))+QZZ@X2XYZZ{{''!'400{{k! $// {{))"7D11{{))"7D11{{))"7D11{{&&..{{((!'400{{))"7D11 {{(("7D11{{&& $//{{(("7D11{{(("7D11{{,,!'400 {{++$Wd33{{..'66{{..'66 {{--'66 {{((!'400{{**#GT22 {{))#GT22 {{++xx#))+C);<<	-3#D)FWf%% {{++xx#))+C);<<yy6==w mnnXXl+
!Z..0J99:JGG7$=>>		(7'%!$((>5"ABF
 WtT9f=>> {{++xx#))+C);<<	-7'-FWf%% {{+++GT:: {{o% #D$4 5 ; ;BBDPPDd#		/4(%   {{((T<(T,/0Q401	4y!))+>?? {{,,T<(T,/0Q$((:t45
	4y!))+>?? {{))T<(T,/0Qxx-55	4y!))+>?? {{,,T6"F|!!#D)C99!#95AAw 677 ?djjl..s3VT7ES_aeajajalmh4y$788{{,,T<0 ?RRTXYC)<cBBF|))+D1Vd?MESYY'=uEE7$:;;!DMh4y$788{{,,T<( ?RRTXYC)<cBB'Qx!1\?d<>P+PAAxQh$$&&

#5#?#?#QR"Eyy.$|2DD! +E,,? @A+/ALFFH # 4,'' {{++%gt44 {{**(B'++w CDD,,v.// {{//)'488 {{''^^  WtT96HIJJ88J+x((w 2C88#%
c"N,>?OZ8'",DJJd|4;;=>{{((PP!'*
z*c"N,>?OZ8'"'"DJJd|4;;=>K ;s7CF'; ;;FG-@# FFF ;s7CF'; ;;  	:w 3S99	:> ;s7CF'; ;;FG-@# FFF" TT $$
 $
 ;s7CF'; ;;FG-@# FFF ;s7CF'; ;; FG-@# FFF^ -. 	-wA,, 	-wA,,	-, O\: 	(wA''	( -. 	(wA'' 	-wA,,	-$ ;s7CF'; ;;FG-@# FFF ;s7CF'; ;;FG-@# FFF ;s7CF'; ;;FG-@# FFF ;s7CF'; ;; ;s7CF'; ;;  ;s7CF'; ;; R  ) ! ! s  AG% AH !AH0 !AI AI; AJ( AKAK AK, 2AK> AL +AL= AM <AN ?AN& 9AP AP; AR %AS AS" "AT AT- AU AU8 AV% ,AW 1AW?AW?<A
AX )AX5AX G%AHG0AH
HAHH
AHHAH-H,AH-H0AIH;AIIAIIAIIAI8I7AI8I;AJ%JAJ JAJ%J AJ%J(AKKAKKAK	KAK)K(AK)K,AK;K:AK;K>ALLALLAL:LAL5L/AL:L5AL:L=AMMAMMANM&AN M:ANN ANNAN#N"AN#N&AP N7AOOAP OAP OAP O AO;O5AP O;AP PAP8PAP3P-AP8P3AP8P;ARQAQ&Q ARQ&ARQ3ARQ4ARR	ARRARRASR"AR<R6ASR<ASSASSASS"ATS-ATTATTATTAT*T)AT*T-AUT8AUUAUUAUUAU5U4AU5U8AV"VAVVAV"VAV"V%AWV0AW
WAWW
AWWAW<WAW7W1AW<W7AW<XAXXAX XAXXAX XAX&X%AX&c                 `   \        \        4      P                  P                  R ,          P                  4       pVP                  \        R4      R pW#,          P                  4       p VP                  V4       TP                  4       '       d   TP                  4       '       g   \        T RR/RR7      # TP                  P                  4       pRRR	R
RR/P                  TP                  R4      R4      pT P                  ^4       T P!                  RT R24       T P!                  RR4       TP#                  4       pT P!                  R\%        \        T4      4      4       T P'                  4        T P(                  P+                  T4       R#   \         d    \        T RR/RR7      u # i ; i)staticrq   Nrt   r   r   rw   cssztext/cssjszapplication/javascripthtmlz	text/html.z
text/plainrU  z; charset=utf-8rV  rW  Content-LengthT)r   __file__parentr   r   r   r   r   r   r  r  suffixlowerr   lstripr   r  
read_bytesr   r   r  r  )r  r  static_rootrelstatic_fileextctr!  s   &&      rK   r   r     st   >((//(:CCEK
++c*o&
'C$--/K>, {':':'<'<7K0==



"
"
$C
T#;
+
"s3::c?LA #2$o(>?4

 
 
"C(#c#h-8MM  >7K0==>s   (F F-,F-c           
         \        VP                  4      P                  R R.4      ^ ,          pV'       g   \        V R4      # \	        V4      p\        P                  ! TP                  R^R7      pT P                  ^4       T P                  RR4       T P                  R	R
T R24       T P                  R\        \        TP                  R4      4      4      4       T P                  RR4       T P                  4        T P                  P!                  TP                  R4      4       R#   \
         d    \        T RR4      u # i ; i)rr   rs   ru   r   r   F)ensure_asciiindentrU  zapplication/json; charset=utf-8Content-Dispositionzattachment; filename="hermes-z.json"r  r_   rV  rW  T)r   r   r   r   r$   r   r   r  __dict__r   r  r   r   r  r   r  r  )r  r  r  r   payloads   &&   rK   r   r     s	   
6<<
 
$
$\B4
8
;Cs7$<==jj%BG#(IJ-1NseSY/Z[(#c'..2I.J*KL4MMw/0 BC)<cBBBs   D* *EEc                 (   \        VP                  4      pVP                  R R.4      ^ ,          P                  4       P	                  4       pVP                  RR.4      ^ ,          R8H  p\        VP                  RR.4      ^ ,          4      pV'       g   \        V R\        4       /4      # . p\        4        EF%  pY7P                  R4      ;'       g    RP                  4       9   pV'       d   VP                  \        VRR7      4       KU  V'       g   K_   \        VR	,          4      p	V'       d   V	P                  R
V MV	P                  p
V
 F  pVP                  R4      ;'       g    Rp\        V\        4      '       d   RP                  R V 4       4      pV\        V4      P                  4       9   g   Kl  VP                  \        VRR7      4        EK#  	  EK(  	  \        V RVRVR\%        V4      /4      #   \         \"        3 d     EKZ  i ; i)qrs   r   r   depth5rl   r{   )
match_typerr   N c              3      "   T FG  p\        V\        4      '       g   K  VP                  R 4      R8X  g   K3  VP                  RR4      x  KI  	  R# 5i)typetextrs   N)r   r   r   r5  s   & rK   r7  *_handle_sessions_search.<locals>.<genexpr>0  sF      %Y1(21d(; &7@AfQW@W &7QUU62%6%6s   AAAr   count)r   r   r   r  r[  rb  r   r&   r   r   r$   ry   r   listr]  r   r   r`  r   )r  r  r  r  content_searchr  resultsr   title_matchr  r  mcs   &&           rK   r   r     s   	&,,	B
sRD!""$**,AVVIu-a0C7Nw&q)*EQw\^ <==G^EE'N00b7799NN4g67>"1\?305t}}Ve,4==Ai(..BA!!T**HH %Y %Y YCFLLN*tA)'DE  & Wz7GQWNOO i( s&   AG;(AG;9G;G;;HHc                    \        VP                  4      pVP                  R R.4      ^ ,          pV'       g   \        V R4      # \	        V4      p \        T R\        \        TP                  4      TP                  RR.4      ^ ,          4      RTP                  RR.4      ^ ,          /4      #   \
         d    \        T RR4      u # i ; i  \        \        3 d!   p\        T \        T4      R4      u Rp?# Rp?ii ; i)	rr   rs   ru   r   r   entriesr   r  N)r   r   r   r   r$   r   r   r3   r   r}   rw  r   r   )r  r  r  r  r   r  s   &&    rK   r   r   :  s    	&,,	B
&&t
$Q
'Cs7$<==)xQ[[ 1266&3%3H3KLBFF6C5)!,
  	 BC)<cBBB z* )7CFC(()s1   B- AC -CCC<C71C<7C<c                    \        VP                  4      P                  R R.4      ^ ,          p\        P                  ! V4      pVf   \	        V RR/RR7      # V P                  ^4       V P                  RR4       V P                  RR	4       V P                  R
R4       V P                  RR4       V P                  4           VP                  ^R7      w  rE\        YT4       TR9   g   K+   R#   \        P                   d:    T P                  P                  R4       T P                  P                  4         K{  i ; i  \        \        3 d     R# i ; i)r   rs   rt   zstream not foundr   rw   rU  z text/event-stream; charset=utf-8rV  zno-cachezX-Accel-Bufferingno
Connectionz
keep-aliveT)timeouts   : heartbeat

)donert   cancel)r   r   r   r   r   r   r  r   queueEmptyr  r  flushr7   BrokenPipeErrorConnectionResetError)r  r  r   r  eventr"  s   &&    rK   r   r   I  s:   &**;=a@IIAy7W.@$A#NN#(JK4+T2l3eeBe/
 &33  ;; ##$67##% 12 s7   E C0 E 0A
D>:E =D>>E EEc                 &   \        VP                  4      pVP                  R R.4      ^ ,          pV'       g   \        V R4      # \	        V4      pTP                  RR.4      ^ ,          pTP                  RR.4      ^ ,          R8H  p\        \        TP                  4      T4      pTP                  4       '       d   TP                  4       '       g   \        T RR	/RR
7      # TP                  P                  4       p\        P                  ! TR4      p	TP                  4       p
^ RIHp TP%                  TP&                  RR7      pT P)                  ^4       T P+                  RT	4       T P+                  R\-        \/        T
4      4      4       T P+                  RR4       T'       d#   T P+                  RRTP&                   RT 24       T P1                  4        T P2                  P5                  T
4       R#   \
         d    \        T RR4      u # i ; i)rr   rs   ru   r   r   r   downloadr   rt   r   rw   zapplication/octet-streamN)saferU  r  rV  rW  r  zattachment; filename="z"; filename*=UTF-8''T)r   r   r   r   r$   r   r   r   r}   r  r  r   r  r  r   r  urllib.parseparsequoter   r   r  r   r   r   r  r  )r  r  r  r  r   r  force_downloadr(  r  mime	raw_bytes_up	safe_names   &&           rK   r   r   c  s   	&,,	B
&&t
$Q
'Cs7$<==
&&"
q
!CVVJ-a0C7N$q{{+S1F==??&.."2"27K0==
--


C<<78D!!#I		&++B	/I#-(#c)n*=>41$V[[M1G	{S	UMM	") BC)<cBBBs   G5 5HHc                    \        VP                  4      pVP                  R R.4      ^ ,          pV'       g   \        V R4      # \	        V4      pTP                  RR.4      ^ ,          pT'       g   \        T R4      # \        T \        \        TP                  4      T4      4      #   \
         d    \        T RR4      u # i ; i  \        \        3 d!   p\        T \        T4      R4      u Rp?# Rp?ii ; i)rr   rs   ru   r   r   r   path is requiredN)r   r   r   r   r$   r   r   r4   r   r}   rw  r   r   )r  r  r  r  r   r  r  s   &&     rK   r   r     s    	&,,	B
&&t
$Q
'Cs7$<==
&&"
q
!Cs7$677',T!++->DE	E BC)<cBBB z*QGSVS8Q1QQs0   B& =(C &C CC5C0*C50C5c                 J   \        VP                  4      P                  R R.4      ^ ,          p\        V4      '       dF   \        ;_uu_ 4        \        \        P                  ! V/ 4      4      pRRR4       \        V RX/4      # \        V RR/4      #   + '       g   i     L,; i)rr   rs   Npending)r   r   r   r;   rC   r   rB   r   )r  r  r  r'  s   &&  rK   r   r     sy    
6<<
 
$
$\B4
8
;C3UX\\#r*+A 9a.))Wy$'(( Us   !BB"	c                B   \        VP                  4      pVP                  RR.4      ^ ,          pVP                  RR.4      ^ ,          pVP                  RR.4      ^ ,          pV'       d&   \        VRVRVRV.RR	/4       \	        V R
RRV/4      # \	        V RR/RR7      # )zIInject a fake pending approval -- loopback-only, used by automated tests.rr   rs   pattern_keytest_patterncommandzrm -rf /tmp/testpattern_keysr   ztest patternrk   Trt   r   rv   rw   )r   r   r   r=   r   )r  r  r  r  r   cmds   &&    rK   r   r     s    	&,,	B
&&t
$Q
'C
&& 0
1!
4C
&&/0
1!
4C
ssM3SE=.
 	 4|S9::Ww 56sCCrM   c                 *   ^ RI Hp \        VP                  4      pVP	                  RR.4      ^ ,          p\        VP	                  RR.4      ^ ,          4      pV'       g   \        V RR/RR	7      # W$,          p. pVP                  4       '       dc   \        VP                  R
4      RR7      RV pV F=  p	 V	P                  RRR7      p
VP                  RV	P                  RV
R,          /4       K?  	  \        V RVRV/4      #   \         d     K_  i ; i)    )
OUTPUT_DIRjob_idrs   limitr  rt   job_id requiredrv   rw   z*.mdT)r   Nr_   r   ra   errorsfilenamer   :Ni@  Noutputs)r   r  r   r   r   rb  r   r  sortedglobr   r   r   r`  )r  r  CRON_OUTr  r  r  out_dirr  filesftxts   &&         rK   r   r     s    0	&,,	BVVHrd#A&Fw&q)*E!Gg/@%A#NNGG~~w||F+T:6EBAkk79kE
AFFIs5zJK  WxG<==  s   69DDDc                   ^ RI p\        VP                  4      p\        VP	                  RR.4      ^ ,          4      p ^ RIHp V! RR7      p. pV F  pVP	                  R4      p	V	'       g   K  \        V	\        4      '       d<    VP                   P                  V	P                  RR	4      4      P                  4       p
M\        V	4      p
W8  g   K  VP                  R
VP	                  RR4      RVP	                  RR4      RVP	                  RR4      RV
/4       K  	  \        V RVRV/4      #   \        \        3 d     K  i ; i  \          d    \        T R. RT/4      u # i ; i)z=Return cron jobs that have completed since a given timestamp.Nsincer   r   Tr   last_run_atZz+00:00r  idrs   r   Unknownrj   last_statusr   completed_atcompletions)datetimer   r   floatr   r   r   r   r   fromisoformatr   	timestampr   	TypeErrorr   r   ImportError)r  r  r  r  r  r   r   r  joblast_runtss   &&         rK   r   r     sQ   	&,,	B"&&3%(+,E?'$/Cww}-H(C((!**889I9I#x9XYcceB 8_z""cggdB/CGGFI6cggmY?"B	$  $ =+wFGG #I.   ?="gu=>>?s=   AE 9D0?E AE 0EE EE E&%E&c                     ^ RI Hp V! 4       R,          pVR,          pVR,          pVP                  4       '       d   VP                  RRR7      MR	pVP                  4       '       d   VP                  RRR7      MR	p\        T R
TRTR\        V4      R\        V4      RVP                  4       '       d   VP                  4       P                  MRRVP                  4       '       d    VP                  4       P                  /4      # R/4      #   \         d(    \        P                  ! 4       R,          R,          p EL(i ; i)r  r   memories.hermes	MEMORY.mdUSER.mdr_   r   r  rs   memoryusermemory_path	user_pathmemory_mtimeN
user_mtime)r  r   r   r   homer  r   r   r   statst_mtime)r  r   mem_dirmem_file	user_filer
  r  s   &      rK   r  r    s    77(*Z7 $H)#IGOGXGXXC^`FFOFVFVFXFX9	B^`DW&&$s8}k3y>HOO4E4E00493C3C3E3Einn&//	   LP	    7))+	)J67s   D .D?>D?c                     ^ p\         P                  ! R4       EF
  pVP                  P                  R4      '       d   K'   \        P
                  ! VP                  4      pV'       d$   T;'       d    \        VP                  4      ^ 8H  pM9T;'       d0    VP                  R8H  ;'       d    \        VP                  4      ^ 8H  pV'       dW   \        ;_uu_ 4        \        P                  ! VP                  R4       RRR4       VP                  RR7       V^,          pEK
  EK  	  \        P                   ! 4       '       d   \        P                  ! RR7       \#        V RRRV/4      #   + '       g   i     Lu; i  \         d     EKs  i ; i)	r  z*.json_r.  NTr:  rk   cleaned)r   r  r   r   r#   loadstemr   ry   r{   r   r	   r   r_  r`  r)   r  r   )r  rK  r-  r  r'  r   should_deletes   &&&    rK   rZ  rZ    s   Gh'66S!!8	QVV$A ! : :c!**o&: ! T Tagg&; T TAJJST@TT8<<5TD)1  (   ""!!T2WtT9g677 T  		sH   'E=)E=2"E=E=, E=E="E*=#E=*E:5E==FFc           
         \        VR 4       \	        TR ,          4      p\        TP                  RR4      4      P                  4       pT'       g   \        T R4      # TP                  R4      ;'       g    .  Uu. uF  p\        T4      NK  	  upR,          p\        \        TP                  R	4      ;'       g    TP                  4      P                  4       P                  4       4      pTP                  R
4      ;'       g    TP                  p\        TTP                  RTP                  ;'       g    R4      4      p	Ysn	        Yn        Yn        TP                  4        \!        T4       \"        P$                  ! 4       P&                  p
\(        P*                  ! 4       p\,        ;_uu_ 4        T\.        T
&   RRR4       \0        P2                  ! \4        TP6                  YHYzYi3RR7      pTP9                  4        \;        T RT
R TP6                  /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \
         d    \        T RR4      u # i ; iu upi   + '       g   i     L; i)rr   Nr   r   rS  rs   zmessage is requiredattachments:N   Nr}   r~   r,  Tr(  argsdaemonr   )r   r   r   r   r$   r   r   r[  r   r}   r^  r   r~   r   r,  r\  r2   r|  r}  r~  r  Queuer   r   	threadingThreadr8   rr   startr   )r  rK  r  r   msgrI   r  r}   r~   r,  r   r  thrs   &&           rK   rc  rc    s   	|	$l+,
dhhy"%
&
,
,
.Cs7$9::$(HH]$;$A$Ar$AC$Aa3q6$ACCHKD+.==!++>IIKSSUVIHHW((E-#Q%7%7%=%=2> KG)FFHy!

  IA	Awy)


#llC	k\C
 IIKW{I|Q\\JKK5 73wA#777BC)<cBBB D 
s@   H I 9I .
I%H? H:4H?:H?II%I5	c                d   ^ RI Hp \        VR,          4      p\        VP	                  RR4      4      P                  4       pV'       g   \        V RR/RR7      # \        VP	                  R	4      ;'       g    VP                  4      P                  4       P                  4       p\        V4      Vn        VP	                  R
4      ;'       g    VP                  Vn        \        VP                  TP	                  RVP                  ;'       g    R4      4      Vn        \        P                  P	                  R4      p\        V4      \        P                  R&   \        P                  P	                  R4      p\        P                  P	                  R4      pR\        P                  R&   VP                   \        P                  R&    ^ RIHp	 \&        ;_uu_ 4        ^ RI Hp
 V
! VP                  4      w  rpRp ^ RIHp V! VR7      pVP	                  R4      pV'       g   VP	                  R4      pV'       g   VP	                  R4      pT	! YTTRR\2        TP                   \5        TP                  4      R7	      pRTP                   R2pRTP                   R 2p^ R!IHp TP;                  TT,           TT! TP<                  4      TP                   TR"7      pRRR4       Tf"   \        P                  P?                  RR4       MT\        P                  R&   Tf"   \        P                  P?                  RR4       MT\        P                  R&   Tf"   \        P                  P?                  RR4       MT\        P                  R&    \A        XP	                  R#4      ;'       g    TP<                  TP	                  R$4      4      Tn        \C        TP<                  TPD                  4      Tn"        TPG                  4         \I        4       P	                  R%4      '       dy   ^ R&I%H&p T! TP                   TPN                  ;'       g    ^ TPP                  ;'       g    ^ TPR                  TP                  TPD                  \U        TP<                  4      R'7       \        T R(TP	                  R$4      ;'       g    RR)TP	                  R*R4      '       d   R+MR,R-TPW                  4       R#TP<                  /,          R.TPY                  4        UUu/ uF  w  ppTR#8w  g   K  TTbK  	  upp/4      #   \.         d   p\1        RT 2RR7        Rp?ELRp?ii ; i  + '       g   i     EL; i  Tf"   \        P                  P?                  RR4       MT\        P                  R&   Tf"   \        P                  P?                  RR4       MT\        P                  R&   Tf"   \        P                  P?                  RR4       i T\        P                  R&   i ; i  \.         d     ELi ; iu uppi )/zJFallback synchronous chat endpoint (POST /api/chat). Not used by frontend.)_get_session_agent_lockrr   rS  rs   rt   zempty messagerv   rw   r}   r~   r,  TERMINAL_CWDHERMES_EXEC_ASKHERMES_SESSION_KEYr   )AIAgent)resolve_model_providerN)resolve_runtime_provider)	requestedapi_keyproviderbase_urlz2[webui] WARNING: resolve_runtime_provider failed: Tr  r  )	r~   r2  r3  r1  platform
quiet_modeenabled_toolsetsrr   reasoning_configz[Workspace: z]
z#Active workspace at session start: ab  
Every user message is prefixed with [Workspace: /absolute/path] indicating the workspace the user has selected in the web UI at the time they sent that message. This tag is the single authoritative source of the active workspace and updates with every message. It overrides any prior workspace mentioned in this system prompt, memory, or conversation history. Always use the value from the most recent [Workspace: ...] tag as your default working directory for ALL file operations: write_file, read_file, search_files, terminal workdir, and patch. Never fall back to a hardcoded path when this tag is present.)_sanitize_messages_for_api)user_messagesystem_messageconversation_historytask_idpersist_user_messagery   final_responsesync_to_insights)sync_session_usage)rr   input_tokensoutput_tokensestimated_costr~   r{   r   answerrj   	completedr  partialrx   r  )-r   r)  r$   r   r   r[  r   r   r}   r^  r   r~   r   r,  osenvironrr   	run_agentr-  r   r.  hermes_cli.runtime_providerr/  r`  printr   r   api.streamingr9  run_conversationry   r   r:   r'   r{   r\  r   api.state_syncrA  rB  rC  rD  r   r   r   )r  rK  r)  r   r&  r}   old_cwdold_exec_askold_session_keyr-  r.  _model	_provider	_base_url_api_keyr/  _rt_er   workspace_ctxworkspace_system_msgr9  r  rA  rJ   vs   &&                        rK   rd  rd    s   2D&'A
dhhy"%
&
,
,
.Cq7O"<SIITXXk*99akk:EEGOOQIi.AKhhw**177AG/	#Q%7%7%=%=2>A jjnn^,G!$YBJJ~::>>"34Ljjnn%9:O$'BJJ !'(||BJJ#$0A%Y9+A!''+J(FyH
]P.C779-  #
 3I  #
 3I &y#+e,8Q\\,B1CUCU,VXE +1;;-s;M5akk] CP P ! A++*S03%?

%K%( , FC R ?BJJNN>4@+2bjj(0A4!H.:bjj*+"BJJNN3G$N1@bjj-./

:,,!**

#$AJ QWW-AGqvvx?1229<<^^00qoo22 //gggg!!**o W&**-.44"FJJ{D99&y199;*ajj!99FLLNFNDAqa:o41a4NF	  k  ]J2$OW[\\] YYR ?BJJNN>4@+2bjj(0A4!H.:bjj*+"BJJNN3G$N1@bjj-.&   Gs   U- U:A T0;T0BUU- AX 	X =X X, X,0U;UUUUU*	$	U- -B*XX)(X)c           
         \        VR R4        ^ RIHp T! TR ,          TR,          TP                  R4      ;'       g    RTP                  R4      ;'       g    RTP                  R4      ;'       g    . TP                  R4      ;'       g    RR	7      p\        T R
RRT/4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \         d$   p\        T R\        T4      /RR7      u Rp?# Rp?ii ; i)r0  scheduleN)
create_jobr   deliverlocalr   r~   )r0  r]  r   r_  r   r~   rk   Tr  rt   rv   rw   )	r   r   r   r   r   r^  r   r   r`  )r  rK  r  r^  r  s   &&   rK   re  re  ~  s    	x	,	9(>D,<&!))T488I3F3Q3Q'88H%++488G3D3L3L

 4uc233 73wA#777  97CF+C889sQ   B% /C C C 3C C %C0C
C
CD C;5D ;D c                 Z   \        VR 4       ^ RIHp TP                  4        UUu/ uF  w  rETR 8w  g   K  Tf   K  YEbK  	  pppT! TR ,          T4      pT'       g   \        T RR4      # \        T RRRT/4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; iu uppi )r  N)
update_jobJob not foundr   rk   Tr  )r   r   r   r   r   rb  r   r   )r  rK  r  rb  rJ   r[  updatesr  s   &&      rK   rf  rf    s    	x	 $ $

PXt!tqtGP
T(^W
-Cs7OS99WtT5#.// 73wA#777Ps,   A: B'B'B':B$BB$B$c                     \        VR 4       ^ RIHp T! TR ,          4      pT'       g   \        T RR4      # \        T RRR TR ,          /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i)r  N)
remove_jobrc  r   rk   T)r   r   r   r   r   rf  r   )r  rK  r  rf  rk   s   &&   rK   rg  rg    sf    	x	 $	DN	#Bc'?C88WtT8T(^<==	 73wA#777s   A A8A3-A83A8c           	         VP                  R R4      pV'       g   \        V R4      # ^ RIHp ^ RIHp V! V4      pV'       g   \        V RR4      # \        P                  ! WE3RR7      P                  4        \        V R	RR VR
R/4      # )r  rs   r  )get_job)run_jobrc  r   Tr  rk   rj   	triggered)
r   r   r   rh  cron.schedulerri  r#  r$  r%  r   )r  rK  r  rh  ri  r  s   &&    rK   rh  rh    sw    XXh#F#g'899!&
&/Cs7OS99G&>DDFWtT8VX{KLLrM   c                     VP                  R R4      pV'       g   \        V R4      # ^ RIHp V! W!P                  R4      R7      pV'       d   \	        V RRRV/4      # \        V R	R
4      # )r  rs   r  )	pause_jobreason)rn  rk   Tr  rc  r   )r   r   r   rm  r   )r  rK  r  rm  r  s   &&   rK   ri  ri    s_    XXh#F#g'899#vhhx&89Fa$eV!<==w--rM   c                     VP                  R R4      pV'       g   \        V R4      # ^ RIHp V! V4      pV'       d   \	        V RRRV/4      # \        V RR4      # )	r  rs   r  )
resume_jobrk   Tr  rc  r   )r   r   r   rp  r   )r  rK  r  rp  r  s   &&   rK   rj  rj    sV    XXh#F#g'899$Fa$eV!<==w--rM   c                 b   \        VR R4       \	        TR ,          4      p \        \        TP                  4      TR,          4      pTP                  4       '       g   \        T RR4      # TP                  4       '       d   \        T R4      # TP                  4        \        T RRRTR,          /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \
         d    \        T RR4      u # i ; i  \        \        3 d    p\        T \        T4      4      u Rp?# Rp?ii ; i)	rr   r   Nr   r   r   z+Cannot delete directories via this endpointrk   T)r   r   r   r   r$   r   r   r   r}   r  r   r_  r   PermissionErrorr  rK  r  r   r(  s   &&   rK   rk  rk    s    	|V	,l+,Kd1;;/f>}}s74Dc'J J==??3w0]#^^4vtF|<== 73wA#777BC)<cBBB (Jc'3q66J/JJs^   B3 C  AC> *C>  C> &C> 3C>CCC C;:C;>D.D)#D.)D.c           
         \        VR R4       \	        TR ,          4      p \        \        TP                  4      TR,          4      pTP                  4       '       g   \        T RR4      # TP                  4       '       d   \        T R4      # TP                  TP                  RR4      R	R
7       \        T RRRTR,          RTP                  4       P                  /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \
         d    \        T RR4      u # i ; i  \        \         3 d    p\        T \        T4      4      u Rp?# Rp?ii ; i)rr   r   Nr   r   r   z Cannot save: path is a directoryr   rs   r_   r`   rk   Tsize)r   r   r   r   r$   r   r   r   r}   r  r   
write_textr   r   r  st_sizerr  rs  s   &&   rK   rl  rl    s   	|V	,l+,Kd1;;/f>}}s74Dc'J J==??3w0R#SS$((9b1GD4vtF|VV[[]EZEZ[\\ 73wA#777BC)<cBBB (Jc'3q66J/JJs_   C  D AD+ *D+  D+ AD+  D
+D?D
D
D('D(+E<EEEc                    \        VR R4       \	        TR ,          4      p \        \        TP                  4      TR,          4      pTP                  4       '       d   \        T R4      # TP                  P                  RRR7       TP                  TP                  RR	4      R
R7       \        T RRR\        TP                  \        TP                  4      4      4      /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \
         d    \        T RR4      u # i ; i  \        \         3 d    p\        T \        T4      4      u Rp?# Rp?ii ; i)rr   r   Nr   r   zFile already existsTparentsexist_okr   rs   r_   r`   rk   )r   r   r   r   r$   r   r   r   r}   r  r  mkdirrv  r   r   r   rr  rs  s   &&   rK   rm  rm    s   	|V	,l+,Kd1;;/f>==??3w0E#FFD48$((9b1GD4vs63E3Ed1;;FW3X/YZ[[ 73wA#777BC)<cBBB (Jc'3q66J/JJsS   C$ D AD/ )A:D/ $D/D	D	DD,+D,/E EEEc           	      n   \        VR RR4       \	        TR ,          4      p \        \        TP                  4      TR,          4      pTP                  4       '       g   \        T RR4      # TR,          P                  4       pT'       d   RT9   g   RT9   d   \        T R	4      # TP                  T,          pTP                  4       '       d   \        T R
T R24      # TP                  T4       \        TP                  \        TP                  4      4      4      p\        T RRRTR,          RT/4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \
         d    \        T RR4      u # i ; i  \        \        \         3 d    p\        T \        T4      4      u Rp?# Rp?ii ; i)rr   r   new_nameNr   r   r   r   ..zInvalid file namezA file named "z" already existsrk   Told_pathnew_path)r   r   r   r   r$   r   r   r   r}   r  r[  r  renamer   r   rr  OSError)r  rK  r  r   sourcer~  destnew_rels   &&      rK   rn  rn    s\   	|VZ	8l+,Td1;;/f>}}s74Dc'J J
#))+3(?dh.>w 344}}x';;==WxjHX.Y!ZZdd&&tAKK'89:4z4<WUVV 73wA#777BC)<cBBB 1Ss7CPQF?S8SSsk   D4 E! AE? +E? 
E? $(E? E? AE? 4E?EEE!E<;E<?F4F/)F4/F4c                 r   \        VR R4       \	        TR ,          4      p \        \        TP                  4      TR,          4      pTP                  4       '       d   \        T R4      # TP                  RR7       \        T RRR\        TP                  \        TP                  4      4      4      /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \
         d    \        T RR4      u # i ; i  \        \        \        3 d    p\        T \        T4      4      u Rp?# Rp?ii ; i)	rr   r   Nr   r   zPath already existsT)rz  rk   )r   r   r   r   r$   r   r   r   r}   r  r|  r   r   rr  r  rs  s   &&   rK   ro  ro    s    	|V	,l+,Td1;;/f>==??3w0E#FFT"4vs63E3Ed1;;FW3X/YZ[[ 73wA#777BC)<cBBB 1Ss7CPQF?S8SSsS   B6 C# AD )AD 6C CC C #C>=C>D6D1+D61D6c                   a VP                  R R4      P                  4       pVP                  RR4      P                  4       pV'       g   \        V R4      # \        V4      P	                  4       P                  4       oSP                  4       '       g   \        V RS 24      # SP                  4       '       g   \        V RS 24      # \        4       p\        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   \        V R	4      # TP                  R \        S4      RT;'       g    SP                  /4       \        V4       \        V R
RRV/4      # )r   rs   r   r  zPath does not exist: zPath is not a directory: c              3   L   <"   T F  qR ,          \        S4      8H  x  K  	  R# 5i)r   N)r   )r6  wr'  s   & rK   r7  (_handle_workspace_add.<locals>.<genexpr>  s     
,1V9As   !$TFzWorkspace already in listrk   r   )r   r[  r   r   r^  r   r  r   r/   anyr   r   r   r0   r   )r  rK  path_strr   wssr'  s   &&   @rK   rp  rp    s   xx#))+H88FB%%'DC);<<X!!#++-A88::c'-B1#+FGG88::c'-Fqc+JKK

C
s
,
,sss
,
,,,7788JJA78CWtT<566rM   c                     VP                  R R4      P                  4       pV'       g   \        V R4      # \        4       pV Uu. uF  qDR ,          V8w  g   K  VNK  	  pp\	        V4       \        V RRRV/4      # u upi )r   rs   r  rk   Tr   r   r[  r   r/   r0   r   )r  rK  r  r  r  s   &&   rK   rq  rq    su    xx#))+HC);<<

C
3cvY(211cC
3CWtT<566 4s   A:A:c                 X   VP                  R R4      P                  4       pVP                  RR4      P                  4       pV'       d	   V'       g   \        V R4      # \        4       pV F  pVR ,          V8X  g   K  W5R&    M	  \        V RR4      # \	        V4       \        V RRRV/4      # )	r   rs   r   zpath and name are requiredzWorkspace not foundr   rk   Tr   r  )r  rK  r  r   r  r  s   &&    rK   rr  rr    s    xx#))+H88FB%%'D4G5Q(R!R

CV9 fIe  71377CWtT<566rM   c                 J   VP                  R R4      pV'       g   \        V R4      # VP                  RR4      pVR9  d   \        V RV 24      # \        ;_uu_ 4        \        P                  ! VR4      pRRR4       X'       d~   VP                  R4      ;'       g    VP                  R	R4      .pVR9   d   V F  p\        W&4       K  	  M5VR8X  d/   V F  p\        W&4       \        V4       K  	  \        \        4       \        V R
RRV/4      #   + '       g   i     L; i)rr   rs   ru   choicedenyalwayszInvalid choice: Nr  r  rk   T)oncerx   r  r  )r  rx   )
r   r   rC   rB   r   r>   r?   r@   rD   r   )r  rK  r  r  r  keysrJ   s   &&     rK   rs  rs  -  s    
((<
$Cs7$<==XXh'F::7.vh788	,,sD) 
{{>*NNw{{="/M.N((?32Tx'):1)= $%89WtT8V455 
s   DD"	c                    \        VR R4       TR ,          P	                  4       P                  4       P                  RR4      pT'       d   RT9   g   RT9   d   \        T R4      # TP                  RR	4      P	                  4       pT'       d   RT9   g   RT9   d   \        T R
4      # ^ RIH	p T'       d   YT,          T,          pMYS,          pTP                  RRR7       TR,          pTP                  TR,          RR7       \        T RRR TR\        T4      /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i)r   r   Nr  -r   r  r   categoryrs   zInvalid categoryr   Try  zSKILL.mdr_   r`   rk   r   )r   r   r   r   r[  r  r   r   r   r   r|  rv  r   )r  rK  r  
skill_namer  r   r&  
skill_files   &&      rK   rt  rt  @  s   	vy	)f##%++-55c3?J
*dj.@7011xx
B'--/HSH_(87.//,)J6	+	OOD4O0Z'J$y/G<WtT6:vs:OPP 73wA#777s   D E)E=EEc                    \        VR 4       ^ RIHp ^ RIp\        TP                  TR ,           R24      4      pT'       g   \        T RR4      # T^ ,          P                  pTP                  \        T4      4       \        T RRR TR ,          /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i)r   Nr  z	/SKILL.mdr   r   rk   T)r   r   r   r   r   r   shutilr  r   r  rmtreer   )r  rK  r  r   r  matchesr&  s   &&     rK   ru  ru  T  s    	v	,:##tF|nI$>?@G3w(93??
!!I
MM#i.!WtT64<899 73wA#777s   B B>B93B>9B>c                    \        VR R4        ^ RIHp T! 4       R,          pTP                  RRR7       TR ,          pTR8X  d   TR	,          pMTR
8X  d   TR,          pM\        T R4      # TP                  TR,          RR7       \        T RRR TR\        T4      /4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i  \         d'    \        P                  ! 4       R,          R,          p Li ; i)sectionr   Nr  r  r  Try  r
  r  r  r	  z"section must be "memory" or "user"r_   r`   rk   r   )r   r   r   r   r  r   r   r   r  r|  rv  r   )r  rK  r  r   r  r  r(  s   &&     rK   rv  rv  `  s    	y)	,77(*Z7 MM$M.9oG(;&	F	9$7@AA
d9o8WtT9gvs6{KLL 73wA#777  7))+	)J67s.   B" C "C-CCC.D ?D c           	         \        VR4       \        TR,          4      p\        P
                  ! T4      pT'       d4   \        T RTP                  4       RTP                  RR/,          RR/4      # \        T4      pT'       g   \        T R	R
4      # \        TR4      pRpRp\        4        F6  p	T	R,          T8X  g   K  T	P                  R4      pT	P                  RR4      p M	  \        Y6YWTR7      p
RT
n        Y:n        T
P!                  4        \        T RT
P                  4       RTRR/,          RR/4      #   \         d    p\        T \        T4      4      u Rp?# Rp?ii ; i)z1Import a single CLI session into the WebUI store.rr   Nrx   ry   r   TimportedFzSession not found in CLI storer   r|   r   r   r~   )r   )r   r   r   r   r#   r  r   r   ry   r.   r'   r-   r   r,   r   _cli_originr\  )r  rK  r  r  existingr  r{   r~   r   r  r   s   &&         rK   r  r  t  so   $l# d< 
!C ||C H9h&6&6&8))d<
 '
 u  	 $C(D7<cBB t]+EE G ls"ffY'GFF7I.E	 ! 	3tGDAAMFFHW199;d"
 
 	D  E  $7CF##$s   D9 9E#EE#E#c           
        V'       d   \        V\        4      '       g   \        V R4      # VP                  R4      p\        V\        4      '       g   \        V R4      # VP                  RR4      pVP                  R\        \        4      4      pVP                  R\        4      p\        VVP                  RR	4      4      p\        W4VVVP                  R
. 4      VR7      pVP                  RR4      Vn
        \        ;_uu_ 4        V\        VP                  &   \        P                  ! VP                  4       \        \        4      \         8  d   \        P"                  ! RR7       K1   RRR4       VP%                  4        \'        V RRRVP)                  4       RVP*                  /,          /4      #   + '       g   i     LQ; i)zIImport a session from a JSON export. Creates a new session with a new ID.z"Request body must be a JSON objectry   z$JSON must contain a "messages" arrayr{   zImported sessionr}   r~   r,  rs   rz   )r{   r}   r~   ry   rz   r,  r   F)r   Nrk   Trx   )r   r   r   r   r  r   r   r   r   r#   r   r   r	   rr   move_to_endr   r
   popitemr\  r   r   ry   )r  rK  ry   r{   r}   r~   r,  r   s   &&      rK   r  r    s[   z$--7@AAxx
#Hh%%7BCCHHW01Ec*;&<=IHHWm,E-#R( 	88L"-)		A xx%(AH	!"Q\\*(ml*%( + 

 FFHWtT9aiikZ<T.TUVV 
s   A%F55G	c                    ^ RI HpHp ^ RIHpHp ^ RIpV! 4        V! 4       pV! 4       pV! 4       pVP                  R/ 4      p	\        V	\        4      '       d   T	p
RpRpMR\        V	\        4      '       d8   V	P                  RR4      p
V	P                  RR4      pV	P                  RR4      pMR;p
;rVP                  R	/ 4      pVP                  R
^<4      pVP                  RR4      ;'       g    RpVP                  RR4      pVP                  R/ 4      p. p\        V\        4      '       d   VP                  4        F  w  ppRp\        V\        4      '       dj   VP                  RVP                  RVP                  RR4      4      4      p\        V\        4      '       d!   \        V4      ^<8  d   VR,          R,           pM8\        V\        4      '       d#   VR,          \        V4      ^<8  d   RMR,           pVP                  RVRV/4       K  	  VP                  R/ 4      pVP                  R. 4      pVP                  R/ 4      pVP                  R. 4      pVP                  R/ 4      pVP                  RR4      p\        V4      pVP                  R. 4      p\        V RVRV
RVRVR
VRVRVRVRVRVRVRVRVR. RO/4      # ) zBRead the active profile's config.yaml and .env as editable fields.)r   r   r   r   Nr~   rs   defaultr2  r3  r   	max_turnsr/  r,  r   r   r0  :N<   Nr   r   platform_toolsetsr  r   external_dirsdisplayr9  custom_providersprofile_namedisplay_personalitycli_toolsetsenv_varsall_toolsets)browserclarifycode_executioncronjob
delegationr   	image_genr
  session_searchr   terminaltodowebwebhook)r   r   r   r  r   r   yamlr   r   r   r   r   r   r   _read_env_for_uir   )r  r   r   r   r   r  cfgprofile_dirr  	model_cfg	model_strprovider_strbase_url_strr   r  r/  r,  r   personality_listr   valr  toolsets_cfgr  
skills_cfgr  display_cfgr  r  r  s   &                             rK   r  r    s   4L O
,C(*K*,L $I)S!!		It	$	$MM)R0	 }}Z4 }}Z4244	4LGGGR E		+r*IIIor288bMyy!3R8IIor2M-&&&,,.ID#D#t$$ww}cggoswwxY[G\.]^dC((SY^9u,DC%%3xCHrM5rB##VT=$$GH / 77.3L##E2.L 2&JNN?B7M '')R(K%//-<  ,H ww126WLLY,)2H, 
  rM   c                0    V ^8  d   QhR\         R\        /# )rX   r  rY   )r   r  )r\   s   "rK   r]   r]     s     & &$ &4 &rM   c                   V R,          p. ROp/ pVP                  4       '       d    VP                  4       P                  4        F  pVP                  4       pV'       g   K  VP	                  R4      '       d   K6  RV9   g   K?  VP                  R^4      w  rVVP                  4       P                  R4      P                  R4      W5P                  4       &   K  	  . pV F{  pW9   dZ   W8,          p	\        V	4      ^8  d%   R\        V	4      ^,
          ,          V	RR ,           p
MRp
VP                  R	VR
V	RV
RR/4       Kb  VP                  R	VR
RRRRR/4       K}  	  V#   \         d     Li ; i)zDRead .env and return known API key env var names with masked values..env#="'u   •Nu   ••••r   r  masked	has_valueTrs   F)OPENROUTER_API_KEYOPENAI_API_KEYANTHROPIC_API_KEYANTHROPIC_TOKENGOOGLE_API_KEYDEEPSEEK_API_KEYKIMI_API_KEYMISTRAL_API_KEYMINIMAX_API_KEYMINIMAX_CN_API_KEYZAI_API_KEYGLM_API_KEYHERMES_API_KEYHERMES_OPENAI_API_KEYLOCAL_API_KEYBLOCKRUN_API_KEYELEVENLABS_API_KEYBROWSERBASE_API_KEYBROWSERBASE_PROJECT_IDFIRECRAWL_API_KEYTELEGRAM_BOT_TOKENDISCORD_BOT_TOKENSLACK_BOT_TOKENSIGNAL_PHONE_NUMBER)	r  r   
splitlinesr[  r   splitr`  r   r   )r  env_path
known_keysr"  linerJ   r[  r  r   r  r  s   &          rK   r  r    sE   V#HJ D	 **,779zz|4 4 4::c1-DA&'ggiooc&:&@&@&EDO	 : F;)C3x!|#c(Q,/#bc(:'MM5#wXv{TXYZMM5#wHb+uUV  M  		s$   6E "E ;E AE E-,E-c           	        ^ RI Hp ^ RIHpHp ^ RIpVP                  R4      RJ d   \        V RR4      # V! 4       pVR,          pVR	,          p/ p	VP                  4       '       d+    VP                  VP                  4       4      ;'       g    / p	R
p
RV9   d   VR,          pVP                  RR4      pVP                  RR4      pV	P                  R/ 4      p\        V\        4      '       d   RV/pM\        V\        4      '       g   / p\        V4      pV'       g   V'       g	   V'       dI   V'       d   WR&   Ve   V'       d   WR&   M
RV9   d   VR Ve   V'       d   WR&   M
RV9   d   VR WR&   Rp
RV9   g   RV9   g   RV9   d   V	P                  R/ 4      p\        V\        4      '       g   / pRV9   d    \        VR,          4      VR&   Rp
RV9   d   VR,          ;'       g    RVR&   Rp
RV9   d   VR,          ;'       g    RVR&   Rp
V
'       g   RV	9  d   VV	R&   RV9   dH   V	P                  R/ 4      p\        V\        4      '       g   / pVR,          ;'       g    RVR&   VV	R&   Rp
RV9   dV   VR,          p\        V\$        4      '       d7   V	P                  R/ 4      p\        V\        4      '       g   / pVVR&   VV	R&   Rp
V
'       dB    VP'                  VP)                  V	R
R
RR7      4       \+        RV! 4        2RR7       V! 4        RV9   d;   VR,          p\        V\        4      '       d   \-        VV4        ^ RIHp V! V4       \1        V R RR!V! 4       /4      #   \         d    / p	 ELi ; i  \         \"        3 d     ELi ; i  \         d   p\        T RT 24      u Rp?# Rp?ii ; i  \         d     Lui ; i)"zEWrite config changes to the active profile's config.yaml and/or .env.r   r  NbusyTz+Cannot change config while agent is runningr?  zconfig.yamlr  Fr~   r2  rs   r3  r  r  r/  r,  r   r  r  r9  r  r  r  )default_flow_style	sort_keysallow_unicodez([webui] config.yaml updated for profile r4  zFailed to write config.yaml: env_updates)_reload_dotenvrk   r   )r   r   r  r   r   r  r   r   r  	safe_loadr   r`  r   r   r   rb  r   r  r  rv  dumprL  _write_env_changesr  r   )r  rK  r   r   r   r  r  config_pathr  r  changed	model_valprovider_valbase_url_valcurrent_model	new_modelr   disptoolsetsptr  r  r  s   &&                     rK   r{  r{  A  s   (Lxx47I3OO(*K-KV#H C	..!6!6!89??RC G $M	xx
B/xx
B/ ,mS))&6MM400M'	'0)$',8j)9,!*-',8j)9,!*-$LG do59Kt9S$%&&E$%(k):%;k" d"%)/%:%@%@bE/"G%(,-?(@(F(FBE$%GgS( CL $wwy"%$%%D"#89??R]I 'h%%,b1Bb$'' BuI')C#$G 	E""499SUV[ko9#pq<=T=V<WX`deO
 =)k4((x57{+ WtT9.E.GHIIA  	C	X 	* J  	Ew"?s CDD	E  s[   '%M/ M/ =N A N O /N ?N NNN?&N:4N?:N?OOc                0    V ^8  d   QhR\         R\        /# )rX   r  rd  )r   r   )r\   s   "rK   r]   r]     s     "L "L "L "LrM   c                P   \        VP                  4       4      p. pV P                  4       '       d     V P                  4       P	                  4       p\        4       p. pV F  pVP                  4       pV'       d   VP                  R4      '       g{   RV9   dt   VP                  R^4      ^ ,          P                  4       pW9   dG   VP                  V4       W,          p	V	e   V	R8X  d   K  V	'       d   VP                  V RV	 24       K  VP                  V4       K  	  VP                  4        F-  w  rW9  g   K  V	'       g   K  VP                  V RV	 24       K/  	  T P                  RP                  V4      V'       d   RMR,           4       R#   \
         d    . p ELSi ; i)zVAdd/modify/remove env vars in a .env file while preserving comments and unknown lines.r  r  Nrs   r3  )setr  r  r   r  r`  r[  r   r  addr   r   rv  r]  )
r  rd  r  lines	seen_keys	new_linesr  strippedr   r  s
   &&        rK   r  r    s[   W\\^$JE	&&(335E
 II::<H//44..a(+113C c"l;#)$$uAcU^4   MMOCCuAcU^, $ 		),	rJK7  	E	s   F F%$F%rF   )__doc__r  r   r   rH  r  sysr#  r   r|  pathlibr   r  r   hermes_constantsr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   api.helpersr   r   r   r   r    r!   r"   ra  r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r   r/   r0   r1   r2   r3   r4   r5   
api.uploadr6   rM  r7   r8   r9   r:   tools.approvalr;   r<   r=   r>   r?   r@   rA   rB   rC   rD   r   Lockr  r   r)  r  r   r   r   r   r   r   r   r   r   r   r   r  rZ  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  r  r  r  r  r{  r  rG   rM   rK   <module>r     s     	  
     ! 3       W V V      % c c   &2 lxzAL0 P:)48	R)D>&?@(8*L>]@90>M..KKKT&
T7776&Q(	:M(,^W@Rj&RrJj"LQ4  
 'K&K)N*O,3&KHNNE%
 s   :E 6FF