
    ri                    <   d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< dd	l=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD dd
lEmFZF ddlGmHZHmIZImJZJmKZK 	 ddlLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZV n;# eW$ r3 d ZMd ZNd ZOd ZPd ZQd ZRd ZSi ZT ejX                    ZU eY            ZVY nw xY wdZZde[fdZ\de[fdZ]d Z^d Z_d Z`d Zad Zbd Zcd Zdd Zed  Zfd! Zgd" Zhd# ZidCd%Zjd& Zkd' Zld( Zmd) Znd* Zod+ Zpd, Zqd- Zrd. Zsd/ Ztd0 Zud1 Zvd2 Zwd3 Zxd4 Zyd5 Zzd6 Z{d7 Z|d8 Z}d9 Z~d: Zd; Zd< Zd=edefd>Zd? Zd@edAefdBZdS )Dz
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                      dS )NF aks     '/home/ubuntu/hermes-webui/api/routes.py<lambda>rL   /   s    %     c                      d S NrG   rH   s     rK   rL   rL   0       $ rM   c                      d S rO   rG   rH   s     rK   rL   rL   1   s    T rM   c                      d S rO   rG   rH   s     rK   rL   rL   2   s    d rM   c                      d S rO   rG   rH   s     rK   rL   rL   3   s     rM   c                      d S rO   rG   rH   s     rK   rL   rL   4   s    t rM   c                      dS )NTrG   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>returnc                 *  3 |j         dv r%t          | t          j        d          d          S |j         dk    rt	          j        t                                          d          pd          }t          	                    d	|          	                    d
|d         
                                          }t          | |d          S |j         dk    rVddlm}m}m} d} |            r% ||           }t          |o
 ||                    }t!          |  |            |d          S |j         dk    r+|                     d           |                                  dS |j         dk    rt&          5  t)          t*                    }	ddd           n# 1 swxY w Y   t!          | dt)          t,                    |	t/          t1          j                    t2          z
  d          d          S |j         dk    rt!          | t5                                S |j         dk    r4t                      }
|
                    dd           t!          | |
          S |j                             d          rt;          | |          S |j         dk    rt=          |j                                      ddg          d         }|st!          | dd id!"          S 	 tA          |          }t!          | d#|!                                |j"        tG          |d$g           d%z  i          S # tH          $ r tK          |          }|rd}tM                      D ]}|d         |k    r|} n||pi                     d&d'          |pi                     d(d          |pi                     d)d*          t)          |          |pi                     d+d          |pi                     d,d          ddd|pi                     d-          d|g d.}t!          | d#|i          cY S tO          | d/d0          cY S w xY w|j         d1k    rtQ                      }t                      }
|
                    d2          r)tM                      }d3 |D             33fd4|D             }ng }||z   }|)                    d5 d6           t!          | |t)          |          d7          S |j         d8k    rt!          | d9tU                      i          S |j         d:k    rtW          | |          S |j         d;k    r+t!          | tY                      t[                      d<          S |j         d=k    rt]          | |          S |j         d>k    rt_          | |          S |j         d?k    rdd@l0m1}  |             ddAl0m2}  |            }|                    dBi           }|                    dCi           }g }tg          |th                    r|5                                D ]\  }}d}tg          |th                    r|                    dDd          }n7tg          |tl                    r"|ddE         t)          |          dEk    rdFndz   }|7                    ||dG           t!          | dC|i          S |j         dHk    rt=          |j                  }|                    ddg          d         }|stO          | dI          S 	 tA          |          }n!# tH          $ r tO          | d/d0          cY S w xY wddJl8m9}  |tu          |j;                            } t!          | dK| i          S |j         dLk    rt                      }
|
                    dMd          st!          | dNdi          S t=          |j                  }|                    dOdPg          d         dQk    }!|                    dRdPg          d         dQk    r1| j<        d         dSk    r t!          | dTdUdVdWdXdYdBddZd[dXdYdd\          S dd]l=m>}" t!          |  |"|!^                    S |j         d_k    rIt=          |j                                      d`dg          d         }#t!          | |#t*          v |#da          S |j         dbk    rdt=          |j                                      d`dg          d         }#|#stO          | dc          S t          |#          }$t!          | d|$|#dd          S |j         dek    rt          | |          S |j         dfk    rt          | |          S |j         dgk    rt          | |          S |j         dhk    rt          | |          S |j         dik    r5| j<        d         dSk    rt!          | ddjid0"          S t          | |          S |j         dkk    r"ddllEmF}% t!          | dm |%dn          i          S |j         dok    rt          | |          S |j         dpk    rt          | |          S |j         dqk    raddrlImJ}&  |&            }'tg          |'tl                    rt          jL        |'          n|'}(t!          | ds|(                    dsg           i          S |j         dtk    rddulImM})mN}* t=          |j                  }|                    dvdg          d         }|st!          | ddwid!"          S |                    dxdg          d         }+|+r0ddlO},|,P                    dy|          rtO          | dzd!          S d}-|*Q                    |          D ]}.|.R                                r|.}- n|-stO          | d{d0          S |-|+z  S                                }/|/T                    |-S                                           n!# t          $ r tO          | d|d!          cY S w xY w|/V                                r|/W                                stO          | d}d0          S t!          | |/                    d          |+d~          S  |)|          }'tg          |'tl                    rt          jL        |'          n|'}(d|(vri |(d<   t!          | |(          S |j         dk    rt          |           S |j         dk    r+ddlYmZ}0m[}1 t!          |  |0             |1            d          S |j         dk    r8ddlYm[}1m\}2 t!          |  |1            tm           |2                      d          S |j         dk    rt          |           S dS )z>Handle all GET routes. Returns True if handled, False for 404.)/z/index.htmlutf-8encodingztext/html; charset=utf-8)content_typez/loginbot_nameHermesz{{BOT_NAME}}z{{BOT_NAME_INITIAL}}r   z/api/auth/status)is_auth_enabledparse_cookieverify_sessionF)auth_enabled	logged_inz/favicon.ico   Tz/healthNok   )statussessionsactive_streamsuptime_secondsz/api/models/api/settingspassword_hash/static/z/api/session
session_id errorsession_id is required  rg   session
tool_calls)messagesru   titleCLI Session	workspacemodelunknown
created_at
updated_atprofile)rn   rw   ry   rz   message_countr|   r}   pinnedarchived
project_idr~   is_cli_sessionrv   ru   Session not found  z/api/sessionsshow_cli_sessionsc                     h | ]
}|d          S rn   rG   ).0ss     rK   	<setcomp>zhandle_get.<locals>.<setcomp>   s    AAAQ<AAArM   c                 (    g | ]}|d          v|S r   rG   )r   r   	webui_idss     rK   
<listcomp>zhandle_get.<locals>.<listcomp>   s'    NNNQ|_I-M-M1-M-M-MrM   c                 2    |                      dd          pdS )Nr}   r   )get)r   s    rK   rL   zhandle_get.<locals>.<lambda>   s    !%%a"8"8"=A rM   )keyreverse)rh   	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descriptionP   ...namer   z/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   abc1234def5678master)r   behindcurrent_sha
latest_shabranchaaa0001bbb0002)r   r   
checked_at)r   )r   z/api/chat/stream/status	stream_id)activer   z/api/chat/cancelzstream_id required)re   	cancelledr   z/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_DIRr   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)profilesr   z/api/profile/active)r   get_active_hermes_home)r   r   /api/profile/config)^r   r!   r   	read_text_htmlescaper   r   _LOGIN_PAGE_HTMLreplaceupperapi.authr_   r`   ra   boolr    send_responseend_headersr   lenr   r
   roundtimer   r   pop
startswith_serve_staticr   queryr%   compactrv   getattrKeyErrorr/   r.   r   r'   sortr+   _handle_session_exportr0   r2   _handle_sessions_search_handle_list_dir
api.configr   r   
isinstancedictitemsstrappendapi.workspacer   r   ry   client_addressapi.updatesr   r:   _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_pager_   r`   ra   rc   cv	n_streamssettingssidr   msgscli_metacssesswebui_sessionscli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   r   s4                                                      @rK   
handle_getr+  r   s    {****4gFFF8: : : 	: {hl=??..z::FhGG ((==EEF\^abc^d^j^j^l^lmm%.HIIII{(((JJJJJJJJJJ	? 	8g&&BR6NN2$6$677I??+<+<9UUVVV{n$$c"""G$7$7$9$9$9$${i33s7||9333333333333333H'#DIKK2C$CQGG
 
   	 {m##.00111{o%% ??_d+++(###{j)) .Wf---{n$$v|$$((t<<Q? 	OWw(@A#NNNN 	:C  AWy!))++J%ar::9 9 +      	: 	: 	:+C00D 5*,,  B,'3..#% / #&&n"11'=II"*.b!5!5k2!F!F&n"11'9EE%(YY#+>r"6"6|Q"G"G#+>r"6"6|Q"G"G# %"& (B33I>>&* $"$   9d"344444w 3S999995	:8 {o%%% ??<<+,, 	"$$CAA.AAAINNNNcNNNKKK+-==tLLLvC<L<LMMNNN{o%%:}7888{+++%gv666{'''):):DVDXDXYYZZZ{,,,&w777{k!!000{*** 	<;;;;;555555xzzHHWb))	%MM/2>>'.. 	J06688 J JeeT** K 99]B77DDs++ K ":#e**r//rJD$$d4%H%HIIII?M:;;;{o%%fl##ff\B4((+ 	7w 5666	:C  AA 	: 	: 	:w 3S99999	:888888%%d1;&7&7885$-((({*** ??||/66 	2Wz40111fl##w&&q)S066*se$$Q'3..73I!3LP[3[3[W")Qy`iu}~~")Qy`iu}~~    
 	211111++%888999{///V\**..{RDAA!D	Y'%9	RRSSS{(((V\**..{RDAA!D	 	6w 4555!),,	IIVVWWW{(((!'6222{o%%000{k!! &111{---'888{111!!$33Ww4SAAAA&w777 {l""''''''699d#C#C#CDEEE{)))"7F333{)))"7F333 {m##AAAAAAlnn",S#"6"6?tz#C8TXXh%;%;<==={+++KKKKKKKKfl##vvfrd##A&NAg'A#NNNNFF6B4((+	 	bzz+t,, ?7$8#>>>I%%d++ 4 488::31yee3IS2CS%I%II)+4466F##I$5$5$7$78888LLLc'3F&L&LLLLL==?? ;&..*:*: ;7$4c:::W&*:*:G*:*L*LV_``aaak$",S#"6"6?tz#C%%btN';$ {m##"7+++ {o%%KKKKKKKK'8'8':':F]F]F_F_``aaa{+++PPPPPPPP#:#:#<#<cJ`J`JbJbFcFcddeee {+++*73335sP   2FFFAL C1P"P"!P" [0 0\\.'n n43n4c                 .  * |j         dk    rt          |           S t          |           *|j         dk    r*                    d          }t	          *                    d          |t          |pt          *                    dd                              }t          | d|                                d	|j	        iz  i          S |j         d
k    rt          | *d          S |j         dk    rt          | *d          S |j         dk    rt          *dd           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt          *d                   }n!# t           $ r t          | dd          cY S w xY wt          *d                                                   dd         pd|_        |                                 t          | d|                                i          S |j         dk    rCt          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wd*vrt          | d          S *d         }*d                                         }	 t          |          }n!# t           $ r t          | dd          cY S w xY wd}|rYddlm}  |             ddlm}	  |	            }
|
                    di           }|                    di           }t/          |t0                    r||vrt          | d| d d          S ||         }t/          |t0                    r|                    d!d          p|                    d"d          g}|                    d#          r|                    d$|d#                     |                    d%          r|                    d&|d%                     d'                    d( |D                       }nt          |          }|r|nd|_        |                                 t          | d|j        |d)          S |j         d*k    rt          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt          *d                   }n!# t           $ r t          | dd          cY S w xY wt          t9          *                    d|j                                                                                                      }*                    d|j                   }||_        ||_         t          |*                    d|j!        pd                    |_!        |                                 tE          |           t          | d|                                d	|j	        iz  i          S |j         d+k    r*                    dd          }|st          | d,          S tF          5  tI          j%        |d           ddd           n# 1 swxY w Y   tL          | d-z  }|'                    d.           n# tP          $ r Y nw xY wtS          j'        d.           n# tP          $ r Y nw xY w	 dd/l*m+}  ||           n# tP          $ r Y nw xY wt          | d0di          S |j         d1k    rt          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt          *d                   }n!# t           $ r t          | dd          cY S w xY wg |_	        g |_,        d|_        |                                 t          | d|                                d2          S |j         d3k    rt          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY w*                    d4          t          | d5          S t          *d                   }n!# t           $ r t          | dd          cY S w xY wt[          *d4                   }|j	        d|         |_	        |                                 t          | d|                                d	|j	        iz  d2          S |j         d6k    rt]          | *          S |j         d7k    rt_          | *          S |j         d8k    rta          | *          S |j         d9k    rtc          | *          S |j         d:k    rte          | *          S |j         d;k    rtg          | *          S |j         d<k    rti          | *          S |j         d=k    rtk          | *          S |j         d>k    rtm          | *          S |j         d?k    rto          | *          S |j         d@k    rtq          | *          S |j         dAk    rts          | *          S |j         dBk    rtu          | *          S |j         dCk    rtw          | *          S |j         dDk    rty          | *          S |j         dEk    rt{          | *          S |j         dFk    rt}          | *          S |j         dGk    rt          | *          S |j         dHk    rt          | *          S |j         dIk    rt          | *          S |j         dJk    rȉ*                    dd                                          }|st          | dK          S 	 ddLlBmC}  ||          }t          | |          S # t          t          f$ r(}t          | t          |          d          cY d}~S d}~wt          $ r(}t          | t          |          dM          cY d}~S d}~ww xY w|j         dNk    rL*                    dd                                          }|st          | dK          S ddlF}|G                    dO|          st          | dP          S *                    dQ          }|Gt          |                                          }|G                    dO|          st          | dR          S 	 ddSlBmH}  |||t          *                    dTd                    U          }t          | d|dV          S # t          t          t          f$ r'}t          | t          |                    cY d}~S d}~ww xY w|j         dWk    rǉ*                    dd                                          }|st          | dK          S 	 ddXlBmK}  ||          }t          | |          S # t          t          f$ r'}t          | t          |                    cY d}~S d}~wt          $ r(}t          | t          |          dM          cY d}~S d}~ww xY w|j         dYk    rt          | *          S |j         dZk    rgd[*v r.t          *d[                   pd                                pd\*d[<   t          *          }|%                    d]d           t          | |          S |j         d^k    rt          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt          *d                   }n!# t           $ r t          | dd          cY S w xY wt          *                    d_d                    |_N        |                                 t          | d|                                d2          S |j         d`k    rt          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt          *d                   }n!# t           $ r t          | dd          cY S w xY wt          *                    dad                    |_O        |                                 t          | d|                                d2          S |j         dbk    rt          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt          *d                   }n!# t           $ r t          | dd          cY S w xY w*                    dc          pd|_P        |                                 t          | d|                                d2          S |j         ddk    r5t          *d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wddlF}*d                                         dde         }|st          | df          S *                    dg          }|r&|G                    dh|          st          | di          S t                      }t          jS                    jT        ddj         ||t          jU                    dk}|                    |           t          |           t          | d|dl          S |j         dmk    rt          *dcd           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wddlF}t                      }t          *fdn|D             d          }|st          | dod          S *d                                         dde         |d<   dg*v r5*dg         }|r&|G                    dh|          st          | di          S ||dg<   t          |           t          | d|dl          S |j         dpk    rct          *dc           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt                      }t          *fdq|D             d          }|st          | dod          S *fdr|D             }t          |           tS          jX                    r	 t          jZ        tS          j[        dst                    }|D ]c}|                    dc          *dc         k    rB	 t          |d                   }d|_P        |                                 S# tP          $ r Y _w xY wdn# tP          $ r Y nw xY wt          | d0di          S |j         duk    rt          | *          S |j         dvk    rI*                    dwd          }|dxvrt          | dy          S ddzl]m^}  t          |  | |                    S |j         d{k    rt          | *          S |j         d|k    rdd}l`ma}!mb}"mc}#md}$  |$            st          | dd~d          S *                    dd          }% |!|%          st          | dd          S  |"            }&| e                    d           | f                    dd           | f                    dd           t          |             |#| |&           | h                                 | ji        j                    t          jk        d0di          l                                           dS |j         dk    rddl`mm}'mn}(mo})  |)|           }&|&r |(|&           | e                    d           | f                    dd           | f                    dd           t          |             |'|            | h                                 | ji        j                    t          jk        d0di          l                                           dS dS )z?Handle all POST routes. Returns True if handled, False for 404.z/api/uploadz/api/session/newrz   ry   reasoning_effortro   )ry   rz   r-  rt   rv   z/api/sessions/cleanupF)	zero_onlyz"/api/sessions/cleanup_zero_messageTz/api/session/renamern   rw   Nr   r   r   Untitledz/api/personality/setr   zMissing required field: namer   r   r   r   r   zPersonality "z" not found in config.yamlsystem_promptprompttonezTone: stylezStyle: 
c              3      K   | ]}||V  	d S rO   rG   r   r)  s     rK   	<genexpr>zhandle_post.<locals>.<genexpr>  s'      "9"9q"91"9"9"9"9"9"9rM   )re   personalityr1  z/api/session/updatez/api/session/deleterq   z.json
missing_ok)delete_cli_sessionre   z/api/session/clearre   rt   z/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  re   r~   z/api/profile/delete)delete_profile_apir   rk   r]   r^   rl   z/api/session/pinr   z/api/session/archiver   z/api/session/mover   z/api/projects/create   r   colorz^#[0-9a-fA-F]{3,8}$zInvalid color format   )r   r   rF  r|   )re   projectz/api/projects/renamec              3   @   K   | ]}|d          d          k    |V  dS r   NrG   r   r)  bodys     rK   r7  zhandle_post.<locals>.<genexpr>  6      RR1AlOtL?Q,Q,QQ,Q,Q,Q,QRRrM   zProject not foundz/api/projects/deletec              3   @   K   | ]}|d          d          k    |V  dS rJ  rG   rK  s     rK   r7  zhandle_post.<locals>.<genexpr>  rM  rM   c                 8    g | ]}|d          d          k    |S )r   rG   rK  s     rK   r   zhandle_post.<locals>.<listcomp>  s,    QQQ!1\?d<>P+P+PA+P+P+PrM   rY   rZ   z/api/session/importz/api/updates/applyr*  )r   r   z!target must be "webui" or "agent")apply_updatez/api/session/import_cliz/api/auth/login)verify_passwordcreate_sessionset_auth_cookier_   zAuth not enabled)re   messagepasswordzInvalid passwordi     Content-Typezapplication/jsonCache-Controlno-storez/api/auth/logout)clear_auth_cookieinvalidate_sessionr`   )pr   r7   r"   r   r&   r   r	   r    r   rv   _handle_sessions_cleanupr   r  r   r   r%   r   striprw   saver   r   r   r   r   r   joinr8  r   ry   
expanduserr  rz   r-  r3   r   r
   r   r   unlink	Exceptionr*   
api.modelsr;  ru   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   FileExistsErrorrD  _handle_profile_config_writer   r   r   r   r+   uuiduuid4hexr   r,   nextr  r   r   r   _handle_session_importr   rP  _handle_session_import_clir   rQ  rR  rS  r_   r   send_headerr#   r   wfilewritedumpsencoderZ  r[  r`   )+r	  r
  rz   r   er  r   r1  _reload_cfg2	_get_cfg2_cfg2r  r  r  partsnew_wsr)  r;  keepr>  resultr'  r@  rA  rD  savedrF  r   projindexentryr*  rP  rQ  rR  rS  r_   rU  
cookie_valrZ  r[  r`   rL  s+                                             @rK   handle_postr  o  s    {m##W%%%WD{(((!!hh{++3&+R00 
 
 
 9aiikkZ4L&LMNNN{---'GGGG{:::'FFFF{+++T<1111;;;s7CFF';'; ; ; ; ; ; ;;T,/00QQFFFG-@# F FFFFFd7m$$**,,SbS1?Z	9aiikk2333{,,,T<((((;;;s7CFF';'; ; ; ; ; ; ;;w >???< F|!!##	:C  AA 	: 	: 	:w 3S99999	:  	$@@@@@@LNNN::::::IKKE		'2..I )or B B/66 [$FW:W:W7$TD$T$T$TVYZZZ%d+E%&& $?B77R599Xr;R;RS99V$$ ;LL!9%-!9!9:::99W%% =LL!;5>!;!;<<<"9"9e"9"9"999U $.$	amvVVWWW{+++T<((((;;;s7CFF';'; ; ; ; ; ; ;;T,/00QQFFFG-@# F FFFFFT$((;<<==HHJJRRTTUU!'**3HH');)ArBB
 
 	
6"""9aiikkZ4L&LMNNN{+++hh|R((A3w(@AAA**8<T******************S---'XXX&&&&$$&$77777$$	555555s####$$4,'''{***T<((((;;;s7CFF';'; ; ; ; ; ; ;;T,/00QQFFFG-@# F FFFFF
jAG!&&(((!))++>>???{---T<((((;;;s7CFF';'; ; ; ; ; ; ;;88L!!)w GHHHT,/00QQFFFG-@# F FFFFF4%&&Z&
!))++QZ@X2XYYZZZ{'''!'4000{k!! $/// {)))"7D111{)))"7D111{)))"7D111{&&&...{(((!'4000{)))"7D111 {((("7D111{&&& $///{((("7D111{((("7D111{,,,!'4000 {+++$Wd333{...'666{...'666 {---'666 {(((!'4000{***#GT222 {)))#GT222 {+++xx##))++<C);<<<	-333333#^D))FWf%%%-. 	- 	- 	-wA,,,,,,,, 	- 	- 	-wA,,,,,,,,	- {+++xx##))++<C);<<<yy6== 	ow mnnnXXl++
!Z..00J99:JGG ?7$=>>>		(777777''%!$((>5"A"ABB  F
 WTf==>>>O\: 	( 	( 	(wA''''''''	( {+++xx##))++<C);<<<	-777777''--FWf%%%-. 	( 	( 	(wA'''''''' 	- 	- 	-wA,,,,,,,,	- {++++GT::: {o%% #D$4 5 5 ;BBDDPDd##		/4(((%    {(((T<((((;;;s7CFF';'; ; ; ; ; ; ;;T,/00QQFFFG-@# F FFFFF40011	!))++>>??? {,,,T<((((;;;s7CFF';'; ; ; ; ; ; ;;T,/00QQFFFG-@# F FFFFF$((:t4455
	!))++>>??? {)))T<((((;;;s7CFF';'; ; ; ; ; ; ;;T,/00QQFFFG-@# F FFFFFxx--5	!))++>>??? {,,,T6"""";;;s7CFF';'; ; ; ; ; ; ;;F|!!##DSD)9C999!! 	8#95AA 	8w 6777 ??"jll.ss3TEaeajalalmmh$77888{,,,T<0000;;;s7CFF';'; ; ; ; ; ; ;; ??RRRRRRRTXYYBC)<cBBBF|))++DSD1Vd??ME <SYY'=uEE <7$:;;;!DMh$77888{,,,T<((((;;;s7CFF';'; ; ; ; ; ; ;; ??RRRRRRRTXYYBC)<cBBBQQQQxQQQh$&& 	
#5#?#Q#Q#QRR" ! !Eyy..$|2DDD! +E,,? @ @A+/ALFFHHHH( ! ! ! D! E!    4,''' {+++%gt444 {***(B''+++w CDDD,,,,,,,,v../// {///)'4888 {'''^^^^^^^^^^^^   	KWT6HIIJJJ88J++x(( 	9w 2C888#^%%
c"""N,>???OZ888'""",,,DJd|44;;==>>>t{(((PPPPPPPPPP!\'**
 	+z***c"""N,>???OZ888'"""'"""DJd|44;;==>>>t5s  D 
E(E
E
EE( (FFH 
II :I I?J J-,J-Q# #
R-R	RRR- -S
SX--X14X1Y 
Y)(Y),Z 
ZZZ% %
Z21Z2[# #
\-\	\\\- -]
](^9 9
_*_%_*%_*`( (aa l8 8n!	m,&n!,n!9nn!n!3Ar; ;s9s4.s94s9 u# #w4vww#w ww&y7 7
z(z#z(#z(+{ {{} 
~)~~~~) )@6AA A
AA8AAA3A-AA8A3AA8A;AB BAB/B.AB/DAD$ D$
AED.AEE
AEEAEIAI& I&
AJI0AJJAJJAJM'AM8 M8
AN)NAN$NAN)N$AN)PA
AR( Q%0ARRAR( R
AR#R AR( R"AR#R#AR( R(
AR5R4AR5c                    t          t                    j        j        dz                                  }|j        t          d          d          }||z                                  }	 |                    |           n$# t          $ r t          | ddid          cY S w xY w|	                                r|
                                st          | ddid          S |j                                        }ddd	d
                    |                    d          d          }|                     d           |                     d| d           |                     dd           |                                }|                     dt%          t          |                               |                                  | j                            |           dS )Nstaticrm   rp   r   r   rs   ztext/csszapplication/javascriptz	text/html)cssjshtml.z
text/plainrV  rW  z; charset=utf-8rX  rY  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     s   >>(/(:CCEEK
+c*oo&&
'C$--//K>,,,, > > >7K0======> >{':':'<'< >7K0====


"
"
$
$C#;
 
"s3::c??LAA #2(>(>(>???444

 
 
"
"C(#c#hh--888M4s   (A> >BBc           
         t          |j                                      ddg          d         }|st          | d          S t	          |          }n!# t
          $ r t          | dd          cY S w xY wt          j        |j        dd	          }| 	                    d
           | 
                    dd           | 
                    dd| d           | 
                    dt          t          |                    d                                         | 
                    dd           |                                  | j                            |                    d                     dS )Nrn   ro   r   rq   r   r   F   )ensure_asciiindentrV  rW  zapplication/json; charset=utf-8Content-Dispositionzattachment; filename="hermes-z.json"r  rY   rX  rY  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
8
;C=s7$<===BBBC)<cBBBBBBj%BBBG#(IJJJ-/Zs/Z/Z/Z[[[(#c'..2I2I.J.J*K*KLLL444Mw//0004s   A A0/A0c                 X   t          |j                  }|                    ddg          d                                                                         }|                    ddg          d         dk    }t          |                    ddg          d                   }|st          | dt                      i          S g }t                      D ]8}||                    d	          pd                                v }|r%|                    t          |d	
                     U|r	 t          |d                   }	|r|	j        d |         n|	j        }
|
D ]}|                    d          pd}t          |t                    rd                    d |D                       }|t          |                                          v r&|                    t          |d
                      n # t           t"          f$ r Y 4w xY w:t          | ||t%          |          d          S )Nqro   r   r   r   depth5rh   rw   )
match_typern    c              3      K   | ]H}t          |t                    r1|                    d           dk    0|                    dd          V  IdS )typetextro   N)r   r   r   r6  s     rK   r7  z*_handle_sessions_search.<locals>.<genexpr>0  sh       %Y %Y1(21d(;(;%Y@AfQW@W@W &'UU62%6%6@W@W@W@W%Y %YrM   )rh   r   count)r   r   r   r  r]  rd  r    r'   r   r   r%   rv   r   listr_  r   r   rb  r   )r	  r
  r   r  content_searchr  resultsr   title_matchr  r  mcs                rK   r   r     sA   	&,		B
sRD!""$$**,,AVVIu--a0C7Nw&&q)**E=Qw\^^ <===G^^  AEE'NN0b77999 	NN4g666777 	"1\?3305Ht}VeV,,4=  Ai((.BA!!T** YHH %Y %Y %Y %Y %Y Y YCFFLLNN**tA)'D'D'DEEE + i(   	 W7QWNNOOOs   )CG11HHc           
      6   t          |j                  }|                    ddg          d         }|st          | d          S t	          |          }n!# t
          $ r t          | dd          cY S w xY w	 t          | t          t          |j	                  |                    ddg          d                   |                    ddg          d         d	          S # t          t          f$ r(}t          | t          |          d          cY d }~S d }~ww xY w)
Nrn   ro   r   rq   r   r   r   r  )entriesr   )r   r   r   r   r%   r   r    r4   r   ry   ry  r  r   )r	  r
  r   r  r   r  s         rK   r   r   :  s/   	&,		B
&&t
$
$Q
'C=s7$<===BBBC)<cBBBBBB)Q[ 1 1266&3%3H3H3KLLFF6C5))!,
 
   	 z* ) ) )7CFFC(((((((()s1   A A21A26A(C D0DDDc                    t          |j                                      ddg          d         }t          j        |          }|t	          | ddid          S |                     d           |                     d	d
           |                     dd           |                     dd           |                     dd           |                                  	 	 	 |                    d          \  }}nH# t          j	        $ r6 | j
                            d           | j
                                         Y `w xY wt          | ||           |dv rnzn# t          t          f$ r Y nw xY wdS )Nr   ro   r   rp   zstream not foundr   rs   rV  rW  z text/event-stream; charset=utf-8rX  zno-cachezX-Accel-Bufferingno
Connectionz
keep-aliveT   )timeouts   : heartbeat

)donerp   cancel)r   r   r   r   r    r   r  r   queueEmptyr  r  flushr8   BrokenPipeErrorConnectionResetError)r	  r
  r   r  eventr$  s         rK   r   r   I  s   &&**;==a@IIAy7W.@$A#NNNN#(JKKK444+T222l333		eeBe//tt;   ##$6777##%%% %&&&333		 12   4s7   E C8 7E 8AD=:E <D==E E,+E,c                 r   t          |j                  }|                    ddg          d         }|st          | d          S t	          |          }n!# t
          $ r t          | dd          cY S w xY w|                    ddg          d         }|                    ddg          d         d	k    }t          t          |j                  |          }|	                                r|
                                st          | d
did          S |j                                        }t          j        |d          }	|                                }
dd lm} |                    |j        d          }|                     d           |                     d|	           |                     dt-          t/          |
                               |                     dd           |r!|                     dd|j         d|            |                                  | j                            |
           dS )Nrn   ro   r   rq   r   r   r   downloadr   rp   r   rs   zapplication/octet-stream)saferV  rW  r  rX  rY  r  zattachment; filename="z"; filename*=UTF-8''T)r   r   r   r   r%   r   r   r   ry   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  s5   	&,		B
&&t
$
$Q
'C=s7$<===BBBC)<cBBBBBB
&&"

q
!CVVJ--a0C7N$q{++S11F==?? >&.."2"2 >7K0====
-



C<788D!!##I		&+B	//I#---(#c)nn*=*=>>>444 U1SV[SS	SS	U 	U 	UM	"""4s   A A21A2c                     t          |j                  }|                    ddg          d         }|st          | d          S t	          |          }n!# t
          $ r t          | dd          cY S w xY w|                    ddg          d         }|st          | d          S t          | t          t          |j	                  |                    S # t          t          f$ r(}t          | t          |          d          cY d }~S d }~ww xY w)	Nrn   ro   r   rq   r   r   r   path is required)r   r   r   r   r%   r   r    r5   r   ry   ry  r  r   )r	  r
  r   r  r   r  r  s          rK   r   r     s   	&,		B
&&t
$
$Q
'C=s7$<===BBBC)<cBBBBBB
&&"

q
!C7s7$6777',T!+->->DDEE	Ez*QQQGSVVS8Q8Q1Q1Q1Q1Q1Q1QQs0   A A21A2$/C D%DDDc                 H   t          |j                                      ddg          d         }t          |          rSt          5  t          t          j        |i                     }d d d            n# 1 swxY w Y   t          | d|i          S t          | dd i          S )Nrn   ro   r   pending)r   r   r   r<   rD   r   rC   r    )r	  r
  r  r)  s       rK   r   r     s    
6<
 
 
$
$\B4
8
8
;C3 * 	, 	,X\#r**++A	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,9a.)))Wy$'(((s   #A55A9<A9c                 V   t          |j                  }|                    ddg          d         }|                    ddg          d         }|                    ddg          d         }|r)t          ||||gdd	           t	          | d
|d          S t	          | ddid          S )zIInject a fake pending approval -- loopback-only, used by automated tests.rn   ro   r   pattern_keytest_patterncommandzrm -rf /tmp/testztest pattern)r  r  pattern_keysr   T)re   rn   rp   r   rr   rs   )r   r   r   r>   r    )r	  r
  r   r  r   cmds         rK   r   r     s    	&,		B
&&t
$
$Q
'C
&& 0
1
1!
4C
&&/0
1
1!
4C
 ;s3 E.
 
 	 	 	 S99:::Ww 56sCCCCrM   c                 H   ddl m} t          |j                  }|                    ddg          d         }t          |                    ddg          d                   }|st          | ddid	
          S ||z  }g }|                                r~t          |	                    d          d          d |         }|D ]O}		 |	
                    dd          }
|                    |	j        |
d d         d           @# t          $ r Y Lw xY wt          | ||d          S )Nr   )
OUTPUT_DIRjob_idro   limitr  rp   job_id requiredrr   rs   z*.mdT)r   rY   r   r[   errorsi@  )filenamer   )r  outputs)r   r  r   r   r   rd  r    r  sortedglobr   r   r   rb  )r	  r
  CRON_OUTr   r  r  out_dirr  filesftxts              rK   r   r     sO   000000	&,		BVVHrd##A&Fw&&q)**EN!Gg/@%A#NNNNGG~~ w||F++T:::6E6B 	 	Akk79kEEAFs5D5zJJKKKK   WG<<===s   <D
DDc           	         ddl }t          |j                  }t          |                    ddg          d                   }	 ddlm}  |d          }g }|D ]}|                    d          }	|	st          |	t                    rY	 |j         	                    |	
                    d	d
                                                    }
n&# t          t          f$ r Y w xY wt          |	          }
|
|k    rV|                    |                    dd          |                    dd          |                    dd          |
d           t          | ||d          S # t           $ r t          | g |d          cY S w xY w)z=Return cron jobs that have completed since a given timestamp.r   Nsincer   r   Tr   last_run_atZz+00:00idro   r   Unknownlast_statusr{   )r  r   rg   completed_at)completionsr  )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     s   OOO	&,		B"&&3%((+,,E?''''''y$/// 	 	Cww}--H (C(( %!*889I9I#x9X9XYYcceeBB"I.   H 8__Ezz""!ggdB//GGFI66!ggmY??$&	$ $    +FFGGG ? ? ?"u==>>>>>?s9   AE! 
A C
E! CE! CBE! !F Fc           
      \   	 ddl m}  |            dz  }n)# t          $ r t          j                    dz  dz  }Y nw xY w|dz  }|dz  }|                                r|                    dd	          nd
}|                                r|                    dd	          nd
}t          | ||t          |          t          |          |                                r|	                                j
        nd |                                r|	                                j
        nd d          S )Nr   r   memories.hermes	MEMORY.mdUSER.mdrY   r   r  ro   )memoryusermemory_path	user_pathmemory_mtime
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    sN   7777777((**Z7 7 7 7)++	)J67$H)#IGOGXGX`XCCC^`FFOFVFVFXFX`9	BBB^`DW$8}}3y>>4<OO4E4EO0043<3C3C3E3EOinn&&//4	    s    #<<Fc                 d   d}t          j        d          D ]}|j                            d          r	 t	          j        |j                  }|r|ot          |j                  dk    }n%|o"|j	        dk    ot          |j                  dk    }|rTt          5  t          j        |j        d            d d d            n# 1 swxY w Y   |                    d           |dz  }# t          $ r Y w xY wt          j                    rt          j        d           t#          | d|d          S )	Nr   z*.json_r/  Tr9  rf   )re   cleaned)r   r  r   r   r$   loadstemr   rv   rw   r   r
   r   ra  rb  r*   r  r    )r	  rL  r.  r  r)  r   should_deletes          rK   r\  r\    sd   Gh''  6S!!+8	QV$$A U ! :c!*oo&: ! Tag&; TAJST@T 558<555555555555555555D)))1 	 	 	D	 "" 3!T2222WTg66777s6   A$C'C 4C' C	C'C	C''
C43C4c           
         t          |d           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wt	          |d                   }n!# t
          $ r t          | dd          cY S w xY wt          |                    dd                                                    }|st          | d          S d |                    d          pg D             d d	         }t          t          |                    d
          p|j	                  
                                                                          }|                    d          p|j        }t          ||                    d|j        pd                    }||_	        ||_        ||_        |                                 t!          |           t#          j                    j        }	t)          j                    }
t,          5  |
t.          |	<   d d d            n# 1 swxY w Y   t1          j        t4          |j        ||||	||fd          }|                                 t;          | |	|j        d          S )Nrn   r   r   rT  ro   zmessage is requiredc                 ,    g | ]}t          |          S rG   r   )r   rI   s     rK   r   z&_handle_chat_start.<locals>.<listcomp>  s    CCCa3q66CCCrM   attachments   ry   rz   r-  Tr*  argsdaemon)r   rn   )r   r  r   r   r%   r   r   r]  r   ry   r`  r  rz   r   r-  r^  r3   r~  r  r  r  Queuer   r   	threadingThreadr9   rn   startr    )r	  rL  r  r   msgr!  ry   rz   r-  r   r  thrs               rK   re  re    sg   	|	$	$	$	$7773wA#7#77777777l+,,BBBC)<cBBBBBB
dhhy"%%
&
&
,
,
.
.C:s7$9:::CCDHH]$;$;$ArCCCCRCHKD+..=!+>>IIKKSSUUVVIHHW(E-#Q%7%=2>>  AKAG)AFFHHHy!!!
 IA	--Awy)---------------

#lC	9kK[\  C
 IIKKKWIQ\JJKKKs;    
A>AAA A:9A:8HHHc                 4   ddl m} t          |d                   }t          |                    dd                                                    }|st          | ddid	          S t          |                    d
          p|j                  	                                
                                }t          |          |_        |                    d          p|j        |_        t          |j        |                    d|j        pd                    |_        t          j                            d          }t          |          t          j        d<   t          j                            d          }t          j                            d          }dt          j        d<   |j        t          j        d<   	 ddlm}	 t&          5  ddl m}
  |
|j                  \  }}}d}	 ddlm}  ||          }|                    d          }|s|                    d          }|s|                    d          }n+# t.          $ r}t1          d| d           Y d}~nd}~ww xY w |	||||ddt2          |j        t5          |j                  	  	        }d|j         d}d |j         d!}dd"lm} |                    ||z   | ||j                  |j        |#          }ddd           n# 1 swxY w Y   |!t          j                            dd           n|t          j        d<   |!t          j                            dd           n|t          j        d<   |!t          j                            dd           n|t          j        d<   n# |!t          j                            dd           n|t          j        d<   |!t          j                            dd           n|t          j        d<   |!t          j                            dd           n|t          j        d<   w xY wtA          |                    d$          p|j        |                    d%                    |_        tC          |j        |j"                  |_"        |#                                 	 tI                                          d&          rLdd'l%m&}  ||j        |j'        pd|j(        pd|j)        |j        |j"        tU          |j                  (           n# t.          $ r Y nw xY wt          | |                    d%          pd|                    d)d          rd*nd+|+                                d$|j        iz  d, |,                                D             d-          S ).zJFallback synchronous chat endpoint (POST /api/chat). Not used by frontend.r   )_get_session_agent_lockrn   rT  ro   rp   zempty messagerr   rs   ry   rz   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  )	rz   r6  r7  r5  platform
quiet_modeenabled_toolsetsrn   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_messagerv   final_responsesync_to_insights)sync_session_usage)rn   input_tokensoutput_tokensestimated_costrz   rw   r   	completedr  partialc                 &    i | ]\  }}|d k    ||S )rv   rG   r   rJ   vs      rK   
<dictcomp>z%_handle_chat_sync.<locals>.<dictcomp>z  s#    FFFDAqa:oo1aooorM   )answerrg   rt   r  )-r   r-  r%   r   r   r]  r    r   ry   r`  r  rz   r   r-  osenvironrn   	run_agentr1  r   r2  hermes_cli.runtime_providerr3  rb  printr   r   api.streamingr=  run_conversationrv   r   r;   r(   rw   r^  r   api.state_syncrE  rF  rG  rH  r   r   r   )r	  rL  r-  r   r*  ry   old_cwdold_exec_askold_session_keyr1  r2  _model	_provider	_base_url_api_keyr3  _rt_er   workspace_ctxworkspace_system_msgr=  r  rE  s                           rK   rf  rf    s   222222D&''A
dhhy"%%
&
&
,
,
.
.CIq7O"<SIIIITXXk**9ak::EEGGOOQQIi..AKhhw*17AG/	#Q%7%=2>> A jnn^,,G!$YBJ~:>>"344Ljnn%9::O$'BJ !'(|BJ#$0A%%%%%% '	 '	999999+A+A!'+J+J(FIyH
]PPPPPP..CCC779--  4 #
 3 3I  4 #
 3 3I ] ] ]O2OOW[\\\\\\\\\]G&9y#+e,8Q\,B1CU,V,VX X XE <1;;;;MPak P P P ! A@@@@@++*S03%?%?
%K%K%( ,  FC'	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	 '	R ?BJNN>4@@@@+2bj(0A4!H!H!H!H.:bj*+"BJNN3G$N$N$N$N1@bj-.. ?BJNN>4@@@@+2bj(0A4!H!H!H!H.:bj*+"BJNN3G$N$N$N$N1@bj-.@@@@/

:,!*

#$$ AJ QW--AGqvvxxx??122 
	999999<^0qo2 /gg!!*oo       W**-..4""JJ{D99H&&y99;;*aj!99FFFLLNNFFF	    sp   ;N K/&AH<;K/<
I$IK/I$$A?K/#N /K33N 6K37N BP)"A-T 
TTc           
         t          |dd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY w	 ddlm}  ||d         |d         |                    d          pd |                    d          pd|                    d          pg |                    d	          pd 
          }t          | d|d          S # t          $ r+}t          | dt          |          id          cY d }~S d }~ww xY w)Nr1  scheduler   )
create_jobr   deliverlocalr   rz   )r1  rd  r   rf  r   rz   Tre   r  rp   rr   rs   )	r   r  r   r   r   re  r   r    rb  )r	  rL  r  re  r  s        rK   rg  rg  ~  sC   	x	,	,	,	,7773wA#7#77777777	9((((((j>D,<&!!)T488I3F3F3Q'88H%%+488G3D3D3L
 
 

 c22333 9 9 97CFF+C8888888889s6    
A?AAB	C 
D D<DDc                 D   t          |d           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wddlm} d |                                D             } ||d         |          }|st          | dd          S t          | d|d          S )	Nr  r   )
update_jobc                 *    i | ]\  }}|d k    |||S )r  rG   rL  s      rK   rN  z'_handle_cron_update.<locals>.<dictcomp>  s'    PPP1X!-q!---rM   Job not foundr   Trh  )r   r  r   r   r   rj  r   r    )r	  rL  r  rj  updatesr  s         rK   rh  rh    s    	x	 	 	 	 7773wA#7#77777777$$$$$$PP

PPPG
*T(^W
-
-C9s7OS999WT#..///    
A>AAc                    t          |d           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wddlm}  ||d                   }|st          | dd          S t          | d|d         d          S )Nr  r   )
remove_jobrl  r   T)re   r  )r   r  r   r   r   rp  r    )r	  rL  r  rp  re   s        rK   ri  ri    s    	x	 	 	 	 7773wA#7#77777777$$$$$$	DN	#	#B8c'?C888WTT(^<<===rn  c                 "   |                     dd          }|st          | d          S ddlm} ddlm}  ||          }|st          | dd          S t          j        ||fd	
                                           t          | d	|dd          S )Nr  ro   r  r   )get_job)run_jobrl  r   Tr#  	triggered)re   r  rg   )
r   r   r   rr  cron.schedulerrs  r'  r(  r)  r    )r	  rL  r  rr  rs  r  s         rK   rj  rj    s    XXh##F9#g'8999!!!!!!&&&&&&
'&//C9s7OS999G3&>>>DDFFFWTV{KKLLLrM   c                     |                     dd          }|st          | d          S ddlm}  |||                     d                    }|rt	          | d|d	          S t          | d
d          S )Nr  ro   r  r   )	pause_jobreason)rx  Trh  rl  r   )r   r   r   rw  r    )r	  rL  r  rw  r  s        rK   rk  rk    s    XXh##F9#g'8999######Yvdhhx&8&8999F=aV!<!<===w---rM   c                     |                     dd          }|st          | d          S ddlm}  ||          }|rt	          | d|d          S t          | dd	          S )
Nr  ro   r  r   )
resume_jobTrh  rl  r   )r   r   r   rz  r    )r	  rL  r  rz  r  s        rK   rl  rl    s{    XXh##F9#g'8999$$$$$$ZF=aV!<!<===w---rM   c                    t          |dd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wt	          |d                   }n!# t
          $ r t          | dd          cY S w xY w	 t          t          |j                  |d                   }|	                                st          | dd          S |
                                rt          | d          S |                                 t          | d|d         d          S # t          t          f$ r'}t          | t          |                    cY d }~S d }~ww xY w)	Nrn   r   r   r   r   z+Cannot delete directories via this endpointTre   r   )r   r  r   r   r%   r   r   r   ry   r  r   ra  r    PermissionErrorr	  rL  r  r   r*  s        rK   rm  rm    s[   	|V	,	,	,	,7773wA#7#77777777l+,,BBBC)<cBBBBBBKd1;//f>>}}Js74Dc'J'J J==??^3w0]#^#^^tF|<<===(JJJc'3q666J6J/J/J/J/J/J/JJsT    
A?AAA A;:A;?AD #D 0,D E.E
EEc                    t          |dd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wt	          |d                   }n!# t
          $ r t          | dd          cY S w xY w	 t          t          |j                  |d                   }|	                                st          | dd          S |
                                rt          | d          S |                    |                    dd          d	
           t          | d|d         |                                j        d          S # t          t           f$ r'}t          | t          |                    cY d }~S d }~ww xY w)Nrn   r   r   r   r   z Cannot save: path is a directoryr   ro   rY   rZ   T)re   r   size)r   r  r   r   r%   r   r   r   ry   r  r   
write_textr   r    r  st_sizer}  r~  s        rK   rn  rn    s   	|V	,	,	,	,7773wA#7#77777777l+,,BBBC)<cBBBBBBKd1;//f>>}}Js74Dc'J'J J==??S3w0R#S#SS$((9b11GDDDtF|V[[]]EZ[[\\\(JJJc'3q666J6J/J/J/J/J/J/JJsU    
A?AAA A;:A;?AE #E 0AE FE?9F?Fc                 $   t          |dd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wt	          |d                   }n!# t
          $ r t          | dd          cY S w xY w	 t          t          |j                  |d                   }|	                                rt          | d          S |j
                            dd           |                    |                    dd	          d
           t          | dt          |                    t          |j                                      d          S # t          t           f$ r'}t          | t          |                    cY d }~S d }~ww xY w)Nrn   r   r   r   zFile already existsTparentsexist_okr   ro   rY   rZ   r|  )r   r  r   r   r%   r   r   r   ry   r  r  mkdirr  r   r    r  r}  r~  s        rK   ro  ro    s   	|V	,	,	,	,7773wA#7#77777777l+,,BBBC)<cBBBBBBKd1;//f>>==??F3w0E#F#FFD4888$((9b11GDDDs63E3Ed1;FWFW3X3X/Y/YZZ[[[(JJJc'3q666J6J/J/J/J/J/J/JJsO    
A?AAA A;:A;?AE BE F(F
F
Fc                    t          |ddd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wt	          |d                   }n!# t
          $ r t          | dd          cY S w xY w	 t          t          |j                  |d                   }|	                                st          | dd          S |d         
                                }|rd|v sd|v rt          | d	          S |j        |z  }|	                                rt          | d
| d          S |                    |           t          |                    t          |j                                      }t          | d|d         |d          S # t          t          t           f$ r'}t          | t          |                    cY d }~S d }~ww xY w)Nrn   r   new_namer   r   r   rX   ..zInvalid file namezA file named "z" already existsT)re   old_pathnew_path)r   r  r   r   r%   r   r   r   ry   r  r]  r  renamer  r    r}  OSError)r	  rL  r  r   sourcer  destnew_rels           rK   rp  rp    s   	|VZ	8	8	8	87773wA#7#77777777l+,,BBBC)<cBBBBBBTd1;//f>>}}Js74Dc'J'J J
#))++ 	53(??dh.>.>w 3444}x';;==ZW.Yx.Y.Y.Y!Z!ZZdd&&tAK'8'899::4<WUUVVV1SSSs7CPQFF?S?S8S8S8S8S8S8SSs]    
AA A AA A<;A< AF 3F 1F 3A"F G-G	GGc                    t          |dd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wt	          |d                   }n!# t
          $ r t          | dd          cY S w xY w	 t          t          |j                  |d                   }|	                                rt          | d          S |
                    d           t          | dt          |                    t          |j                                      d          S # t          t          t          f$ r'}t          | t          |                    cY d }~S d }~ww xY w)	Nrn   r   r   r   zPath already existsT)r  r|  )r   r  r   r   r%   r   r   r   ry   r  r  r    r  r}  r  r~  s        rK   rq  rq    sa   	|V	,	,	,	,7773wA#7#77777777l+,,BBBC)<cBBBBBBTd1;//f>>==??F3w0E#F#FFT"""s63E3Ed1;FWFW3X3X/Y/YZZ[[[1SSSs7CPQFF?S?S8S8S8S8S8S8SSsO    
A?AAA A;:A;?AD& AD& &E$=EE$E$c                    |                     dd                                          }|                     dd                                          }|st          | d          S t          |                                                                                                          st          | d           S                                 st          | d           S t                      }t          fd|D                       rt          | d          S |
                    t                    |pj        d	           t          |           t          | d
|d          S )Nr   ro   r   r  zPath does not exist: zPath is not a directory: c              3   J   K   | ]}|d          t                    k    V  dS )r   Nr   )r   wr)  s     rK   r7  z(_handle_workspace_add.<locals>.<genexpr>  s2      
,
,11V9A
,
,
,
,
,
,rM   zWorkspace already in list)r   r   Tre   r   )r   r]  r   r   r`  r  r  r   r0   anyr   r   r   r1   r    )r	  rL  path_strr   wssr)  s        @rK   rr  rr    sS   xx##))++H88FB%%''D<C);<<<X!!##++--A88::Gc'+F1+F+FGGG88::Kc'+Jq+J+JKKK


C

,
,
,
,
,
,
,,, 977888JJA77888CWT55666rM   c                     |                     dd                                          st          | d          S t                      }fd|D             }t	          |           t          | d|d          S )Nr   ro   r  c                 ,    g | ]}|d          k    |S )r   rG   )r   r  r  s     rK   r   z,_handle_workspace_remove.<locals>.<listcomp>  s'    
3
3
3QvY(221222rM   Tr  r   r]  r   r0   r1   r    )r	  rL  r  r  s      @rK   rs  rs    s    xx##))++H<C);<<<


C
3
3
3
3c
3
3
3CCWT55666rM   c                 |   |                     dd                                          }|                     dd                                          }|r|st          | d          S t                      }|D ]}|d         |k    r||d<    nt          | dd          S t	          |           t          | d|d          S )	Nr   ro   r   zpath and name are requiredzWorkspace not foundr   Tr  r  )r	  rL  r  r   r  r  s         rK   rt  rt    s    xx##))++H88FB%%''DR4RG5Q(R(R!R


C 8 8V9  AfIee ! 713777CWT55666rM   c                 F   |                     dd          }|st          | d          S |                     dd          }|dvrt          | d|           S t          5  t          j        |d           }d d d            n# 1 swxY w Y   |r|                     d          p|                     d	d          g}|d
v r|D ]}t          ||           n>|dk    r8|D ]!}t          ||           t          |           "t          t                     t          | d|d          S )Nrn   ro   rq   choicedeny)oncert   alwaysr  zInvalid choice: r  r  )r  rt   r  T)re   r  )
r   r   rD   rC   r   r?   r@   rA   rE   r    )r	  rL  r  r  r  keysrJ   s          rK   ru  ru  -  s   
((<
$
$C=s7$<===XXh''F:::77v77888	 * *,sD))* * * * * * * * * * * * * * * :{{>**Nw{{="/M/M.N(((22?322222x > >Q'''):1)=)=)=)=$%8999WTV44555s   A??BBc                    t          |dd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY w|d                                                                                             dd          }|rd|v sd|v rt          | d          S |                    dd	                                          }|rd|v sd|v rt          | d
          S ddlm	} |r	||z  |z  }n||z  }|
                    dd           |dz  }|                    |d         d           t          | d|t          |          d          S )Nr   r   r  -rX   r  r   categoryro   zInvalid categoryr   r   Tr  zSKILL.mdrY   rZ   )re   r   r   )r   r  r   r   r]  r  r   r   r   r   r  r  r    )r	  rL  r  
skill_namer  r   r(  
skill_files           rK   rv  rv  @  s   	vy	)	)	)	)7773wA#7#77777777f##%%++--55c3??J 2
**dj.@.@70111xx
B''--//H 0SH__(8(87.///,,,,,, ,)J6		+	OOD4O000Z'J$y/G<<<WT:s:OOPPPs    
A?AAc                    t          |d           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY wddlm} dd l}t          |                    |d          d                    }|st          | dd          S |d         j	        }|
                    t          |                     t          | d|d         d          S )	Nr   r   r  z	/SKILL.mdr   r   T)re   r   )r   r  r   r   r   r   shutilr  r   r  rmtreer    )r	  rL  r  r   r  matchesr(  s          rK   rw  rw  T  s    	v				7773wA#7#77777777,,,,,,MMM:##tF|$>$>$>??@@G?3w(93???
!I
MM#i..!!!WT4<88999rn  c                    t          |dd           n4# t          $ r'}t          | t          |                    cY d }~S d }~ww xY w	 ddlm}  |            dz  }n)# t          $ r t          j                    dz  dz  }Y nw xY w|	                    dd           |d         }|d	k    r|d
z  }n|dk    r|dz  }nt          | d          S |
                    |d         d           t          | d|t          |          d          S )Nsectionr   r   r  r  r	  Tr  r  r
  r  r  z"section must be "memory" or "user"rY   rZ   )re   r  r   )r   r  r   r   r  r   r  r   r  r  r  r    )r	  rL  r  r   r  r  r*  s          rK   rx  rx  `  sM   	y)	,	,	,	,7773wA#7#777777777777777((**Z7 7 7 7)++	)J67MM$M...9oG(;&	F		9$7@AAA
d9o888WTgs6{{KKLLLs)    
A?AAA #BBc                    	 t          |d           n4# t          $ r'}t          | t          |                    cY d}~S d}~ww xY wt          |d                   }t	          j        |          }|r0t          | |                                |j        ddz  dd          S t          |          }|st          | dd          S t          |d	          }d
}d}t                      D ];}	|	d         |k    r-|	                    d          }|	                    dd
          } n<t          |||||          }
d|
_        ||
_        |
                                 t          | |
                                |ddz  dd          S )z1Import a single CLI session into the WebUI store.rn   NT)rv   r   F)rt   importedzSession not found in CLI storer   rx   r{   r~   rz   )r~   )r   r  r   r   r$   r  r    r   rv   r/   r(   r.   r   r-   r   _cli_originr^  )r	  rL  r  r  existingr  rw   rz   r~   r  r   s              rK   r  r  t  s   $l#### $ $ $7CFF########$ d< 
!
!C |C  H h&6&6&8&8 )"<
 <
 '
     	 $C((D C7<cBBB t]++EE G    ls""ffY''GFF7I..EE #
 	3tUGDDDAAAMFFHHHW99;;""
 "
 
     s    
A?AAc           
         |rt          |t                    st          | d          S |                    d          }t          |t                    st          | d          S |                    dd          }|                    dt          t                              }|                    dt                    }t          ||                    dd	                    }t          |||||                    d
g           |          }|                    dd          |_
        t          5  |t          |j        <   t          j        |j                   t          t                    t           k    r2t          j        d           t          t                    t           k    2ddd           n# 1 swxY w Y   |                                 t'          | d|                                d|j        iz  d          S )zIImport a session from a JSON export. Creates a new session with a new ID.z"Request body must be a JSON objectrv   z$JSON must contain a "messages" arrayrw   zImported sessionry   rz   r-  ro   ru   )rw   ry   rz   rv   ru   r-  r   F)r   NTr<  )r   r   r   r   r  r   r   r	   r   r$   r   r   r
   rn   move_to_endr   r   popitemr^  r    r   rv   )r	  rL  rv   rw   ry   rz   r-  r   s           rK   r  r    s    Bz$-- B7@AAAxx
##Hh%% D7BCCCHHW011Ec*;&<&<==IHHWm,,E-#R((  	y88L"--)		 	 	A xx%((AH	 ) )!"Q\***(mml**%(((( (mml**) ) ) ) ) ) ) ) ) ) ) ) ) ) )
 FFHHHWTaiikkZ<T.TUUVVVs   *A8F..F25F2c                 $   ddl m}m} ddlm}m} ddl} |              |            } |            } |            }|                    di           }	t          |	t                    r|	}
d}d}n^t          |	t                    rC|	                    dd          }
|	                    dd          }|	                    d	d          }ndx}
x}}|                    d
i           }|                    dd          }|                    dd          pd}|                    dd          }|                    di           }g }t          |t                    r|                                D ]\  }}d}t          |t                    rt|                    d|                    d|                    dd                              }t          |t                    r t          |          dk    r|dd         dz   }n7t          |t                    r"|dd         t          |          dk    rdndz   }|                    ||d           |                    di           }|                    dg           }|                    di           }|                    dg           }|                    di           }|                    dd          }t          |          }|                    dg           }t          | ||
|||||||||||g dd          S )zBRead the active profile's config.yaml and .env as editable fields.r   )r   r   r   r   Nrz   ro   defaultr6  r7  r   	max_turns<   r0  r-  r   r   r1  r   r   platform_toolsetsr  r   external_dirsdisplayr8  custom_providers)browserclarifycode_executioncronjob
delegationr   	image_genr  session_searchr   terminaltodowebwebhook)profile_namerz   r6  r7  r  r-  r0  r   display_personalitycli_toolsetsr  env_varsr  all_toolsets)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  r0  r-  r   personality_listr   valr  toolsets_cfgr  
skills_cfgr  display_cfgr  r  r  s                                 rK   r  r    sj   44444444LLLLLLLLKKK MOOO
*,,C((**K**,,L $$I)S!! 	5		It	$	$ 5MM)R00	 }}Z44 }}Z44244	4L<GGGR  E		+r**IIIor228bMyy!3R88IIor22M-&& 	I&,,.. 	I 	IID#D#t$$ Cww}cggoswwxY[G\G\.].]^^dC(( -SYY^^9u,DC%% C3B3xCHHrMM55rB##T$$G$GHHHH 77.33L##E2..L 2&&JNN?B77M '')R((K%//-<<  ,,H ww1266W$  ,&)2$&,
 
 
    rM   r  c                    | dz  }g d}i }|                                 r	 |                                                                D ]}|                                }|r|                    d          sld|v rh|                    dd          \  }}|                                                    d                              d          ||                                <   n# t          $ r Y nw xY wg }|D ]y}||v rY||         }	t          |	          dk    r!d	t          |	          d
z
  z  |	dd         z   }
nd}
|                    ||	|
dd           _|                    |dddd           z|S )zDRead .env and return known API key env var names with masked values..env)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#=rf   "'   u   •   Nu   ••••T)r   r  masked	has_valuero   F)	r  r   
splitlinesr]  r   splitrb  r   r   )r  env_path
known_keysr$  linerJ   rM  r  r   r  r  s              rK   r  r    s   V#H  J D 	 **,,7799 F Fzz|| F 4 4 F::c1--DAq&'ggiiooc&:&:&@&@&E&EDO	F
  	 	 	D	 F 
W 
W$;;s)C3xx!||#c((Q,/#bcc(:'MM#vTXYYZZZZMM#buUUVVVVMs   C C" "
C/.C/c                 .   ddl m} ddlm}m} ddl}|                    d          du rt          | dd          S  |            }|d	z  }|d
z  }i }	|                                r=	 |	                    |
                                          pi }	n# t          $ r i }	Y nw xY wd}
d|v r|d         }|                    dd          }|                    dd          }|	                    di           }t          |t                    rd|i}nt          |t                    si }t          |          }|s|s|r0|r||d<   ||r||d<   nd|v r|d= ||r||d<   nd|v r|d= ||	d<   d}
d|v sd|v sd|v r|	                    di           }t          |t                    si }d|v r3	 t          |d                   |d<   d}
n# t           t"          f$ r Y nw xY wd|v r|d         pd|d<   d}
d|v r|d         pd|d<   d}
|
sd|	vr||	d<   d|v rA|	                    di           }t          |t                    si }|d         pd|d<   ||	d<   d}
d|v rV|d         }t          |t$                    r9|	                    di           }t          |t                    si }||d<   ||	d<   d}
|
r~	 |                    |                    |	ddd                     t+          d |             d            |             n*# t          $ r}t          | d|           cY d}~S d}~ww xY wd|v rP|d         }t          |t                    r3t-          ||           	 dd lm}  ||           n# t          $ r Y nw xY wt1          | d |            d!          S )"zEWrite config changes to the active profile's config.yaml and/or .env.r   r   r  NbusyTz+Cannot change config while agent is runningr?  zconfig.yamlr  Frz   r6  ro   r7  r  r  r0  r-  r   r  r  r8  r  r  r  )default_flow_style	sort_keysallow_unicodez([webui] config.yaml updated for profile r8  zFailed to write config.yaml: env_updates)_reload_dotenvrC  )r   r   r  r   r   r  r   r   r  	safe_loadr   rb  r   r   r   rd  r  r  r  r  dumprT  _write_env_changesr  r    )r	  rL  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LLLLLLLKKKxx47I3OOO((**K-KV#H C 	..!6!6!8!899?RCC 	 	 	CCC	 G $M	xx
B//xx
B// ,,mS)) 	&6MMM400 	M''	 	 	 	 1'0	)$' .,8Ij))9,,!*-' .,8Ij))9,,!*-$CLG do559Kt9S9S$$%&& 	E$%(k):%;%;k"	*   d""%)/%:%@bE/"G%%(,-?(@(FBE$%G 	!gS(( CL $$wwy"%%$%% 	D"#89?R]I 'h%% 	,b11Bb$''  BuI')C#$G  E	E""499SUV[ko9#p#pqqqX=T=T=V=VXX`deeeeMOOOO 	E 	E 	Ew C C CDDDDDDDD	E =)k4(( 	x555777777{++++    WT.E.E.G.GHHIIIsU   &)B BB&G GG+AK> >
L%L L% L%M, ,
M98M9r  rm  c                 V   t          |                                          }g }|                                 r:	 |                                                                 }n# t
          $ r g }Y nw xY wt                      }g }|D ]}|                                }|r|                    d          syd|v ru|                    dd          d                                         }||v rC|	                    |           ||         }	|	|	dk    r|	r|
                    | d|	            |
                    |           |                                D ]%\  }}	||vr|	r|
                    | d|	            &|                     d                    |          |rdndz              dS )zVAdd/modify/remove env vars in a .env file while preserving comments and unknown lines.r  r  rf   r   Nro   r4  )setr  r  r   r   rb  r]  r   r  addr   r   r  r_  )
r  rm  r  lines	seen_keys	new_linesr  strippedr   r  s
             rK   r  r    s   W\\^^$$JE 	&&((3355EE 	 	 	EEE	 II  ::<< 
	H//44 
	..a((+1133Cj  c"""cl;#)) 5$$^^c^^444 MMOO - -SiC^^c^^,,,		),,	0IrJKKKKKs   &A   A/.A/)F)__doc__r  r   r   rP  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#   rc  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   r0   r1   r2   r3   r4   r5   r6   
api.uploadr7   rU  r8   r9   r:   r;   tools.approvalr<   r=   r>   r?   r@   rA   rB   rC   rD   rE   r  Lockr  r   r   r+  r  r   r   r   r   r   r   r   r   r   r   r   r  r\  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  r  r  r  r  r  r}  r   r  rG   rM   rK   <module>r(     s         				  



             ! ! ! ! ! ! 3 3 3 3 3 3                                                  W V V V V V V V V V V V V V V V V V                                             % $ $ $ $ $ c c c c c c c c c c c c                         
  
  
  
 ''K&&K))N**O,,33&&KHINE#%%
 2 lx4 x x x xzAD A A A AL  0   P P P:) ) )  4  8	R 	R 	R) ) )D D D> > >&? ? ?@  (8 8 8 8*L L L>] ] ]@9 9 90 0 0> > >M M M. . .. . .K K KK K KK K KT T T&
T 
T 
T7 7 77 7 77 7 76 6 6&Q Q Q(	: 	: 	:M M M(, , ,^W W W@R R Rj&$ &4 & & & &RrJ rJ rJj"L "L "L "L "L "L "L "Ls   :C 5D
D