+
    lHàjÇŸ  ã                   óª  € R t ^ RIt^ RIt^ RIt^RIHtHt ]! 4       t]P                  tRRRRRR/t	RRX.RRY.RRZR[./t
R	 R
 ltR tR\R R lltR R ltR tR R ltR tR tR R ltR tR R ltR tR tR R ltR tR tR  tR! R" lt]! R#R$4      R% R& l4       t]! R'4      R( R) l4       t]! R*R+4      R, R- l4       t]! R.R/4      R0 R1 l4       t]! R2R34      R4 R5 l4       t]! R6R74      R8 R9 l4       tR: R; ltR< R= ltR> R? lt R@ RA lt!RB RC lt"RD t#RE RF lt$RG RH lt%RI t&RJ RK lt'RL RM lt(RN RO lt)RP RQ lt*RR RS lt+RT RU lt,RV RW lt-R# )]uV  Profile JSON-RPC handlers â€” the ws twin of the dashboard's /api/profiles (desktop plugins
only have the ws door), on the same `hermes_cli.profiles` primitives. Bodies are rebound onto
server.py's globals (method_ctx.bind_module) and use them bare; module-level names are published
onto server.py, so they must not collide with its globals.
N)ÚHandlerRegistryÚbind_moduleÚpngz	image/pngÚjpgz
image/jpegÚwebpz
image/webpc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚnameÚcode)ÚstrÚint)Úformats   "ÚA/home/ubuntu/.hermes/hermes-agent/tui_gateway/methods_profiles.pyÚ__annotate__r      s   € ÷ 	ñ 	œ3ð 	¤cñ 	ó    c                ó   a a€ VV 3R lpV# )zV``@method(name)`` whose body's uncaught exception becomes ``_err(rid, code, str(e))``.c                 ó<   <a € R  VV 3R llp\        S4      ! V4      # )c                ó0   € V ^8„  d   QhR\         R\         /# ©r   ÚparamsÚreturn©Údict)r   s   "r   r   Ú4_profile_handler.<locals>.deco.<locals>.__annotate__   s   € ÷ 	/ñ 	/¤ð 	/¬$ñ 	/r   c                 ór   <€  S! W4      #   \          d!   p\        T S\        T4      4      u R p?# R p?ii ; i©N)Ú	ExceptionÚ_errr   )Úridr   Úer
   Úfns   && €€r   ÚhandlerÚ/_profile_handler.<locals>.deco.<locals>.handler   s5   ø€ ð/Ù˜#“Ð&øÜô /Ü˜C ¤s¨1£vÓ.Õ.ûð/ús   ƒ ‹6–1«6±6)Úmethod)r    r!   r
   r	   s   f €€r   ÚdecoÚ_profile_handler.<locals>.deco   s   ù€ ÷	/ñ 	/ô
 �dŒ|˜GÓ$Ð$r   © )r	   r
   r$   s   ff r   Ú_profile_handlerr'      s   ù€ ö%ð €Kr   c                ó0   € \        \        W.R7      V4      # )z†Late-bound attribute lookup; ``__import__`` builtin on purpose (rebound bodies see only
server.py globals, not this module's imports).)Úfromlist)ÚgetattrÚ
__import__)Úmoduler	   s   &&r   Ú_lazyr-   #   s   € ô ”:˜f¨vÔ6¸Ó=Ð=r   c                ó   € V ^8„  d   QhRR/# ©r   r   Nr&   )r   s   "r   r   r   )   s   € ÷ 9ñ 9ÀTñ 9r   c                 ó.   € \        R R4      ! WW#R7       R# )zhermes_cli.web_routers.profilesÚ_write_profile_model)Úbase_urlN©r-   )Úprofile_dirÚproviderÚmodelr2   s   &&&&r   Ú_pin_profile_modelr7   )   s   € Ü	Ð
+Ð-CÔDØ˜u÷9r   c                ó$   € V ^8„  d   QhR\         /# ©r   r   )Útuple)r   s   "r   r   r   .   s   € ÷ ]ñ ]¤eñ ]r   c                 óÊ   € \        V P                  R 4      ;'       g    R4      P                  4       \        V P                  R4      ;'       g    R4      P                  4       3# )r6   Ú r5   )r   ÚgetÚstrip)r   s   &r   Ú_model_provider_paramsr?   .   sL   € Üˆv�z‰z˜'Ó"×(Ð( bÓ)×/Ñ/Ó1´3°v·z±zÀ*Ó7M×7SÐ7SÐQSÓ3T×3ZÑ3ZÓ3\Ð\Ð\r   c                ó8   €  V ! 4       #   \          d    Tu # i ; i)z[``fn()`` or ``default`` on any exception (best-effort sections must never fail each other).)r   )r    Údefaults   &&r   Ú_tryrB   2   s"   € ðÙ‹tˆøÜô ØŠðús   ‚	 ‰˜c                ó$   € V ^8„  d   QhR\         /# r9   ©Úbool)r   s   "r   r   r   :   s   € ÷ 0ñ 0œñ 0r   c                 ó$   a € \        V 3R  lR4      # )c                  ó$   <€ S ! 4       R 3^,          # )Tr&   ©r    s   €r   Ú<lambda>Ú_best_effort.<locals>.<lambda>;   s   ø€ ™›˜t˜ Qžr   F)rB   rH   s   fr   Ú_best_effortrK   :   s   ø€ ÜÔ'¨Ó/Ð/r   c                ó´   € \        V 4      P                  4       \        \        4      P                  4       8H  p\        RV'       d   RM
\	        V 4      /RR7      # )u5  Bind ``path``'s full runtime scope (home + secrets + terminal) for the block â€” the same
composition ``@_profile_scoped`` binds. Home alone is half-bound: under multi-profile hosting
every credential read raised ``UnscopedSecretError``, which a best-effort ``_try`` turned into
a plausible wrong answer (the toolset snapshot's ``XAI_API_KEY`` probe â†’ "every toolset off",
#120726). The launch home maps to None so it keeps its frozen launch env (systemd / ``op run``
keys). No external-source hydration: these bodies read and write config, never call a provider.Úprofile_homeNF)Úhydrate_secrets)ÚPathÚresolveÚ_hermes_homeÚ_session_profile_runtime_scoper   )ÚpathÚlaunchs   & r   Ú_hermes_home_scoperU   >   sE   € ô �$‹Z×ÑÓ!¤T¬,Ó%7×%?Ñ%?Ó%AÑA€FÜ)¨>Ç6¹4ÌsÐSWËyÐ*YÐkpÔqÐqr   c           
     ól  € \        VP                  R4      ;'       g    R4      P                  4       pV'       g   VR\        V RR4      3# ^ RIHp  \        V! V4      4      pTP                  4       '       g   TR\        T RRT R	24      3# Y$R3#   \         d    TR\        T RRT R	24      3u # i ; i)
zU``(name, profile_dir, err)``; err = 4063 (name required) / 4064 (not found) response.r	   r<   Néß  úname required)Úget_profile_dirià  z	profile 'z' not found)	r   r=   r>   r   Úhermes_cli.profilesrY   rO   Ú
ValueErrorÚis_dir)r   r   r	   rY   r4   s   &&   r   Ú_resolve_profiler]   I   sÄ   € äˆv�z‰z˜&Ó!×'Ð' RÓ(×.Ñ.Ó0€DßØ�Tœ4  T¨?Ó;Ð;Ð;Ý3ðJÜ™?¨4Ó0Ó1ˆð ×Ñ×ÒØ�Tœ4  T¨Y°t°f¸KÐ+HÓIÐIÐIØ˜dÐ"Ð"øô	 ô JØ�Tœ4  T¨Y°t°f¸KÐ+HÓIÐIÒIðJús   ÁB ÂB3Â2B3c                ó$   € V ^8„  d   QhR\         /# r9   r   )r   s   "r   r   r   X   s   € ÷ 6ñ 6¤tñ 6r   c                ó\   a € V 3R lp\        V/ 4      p\        V\        4      '       d   V# / # )zZprofile.yaml as a mapping; ``{}`` when missing, unreadable, unparseable, or not a mapping.c                  ó¤   <€ ^ RI p SR,          pVP                  4       '       d,   V P                  VP                  RR7      4      ;'       g    / # / # )é    Núprofile.yamlúutf-8©Úencoding)Úhermes_yamlÚis_fileÚ	safe_loadÚ	read_text)ÚyamlÚ	meta_pathr4   s     €r   ÚloadÚ _read_profile_yaml.<locals>.loadZ   sI   ø€ Û"Ø .Õ0ˆ	ØPY×PaÑPa×PcÒPc�—‘˜y×2Ñ2¸GÐ2ÓDÓE×KÐKÈÐkÐikÐkr   )rB   Ú
isinstancer   )r4   rl   Úloadeds   f  r   Ú_read_profile_yamlrp   X   s-   ø€ õlô �$˜‹^€FÜ ¬×-Ò-ˆ6Ð5°2Ð5r   c                ób   € \        V RR4      p\        V4      '       d   V! 4       # \        V 4      # )uX   ``json.dumps`` default for YAML-only scalars (datetime/date â†’ ISO 8601, else ``str``).Ú	isoformatN)r*   Úcallabler   )Úvaluerr   s   & r   Ú_yaml_scalar_to_jsonru   b   s+   € ä˜˜{¨DÓ1€IÜ" 9×-Ò-‰9‹;Ð=´3°u³:Ð=r   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úrawr   r   )r   s   "r   r   r   h   s   € ÷ nñ nœ$ð n¤4ñ nr   c                óð   € V P                  4        UUu/ uFT  w  r\        V\        4      '       g   K  \        V\        4      '       d   K5  \	        V4      \        ^ \        V4      4      bKV  	  upp# u uppi )zMNormalise a ``_ui_meta_revisions`` map: str keys, non-bool ints clamped at 0.)Úitemsrn   r   rE   r   Úmax)rw   ÚkÚvs   &  r   Ú_clean_revisionsr}   h   sP   € à/2¯y©y¬{Ôm©{¡t q¼jÈÌC×>PÔ"ÔYcÐdeÔgk×YlÔ"ŒC�‹F”C˜œ3˜q›6“NÒ"©{ÒmÐmùÓms   ”A2³A2Á#A2c                óÄ  €  V P                   ;_uu_ 4        V P                  P                  RV34      P                  4       pRRR4       X'       dH   RP                  \        T^ ,          ;'       g    R4      P                  4       4      P                  4       MRp\        T4      ^P8”  d   TR,          R,           # T#   + '       g   i     Lƒ; i  \         d     R# i ; i)u¥   â‰¤80-char excerpt of the NEWEST active user/assistant message, or "" (roster semantics).
Same query shape as ``SessionDB.latest_message_row_id``; keep them in step.z«SELECT content FROM messages WHERE session_id = ? AND role IN ('user', 'assistant') AND active = 1 AND content IS NOT NULL AND TRIM(content) != '' ORDER BY id DESC LIMIT 1Nr<   Ú :NéP   Nz...)
Ú_lockÚ_connÚexecuteÚfetchoner   Újoinr   Úsplitr>   Úlen)ÚdbÚ
session_idÚrowÚtexts   &&  r   Ú_latest_message_previewrŒ   m   s¯   € ð	Ø�X�X‹XØ—(‘(×"Ñ"ð,ð �ó÷
  (™x›zð ÷ ÷ ;>ˆ3�8‰8”C˜˜A�Ÿ˜ "Ó%×+Ñ+Ó-Ó.×4Ñ4Ô6À2€DÜ # D£	¨B¤ˆ4��9�uÕÐ8°DÐ8÷ �Xûô ô Úðús.   ‚C –,B=ÁC Â=C	ÃC ÃC ÃCÃCc                ó.  a aaa€  S P                  S4      pV'       d   VP                  R4      '       g   R# \        V V3R lR4      ;'       g    SoSS8w  d   \        V V3R lR4      ;'       g    TMTp^ RIHp ^ RIHp VP                  R4      ;'       g    R	VP                  9  d   R# V! \        V4      R
,          4      o \        SP                  S4      4      \        V3R l4       #   \        T3R l4       i ; i  \         d     R# i ; i)z�Un-archive an accidentally archived canonical row (judged read-only, written via a
short-lived writable handle); False otherwise.

See #92687.
ÚarchivedFc                  ó&   <€ S P                  S4      # r   ©Úget_compression_tip©rˆ   r‰   s   €€r   rI   Ú2_resurrect_recoverable_canonical.<locals>.<lambda>ˆ   s   ø€ ˜b×4Ñ4°ZÔ@r   Nc                  ó&   <€ S P                  S4      # r   )Úget_session)rˆ   Útip_ids   €€r   rI   r“   ‰   s   ø€ ˜BŸN™N¨6Ô2r   )Ú	SessionDB)ÚacquireÚ
end_reasonr<   ústate.dbc                  ó(   <€ \        R R4      ! S 4      # )Úhermes_state_registryÚrelease_or_closer3   )Úwdbs   €r   rI   r“   ’   s   ø€ ¤Ð'>Ð@RÔ!SÐTWÔ!Xr   )r•   r=   rB   Úhermes_stater—   rœ   r˜   ÚRECOVERABLE_END_REASONSrO   rE   Úunarchive_recoverable_sessionrK   r   )	rˆ   Úprofile_pathr‰   rŠ   Útipr—   r˜   r–   rž   s	   f&f    @@r   Ú _resurrect_recoverable_canonicalr¤   ~   sØ   û€ ðØ�n‰n˜ZÓ(ˆß˜#Ÿ'™' *×-Ò-ÙÜÕ@À$ÓG×UÐUÈ:ˆØEKÈzÔEYŒtÕ2°DÓ9×@Ð@¸SøÐ_bˆÝ*Ý1Ø�G‰G�LÓ!×'Ð' R°	×0QÑ0QÔQÙÙ”d˜<Ó(¨:Õ5Ó6ˆð	ZÜ˜×9Ñ9¸*ÓEÓFäÔXÕYøŒLÔXÕYûÜô ÚðúsK   †D ŸD ¸D Á!D Á2(D ÂD Â/D ÃC1 Ã!D Ã1DÄD ÄDÄDc                ó$   € V ^8„  d   QhR\         /# r9   r   )r   s   "r   r   r   —   s   € ÷ ñ ¬ñ r   c                óv   €  RV P                  \        V4      4      /#   \        P                   d    / u # i ; i)a  ``{"live_message_count": n}`` sized like a stored-transcript read, else ``{}`` (older stores).

The denormalized ``message_count`` also counts folded rows (orphaned compaction marks, full
rewinds, model-only rows), which once made the roster wait for history no reader serves.Úlive_message_count)Údisplay_message_countr   Úsqlite3ÚErrorr’   s   &&r   Ú_live_count_fieldr«   —   s9   € ð
Ø$ b×&>Ñ&>¼sÀ:»Ó&OÐPÐPøÜ�=‰=ô ØŠ	ðús   ‚ ž8·8c                ór  a a€  S P                  R4      p\        T;'       g    / P                  R4      ;'       g    R4      P                  4       oS'       d   \	        V4      '       d   R# VP                  R4      '       d   \        S VS4      '       g   R# \        V V3R lR4      ;'       g    SpS P                  V4      ;'       g    TpVP                  R4      ;'       g    ^ pRSRTR	VP                  R
4      ;'       g    RR
VP                  R
4      ;'       g    RR\        S V4      RVP                  R4      ;'       g    TRVP                  R4      ;'       g    VP                  R4      ;'       g    TRVP                  R4      ;'       g    ^ /\        S V4      C#   \         d     R# i ; i)u©  Summary of the profile's canonical "Bot Chat" row (identity is the NAME), or None.
Lineages via ``get_compression_tip`` (NOT the resume walker's unmarked-child fallback);
worker sources count as absent. ``id`` is the registry row, ``resolved_id`` the live tip.

The canonical chat's identity is the NAME: the session titled exactly "Bot Chat" on this profile (core
UNIQUE(title) makes it a registry of at most one row). Complements ``last_session``: that field answers
"what is the newest conversation", this answers "where is the forever-chat" â€” so a roster row's preview
and its click target describe the same session (hermes-agent#88200) with no client-side pointer
involved.
zBot ChatÚidr<   NrŽ   c                  ó&   <€ S P                  S4      # r   r�   r’   s   €€r   rI   Ú(_canonical_session_row.<locals>.<lambda>º   s   ø€ ˜2×1Ñ1°*Ô=r   Ú
started_atÚresolved_idÚ
root_titleÚtitleÚpreviewÚlast_activeÚlast_activity_atÚmessage_count)Úget_session_by_titler   r=   r>   Ú_denied_sourcer¤   rB   r•   rŒ   r«   r   )rˆ   r¢   rŠ   r£   Útip_rowÚstartedr‰   s   f&    @r   Ú_canonical_session_rowr¼   ¢   s…  ù€ ðØ×%Ñ% jÓ1ˆÜ˜#Ÿ)˜) Ÿ™¨Ó.×4Ð4°"Ó5×;Ñ;Ó=ˆ
ßœ^¨C×0Ò0Ùð �7‰7�:×ÒÔ'GÈÈLÐZd×'eÒ'eÙÜÕ=¸tÓD×RÐRÈ
ˆØ—.‘. Ó%×,Ð,¨ˆØ—'‘'˜,Ó'×,Ð,¨1ˆà�*˜m¨S°,ÀÇÁÈÓ@P×@VÐ@VÐTVØ�W—[‘[ Ó)×/Ð/¨R°Ô<SÐTVÐX[Ó<\Ø˜'Ÿ+™+ lÓ3×>Ð>°wØ˜7Ÿ;™;Ð'9Ó:×bÐb¸g¿k¹kÈ,Ó>W×bÐbÐ[bØ˜WŸ[™[¨Ó9×>Ð>¸Qð^ô
 CTÐTVÐX[ÓB\ð^ð 	^øô ô Úðúsi   „F' £F' ¼F' ÁF' Á,F' ÂF' ÂF' Â0F' ÃF' Ã&F' ÄF' Ä!&F' ÅF' Å#F' Å<F' ÆF' Æ'F6Æ5F6c                ó   €  R;rV P                  R^RRR7       EFK  pVP                  R4      ;'       g    RVP                  R4      ;'       g    VP                  R4      ;'       g    ^ rT\        V4      '       dL   VfG   RVR,          R	VP                  R	4      ;'       g    RP                  4       P	                  4       RVRV/pM�Vf�   RVR,          RTR
\        WR,          4      ;'       g    VP                  R
4      ;'       g    RRVP                  R4      ;'       g    ^ RTRVP                  R4      ;'       g    ^ /\        WR,          4      CpVf   EKE  Vf   EKL   M	  W3#   \         d    Ru # i ; i)u3  (newest human-facing session, newest worker session); the worker row lets rosters show a
profile as working (workers heartbeat ``last_activity_at`` every â‰¤60s).

First element mirrors session.list's deny-list (drops ``tool`` sub-agent rows and ``kanban`` dispatcher
workers). Second element is the newest DENIED row â€” the freshest kanban/tool worker â€” so roster UIs can
show that a profile is actively working even though worker sessions never surface in conversation lists
(hermes-agent#90268). Workers heartbeat ``last_activity_at`` every â‰¤60s while running (#72016), so a
live worker's ``last_active`` stays fresh and the client can apply its own liveness window. Best-effort:
any failure (missing state.db, locked db, older schema) degrades to (None, None) rather than failing the
whole profiles.list call.
NT)ÚsourceÚlimitÚorder_by_last_activeÚcompact_rowsr³   r<   rµ   r°   r­   r¾   r´   r·   )NN)Úlist_sessions_richr=   r¹   r>   ÚlowerrŒ   r«   r   )rˆ   ÚhumanÚworkerÚsr³   rµ   s   &     r   Ú_latest_profile_session_rowsrÇ   Ç   sr  € ðØÐˆØ×&Ñ&¨d¸"ÐSWÐfjÐ&×kˆAØ!"§¡ w£×!5Ð!5°2°q·u±u¸]Ó7K×7gÐ7gÈqÏuÉuÐUaÓOb×7gÐ7gÐfg�;Ü˜a× Ò Ø’>Ø" A d¥G¨X¸¿¹¸h»×8MÐ8MÈ2×7TÑ7TÓ7V×7\Ñ7\Ó7^Ø% u¨m¸[ðJ�Føà’Ø˜q �w¨°Ø"Ô$;¸BÀ$ÅÓ$H×$bÐ$bÈAÏEÉEÐR[ÓL\×$bÐ$bÐ`bØ% q§u¡u¨\Ó':×'?Ð'?¸aÀÐP[Ø(¨!¯%©%°Ó*@×*EÐ*EÀAð;ô -¨R°4µÓ9ð	;�ð
 Õ  VÕ%7Ùñ lð ˆ}ÐøÜô ØÒðúsM   ‚3E- ¶E- ÁE- Á)9E- Â#AE- Ã1E- Ä
E- Ä%E- ÅE- ÅE- Å&E- Å-E=Å<E=c                óV   a€ R V3R llp^ RI Hp V P                  V! SV4      4       R# )a  Attach last_session / worker_session / canonical_session to a roster row. The DB is a
read-only attach (a writable ``SessionDB()`` waits up to 20s for the write lock + runs DDL
and stalled the 5s roster poll); no/unreadable DB -> every field None (the readers swallow).c                ó$   € V ^8„  d   QhR\         /# r9   r   )r   s   "r   r   Ú-_profile_session_fields.<locals>.__annotate__ì   s   € ÷ 'ñ '”4ñ 'r   c            	      ó8  <a€ \        S4      R ,          oRp \        SP                  R4      '       d   \        V3R lR4      p  \        V 4      w  rRVRVR\	        V S4      /V e   \        V P                  4       # #   T e   \        T P                  4       i i ; i)rš   NFc                  ó,   <€ \        R R4      ! S RR7      # )rŸ   r—   T)Údb_pathÚ	read_onlyr3   )rÍ   s   €r   rI   Ú8_profile_session_fields.<locals>._read.<locals>.<lambda>ð   s   ø€ œe N°KÔ@ÈÐ\`Õar   Úlast_sessionÚworker_sessionÚcanonical_session)rO   rB   ÚexistsrÇ   r¼   rK   Úclose)rˆ   ÚlastrÅ   rÍ   r¢   s      @€r   Ú_readÚ&_profile_session_fields.<locals>._readì   s“   ù€ Ü�|Ó$ zÕ1ˆØˆÜ�—‘ ×&Ò&ÜÔaÐcgÓhˆBð	'Ü7¸Ó;‰LˆDà" DÐ*:¸FØ'Ô)?ÀÀLÓ)QðSð Š~Ü˜RŸX™XÕ&ð øˆrŠ~Ü˜RŸX™XÕ&ð ús   ÁA= Á=B)Úcached_session_fieldsN)Ú tui_gateway.profile_roster_cacherØ   Úupdate)rŠ   r¢   rÖ   rØ   s   &f  r   Ú_profile_session_fieldsrÛ   è   s'   ø€ ÷'ð 'õ  Gà‡J�JÑ$ \°5Ó9Ö:r   c                ó(   € V ^8„  d   QhR\         RR/# )r   rŠ   r   Nr   )r   s   "r   r   r     s   € ÷ zñ z¤ð z°tñ zr   c                ó|   a€ R V3R llp^ RI Hp V P                  V! SV4      4       \        V3R lR4      V R&   R# )z¸Attach ``ui_meta`` / ``ui_meta_revisions`` / ``has_avatar`` from profile.yaml + assets.
``ui_meta_revisions`` is always present: it feature-detects gateway-owned CAS for a new profile.c                ó$   € V ^8„  d   QhR\         /# r9   r   )r   s   "r   r   Ú-_profile_ui_meta_fields.<locals>.__annotate__  s   € ÷ 
ñ 
”4ñ 
r   c                  óX  <a€ \        S4      p V P                  R 4      V P                  R4      upoR\        S\        4      '       d   \	        V3R l/ 4      M/ /p\        V\        4      '       d:   V'       d2   \
        P                  \
        P                  V\        R7      4      VR &   V# )Úui_metaÚ_ui_meta_revisionsÚui_meta_revisionsc                  ó   <€ \        S 4      # r   )r}   )Ú	revisionss   €r   rI   Ú8_profile_ui_meta_fields.<locals>._read.<locals>.<lambda>	  s   ø€ Ô/°	Ô:r   ©rA   )	rp   r=   rn   r   rB   ÚjsonÚloadsÚdumpsru   )Úraw_metará   Úfieldsrå   r4   s      @€r   rÖ   Ú&_profile_ui_meta_fields.<locals>._read  s‰   ù€ Ü% kÓ2ˆØ%Ÿ\™\¨)Ó4°h·l±lÐCWÓ6XÐˆ�à%ÜCMÈiÔY]×C^ÒC^”$Ô:¸BÔ?Ðdfðhˆä�gœt×$Ò$¯ô !%§
¡
¬4¯:©:°gÔG[¨:Ó+\Ó ]ˆF�9ÑØˆr   )Úcached_ui_meta_fieldsc                  óˆ   <€ \         ;QJ d#    V 3R  l\         4       F  '       g   K   R# 	  R# ! V 3R  l\         4       4      # )c              3   óf   <"  € T F&  pSR ,          RV 2,          P                  4       x € K(  	  R# 5i)Úassetszavatar.N)rg   )Ú.0r   r4   s   & €r   Ú	<genexpr>Ú<_profile_ui_meta_fields.<locals>.<lambda>.<locals>.<genexpr>  s0   øé € Ð(qÑepÐ`a¨+¸Õ*@ÀWÈQÈCÀ=Õ*P×)YÑ)Y×)[Ð)[Óepùs   ƒ.1TF)ÚanyÚ_ASSET_EXTS©r4   s   €r   rI   Ú)_profile_ui_meta_fields.<locals>.<lambda>  s*   ø€ §S£SÔ(qÕepÓ(q§S¤SÐ%q¢SÐ%q SÔ(qÕepÓ(qÔ%qr   FÚ
has_avatarN)rÙ   rî   rÚ   rB   )rŠ   r4   rÖ   rî   s   &f  r   Ú_profile_ui_meta_fieldsrú     s:   ø€ ÷
ð 
õ Gà‡J�JÑ$ [°%Ó8Ô9äÔqÐsxÓy€CˆÓr   zprofiles.listiÅ  c                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r   s   "r   r   r     s   € ÷ zñ z”4ð zœDñ zr   c                óÈ  a€ ^ RI Hp \        VP                  RR4      4      p. pV! RR7       EF  pRVP                  R\        VP                  4      R\        VP                  4      RVP                  R	VP                  R
VP                  ;'       g    RRVP                  ;'       g    RRVP                  ;'       g    ^ R\        VP                  ;'       g    . 4      /	pV'       d   \!        WeP                  4       \#        V\%        \        VP                  4      4      4       VP'                  V4       EK  	  ^ RIHo \-        V RVRRR\/        V3R lR4      /4      # )z©List Hermes profiles. ``include_sessions`` (default true) adds ``last_session`` /
``worker_session`` / ``canonical_session`` so a roster paints previews without N calls.)Úlist_profilesÚinclude_sessionsT)Úlazy_skill_countr	   rS   Ú
is_defaultr6   r5   Údescriptionr<   Údisplay_nameÚskill_countÚprevious_names©Úget_install_idÚprofilesÚbot_mode_protocolÚ
install_idc                  ó&   <€ S ! 4       ;'       g    R # ©r<   r&   r  s   €r   rI   Ú_.<locals>.<lambda>/  s   ø€ Ñ\jÓ\l×\rÐ\rÐprÐ\rr   )rZ   rý   Úis_truthy_valuer=   r	   r   rS   rE   r   r6   r5   r  r  r  Úlistr  rÛ   rú   rO   ÚappendÚhermes_cli.install_identityr  Ú_okrB   )r   r   rý   rþ   ÚoutÚprŠ   r  s   &&     @r   Ú_r    s  ø€ õ 2Ü& v§z¡zÐ2DÀdÓ'KÓLÐØ
€Cá¨D×1Ð1ˆØ�q—v‘v˜v¤s¨1¯6©6£{°LÄ$ÀqÇ|Á|ÓBTÐV]Ð_`×_fÑ_fØ˜1Ÿ:™: }°a·m±m×6IÐ6IÀrØ˜qŸ~™~×3Ð3°°]ÀAÇMÁM×DVÐDVÐUVØ¤ a×&6Ñ&6×&<Ð&<¸"Ó!=ð?ˆ÷ Ü# C¯©Ô0Ü ¤T¬#¨a¯f©f«+Ó%6Ô7Ø�
‰
�3�ñ 2õ ;Üˆs�Z Ð&9¸4ÀÌtÔTrÐtvÓOwÐxÓyÐyr   zprofiles.createc                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r   s   "r   r   r   3  s   € ÷ 'Dñ 'D”4ð 'DœDñ 'Dr   c                ó¾  aa	a
aaa€ \        VP                  R4      ;'       g    R4      P                  4       o	S	'       g   \        V RR4      #  ^ RIHo \        VP                  R4      ;'       g    R4      P                  4       ;'       g    Rp\        VP                  RR	4      4      pSP                  S	Y#\        V4      ;'       d    V'       * \        VP                  R
R	4      4      \        VP                  R4      ;'       g    R4      P                  4       ;'       g    R\        VP                  RR	4      4      R7      o
T'       g   \        T
T3R l4       \        TP                  RR	4      4      '       g   \        T	T3R l4       TP                  R4      o\        S\         4      ;'       d2    \        SP                  4       4      ;'       d    \        T
T3R l4      p\        S
T4      p\!        T4      w  ooR	pS'       d   S'       d   \        TT
T3R l4      pM4\        TP                  RR4      4      '       d   \#        T
3R lR	4      TR&   \%        T RRRS	R\        S
4      RTRTRT/4      #   \        \        \        3 d!   p\        T R\        T4      4      u Rp?# Rp?i\         d!   p\        T R\        T4      4      u Rp?# Rp?ii ; i)uî  Create a profile (ws twin of POST /api/profiles). Params: ``name``, ``description``,
``clone_from`` (omitted = fresh + bundled skills), ``clone_all``, ``clone_channels`` (opt-in: keep the
source's bot tokens/allowlists â€” default strips them so two profiles never hold one bot), ``no_skills``, ``soul``,
``model`` + ``provider``, ``share_auth``, ``no_alias``, ``mirror_credentials`` (default true: a bare
``create_profile()`` seeds a comment-only .env and no auth.json = NO provider headless).r	   r<   iÝ  rX   )r  Ú
clone_fromNÚ	clone_allFÚ	no_skillsr  Úclone_channels)r	   r  r  Úclone_configr  r  r  iÞ  iÆ  c                  ó*   <€ SP                  S R R7      # )T)Úquiet)Úseed_profile_skills)rS   Úprofiles_mods   €€r   rI   r  L  s   ø€ ˜\×=Ñ=¸dÈ$Ð=ÔOr   Úno_aliasc                  óX   <€ SP                  S 4      ;'       g    SP                  S 4      # r   )Úcheck_alias_collisionÚcreate_wrapper_script)r	   r  s   €€r   rI   r  N  s'   ø€ ˜\×?Ñ?ÀÓE×qÐqÈ×IkÑIkÐlpÓIqÐqr   Úsoulc                  ó8   <€ S R ,          P                  SRR7      # )úSOUL.mdrc   rd   ©Ú
write_text)rS   r$  s   €€r   rI   r  Q  s   ø€ �˜	Õ!×-Ñ-¨d¸WÐ-ÔEr   c                  ó   <€ \        SSS 4      # r   ©r7   )r6   rS   r5   s   €€€r   rI   r  V  s   ø€ Ô);¸DÀ(ÈEÔ)Rr   Úmirror_credentialsTc                  ó   <€ \        S 4      # r   )Ú_inherit_launch_model©rS   s   €r   rI   r  X  s   ø€ Ô3HÈÔ3Nr   Úmodel_inheritedÚokrS   Úsoul_writtenÚ	model_setÚmirrored)r   r=   r>   r   Ú
hermes_clir  r  Úcreate_profilerE   r[   ÚFileExistsErrorÚFileNotFoundErrorr   rK   rn   Ú_mirror_launch_credentialsr?   rB   r  )r   r   r  r  r   r1  r3  r2  r6   r	   rS   r  r5   r$  s   &&      @@@@@@r   r  r  2  sR  ý€ ô ˆv�z‰z˜&Ó!×'Ð' RÓ(×.Ñ.Ó0€DßÜ�C˜˜Ó/Ð/ð'Ý7Ü˜Ÿ™ LÓ1×7Ð7°RÓ8×>Ñ>Ó@×HÐHÀDˆ
Ü# F§J¡J¨{¸EÓ$BÓCˆ	Ø×*Ñ*Ø *Ü˜jÓ)×;Ð;°)¬mÜ% f§j¡j°¸eÓ&DÓEÜ˜FŸJ™J }Ó5×;Ð;¸Ó<×BÑBÓD×LÐLÈÜ*¨6¯:©:Ð6FÈÓ+NÓOð +ó Qˆ÷ ÜÕOÔPÜ˜6Ÿ:™: j°%Ó8×9Ò9ÜÕqÔrØ�:‰:�fÓ€DÜ˜d¤CÓ(÷ Gð G¬T°$·*±*³,Ó-?÷ Gð GÄLÝEóEG€Lä)¨$°Ó7€HÜ,¨VÓ4�O€Eˆ8Ø€Iß—Ü Ö!RÓS‰	Ü	˜Ÿ™Ð$8¸$Ó?×	@Ò	@Ü&*Ô+NÐPUÓ&VˆÐ"Ñ#Üˆs�T˜4 ¨¨v´s¸4³yÀ.ÐR^Ø  )¨Z¸ðCó Dð Døô' œÔ):Ð;ô 'Ü�C˜œs 1›vÓ&Õ&ûÜô 'Ü�C˜œs 1›vÓ&Õ&ûð'úsO   Á"I= Á2I= ÂA:I= Ä	I= Ä%"I= É=KÊJ.Ê(KÊ.KÊ;KÊ<KËKËKzprofiles.describeiÇ  c                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r   s   "r   r   r   ^  s   € ÷ !Pñ !P”4ð !PœDñ !Pr   c                ó‚  aaa€ \        W4      w  popVe   V# \        S4      ;_uu_ 4        ^ RIHp ^ RIHp ^ RIHp V! 4       ;'       g    / pV! V4       Uu0 uF  qˆP                  4       kK  	  p	pSR,          p
V
P                  4       '       d
   V! V
R4      MR Uu. uFB  pRVP                  P                  RVP                  P                  P                  4       V	9  /NKD  	  pp\        V4      w  rÞSR	,          o\        V3R
 lR4      pVP                  R4      o\        S\         4      '       d   \        V3R l. 4      M. p\        VP                  R4      \         4      '       d   VP                  R4      M/ p\        V3R l/ 4      p\#        T RTR\%        VP                  R4      ;'       g    R4      RTRR\%        VP                  R4      ;'       g    R4      R\%        VP                  R4      ;'       g    R4      /RVRVRVRJRV/4      uuRRR4       # u upi u upi   + '       g   i     R# ; i)z�Editor snapshot; installed skills are enabled unless in ``skills.disabled``; ``mcp_servers``
is ``[{name, enabled, transport}]`` (best-effort).N)Úiter_skill_index_files)Úload_config)Úget_disabled_skillsÚskillszSKILL.mdr	   Úenabledr&  c                  óZ   <€ S P                  4       '       d   S P                  R RR7      # R# )rc   Úreplace©re   Úerrorsr<   )rg   ri   )Ú	soul_paths   €r   rI   r  p  s-   ø€ ÐW`×WhÑWh×WjÒWj˜I×/Ñ/¸ÈÐ/ÓSÐrÐprÐrr   r<   Úmcp_serversc                  óN  <€ \        SP                  4       4       U Uu. uFy  p SV ,          p\        V\        4      '       g   K$  R \	        V 4      R\        V4      RVP                  R4      '       d%   \	        VP                  R4      ;'       g    R4      MR/NK{  	  upp # u upp i )r	   r?  Ú	transportÚurlÚhttpÚstdio)ÚsortedÚkeysrn   r   r   Ú_mcp_entry_enabledr=   )Úsrv_nameÚentryÚmcp_cfgs     €r   rI   r  r  sŠ   ø€ ô # 7§<¡<£>Ô2ô 
ñ 3�ÀÈÕAR°uÜ˜%¤×&ôbˆV”S˜“] IÔ/AÀ%Ó/HØÀ5Ç9Á9ÈU×CSÒCSœ#˜eŸi™i¨Ó4×>Ð>¸Ô?ÐY`óbá2ó 
ùó  
s   ž!B!ÁA
B!ÂB!r6   c                  ó(   <€ \        R R4      ! S 4      # )úhermes_cli.profilesÚread_profile_metar3   r÷   s   €r   rI   r  y  s   ø€ œEÐ"7Ð9LÔMÈkÔZr   r  r$  r5   rA   ÚtoolsetsÚtoolsets_pinnedr&   )r]   rU   Úagent.skill_utilsr;  Úhermes_cli.configr<  Úhermes_cli.skills_configr=  rÃ   r\   Úparentr	   Ú_describe_toolsetsrB   r=   rn   r   r  r   )r   r   r	   Úerrr;  r<  r=  ÚcfgrÆ   ÚdisabledÚskills_rootÚmdÚ	installedÚtoolsets_outÚ
pinned_setr$  Úmcp_outÚ	model_cfgÚmetarP  r4   rD  s   &&                 @@@r   r  r  ]  s  ú€ ô .¨cÓ:Ñ€Dˆ+�sØ
‚Øˆ
Ü	˜K×	(Õ	(Ý<Ý1Ý@Ù‹m×!Ð!˜rˆÙ':¸3Ô'?Ó@Ñ'? !—G‘G–IÑ'?ˆÐ@Ø! HÕ,ˆð KV×J\ÑJ\×J^ÒJ^Ñ-¨k¸:ÔFÐdfÐfóiáf�ð �R—Y‘Y—^‘^ Y°·	±	·±×0DÑ0DÓ0FÈhÑ0VÓWÙfð 	ð iô $6°cÓ#:Ñ ˆØ )Õ+ˆ	ÜÔrÐtvÓwˆØ—'‘'˜-Ó(ˆô ˜W¤d×+Ò+ô ô 
ð
 ôð
 24ð 	ô )3°3·7±7¸7Ó3CÄT×(JÒ(J�C—G‘G˜GÔ$ÐPRˆ	ÜÔZÐ\^Ó_ˆÜ�3Ø�D˜-¬¨T¯X©X°mÓ-D×-JÐ-JÈÓ)KÈVÐUYØ�j¤# i§m¡m°JÓ&?×&EÐ&EÀ2Ó"FØ¤ Y§]¡]°9Ó%=×%CÐ%CÀÓ!DðFà�i ¨\Ø˜z°Ð5°}ÀgðOó P÷- 
)Ò	(ùò
 Aùòi÷ 
)×	(Ð	(ús7   ¬.H-ÁH#Á2.H-Â AH(Ã(C5H-Ç#H-ÈH-È#
H-È-H>	zprofiles.configureiÈ  c                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r   s   "r   r   r   ƒ  s   € ÷ Bñ B”4ð BœDñ Br   c                óÎ  aaa€ \        V S4      w  popVe   V# / p\        SP                  R4      \        4      '       d   \	        SSV4       \        SP                  R4      \
        4      '       d   \        VV3R l4      VR&   \        SP                  R4      \
        4      '       d!   \        RR4      o\        VVV3R l4      VR&   \        SSV4      p\        ;QJ d    V3R lR 4       F  '       g   K   R	M	  R
M! V3R lR 4       4      '       d   \        SSV4       \        T RV'       d   \        VP                  4       4      MR	RV/Ve   RR	RV/C4      # / C4      # )a  Editor Save: ``name`` plus any of ``ui_meta`` (+ ``ui_meta_expected_revisions``), ``soul``,
``description``, ``model`` + ``provider`` (+ ``confirm_expensive_model``), ``disabled_skills``,
``enabled_toolsets``, ``enabled_mcp_servers``; sections are independent, ``applied`` reports each.rá   r$  c                  óF   <€ SR ,          P                  S R,          RR7      # )r&  r$  rc   rd   r'  )r   r4   s   €€r   rI   r  Ž  s"   ø€ °¸iÕ0G×/SÑ/SÐTZÐ[aÕTbÐmtÐ/SÔ/ur   r  rR  Úwrite_profile_metac                  óD   <€ S! SS R ,          P                  4       RR7      # )r  F)r  Údescription_auto)r>   )r   r4   Ú
write_metas   €€€r   rI   r  ‘  s!   ø€ ±jØ V¨MÕ%:×%@Ñ%@Ó%BÐUZõ7\r   c              3   ób   <"  € T F$  p\        SP                  V4      \        4      x € K&  	  R # 5ir   )rn   r=   r  )rò   r{   r   s   & €r   ró   Ú_.<locals>.<genexpr>”  s%   øé € Ð
sÑ4r¨qŒ:�f—j‘j “m¤T×*Ð*Ó4rùs   ƒ,/TFr0  ÚappliedÚconfirm_requiredÚconfirm_message)Údisabled_skillsÚenabled_toolsetsÚenabled_mcp_servers)r]   rn   r=   r   Ú_configure_ui_metar   rK   r-   Ú_configure_modelrõ   Ú_configure_cfg_sectionsr  ÚallÚvalues)r   r   Ú_namer[  ro  rq  r4   rl  s   &f    @@r   r  r  ‚  sE  ú€ ô
 /¨s°FÓ;Ñ€Eˆ;˜Ø
‚Øˆ
Ø€GÜ�&—*‘*˜YÓ'¬×.Ò.Ü˜;¨°Ô8Ü�&—*‘*˜VÓ$¤c×*Ò*Ü&Õ'uÓvˆ�‰Ü�&—*‘*˜]Ó+¬S×1Ò1ÜÐ0Ð2FÓGˆ
Ü!-ö /\ó "]ˆ�Ñä& {°F¸GÓD€Oß
ƒsÔ
sÑ4rÓ
s‡s‡s‚sÔ
sÑ4rÓ
s×sÒsÜ ¨V°WÔ=äˆs�T·Gœ3˜wŸ~™~Ó/Ô0ÀÀyÐRYð Aà*Ò6ð ,¨TÐ3DÀoÐVðAó Bð Bà<>ðAó Bð Br   zprofiles.set_assetiÉ  c                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r   s   "r   r   r   �  s   € ÷ "Eñ "E”4ð "EœDñ "Er   c                óò  a€ \        VP                  R4      ;'       g    R4      P                  4       P                  4       p\        VP                  R4      ;'       g    R4      P                  4       '       g   \	        V RR4      # VR8w  d   \	        V RRV R	24      # ^ R
Ip^ R
Ip\        W4      w  rVpVe   V# VR,          p\        VP                  RR4      4      '       d   \        V RRRVR^ R\        W‚4      /4      # \        VP                  R4      ;'       g    R4      p	V	'       g   \	        V RR4      # VP                  RW”P                  4      p
 TP                  V
'       d   V
P                  ^4      MT	RR7      o\!        S4      R8”  d   \	        T RR\!        S4       R24      # \#        T3R l\$        P'                  4        4       R
4      pTf   \	        T RR4      # TP)                  RRR 7       \        Y‚4       Y‚ R!T R"2,          pTP+                  S4       TP-                  Y‚ R!T 2,          4       \        T RRRTR\!        S4      /4      #   \         d    \	        T RR4      u # i ; i)#u³   Store ``assets/<asset>.<ext>`` atomically. Params: ``name``, ``asset`` (``"avatar"`` only),
``data`` (data URL or base64; PNG/JPEG/WebP â‰¤2MB, format sniffed) or ``clear: true``.ÚassetÚavatarr	   r<   rW   rX   iâ  zunknown asset 'z' (supported: avatar)Nrñ   ÚclearFr0  TÚsizeÚremovedÚdataiã  z"data required (data URL or base64)z,^data:(image/(?:png|jpeg|webp));base64,(.*)$)Úvalidateiä  zdata is not valid base64i€„ iå  zasset too large (z bytes; max 2MB)c              3   ó°   <"  € T FK  w  r\         ;QJ d    V3R  lV 4       F  '       d   K   RM	  RM! V3R  lV 4       4      '       g   KG  Vx € KM  	  R# 5i)c              3   ó8   <"  € T F  w  rpSW V8H  x € K  	  R # 5ir   r&   )rò   ÚaÚbÚmÚblobs   &   €r   ró   Ú_.<locals>.<genexpr>.<genexpr>·  s"   øé € Ð=bÑ\aÑQXÐQRÐWX¸dÀ1¸iÈ1¾nÓ\aùs   ƒFTN)rx  )rò   r   Úmagicr‰  s   &  €r   ró   rn  ·  s6   øé € ÐcÑ"6‘h�a¿#»#Ô=bÑ\aÓ=b¿#¿#º#Ô=bÑ\aÓ=b×:b—’Ó"6ùs   ƒ&A¬AÁ
Aiæ  z-unsupported image format (PNG/JPEG/WebP only))ÚparentsÚexist_okÚ.z.tmp)r   r=   r>   rÃ   r   Úbase64Úrer]   r  r  Ú_unlink_asset_filesÚmatchÚDOTALLÚ	b64decodeÚgroupr   r‡   ÚnextÚ_ASSET_MAGICry   ÚmkdirÚwrite_bytesrA  )r   r   r}  r�  r�  rz  r4   r[  Ú
assets_dirr‚  r’  ÚextÚtmpr‰  s   &&           @r   r  r  œ  sF  ø€ ô �—
‘
˜7Ó#×/Ð/ xÓ0×6Ñ6Ó8×>Ñ>Ó@€EÜˆv�z‰z˜&Ó!×'Ð' RÓ(×.Ñ.×0Ò0Ü�C˜˜Ó/Ð/Ø�ÔÜ�C˜ °°Ð7LÐMÓNÐNÛÛÜ.¨sÓ;Ñ€E˜Ø
‚Øˆ
Ø˜xÕ'€JÜ�v—z‘z '¨5Ó1×2Ò2Ü�3˜˜t W¨e°V¸QÀ	ÔK^Ð_iÓKqÐrÓsÐsÜˆv�z‰z˜&Ó!×'Ð' RÓ(€DßÜ�C˜ÐCÓDÐDØ�H‰HÐDÀdÏIÉIÓV€Eð;Ø×Ñ·% §¡¨A¤¸TÈDÐÓQˆô ˆ4ƒy�9ÔÜ�C˜Ð!2´3°t³9°+Ð=MÐNÓOÐOÜ
Ôc¤,×"4Ñ"4Ô"6ÓcÐeiÓ
j€CØ
‚{Ü�C˜ÐNÓOÐOØ×Ñ˜T¨DÐÔ1Ü˜
Ô*Ø
˜  #  dÐ+Õ
+€CØ‡O�O�DÔØ‡K�K�
˜w a¨ uÐ-Õ-Ô.Üˆs�T˜4 ¨%°¼¸T»ÐCÓDÐDøô ô ;Ü�C˜Ð9Ó:Ò:ð;ús   Å,I ÉI6É5I6zprofiles.get_assetiÊ  c                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r   s   "r   r   r   Ã  s   € ÷ &ñ &”4ð &œDñ &r   c                ó  € \        VP                  R4      ;'       g    R4      P                  4       P                  4       p^ RIp\        W4      w  rEpVe   V# \        P                  4        Fƒ  w  rxVR,          V RV 2,          p	V	P                  4       '       g   K2  V	P                  4       p
\        V RRRVR	\        V
4      R
RV RVP                  V
4      P                  R4       2/4      u # 	  \        V RR/4      # )zFProfile asset as a data URL; absent is ``found: false``, not an error.r}  r~  Nrñ   rŽ  ÚfoundTÚmimer€  r‚  zdata:z;base64,ÚasciiF)r   r=   r>   rÃ   r�  r]   rö   ry   rg   Ú
read_bytesr  r‡   Ú	b64encodeÚdecode)r   r   r}  r�  rz  r4   r[  r›  r   Útargetr‰  s   &&         r   r  r  Â  sü   € ô �—
‘
˜7Ó#×/Ð/ xÓ0×6Ñ6Ó8×>Ñ>Ó@€EÛÜ.¨sÓ;Ñ€E˜Ø
‚Øˆ
Ü ×&Ñ&Ö(‰	ˆØ˜xÕ'¨U¨G°1°S°EÐ*:Õ:ˆØ�>‰>×ÔØ×$Ñ$Ó&ˆDÜ�s˜W d¨F°D¸&Ä#ÀdÃ)Ø# u¨T¨F°(¸6×;KÑ;KÈDÓ;Q×;XÑ;XÐY`Ó;aÐ:bÐ%cðeó fò fñ	 )ô ˆs�W˜eÐ$Ó%Ð%r   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r	   r   )r   rE   )r   s   "r   r   r   Ó  s   € ÷ 	ñ 	¬Cð 	¼Dñ 	r   c                óV  € W,          W,          rTVP                  4       '       d   V! WE4      '       g   R# ^ RIpVP                  WE4       \        P                  ! \
        4      ;_uu_ 4        \        P                  \        V4      R4       RRR4       R#   + '       g   i     R# ; i)z^Copy the launch ``name`` file into the profile (0600) when it exists and ``wanted(src, dst)``.FNi€  T)	rg   ÚshutilÚcopy2Ú
contextlibÚsuppressÚOSErrorÚosÚchmodr   )rS   Úlaunch_homer	   ÚwantedÚsrcÚdstr¨  s   &&&&   r   Ú_mirror_secretr³  Ó  sl   € àÕ! 4¥;ˆØ�K‰K�MŠM™f S×.Ò.ÙÛØ
‡L�L�ÔÜ	×	Ò	œW×	%Õ	%Ü
�‰”�S“˜5Ô!÷ 
&á÷ 
&Ö	%áús   Á- BÂB(	c                ó$   € V ^8„  d   QhR\         /# r9   rD   )r   s   "r   r   r   ß  s   € ÷ Kñ K¤$ñ Kr   c                 ó  € V P                  R RR7      P                  4       p\        ;QJ d4    R \        \        P
                  V4       4       F  '       g   K   R# 	  R# ! R \        \        P
                  V4       4       4      # )rc   rA  rB  c              3   ó`   "  € T F$  q;'       d    VP                  R 4      '       * x € K&  	  R# 5i)Ú#N)Ú
startswith)rò   rÆ   s   & r   ró   Ú#_env_has_content.<locals>.<genexpr>á  s'   é € ÐJÑ4I¨q×*Ð*˜Ÿ™ cÓ*Ô*Ô*Ó4Iùs   ‚.�.TF)ri   Ú
splitlinesrõ   Úmapr   r>   )Úenv_pathÚliness   & r   Ú_env_has_contentr¾  ß  s_   € Ø×Ñ¨¸	ÐÓB×MÑMÓO€Eß‹3ÑJ´C¼¿	¹	À5Ô4IÓJ�3Œ3ÐJŠ3ÐJˆ3ÑJ´C¼¿	¹	À5Ô4IÓJÓJÐJr   c                ó$   € V ^8„  d   QhR\         /# r9   rD   )r   s   "r   r   r   ä  s   € ÷ ñ ¤Dñ r   c                óä  €  ^ RI HpHp V! 4       pR Uu/ uF$  qCP                  V4      '       g   K  WCV,          bK&  	  ppV'       g   R# \	        V 4      ;_uu_ 4        V! 4       ;'       g    / pVP                  4        UUu/ uF  w  rGWF9  g   K  WGbK  	  pppV'       d   V! / VCVC4       RRR4       \        X4      # u upi u uppi   + '       g   i     L&; i  \         d     R# i ; i)zŠCopy stt/tts/voice sections from the launch profile (a fresh profile has only ``model``,
so voice fell back to defaults); True if written.)Úread_user_config_rawÚsave_configFN)ÚsttÚttsÚvoice)rW  rÁ  rÂ  r=   rU   ry   rE   r   )	rS   rÁ  rÂ  Úsrc_cfgr{   ÚsectionsÚdst_cfgr|   Úmissings	   &        r   Ú_mirror_voice_sectionsrÊ  ä  sÓ   € ðßGñ 'Ó(ˆÙ+BÓUÑ+B aÇkÁkÐRSÇn”M�A˜q•z’MÑ+BˆÐUßÙÜ ×%Õ%á*Ó,×2Ð2°ˆGØ(0¯©Ô(8ÔMÑ(8¡ ¸AÑ<L”t�q’tÑ(8ˆGÑMßÙÐ2˜wÐ2¨'Ð2Ô3÷ &ô �G‹}Ðùò Vùó N÷ &×%ûô ô Úðús\   ‚C  •C²C¿
C  ÁC  Á%CÂ
C
ÂC
ÂCÂ/C  ÃC  ÃCÃC	ÃC  Ã C/Ã.C/c                ó$   € V ^8„  d   QhR\         /# r9   rD   )r   s   "r   r   r   ú  s   € ÷ 'ñ '¤4ñ 'r   c           
     ó¾  € ^ RI HpHp \        V 4      ;_uu_ 4        V! 4       ;'       g    / P	                  R4      ;'       g    / pRRR4       XP	                  R4      '       d   VP	                  R4      '       d   R# V! 4       ;'       g    / pVP	                  R4      ;'       g    / pVP	                  R4      '       d   VP	                  R4      '       g   R# \        RR4      ! V! 4       4      pVP	                  R	4      '       g   VP	                  R
4      '       dC   ^ RI Hp \        RR4      p\        V 4      ;_uu_ 4        V! V! V! 4       V4      4       RRR4       \        T \        VR,          4      \        VR,          4      \        VP	                  R4      ;'       g    R4      4       V! 4       ;'       g    / P	                  R4      ;'       g    / P	                  R4      p	\        V	\        4      '       d¡   RV	9   dš   ^ RI Hp \        V 4      ;_uu_ 4        V! 4       ;'       g    / p
\        V
P	                  R4      \        4      '       d@   V
R,          P	                  R4      VP	                  R4      8X  d   WšR,          R&   V! V
4       RRR4       R# R#   + '       g   i     ELe; i  + '       g   i     ELf; i  + '       g   i     R# ; i)z¡Inherit launch model.provider/default when the new profile has none. Gate on the MODEL
SECTION, not config.yaml existing: voice mirroring creates the file first.)Úload_config_readonlyrÁ  r6   Nr5   rA   Fzhermes_cli.profile_model_seedÚlaunch_model_seedÚ	providersÚcustom_providers)rÂ  Úmerge_endpoint_seedr2   r<   z${T)rW  rÍ  rÁ  rU   r=   r-   rÂ  r7   r   rn   r   )rS   rÍ  rÁ  Ú	dst_modelÚ
launch_cfgrd  ÚseedrÂ  ÚmergeÚraw_urlr\  s   &          r   r-  r-  ú  s%  € ÷ MÜ	˜D×	!Õ	!Ù)Ó+×1Ð1¨r×6Ñ6°wÓ?×EÐEÀ2ˆ	÷ 
"à‡}�}�Z× Ò  Y§]¡]°9×%=Ò%=ÙÙ%Ó'×-Ð-¨2€JØ—‘˜wÓ'×-Ð-¨2€IØ�M‰M˜*×%Ò%¨)¯-©-¸	×*BÒ*BÙô
 Ð0Ð2EÔFÑG[ÓG]Ó^€DØ‡x�x�×Ò §¡Ð);× <Ò <Ý1ÜÐ5Ð7LÓMˆÜ ×%Õ%Ù™Ñ2Ó4°dÓ;Ô<÷ &ô
 �tœS ¨:Õ!6Ó7¼¸YÀyÕ=QÓ9RÜ˜9Ÿ=™=¨Ó4×:Ð:¸Ó;ô=á$Ó&×,Ð,¨"×1Ñ1°'Ó:×@Ð@¸b×EÑEÀjÓQ€GÜ�'œ3×Ò D¨G¤OÝ1Ü ×%Õ%Ù&Ó(×.Ð.¨BˆCÜ˜#Ÿ'™' 'Ó*¬D×1Ò1°c¸'µl×6FÑ6FÀzÓ6RÐV_×VcÑVcÐdnÓVoÔ6oØ+2�G•˜ZÑ(Ù˜CÔ ÷	 &ó
 ÷? 
"×	!Ð	!ú÷  &×%Ð%ú÷ &Ö%ñ
 ús*   œ'J#ÁJ#ÅJ7È!A6KÊ#J4	Ê7K	ËK	c                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r   s   "r   r   r   $  s   € ÷ ñ ¬Tð ´dñ r   c                óø  a a€ \        VP                  RR4      4      pRRRV'       d   RMRRRRR/p\        VP                  RR	4      4      '       g   V# \        4       o\        VV 3R
 lR4      VR&   VR,          '       d1   \        VP                  RR4      4      '       g   \	        V 3R l4       V'       g3   \        VV 3R lR4      VR&   VR,          '       d   \	        V 3R l4       \        S 4      VR&   V# )zúCopy launch .env / auth.json / voice sections into a new profile (best-effort per item).
``share_auth`` reports ``auth: "shared"`` and skips the auth copy; ``mirror_credentials``
false skips everything. ``model_inherited`` is filled in by the caller.Ú
share_authFÚenvÚauthÚsharedr/  rÅ  r+  Tc                  ó"   <€ \        SS R R 4      # )ú.envc                 óT   a€ \        V 4      ;'       d    \        V3R  lR4      '       * # )c                  ó   <€ \        S 4      # r   )r¾  )r²  s   €r   rI   ÚP_mirror_launch_credentials.<locals>.<lambda>.<locals>.<lambda>.<locals>.<lambda>0  s   ø€ Ô3CÀCÔ3Hr   F)r¾  rB   ©r±  r²  s   &fr   rI   Ú>_mirror_launch_credentials.<locals>.<lambda>.<locals>.<lambda>/  s!   ø€ Ü˜Ó×PÐP¤dÔ+HÈ%Ó&PÔ"PÐPr   ©r³  ©r¯  rS   s   €€r   rI   Ú,_mirror_launch_credentials.<locals>.<lambda>/  s   ø€ ¤>°$¸ÀVñ NRô $Sr   r  c                  ó6   <€ \        R R4      ! S R,          4      # )zhermes_cli.profile_channelsÚstrip_channel_env_filerÞ  r3   r.  s   €r   rI   ræ  4  s   ø€ œUÐ#@ÐBZÔ[Ð\`ÐciÕ\iÔjr   c                  ó"   <€ \        SS R R 4      # )z	auth.jsonc                 ó,   € VP                  4       '       * # r   )rÓ   râ  s   &&r   rI   rã  7  s   € ÈCÏJÉJËLÕHXr   rä  rå  s   €€r   rI   ræ  6  s   ø€ ¬°t¸[È+Ù7Xô)Zr   c                  ó(   <€ \        R R4      ! S 4      # )zhermes_cli.authÚ$strip_cloned_single_use_oauth_grantsr3   r.  s   €r   rI   ræ  ;  s   ø€ ¤Ð'8Ð:`Ô!aÐbfÔ!gr   )r  r=   Úget_hermes_homerB   rK   rÊ  )rS   r   rÙ  r3  r¯  s   f&  @r   r8  r8  $  så   ù€ ô ! §¡¨L¸%Ó!@ÓA€JØ�u˜f·*¡hÀ%ÐIZÐ\aØ˜ð €Hä˜6Ÿ:™:Ð&:¸DÓA×BÒBØˆÜ!Ó#€Käõ SØTYó[€HˆU�Oà�‡„œ¨v¯z©zÐ:JÈEÓ/R×SÒSô 	ÔjÔkßÜõ !ZØ[`óbˆ�Ñà�F×Ôô ÔgÔhÜ.¨tÓ4€HˆWÑØ€Or   c                ó*  a aaa€ ^ RI HpHpHoHp ^ RIHo T! S P                  R4      ;'       g    / P                  R4      R4      p\        V\        4      '       d   \        V4      MRp\        VV 3R l\        4       4      p\        R \        4       4      p. pV! 4        Fl  w  oršSVe   TMT9   pV! SR4      '       d   SV9   g   SR8X  d   V'       g   K8  TP                  R	SR
T	RT
;'       g    RR\        VV3R l^ 4      RV/4       Kn  	  W…3# )z£``(toolsets, pinned_set)`` as the `hermes tools` checklist presents them (the raw registry
leaks platform composites and reports everything enabled without a pin).)Ú_coerce_platform_toolsets_valueÚ$_get_effective_configurable_toolsetsÚ_get_platform_toolsÚ_toolset_allowed_for_platform)Úresolve_toolsetÚplatform_toolsetsÚcliNc                  ó,   <€ \        S ! SR RR7      4      # )rõ  F)Úinclude_default_mcp_servers©Úset)rñ  r\  s   €€r   rI   Ú$_describe_toolsets.<locals>.<lambda>I  s   ø€ ¤CÑ(;¸CÀÐdiÔ(jÔ$kr   c                  ó   € \        R R4      # )zhermes_cli.tools_configÚ_DEFAULT_OFF_TOOLSETSr3   r&   r   r   rI   rú  J  s   € œuÐ%>Ð@WÔXr   Úyuanbaor	   Úlabelr  r<   Ú
tool_countc                  ó8   <€ \        \        S ! S4      4      4      # r   )r‡   rù  )ró  Úts_names   €€r   rI   rú  S  s   ø€ ¼¼CÁÐPWÓ@XÓ<YÔ8Zr   r?  )Úhermes_cli.tools_configrï  rð  rñ  rò  rT  ró  r=   rn   r  Ú_clean_namesrB   rù  r  )r\  rï  rð  rò  Úpinnedrb  Úplatform_enabledÚdefault_offra  Úts_labelÚts_descr?  rñ  ró  r  s   f           @@@r   rZ  rZ  @  s
  û€ ÷'ó 'õ )Ù,¨c¯g©gÐ6IÓ.J×.PÐ.PÈb×-UÑ-UÐV[Ó-\Ð^cÓd€FÜ)3°F¼D×)AÒ)A”˜fÔ%Àt€JÜÕkÔmpÓmrÓsÐÜÑXÔZ]ÓZ_Ó`€KØ€LÙ&JÖ&LÑ"ˆ�Ø¨JÒ,B™jÐHXÑYˆá,¨W°e×<Ò<Ø˜KÔ'¨7°iÔ+?ÏÙØ×Ñ˜V W¨g°xÀÐPW×P]ÐP]Ð[]Ø)¬4Õ0ZÐ\]Ó+^Ø&¨ð1ö 	2ñ 'Mð Ð#Ð#r   c                ó$   € V ^8„  d   QhR\         /# )r   rá   r   )r   s   "r   r   r   X  s   € ÷ Añ Aœñ Ar   c                 óv   € V P                  R 4      p\        V\        4      '       d   VP                  R4      # R# )úhermes-botsr³   N)r=   rn   r   )rá   Úbotss   & r   Ú_bots_titler  X  s0   € Ø�;‰;�}Ó%€DÜ *¨4´× 6Ò 6ˆ4�8‰8�GÓÐ@¸DÐ@r   c                ó   € V ^8„  d   QhRR/# r/   r&   )r   s   "r   r   r   ]  s   € ÷ 3#ñ 3#¸ñ 3#r   c                ó(  € RVR&    VR,          p\        \        P                  V4      4      R8”  d   R# VP                  R4      pVe"   \	        V\
        4      '       g   \        R4      h\        ;_uu_ 4        \        V 4      pVP                  R4      p\        \	        V\
        4      '       d   TM/ 4      p/ p\	        V\
        4      '       d   TMR Fh  p	VP                  V	4      VP                  V	^ 4      rº\	        V
\        4      '       d&   \	        V
\        4      '       g   V
^ 8  g	   W«8w  g   K`  RV
R	V/W‰&   Kj  	  V'       d5   W‚R
&   V U	u/ uF  q™VP                  V	^ 4      bK  	  up	VR&    RRR4       R# VP                  R4      p\	        V\
        4      '       d   TM/ p\        V4      pVP                  4        F;  w  ržVf   VP                  V	R4       MWìV	&   VP                  V	^ 4      ^,           Wy&   K=  	  V'       d   WÅR&   MVP                  RR4       YuR&   ^ RIHp V! V R,          VRR7       RVR&   V U	u/ uF  q™Wy,          bK  	  up	VR&   \        V4      V8w  di   \"        P$                  ! \&        4      P)                  RVP                  R4      ;'       g    V P*                  V\        V4      VP                  R4      4       RRR4       R# u up	i u up	i   + '       g   i     R# ; i  \,         d
    RTR&    R# i ; i)a
  Merge ``params["ui_meta"]`` key-wise into profile.yaml (None deletes). 64KB cap (rides
every roster paint). ``ui_meta_expected_revisions``: per-key CAS, any mismatch rejects the
whole write; revisions survive deletion so a stale client cannot recreate a removed key.Frá   i   NÚui_meta_expected_revisionsz,ui_meta_expected_revisions must be an objectrâ   ÚexpectedÚactualÚui_meta_conflictsrã   )Úatomic_yaml_writerb   )Ú	sort_keysTz@ui_meta hermes-bots title for profile %s: %r -> %r (revision %s)r	   r  r&   )r‡   rè   rê   r=   rn   r   r[   Ú_profile_ui_meta_lockrp   r}   r   rE   r  ry   ÚpopÚutilsr  ÚloggingÚ	getLoggerÚ__name__Úinfor	   r   )r4   r   ro  Úincomingr  ÚexistingÚraw_revisionsrå   Ú	conflictsÚkeyr°  r  ÚcurrentÚ	old_titlert   r  s   &&&             r   ru  ru  ]  s»  € ð €GˆIÑð.#Ø˜)Õ$ˆÜŒt�z‰z˜(Ó#Ó$ uÔ,ÙØ—:‘:Ð:Ó;ˆØÒ¬
°8¼T×(BÒ(BÜÐKÓLÐLß"Ö"Ü)¨+Ó6ˆHØ$ŸL™LÐ)=Ó>ˆMÜ(¼*À]ÔTX×:YÒ:Y©Ð_aÓbˆIØˆIÜ#-¨h¼×#=Ò#=‘xÀ2ÒE�Ø!)§¡¨cÓ!2°I·M±MÀ#ÀqÓ4I˜Ü! &¬#×.Ò.´*¸VÄT×2JÒ2JÈfÐWXÌjÐ\bÖ\lØ&0°&¸(ÀFÐ%K�I“Nñ F÷ Ø/8Ð+Ñ,ÙV^Ó/_ÑV^Ès°Y·]±]À3ÈÓ5JÒ0JÑV^Ñ/_�Ð+Ñ,Ø÷ #Ñ"ð —l‘l 9Ó-ˆGÜ!+¨G´T×!:Ò!:‘gÀˆGÜ# GÓ,ˆIØ&Ÿn™nÖ.‘
�Ø’=Ø—K‘K  TÕ*à#(˜C‘LØ!*§¡¨s°AÓ!6¸Õ!:�	“ñ /÷ Ø&-˜Ò#à—‘˜Y¨Ô-Ø-6Ð)Ñ*Ý/Ù˜k¨NÕ:¸HÐPUÕVØ!%ˆG�IÑÙKSÓ+TÉ8ÀC°µÒ,?É8Ñ+TˆGÐ'Ñ(Ü˜7Ó# yÔ0ô ×!Ò!¤(Ó+×0Ñ0ØVØ—J‘J˜vÓ&×:Ð:¨+×*:Ñ*:¸IÄ{ÐSZÓG[Ø—M‘M -Ó0ô2÷E #Ñ"ùò 0`ùò& ,U÷= #×"Ð"ûôL ô #Ø"ˆ�	Ôð#úsz   ‡,K= µAK= Á9B7K)Ä5K)Å	K)ÅKÅ,K)Å3K= Å=BK)È
<K)ÉK$ÉAK)Ê),K)ËK= Ë
K)Ë)K:	Ë4K= Ë:K= Ë=LÌLc                ó   a aaa€ \        V4      w  ooS'       d	   S'       g   R# Rp\        VP                  RR4      4      '       g   \        RR4      o\	        VVV3R lR4      pVf   \        VV V3R l4      VR&   V# )	z½Apply a ``model`` + ``provider`` pin, or return a confirm message and write NOTHING (client
resends with ``confirm_expensive_model``). A failing guard = no warning (as _apply_model_switch).NÚconfirm_expensive_modelFz!hermes_cli.model_selection_guardsÚcombined_selection_warningc                  óB   <€ \        S! S S;'       g    R R7      RR 4      # )N)r5   Úmessage)r*   )r6   r5   Úwarns   €€€r   rI   Ú"_configure_model.<locals>.<lambda>£  s    ø€ ¤w©t°EÀH×DTÐDTÐPTÔ/UÐW`ÐbfÔ'gr   c                  ó   <€ \        SSS 4      # r   r*  )r6   r4   r5   s   €€€r   rI   r*  ¥  s   ø€ Ô0BÀ;ÐPXÐZ_Ô0`r   r6   )r?   r  r=   r-   rB   rK   )r4   r   ro  rq  r6   r5   r)  s   f&& @@@r   rv  rv  “  sq   û€ ô -¨VÓ4�O€Eˆ8ß—hÙØ€Oô ˜6Ÿ:™:Ð&?ÀÓG×HÒHÜÐ8Ð:VÓWˆÜÖgÐimÓnˆØÒÜ'Ö(`Óaˆ�ÑØÐr   c                ó$   € V ^8„  d   QhR\         /# r9   rø  )r   s   "r   r   r   ©  s   € ÷ >ñ >œCñ >r   c                 ó    € V  Uu0 uF=  p\        V4      P                  4       '       g   K$  \        V4      P                  4       kK?  	  up# u upi r   )r   r>   )ry  r|   s   & r   r  r  ©  s2   € Ù$*Ó=¡F˜q¬c°!«f¯l©l¯nŒNŒC�‹F�L‰LŽN¡FÑ=Ð=ùÒ=s
   …!A«Ac                ó   € V ^8„  d   QhRR/# r/   r&   )r   s   "r   r   r   ­  s   € ÷ 
ñ 
°Dñ 
r   c                óÚ   € ^ RI Hp \        V4      pV'       d   V! V RV4       M>\        V P	                  R4      \
        4      '       d   V R,          P                  RR4       V! V 4       R# )z­Pin ``platform_toolsets.cli``: the key ``_load_enabled_toolsets`` reads and ``hermes tools`` writes.
An empty selection clears the pin so the platform default applies again.)Ú_save_platform_toolsrõ  rô  N)r  r0  r  rn   r=   r   r  )r\  r?  rÂ  r0  r°  s   &&&  r   Ú_save_toolset_pinr1  ­  sU   € õ =ä˜'Ó"€FßÙ˜S %¨Õ0Ü	�C—G‘GÐ/Ó0´$×	7Ò	7ØÐÕ ×$Ñ$ U¨DÔ1Ù�Ör   c                ó0   € V ^8„  d   QhR\         R\        /# )r   rO  r   )r   rE   )r   s   "r   r   r   º  s   € ÷ nñ nœdð n¤tñ nr   c                óx   € ^ RI Hp ^ RIHp V! V 4      ;'       d     V! V P	                  RR4      RR7      '       * # )z„The runtime's ``enabled`` reader; a legacy ``disabled: true`` (what older editors wrote,
migrated by config v46) still reads as off.)Ú_parse_enabled_flag)Úmcp_server_enabledr]  Frç   )r  r4  Útools.mcp_tool_commonr5  r=   )rO  r4  r5  s   &  r   rM  rM  º  s5   € õ <Ý8Ù˜eÓ$×mÐmÑ-@ÀÇÁÈ:ÐW\ÓA]ÐglÔ-mÔ)mÐmr   c                ó   € V ^8„  d   QhRR/# r/   r&   )r   s   "r   r   r   Â  s   € ÷ ñ Àñ r   c                ó  € \        V4      p\        V P                  R4      \        4      '       d   V P                  R4      M/ pV Fd  p\        VP                  V4      \        4      '       d   K*  \        VP                  V4      \        4      '       g   KQ  \        W&,          4      WV&   Kf  	  VP	                  4        F6  w  rg\        V\        4      '       g   K  Wd9   VR&   VP                  RR4       K8  	  V'       d   WPR&   V! V 4       R# )z¯Write the ``enabled`` flag every runtime resolver reads (``enabled_mcp_server_names``,
coding_context, oneshot); the legacy ``disabled`` key is dropped so old configs migrate.rE  r?  r]  N)r  rn   r=   r   ry   r  )r\  r?  Ú
launch_mcprÂ  r°  rP  ÚsrvrO  s   &&&&    r   Ú_save_mcp_togglesr;  Â  sÉ   € ô ˜'Ó"€FÜ(2°3·7±7¸=Ó3IÌ4×(PÒ(Pˆc�g‰g�mÔ$ÐVX€GÛˆÜ˜'Ÿ+™+ cÓ*¬D×1Ô1´jÀÇÁÐPSÓATÔVZ×6[Ô6[Ü 
¥Ó0ˆG‹Lñ ð —m‘m–o‰
ˆÜ�eœT×"Ô"Ø"™}ˆE�)ÑØ�I‰I�j $Ö'ñ &÷ Ø$ˆMÑÙ�Ör   c                ó   € V ^8„  d   QhRR/# r/   r&   )r   s   "r   r   r   Ó  s   € ÷ ^ñ ^¸Tñ ^r   c           	     óð  aaaaaa	€ \        SP                  R4      \        4      p/ oV'       d7   \        RR4      o\	        V3R l/ 4      o\        S\
        4      '       d   SM/ o\        V 4      ;_uu_ 4        ^ RIHoH	o	 S! 4       ;'       g    / o\        SP                  R4      \        4      '       d7    ^ RI
Hp V! S\        SR,          4      4       RVR	&   S! 4       ;'       g    / o\        SP                  R4      \        4      '       d   \        VVV	3R l4      VR&   V'       d   \        VVVV	3R l4      VR&   RRR4       R#   \         d	    R
TR	&    Lri ; i  + '       g   i     R# ; i)zðApply ``disabled_skills`` / ``enabled_toolsets`` / ``enabled_mcp_servers`` (replace
semantics; empty toolsets clears the pin). An undefined MCP server is copied from the LAUNCH
catalog (unknown names skipped); credentials stay in .env/auth.rt  zhermes_cli.configrÁ  c                  óD   <€ S ! 4       ;'       g    / P                  R 4      # )rE  )r=   )Úload_launchs   €r   rI   Ú)_configure_cfg_sections.<locals>.<lambda>Ü  s   ø€ ¡;£=×#6Ð#6°B×";Ñ";¸MÔ"Jr   )r<  rÂ  rr  )Úsave_disabled_skillsTr>  Frs  c                  ó,   <€ \        S SR ,          S4      # )rs  )r1  )r\  r   rÂ  s   €€€r   rI   r@  ê  s   ø€ Ô7HÈÈfÐUgÕNhÐjuÔ7vr   rT  c                  óL   <€ \        S! 4       ;'       g    / SR ,          S S4      # )rt  )r;  )r9  r<  r   rÂ  s   €€€€r   rI   r@  ì  s&   ø€ Ô:KÙ“×#Ð#  VÐ,AÕ%BÀJÐP[ô;]r   rE  N)rn   r=   r  r-   rB   r   rU   rW  r<  rÂ  rX  rA  r  r   rK   )
r4   r   ro  Úwant_mcprA  r\  r9  r<  r?  rÂ  s
   &f&  @@@@@r   rw  rw  Ó  s,  ý€ ô ˜&Ÿ*™*Ð%:Ó;¼TÓB€HØ€JßäÐ/Ð1GÓHˆÜÔJÈBÓOˆ
Ü#-¨j¼$×#?Ò#?‘ZÀRˆ
Ü	˜K×	(Õ	(ß>Ù‹m×!Ð!˜rˆÜ�f—j‘jÐ!2Ó3´T×:Ò:ð*ÝIÙ$ S¬,°vÐ>OÕ7PÓ*QÔRØ$(�˜Ñ!Ù!“m×)Ð) r�ô �f—j‘jÐ!3Ó4´d×;Ò;Ü".Ö/vÓ"wˆG�JÑßÜ%1÷ 3]ó &^ˆG�MÑ"÷ 
)Ñ	(øô ô *Ø$)�˜Ó!ð*ú÷ 
)×	(Ð	(ús=   Á9?E$Â91EÃ+EÃ.A E$Ä/E$ÅE!ÅE$Å E!Å!E$Å$E5	c                ó$   € V ^8„  d   QhR\         /# r9   )r   )r   s   "r   r   r   ð  s   € ÷ .ñ .¬cñ .r   c                óØ   a a€ VV 3R l\          4        Uu. uF  q"P                  4       '       g   K  VNK  	  pp\        V Uu. uF  q"P                  4       NK  	  up4      # u upi u upi )zKDelete every ``<asset>.<ext>`` in ``assets_dir``; returns how many existed.c              3   ó@   <"  € T F  pSS R V 2,          x € K  	  R# 5i)rŽ  Nr&   )rò   r›  r}  rš  s   & €€r   ró   Ú&_unlink_asset_files.<locals>.<genexpr>ò  s$   øé € ÐPÁK¸S˜:¨5¨'°°3°%Ð(8×8Ò8ÃKùs   ƒ)rö   rg   r‡   Úunlink)rš  r}  ÚtÚpresents   ff  r   r‘  r‘  ð  sP   ù€ åPÅKÔPÓ`ÑP�Q×T]ÑT]×T_�qˆqÑP€GÐ`Ü¡GÓ,¡G˜q—‘–
¡GÑ,Ó-Ð-ùò aùÚ,s   –A"²A"ÁA'c                ó   € V ^8„  d   QhRR/# r/   r&   )r   s   "r   r   r   ö  s   € ÷ #ñ #˜ñ #r   c                 ó.   € \        \        4       V 4       R # r   )r   Úglobals)Úservers   &r   ÚregisterrP  ö  s   € Ü”“	˜6Ö"r   )ra   é   s   ‰PNG

)ra   é   s   ÿØÿ)ra   é   s   RIFF)rQ  é   s   WEBPr  ).Ú__doc__rª  r  r©   Ú
method_ctxr   r   Ú	_registryr#   rö   r—  r'   r-   r7   r?   rB   rK   rU   r]   rp   ru   r}   rŒ   r¤   r«   r¼   rÇ   rÛ   rú   r  r³  r¾  rÊ  r-  r8  rZ  r  ru  rv  r  r1  rM  r;  rw  r‘  rP  r&   r   r   Ú<module>rX     sÊ  ðñó Û Û ç 4áÓ€	Ø	×	Ñ	€ð �k 5¨,¸ÀÐM€àÐ4Ð5°uÐ?VÐ>WØ˜Ð*:Ð;ð=€õ	ò>÷9õ
]òõ0òrò#õ6ò>õnò
9ò"õ2ò"òJòB;õ2zñ2 �/ 4Ó(ôzó )ðzñ. ÐÓô'Dó ð'DñT Ð% tÓ,ô!Pó -ð!PñH Ð&¨Ó-ôBó .ðBñ2 Ð&¨Ó-ô"Eó .ð"EñJ Ð&¨Ó-ô&ó .ð&õ 	õKõ
õ,'õTò8$õ0Aõ
3#òlõ,>õ
õnõõ"^õ:.÷#r   