+
    „WÝjÊ€  ã            
       ón  € R t ^ RIt^ RIt^ RIt^ RIHtHtHtHt ^ RI	H
t
Ht ^ RIHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHtHt ^ RIHtHtHtHtHtHt H!t!H"t" ]
! 4       t#]! R	R
4      t$]! RR
4      t%R R lt&R R lt'R R lt(R R lt)R R lt*R R lt+R R lt,RR R])R]*R]+R],/t-R  R! lt.R"R"R#R#/t/R$ R% lt0R& R' lt1R( R) lt2R* R+ lt3R, R- lt4R. R/ lt5R0 R1 lt6R2 R3 lt7]#Pq                  R44      RXR5 R6 ll4       t9]#Pu                  R74      RXR8 R9 ll4       t;]#Pq                  R:4      RXR; R< ll4       t<]#Pq                  R=4      RYR> R? ll4       t=]#Pu                  R@4      RXRA RB ll4       t>]#Pu                  RC4      RXRD RE ll4       t?]#Pu                  RF4      RXRG RH ll4       t@]#Pƒ                  RI4      RXRJ RK ll4       tB]#Pq                  RL4      RXRM RN ll4       tC]#Pu                  RO4      RXRP RQ ll4       tD]#Pq                  RR4      RXRS RT ll4       tE]#Pƒ                  RU4      RXRV RW ll4       tFR# )Zuû   Toolset / terminal-backend dashboard routes.

The toolset/terminal catalogs and helpers stay in web_server (some are defined
*after* this router's mount point) â€” reached via the late-binding seam so
monkeypatching on web_server stays authoritative.
N)ÚAnyÚDictÚListÚOptional)Ú	APIRouterÚHTTPException)Úlate)Ú_plugin_terminal_backend_rows)Úrun_in_threadpool)ÚTerminalBackendSelectÚToolsetEnvUpdateÚToolsetModelSelectÚToolsetPostSetupÚToolsetProviderSelectÚToolsetToggle)Ú_CONFIG_MUTATION_LOCKÚ_profile_cli_argsÚ_profile_scopeÚ_spawn_hermes_actionÚconfig_write_scopeÚlogÚscoped_to_threadÚspawn_profile_actionÚload_configzhermes_cli.configÚsave_configc                ó0   € V ^8„  d   QhR\         R\         /# ©é   ÚnameÚreturn©Ústr)Úformats   "ÚPC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\web_routers\tools.pyÚ__annotate__r$      s   € ÷ ñ ”Sð œSñ ó    c                óX   €  ^ RI Hp V! V 4      ;'       g    R#   \         d     R# i ; i)zB``get_env_value`` that never raises (empty string on any failure).©Úget_env_valueÚ )Úhermes_cli.configr(   Ú	Exception)r   r(   s   & r#   Ú
_env_valuer,      s/   € ðÝ3á˜TÓ"×(Ð( bÐ(øÜô Úðús   ‚ — š)¨)c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   Úterminal_cfgÚkeyÚenv_varr   ©Údictr!   )r"   s   "r#   r$   r$   )   s(   € ÷ 'ñ '¤dð '´ð '¼sð 'Äsñ 'r%   c                óÎ   € V P                  V4      pVe9   \        V4      P                  4       '       d   \        V4      P                  4       # \        V4      P                  4       # )zHRead a terminal.* setting from config.yaml, falling back to its env var.)Úgetr!   Ústripr,   )r.   r/   r0   Úvalues   &&& r#   Ú_terminal_cfg_valuer7   )   sQ   € à×Ñ˜SÓ!€EØÒœS ›Z×-Ñ-×/Ò/Ü�5‹z×ÑÓ!Ð!Ü�gÓ×$Ñ$Ó&Ð&r%   c                ó\   € V ^8„  d   QhR\         \        \        \        3,          ,          /# ©r   r   )Úlistr2   r!   )r"   s   "r#   r$   r$   1   s#   € ÷ Cñ C¤¤T¬#¬s¨(¥^Õ 4ñ Cr%   c                 ó*   € ^ RI Hp  . V O\        4       O# )zƒBuilt-in picker rows plus plugin-registered backends, computed per request
so a plugin installed after server start still shows up.©Ú_TERMINAL_BACKENDS)Úhermes_cli.web_server_profilesr=   r	   r<   s    r#   Ú_terminal_backend_rowsr?   1   s   € õ BØBÐÐBÔ"?Ó"AÐBÐBr%   c                ó$   € V ^8„  d   QhR\         /# r9   ©Útuple)r"   s   "r#   r$   r$   8   s   € ÷ Añ A¤5ñ Ar%   c                ó,  € ^ RI HpHpHp ^ RIHp V! 4       pV'       g   R# V! V4      p V! VR.^R7      P                  ^ 8X  d   R# RV RV! V4       R23#   \        P                   d    RT R23u # \         d   pR	T R
T 23u Rp?# Rp?ii ; i)aF  Health-check the docker terminal backend the same way the agent resolves it.

``find_docker()`` honors ``HERMES_DOCKER_BINARY``, then ``docker`` / ``podman``
on PATH. The probe uses ``version`` (not ``info --format {{.ServerVersion}}``)
because Podman has no ServerVersion field and the agent already probes with
``version``.
)Údocker_runtime_nameÚdocker_runtime_start_hintÚfind_docker)Úrun_captureÚneeds_setupÚversion)Útimeoutu    not reachable â€” Ú.z not responding (timed out).Úunavailablez probe failed: N)rH   uF   Docker CLI not found â€” install Docker Desktop, docker-ce, or Podman.©Úreadyr)   )
Útools.environments.dockerrD   rE   rF   Ú tools.environments.remote_commonrG   Ú
returncodeÚ
subprocessÚTimeoutExpiredr+   )Ú_cfgrD   rE   rF   rG   Ú
docker_exeÚruntimeÚexcs   &       r#   Ú_probe_docker_backendrX   8   sÀ   € ÷ fÑeÝ<á“€Jßð
ð 	
ñ " *Ó-€GðAÙ˜
 IÐ.¸Ô:×EÑEÈÔJØ Ð Ø ' Ð*=Ñ>WÐXbÓ>cÐ=dÐdeÐfÐgÐgøÜ×$Ñ$ô IØ ' Ð*FÐGÐHÒHÜô AØ ' ¨/¸#¸Ð?Ð@Õ@ûðAús/   «A ÁA ÁBÁ6BÁ?BÂ BÂBÂBc                ó0   € V ^8„  d   QhR\         R\        /# )r   r.   r   )r2   rB   )r"   s   "r#   r$   r$   T   s   € ÷ 	'ñ 	'¤Tð 	'¬eñ 	'r%   c                 óÜ   € \        V R R4      p\        V RR4      pRV3RV33 UUu. uF  w  r4V'       d   K  VNK  	  pppV'       d   RRRP                  V4       R	23# R
V RV 23# u uppi )Ússh_hostÚTERMINAL_SSH_HOSTÚssh_userÚTERMINAL_SSH_USERzterminal.ssh_hostzterminal.ssh_userrH   zSet z and z: in config.yaml (or the matching TERMINAL_SSH_* env vars).rN   Ú@)r7   Újoin)r.   ÚhostÚuserÚkÚvÚmissings   &     r#   Ú_probe_ssh_backendrf   T   s“   € Ü˜|¨ZÐ9LÓM€DÜ˜|¨ZÐ9LÓM€DØ2°DÐ9Ð<OÐQUÐ;VÑWÔaÑW‘T�QÔ_`�qˆqÑW€GÑaßàØ�7—<‘< Ó(Ð)Ð)cÐdð
ð 	
ð ˜�v˜Q˜t˜fÐ%Ð&Ð&ùó bs
   ¦A(·A(c                ó$   € V ^8„  d   QhR\         /# r9   rA   )r"   s   "r#   r$   r$   `   s   € ÷ ñ ¤%ñ r%   c                 óž   €  ^ RI Hp V! 4       '       d   R#  \        R4      '       d   \        R4      '       d   R# R#   \         d     L3i ; i)é    )Úhas_direct_modal_credentialsÚMODAL_TOKEN_IDÚMODAL_TOKEN_SECRETrM   )rH   ua   Modal credentials not found â€” set MODAL_TOKEN_ID and MODAL_TOKEN_SECRET (or run `modal setup`).)Útools.tool_backend_helpersrj   r+   r,   )rT   rj   s   & r#   Ú_probe_modal_backendrn   `   s[   € ðÝKá'×)Ò)Ø Ð ð *ô Ð"×#Ò#¬
Ð3G×(HÒ(HØÐðð øô	 ô Ùðús   ‚> •> ¾AÁAc                ó$   € V ^8„  d   QhR\         /# r9   rA   )r"   s   "r#   r$   r$   p   s   € ÷ Nñ N¤Eñ Nr%   c                 ó,   € \        R 4      '       d   R# R# )ÚDAYTONA_API_KEYrM   )rH   z/Set DAYTONA_API_KEY to use the Daytona backend.)r,   ©rT   s   &r#   Ú_probe_daytona_backendrs   p   s   € ÜÐ#×$Ò$ØÐØMÐMr%   Úlocalc                 ó   € R# )rN   rM   © rr   s   &r#   Ú<lambda>rw   w   s   € ™-r%   ÚdockerÚsshÚmodalÚdaytonac                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r   r.   r   )r!   r2   rB   )r"   s   "r#   r$   r$      s!   € ÷ 7ñ 7¤#ð 7´Tð 7¼eñ 7r%   c                óü   €  \         P                  V 4      pVe	   V! V4      #  ^ RIHp V! V 4      pVe   VP	                  4       #  RRV  23#   \
         d     Li ; i  \
         d   pRRT 23u Rp?# Rp?ii ; i)z:Return ``(status, detail)`` for one backend. Never raises.N)Úget_providerrL   zUnknown backend: zProbe failed: )Ú_BACKEND_PROBESr4   Úagent.terminal_env_registryr~   Úprober+   )r   r.   r�   r~   ÚproviderrW   s   &&    r#   Ú_probe_terminal_backendrƒ      sž   € ð7Ü×#Ñ# DÓ)ˆØÒÙ˜Ó&Ð&ð	Ý@á# DÓ)ˆHØÒ#Ø—~‘~Ó'Ð'ð $ð Ð!2°4°&Ð9Ð:Ð:øô ô 	Ùð	ûô ô 7Ø °¨uÐ5Ð6Õ6ûð7ús@   ‚ A ¤!A ÁA ÁAÁA ÁAÁA ÁA;Á*A6Á0A;Á6A;Ú	image_genÚ	video_genc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r   Úts_keyÚprovider_rowr   ©r!   r2   r   )r"   s   "r#   r$   r$   ˜   s%   € ÷ 
ñ 
¬#ð 
¼Tð 
ÄhÌsÅmñ 
r%   c                ó˜   € V R8X  d+   VP                  R4      ;'       g    VP                  R4      # V R8X  d   VP                  R4      # R# )zÒMap a provider picker row to its model-catalog plugin name.

Plugin-backed rows carry ``image_gen_plugin_name`` / ``video_gen_plugin_name``;
a managed image row's ``imagegen_backend`` names its catalog plugin.
r„   Úimage_gen_plugin_nameÚimagegen_backendr…   Úvideo_gen_plugin_nameN©r4   )r‡   rˆ   s   &&r#   Ú_resolve_toolset_model_pluginr�   ˜   sO   € ð �ÔØ×ÑÐ 7Ó8×`Ð`¸L×<LÑ<LÐM_Ó<`Ð`Ø�ÔØ×ÑÐ 7Ó8Ð8Ùr%   c                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   r‡   Úplugin_nameÚconfig©r!   r2   )r"   s   "r#   r$   r$   ¥   s!   € ÷ 
2ñ 
2¤3ð 
2´Sð 
2Ä$ñ 
2r%   c                ó”   € ^ RI HpHpHp V R8X  d1   VP	                  V4      pV'       d   VR,          ! V4      # V! V4      # V! V4      # )z²Return ``(catalog_dict, default_model)`` for a toolset's plugin backend or, for an image row's
``imagegen_backend`` (``fal``, the managed ``nous`` union), that backend's catalog.)ÚIMAGEGEN_BACKENDSÚ_plugin_image_gen_catalogÚ_plugin_video_gen_catalogr„   Ú
catalog_fn)Úhermes_cli.tools_configr•   r–   r—   r4   )r‡   r‘   r’   r•   r–   r—   Úbackends   &&&    r#   Ú_toolset_model_catalogr›   ¥   sL   € ÷ pÑoà�ÔØ#×'Ñ'¨Ó4ˆßØ˜<Ö(¨Ó0Ð0Ù(¨Ó5Ð5Ù$ [Ó1Ð1r%   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r‡   r’   r   )r!   r2   r:   )r"   s   "r#   r$   r$   ²   s&   € ÷ Lñ L¤ð L¬Tð L´dñ Lr%   c                ó\   € ^ RI HpHp VP                  V 4      pV'       d   V! WARR7      # . # )zHVisible provider rows for a toolset's category (fresh entitlement read).)ÚTOOL_CATEGORIESÚ_visible_providersT©Úforce_fresh)r™   rž   rŸ   r4   )r‡   r’   rž   rŸ   Úcats   &&   r#   Ú_category_providersr£   ²   s*   € çKà
×
Ñ
˜fÓ
%€Cß@CÑ˜c°tÔ<ÐKÈÐKr%   c          	      ót   € V ^8„  d   QhR\         R\        R\        \         ,          R\        \        ,          /# )r   r‡   r’   r‚   r   r‰   )r"   s   "r#   r$   r$   º   s:   € ÷ ]ñ ]Üð]Üð]Ü)1´#­ð]Ü;CÄD½>ñ]r%   c                ó–   aaa€ ^ RI Ho \        V S4      pS'       d   \        V3R lV 4       R4      # \        VV3R lV 4       R4      # )zFResolve a provider picker row by name, or the active row when omitted.)Ú_is_provider_activec              3   óV   <"  € T F  qP                  R 4      S8X  g   K  Vx € K   	  R# 5i©r   NrŽ   )Ú.0Úpr‚   s   & €r#   Ú	<genexpr>Ú-_find_toolset_provider_row.<locals>.<genexpr>Á   s    øé € ÐB¡˜1¯©¨f«¸Ñ(A—Q’Q£ùs   ƒ)Ÿ
)Nc              3   óN   <"  € T F  pS! VSR R7      '       g   K  Vx € K  	  R# 5i)Tr    Nrv   )r©   rª   r¦   r’   s   & €€r#   r«   r¬   Â   s"   øé € ÐU™D�qÑ$7¸¸6Èt×$TÐ$T—’›Dùs   ƒ%›
%)r™   r¦   r£   Únext)r‡   r’   r‚   Úrowsr¦   s   &ff @r#   Ú_find_toolset_provider_rowr°   º   s>   ú€ õ <ä˜v vÓ.€DßÜÔB¡ÓBÀDÓIÐIÜÕU™DÓUÐW[Ó\Ð\r%   c                ó(   € V ^8„  d   QhR\         RR/# )r   r   r   Nr    )r"   s   "r#   r$   r$   Å   s   € ÷ 7ñ 7¤ð 7¨ñ 7r%   c                óz   € ^ RI Hp Y! 4        UUu0 uF  w  p q2kK
  	  upp9  d   \        RV  24      hR# u uppi )zµ400 for toolset keys outside the effective configurable set. Call it inside the target
profile's scope, like ``GET /api/tools/toolsets``: plugin toolsets are registered per profile.)Ú$_get_effective_configurable_toolsetszUnknown toolset: N)r™   r³   Ú_bad_request)r   r³   r‡   Ú_s   &   r#   Ú_require_known_toolsetr¶   Å   sG   € õ MàÐ/SÔ/UÔVÑ/U™|˜v q¨!’FÑ/UÒVÔVÜÐ.¨t¨fÐ5Ó6Ð6ñ WùÓVs   ‘7c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   r’   r/   r   r1   )r"   s   "r#   r$   r$   Î   s!   € ÷ ñ œ$ð ¤Sð ¬Tñ r%   c                ób   € V P                  V/ 4      p\        V\        4      '       g   / pW V&   V# )z?``config[key]`` as a dict, replacing a non-dict value in place.)Ú
setdefaultÚ
isinstancer2   )r’   r/   Úsections   && r#   Ú_dict_sectionr¼   Î   s2   € à×Ñ  RÓ(€GÜ�gœt×$Ò$ØˆØˆs‰Ø€Nr%   c                ó0   € V ^8„  d   QhR\         R\        /# )r   Údetailr   )r!   r   )r"   s   "r#   r$   r$   ×   s   € ÷ 9ñ 9œð 9¤ñ 9r%   c                 ó   € \        R V R7      # )i�  )Ústatus_coder¾   )r   )r¾   s   &r#   r´   r´   ×   s   € Ü S°Ô8Ð8r%   c                ó0   € V ^8„  d   QhR\         R\        /# r   r“   )r"   s   "r#   r$   r$   Û   s   € ÷ _ñ _”Sð _œTñ _r%   c           
      ó   € R V RRR. RRRR/# )r   Ú
has_modelsFÚmodelsÚcurrentNÚdefaultrv   )r   s   &r#   Ú
_no_modelsrÇ   Û   s   € Ø�D˜,¨¨x¸¸YÈÈiÐY]Ð^Ð^r%   z/api/tools/toolsetsc                ó:   € V ^8„  d   QhR\         \        ,          /# ©r   Úprofile©r   r!   )r"   s   "r#   r$   r$   à   s   € ÷ .ñ .¤¬¥ñ .r%   c              ƒ   óV  a aaaaa"  € ^ RI HpHoHoHoHoHoHp ^ RIH	p ^ RI
Hp ^ RIHp VVVVVV 3R lp\        V4      G Rj  x€L
 w  rxrš. pV F¼  w  rÍp \        \!        V! V4      4      4      pS! V4      pWÁ9   dG   VP%                  V4      p\'        V\(        4      '       d   TM/ pV! VP%                  RR4      RR	7      pMWÉV,          9   pVP+                  R
VRV! V4      RVRVRV! V! VV4      4      RVRVRW¬,          RV/	4       K¾  	  V#  LÍ  \"         d    . p L²i ; i5i)ri   )Ú_CONFIG_ONLY_TOOLSETSr³   Ú_get_platform_toolsÚ_toolset_configuration_platformÚ_toolset_has_keysÚget_nous_subscription_featuresÚgui_toolset_label)Úplatform_label)Úresolve_toolset)Úis_truthy_valuec                  ón  <€ \        S4      ;_uu_ 4        \        4       p S	! 4       pV UUu0 uF  w  p pS! V4      kK  	  pppV Uu/ uF  pVS
! WR R7      bK  	  ppS! V 4      pV UUu/ uF  w  p q2S! W VR7      bK  	  pppRRR4       X XXX3# u uppi u upi u uppi   + '       g   i     L'; i)F©Úinclude_default_mcp_servers)ÚfeaturesN)r   r   )r’   Útoolset_rowsr   rµ   Útarget_platformsÚplatformÚenabled_by_platformrÙ   Ú
configuredr³   rÎ   rÏ   rÐ   rÑ   rÊ   s            €€€€€€r#   Ú_readÚget_toolsets.<locals>._readé   sã   ø€ Ü˜G×$Õ$Ü “]ˆFÙ?ÓAˆLáHTô VÙHT¹*¸$ÀÀ1Ñ/°Ö5Éð ñ  Vñ !1ó#2á 0�Hð Ñ-¨fÐ\aÔbÒbÙ 0ð  ð #2ñ 6°fÓ=ˆHñ frÔrÑeqÑWaÐW[Ð]^Ð`aÑ 1°$ÈÔ RÒRÑeqˆJÑr÷ %ð �|Ð%8¸*ÐDÐDùó Vùò#2ùó s÷ %×$ús4   •B$¬B
ÁB$ÁBÁB$Á+B
ÂB$ÂB$Â$B4	NÚenabledT)rÆ   r   ÚlabelÚdescriptionrÜ   rÓ   Ú	availablerÞ   Útools)r™   rÍ   r³   rÎ   rÏ   rÐ   rÑ   rÒ   Úhermes_cli.platformsrÓ   ÚtoolsetsrÔ   ÚutilsrÕ   r
   ÚsortedÚsetr+   r4   rº   r2   Úappend)rÊ   rÍ   rÒ   rÓ   rÔ   rÕ   rß   r’   rÚ   rÝ   rÞ   Úresultr   râ   Údescrå   Útarget_platformr»   Ú
is_enabledr³   rÎ   rÏ   rÐ   rÑ   s   f                  @@@@@r#   Úget_toolsetsrð   ß   s=  ýé € ÷÷ ñ õ 4Ý(Ý%÷Eò Eô CTÐTYÓBZ×<ZÑ9€FÐ-Ø€FÛ)Ñˆ�Tð	Üœ3™¨tÓ4Ó5Ó6ˆEñ :¸$Ó?ˆØÔ(ð —j‘j Ó&ˆGÜ!+¨G´T×!:Ò!:‘gÀˆGÙ(¨¯©°YÀÓ)EÈtÔT‰Jà°_Õ!EÑEˆJØ�‰Ø�D˜'Ñ#4°UÓ#;¸]ÈDØ˜ØÑ/±¸ÐP_Ó0`ÓaØ�z ;°
Ø˜*Õ*¨G°Uð<ö 	=ñ *ð( €Mñ- =[øô
 ô 	ØŠEð	üs6   ˆ>D)ÁDÁD)ÁDÁ3B"D)ÄD&Ä#D)Ä%D&Ä&D)z/api/tools/toolsets/{name}c                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# ©r   r   ÚbodyrÊ   )r!   r   r   )r"   s   "r#   r$   r$     s%   € ÷ =2ñ =2œsð =2¬-ð =2Ä(Ì3Å-ñ =2r%   c           
   ƒ  ó  a aaa	a
aa"  € ^ RI HoHo	Ho
Hp V! S 4      oSP
                  ;'       g    ToVV	V
VV VV3R lp\        P                  ! V4      G Rj  x€L
  RpSP                  '       dZ   S S9  dS   R V V3R llp \        P                  ! V4      G Rj  x€L
 pV'       d"   \        \        S4      RRV.,           R4       TpR
RRS RSRSP                  RV/#  L‡ LE  \         d    \        P                  ! R	S 4        L>i ; i5i)zÕEnable/disable a configurable toolset for its configuration platform
(``platform_toolsets.cli`` for most; platform-restricted toolsets target
their own platform) via the same ``_save_platform_tools`` the CLI uses.)rÍ   rÎ   Ú_save_platform_toolsrÏ   c            
      ó¶  <€ \        S4      ;_uu_ 4        \        S4       \        4       p SS9   d9   \        SP                  4      \        V S4      R &   \        V 4        RRR4       R# \        S! V SRR7      4      pSP                  '       d   VP                  S4       MVP                  S4       S! V SV4       RRR4       R#   + '       g   i     R# ; i)rá   NFr×   )
r   r¶   r   Úboolrá   r¼   r   rê   ÚaddÚdiscard)	r’   rá   rÍ   rÎ   rõ   ró   r   Úscope_profilerî   s	     €€€€€€€r#   Ú_runÚtoggle_toolset.<locals>._run  s«   ø€ Ü ×.Õ.Ü" 4Ô(Ü “]ˆFØÐ,Ô,ô :>¸d¿l¹lÓ9K”˜f dÓ+¨IÑ6Ü˜FÔ#Ø÷ /Ñ.ô Ù# F¨OÐY^Ô_óaˆGà�|�|ˆ|Ø—‘˜DÕ!à—‘ Ô%Ù  ¨¸'ÔB÷ /×.×.Ò.ús   •ACÁ*ACÃC	Nc                ó:   € V ^8„  d   QhR\         \        ,          /# r9   rË   )r"   s   "r#   r$   Ú$toggle_toolset.<locals>.__annotate__7  s   € ÷ 
	cñ 
	c¤h¬s¥mñ 
	cr%   c                  óH  <a€ ^ RI Hp HoHp V P	                  S4      pV'       g   R# \        S4      ;_uu_ 4        \        4       pV! W#4       Uu. uF  qDP	                  R4      NK  	  pp\        V3R lV 4       R4      uuRRR4       # u upi   + '       g   i     R# ; i)ri   )rž   Ú_post_setup_already_installedrŸ   NÚ
post_setupc              3   óZ   <"  € T F   q'       g   K  S! V4      '       d   K  Vx € K"  	  R # 5i©Nrv   )r©   rc   r   s   & €r#   r«   Ú?toggle_toolset.<locals>._pending_install_key.<locals>.<genexpr>A  s    øé € Ð[© 1³œQÑ:WÐXY×:ZŸQšQ«ùs   ƒ	+‘+¡
+)r™   rž   r   rŸ   r4   r   r   r®   )	rž   rŸ   r¢   r’   ÚprovÚkeysr   r   rú   s	         @€€r#   Ú_pending_install_keyÚ,toggle_toolset.<locals>._pending_install_key7  sƒ   ù€ ÷Tñ Tð "×%Ñ% dÓ+ˆCßÙÜ ×.Õ.Ü$›�Ù;MÈcÔ;ZÓ[Ñ;Z°4Ÿ™ Ö.Ñ;Z�Ð[ÜÔ[©Ó[Ð]aÓb÷ /Ò.ùâ[÷ /×.Ð.ús   »BÁBÁ)BÂBÂB!	rå   ú
post-setupútools-post-setupz0install-on-enable post-setup spawn failed for %sÚokTr   rÜ   rá   Úpost_setup_started)r™   rÍ   rÎ   rõ   rÏ   rÊ   ÚasyncioÚ	to_threadrá   r   r   r+   Ú_logÚ	exception)r   ró   rÊ   rÏ   rû   r  r  Úpending_keyrÍ   rÎ   rõ   rú   rî   s   ff&     @@@@@r#   Útoggle_toolsetr    s  þé € ÷
)ó )ñ 6°dÓ;€OØ—L‘L×+Ð+ G€M÷Có Cô$ ×
Ò
˜DÓ
!×!Ð!ð )-ÐØ‡|‡|€|˜Ð$9Ô9÷
	cñ 
	cð	UÜ '× 1Ò 1Ð2FÓ G×GˆKßÜ$Ü% mÓ4¸ÀÈ{Ð7[Õ[Ø&ô(ð &1Ð"ð
 	ˆd�F˜D *¨o¸yÈ$Ï,É,ØÐ0ð2ð 2ñ= "ñ* Høô ô 	UÜ�NŠNÐMÈtÖTð	UüsT   ‰ADÁC!ÁDÁ2DÂC% ÂC#ÂC% Â*!C% ÃDÃ#C% Ã%"D
ÄDÄ	D
Ä
Dz!/api/tools/toolsets/{name}/configc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   r   rÊ   ©r!   r   )r"   s   "r#   r$   r$   S  s"   € ÷ R*ñ R*¤3ð R*´¼#µñ R*r%   c           	   ƒ  ó¬   a aaaaaaaa	"  € ^ RI HoHoHoHoHo	 ^ RIHo ^ RIH	o VVVVVV VVV	3	R lp\        P                  ! V4      G Rj  x€L
 #  L5i)z›Provider matrix + key status for a toolset's config panel (the CLI picker
rows, each env var annotated ``is_set``); no category -> ``has_category: false``.)rž   r¦   rŸ   Úprovider_readiness_statusÚweb_provider_capabilitiesr'   )rÑ   c                  ó|  <	€ \        S4      ;_uu_ 4        \        S4       \        4       p SP                  S4      p. pR pV'       Edª   S! V RR7      pS! WRR7       EF�  pVP                  R. 4       Uu. uFa  pRVR,          RVP                  RVR,          4      RVP                  R4      RVP                  R4      R\	        S! VR,          4      4      /NKc  	  ppS! WPRR7      pV'       d   Vf
   VR	,          pR	VR	,          R
VP                  R
R4      RVP                  RR4      RVRVP                  R4      R\	        VP                  R4      4      RVP                  R4      RVRS! WPWHR7      /	p	SR8X  d6   VP                  R4      '       d   VR,          V	R&   S! VR,          4      V	R&   SR8X  d$   VP                  R4      '       d   VR,          V	R&   VP                  V	4       EK“  	  R	SRVR JRVRV/p
SR8X  d~    ^ RIHp ^ RIH	pH
pHp V! 4       pV! 4       pV! 4       ;'       g    VR8H  ;'       d	    V! R4      pVR8H  ;'       d	    V! R4      pWúR!&   VV
R"&   \	        V4      V
R#&   \	        V4      V
R$&   R R R 4       V
# u upi   \         d    R ;ppR ;pp LIi ; i  + '       g   i     X
# ; i)%NTr    Úenv_varsr/   ÚpromptÚurlrÆ   Úis_setr   Úbadger)   Útagr  Úrequires_nous_authÚmanaged_nous_featureÚ	is_activeÚstatus)rÙ   r!  ÚwebÚweb_backendÚcapabilitiesÚttsÚtts_providerÚhas_categoryÚ	providersÚactive_provider)Úis_managed_route)Ú_get_extract_backendÚ_get_search_backendÚ_managed_web_searchÚ	firecrawlÚsearchÚextractFÚactive_search_backendÚactive_extract_backendÚsearch_via_nousÚextract_via_nous)r   r¶   r   r4   r÷   rë   Úplugins.web.firecrawl.providerr+  Útools.web_toolsr,  r-  r.  r+   )r’   r¢   r)  r*  rÙ   r  Úer  r!  ÚrowÚpayloadr+  r,  r-  r.  Úsearch_backendÚextract_backendÚsearch_managedÚextract_managedrž   r¦   rŸ   r(   rÑ   r   rÊ   r  r  s                      €€€€€€€€€r#   rß   Ú!get_toolset_config.<locals>._read\  sû  ø€ Ü˜G×$Õ$Ü" 4Ô(Ü “]ˆFØ!×%Ñ% dÓ+ˆCØˆIØ"ˆOßˆsá9¸&ÈdÔS�Ù.¨sÈ×MÐM�Dð "&§¡¨*°bÔ!9ó ;ñ
 ":˜Að " 1 U¥8¨X°q·u±u¸XÀqÈÅxÓ7PØ! 1§5¡5¨£<°¸A¿E¹EÀ)Ó<LØ$¤d©=¸¸5½Ó+BÓ&CóEñ ":ð ð  ;ñ !4°DÈdÔ S�Iß  _Ò%<Ø*.¨v­,˜à  V¥Ø §¡¨'°2Ó!6Ø˜tŸx™x¨¨rÓ2Ø" HØ$ d§h¡h¨|Ó&<Ø,¬d°4·8±8Ð<PÓ3QÓ.Rð /°·±Ð9OÓ0PØ# Yð !Ñ";Ø °8ô#RðS�Cð  ˜u”}¨¯©°-×)@Ò)@ð .2°-Õ-@˜˜MÑ*Ù.GÈÈ]ÕH[Ó.\˜˜NÑ+Ø˜u”}¨¯©°.×)AÒ)Að /3°>Õ.B˜˜NÑ+Ø×$Ñ$ S×)ñK NðN ˜˜n¨c¸¨o¸{ÈIØ! ?ð4ˆGð �uŒ}ð=ÝOßnÑná%8Ó%:�NÙ&:Ó&<�OÙ%8Ó%:÷ &Vð &VØ&¨+Ñ5×TÐTÑ:JÈ8Ó:Tð #à&5¸Ñ&D×&dÐ&dÑIYÐZcÓId�Oð 4BÐ/Ñ0Ø4C�Ð0Ñ1Ü-1°.Ó-A�Ð)Ñ*Ü.2°?Ó.C�Ð*Ñ+÷K %ðL ˆùòy ;øôj !ô =Ø7;Ð;�N _Ø7<Ð<�N¢_ð=ú÷ %Ö$ðL ˆúsb   •A J*Á5A'J
ÃB7J*Æ;J*Ç5J*È+JÈ2JÈ?JÉ	JÉ%J*ÊJ*ÊJ'Ê$J*Ê&J'Ê'J*Ê*J;	N)r™   rž   r¦   rŸ   r  r  r*   r(   Úhermes_cli.nous_subscriptionrÑ   r  r  )
r   rÊ   rß   rž   r¦   rŸ   r(   rÑ   r  r  s
   ff @@@@@@@r#   Úget_toolset_configrA  R  s?   ÿøé € ÷#õ #õ 0ÝK÷Gõ GôR ×"Ò" 5Ó)×)Ð)Ñ)ùs   ‹AAÁAÁAz!/api/tools/toolsets/{name}/modelsc                óh   € V ^8„  d   QhR\         R\        \         ,          R\        \         ,          /# )r   r   r‚   rÊ   r  )r"   s   "r#   r$   r$   ©  s,   € ÷ $>ñ $>Ü
ð$>Ü!¤#�ð$>Ü8@Ä½ñ$>r%   c              ƒ  óÒ   a aaa"  € \         P                  S 4      oSf   \        S 4      # V VVV3R lp\        P                  ! V4      G Rj  x€L
 ;'       g    \        S 4      #  L5i)uÌ   Model catalog for a toolset backend (image/video gen) â€” the GUI
counterpart of the CLI model picker.  ``provider`` names a picker row
(default: the active provider); no catalog -> ``has_models: false``.Nc                  ó@  <€ \        S4      ;_uu_ 4        \        4       p \        SV S4      pV'       d   \        SV4      MR pV'       g    R R R 4       R # \	        SW 4      w  r4V P                  S4      pR p\        V\        4      '       dN   VP                  R4      p\        V\        4      '       d'   VP                  4       '       d   VP                  4       pWc9  d   WC9   d   TMR pR R R 4       XP                  4        UU	u. uFQ  w  r‰RVRV	P                  RV4      RV	P                  RR4      RV	P                  RR4      RV	P                  RR4      /NKS  	  p
pp	RSR	\        V
4      R
XP                  R4      RXRV
RXRX/#   + '       g   i     L¥; iu up	pi )NÚmodelÚidÚdisplayÚspeedr)   Ú	strengthsÚpricer   rÃ   r‚   ÚpluginrÄ   rÅ   rÆ   )r   r   r°   r�   r›   r4   rº   r2   r!   r5   Úitemsr÷   )r’   r9  rK  ÚcatalogÚdefault_modelÚsection_cfgrÅ   ÚrawÚmodel_idÚmetarÄ   r   rÊ   r‚   r»   s              €€€€r#   rß   Ú!get_toolset_models.<locals>._read²  ss  ø€ Ü˜G×$Õ$Ü “]ˆFÜ,¨T°6¸8ÓDˆCßADÔ2°4¸Ô=È$ˆFßØ÷ %Ñ$ô &<¸DÀ&Ó%QÑ"ˆGØ Ÿ*™* WÓ-ˆKØˆGÜ˜+¤t×,Ò,Ø!—o‘o gÓ.�Ü˜c¤3×'Ò'¨C¯I©I¯KªKØ!Ÿi™i›k�GØÔ%Ø+8Ô+C™-È�÷ %ð* #*§-¡-¤/ô3ñ
 #2‘�ð �h 	¨4¯8©8°I¸xÓ+HØ˜Ÿ™ '¨2Ó.°¸T¿X¹XÀkÐSUÓ=VØ˜Ÿ™ '¨2Ó.ó0ñ #2ð 	ñ 3ð �D˜,¬¨V«°jÀ#Ç'Á'È&Ã/Ø�f˜h¨°	¸7ÀIÈ}ð^ð 	^÷- %×$üó 3s%   •5FÁFÁA3FÃ
 FÄAFÆF	)Ú_MODEL_CATALOG_TOOLSETSr4   rÇ   r  r  )r   r‚   rÊ   rß   r»   s   fff @r#   Úget_toolset_modelsrU  ¨  sZ   ûé € ô &×)Ñ)¨$Ó/€GØ‚Ü˜$ÓÐ÷^ð ^ô6 ×"Ò" 5Ó)×)×=Ð=¬Z¸Ó-=Ð=Ñ)ùs   †AA'ÁA%Á
A'ÁA'z /api/tools/toolsets/{name}/modelc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# rò   )r!   r   r   )r"   s   "r#   r$   r$   Ñ  s-   € ÷ Kñ KÜ
ðKÜ'ðKÜ2:¼3µ-ñKr%   c              ƒ  ó8  a aaaa"  € \         P                  S 4      oSf   \        RS  24      hSP                  ;'       g    RP	                  4       oS'       g   \        R4      hVVV VV3R lp\
        P                  ! V4      G Rj  x€L
 pRRRS R	SR
V/#  L5i)z€Persist a backend model selection (``image_gen.model`` /
``video_gen.model``), validated against the resolved backend's catalog.NzToolset has no model catalog: r)   zmodel is requiredc                  ó®  <€ \        SP                  ;'       g    S4      ;_uu_ 4        \        4       p \        SV SP                  4      pV'       d   \        SV4      MR pV'       g   \        RS 24      h\        SW 4      w  r4SV9  d   \        RS: RV: 24      hS\        V S	4      R&   \        V 4       R R R 4       V#   + '       g   i     X# ; i)Nz'No model-capable backend is active for zUnknown model z for backend rE  )
r   rÊ   r   r°   r‚   r�   r´   r›   r¼   r   )
r’   r9  rK  rM  Ú_defaultró   rQ  r   rÊ   r»   s
        €€€€€r#   rû   Ú"select_toolset_model.<locals>._runÜ  s¾   ø€ Ü §¡× 7Ð 7°×8Õ8Ü “]ˆFÜ,¨T°6¸4¿=¹=ÓIˆCßADÔ2°4¸Ô=È$ˆFßÜ"Ð%LÈTÈFÐ#SÓTÐTä 6°t¸VÓ LÑˆGØ˜wÔ&Ü" ^°H±<¸}ÈVÉJÐ#WÓXÐXà6>ŒM˜& 'Ó*¨7Ñ3Ü˜Ô÷ 9ð ˆ÷ 9Ö8ð ˆús   ©?CÁ)ACÃC	r  Tr   rE  rK  )rT  r4   r´   rE  r5   r  r  )r   ró   rÊ   rû   rK  rQ  r»   s   fff  @@r#   Úselect_toolset_modelr[  Ð  s”   üé € ô
 &×)Ñ)¨$Ó/€GØ‚ÜÐ;¸D¸6ÐBÓCÐCØ—
‘
× Ð ˜b×'Ñ'Ó)€HßÜÐ.Ó/Ð/÷ñ ô  ×$Ò$ TÓ*×*€FØ�$˜  g¨x¸À6ÐJÐJñ +ùs   ‡:BÁBÁ.BÂ	BÂ
Bz#/api/tools/toolsets/{name}/providerc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# rò   )r!   r   r   )r"   s   "r#   r$   r$   ñ  s-   € ÷ Q)ñ Q)Ü
ðQ)Ü*ðQ)Ü5=¼cµ]ñQ)r%   c              ƒ  ó8  a aaaaaaa"  € ^ RI HoHo ^ RIHoHo SP                  e>   S R8w  d   \        R4      hSP                  R
9  d   \        RSP                  : R24      hVV 3R loVVVVVV VV3R	 lp\        P                  ! V4      G Rj  x€L
 #  L5i)a×  Persist a provider selection via ``apply_provider_selection`` (shared with
``hermes tools``, so both write identical keys).

``web`` only: ``capability`` ('search' | 'extract') writes
``web.<capability>_backend`` (the override the dispatchers resolve first);
omitted -> legacy ``web.backend``.  Managed Nous rows report Portal
entitlement (``needs_nous_auth`` + ``feature``): the GUI has no inline
login, so an unentitled selection would write config and never activate.
)Úapply_provider_selectionr  )Ú!MANAGED_FEATURE_COVERAGE_CATEGORYrÑ   Nr#  z:capability selection is only supported for the web toolsetzUnknown capability: z! (expected 'search' or 'extract')c                 óD   <€ \        V3R  l\        SV 4       4       R4      # )c              3   ój   <"  € T F(  qP                  R 4      SP                  8X  g   K$  Vx € K*  	  R# 5ir¨   )r4   r‚   )r©   rª   ró   s   & €r#   r«   ÚAselect_toolset_provider.<locals>._provider_row.<locals>.<genexpr>	  s&   øé € Ð\Ñ9�1¿U¹UÀ6»]ÈdÏmÉmÑ=[�QŠQÓ9ùs   ƒ!3©
3N)r®   r£   )r’   ró   r   s   &€€r#   Ú_provider_rowÚ.select_toolset_provider.<locals>._provider_row  s%   ø€ ÜÜ\Ô+¨D°&Ô9Ó\Ð^bódð 	dr%   c            
      ó:  <€ \        SP                  ;'       g    S4      ;_uu_ 4        \        S4       \        ;_uu_ 4        \	        4       p SP
                  eÔ   S! V 4      pVf   \        RSP                  : RS: 24      hVP                  R4      pV'       g   \        RSP                  : R24      hSP
                  S! V4      9  d%   \        SP                   RSP
                   24      h^ RI	H
p VP                  R4      '       d   TMT\        V R	4      SP
                   R
2&   M S! SSP                  V 4       \        V 4       RRRSRSP                  /pSP
                  e   SP
                  VR&   R R R 4       S! X 4      pT;'       g    / P                  R4      pV'       d…   S! V RR7      pVP                   p	SP                  V4      p
\#        T	;'       d:    V	P$                  ;'       d&    V
'       d   V	P'                  V
4      MV	P(                  4      pV'       g
   RXR&   WuR&   R R R 4       X#   \         d)   p\        \        T4      P                  R4      4      hR p?ii ; i  + '       g   i     EL ; i  + '       g   i     X# ; i)NzUnknown provider z for toolset r$  z	Provider z has no web backend keyz does not support )ÚNOUS_MANAGED_PROVIDERr   r#  Ú_backendÚ"r  Tr   r‚   Ú
capabilityr    Úneeds_nous_authÚfeature)r   rÊ   r¶   r   r   ri  r´   r‚   r4   rm   rf  r¼   ÚKeyErrorr!   r5   r   Úaccount_infor÷   Ú	logged_inÚtool_gateway_entitled_forÚtool_gateway_entitled)r’   r  rš   rf  rW   Úresponser9  Úmanaged_featurerÙ   ÚacctÚcategoryÚentitledr_  rc  r^  ró   rÑ   r   rÊ   r  s               €€€€€€€€r#   rû   Ú%select_toolset_provider.<locals>._run  s]  ø€ Ü˜DŸL™L×3Ð3¨G×4Õ4Ü" 4Ô(ß&Ö&Ü$›�Ø—?‘?Ò.ñ )¨Ó0�DØ’|Ü*Ø/°·±Ñ/@ÀÈdÉXÐVóXð Xà"Ÿh™h }Ó5�Gß"Ü*¨Y°t·}±}Ñ6GÐG^Ð+_Ó`Ð`Ø—‘Ñ.GÈÓ.PÔPÜ*¨d¯m©m¨_Ð<NÈtÏÉÐN_Ð+`ÓaÐaõ Qð 26·±Ð:P×1QÒ1QÑ-ÐW^ô " &¨%Ó0°D·O±OÐ3DÀHÐ1MÒNð@Ù0°°t·}±}ÀfÔMô ˜FÔ#Ø,0°$¸ÀÀjÐRV×R_ÑR_Ð+`�Ø—?‘?Ò.Ø-1¯_©_�H˜\Ñ*÷; 'ñD   Ó'ˆCØ"Ÿy˜y bŸo™oÐ.DÓEˆOßÙ9¸&ÈdÔS�Ø×,Ñ,�Ø<×@Ñ@ÀÓQ�ÜØ÷ 9ð 9ØŸ™÷9ð 9÷ $ð ×6Ñ6°xÔ@à!×7Ñ7ó:�÷  Ø26�HÐ.Ñ/Ø*9˜YÑ'÷g 5ðh ˆøô5 $ô @Ü*¬3¨s«8¯>©>¸#Ó+>Ó?Ð?ûð@ú÷1 '×&Ð&ú÷ 5Ö4ðh ˆúsy   ©J	ÁAI5	ÂA1I5	ÄI5	Ä0H?Å:I5	Å>J	ÆJ	Æ14J	Ç&J	Ç:J	È(J	È,	J	È?I2É
#I-É-I2É2I5	É5JÊ 	J	Ê	J	)r0  r1  )
r™   r^  r  r@  r_  rÑ   ri  r´   r  r  )	r   ró   rÊ   rû   r_  rc  r^  rÑ   r  s	   fff @@@@@r#   Úselect_toolset_providerrw  ð  s‰   ÿé € ÷ \÷Kð ‡�Ò"Ø�5Œ=ÜÐ[Ó\Ð\Ø�?‰?Ð"7Ô7ÜØ& t§¡Ñ&9Ð9ZÐ[ó]ð ]öd÷5ô 5ôn ×"Ò" 4Ó(×(Ð(Ñ(ùs   ŠB	BÂBÂBz/api/tools/toolsets/{name}/envc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# rò   )r!   r   r   )r"   s   "r#   r$   r$   F  s,   € ÷ $\ñ $\¤ð $\Ô,<ð $\ÄxÔPSÅ}ñ $\r%   c           
   ƒ  ó–   a aaaa"  € ^ RI HoHo VVV VV3R lp\        P                  ! V4      G Rj  x€L
 w  rEpRRRS RVRVR	V/#  L5i)
zÙPersist API keys to ``.env`` via ``save_env_value``.  Keys are validated
against the union of the category's visible-provider ``env_vars`` so this
can't write arbitrary env vars; a blank value means "leave unchanged".)r(   Úsave_env_valuec                  óŽ  <€ \        SP                  ;'       g    S4      ;_uu_ 4        \        S4       \        4       p \	        SV 4       UUu0 uF%  pVP                  R . 4       F  pVR,          kK  	  K'  	  pppSP                   Uu. uF  qDV9  g   K  VNK  	  ppV'       d*   \        RS RRP                  \        V4      4       24      h. p. pSP                  P                  4        F^  w  r‰V	'       dA   V	P                  4       '       d+    S! W‰P                  4       4       TP                  T4       KM  VP                  V4       K`  	  V Uu/ uF  qD\        S! V4      4      bK  	  ppRRR4       XXX3# u uppi u upi   \         d   p
\        \        T
4      4      hRp
?
ii ; iu upi   + '       g   i     LL; i)r  r/   zUnknown env var(s) for toolset z: ú, N)r   rÊ   r¶   r   r£   r4   Úenvr´   r`   ré   rL  r5   Ú
ValueErrorr!   rë   r÷   )r’   r  r8  Úallowedrc   ÚunknownÚsavedÚskippedr/   r6   rW   r"  ró   r(   r   rÊ   rz  s               €€€€€r#   rû   Úsave_toolset_env.<locals>._runL  s�  ø€ Ü˜DŸL™L×3Ð3¨G×4Õ4Ü" 4Ô(Ü “]ˆFô 0°°fÔ=ô!3á=�DØŸ™ *¨bÖ1�Að �%—�á1ñ Ù=ð ñ !3ð
 #'§(¢(Ó?¡(˜Q°wÑ.>—q�q¡(ˆGÐ?ßÜ"Ø5°d°V¸2¸d¿i¹iÌÈwËÓ>XÐ=YÐZó\ð \ð  "ˆEØ!#ˆGØ"Ÿh™hŸn™nÖ.‘
�ß˜UŸ[™[Ÿ]š]ð5Ù& s¯K©K«MÔ:ð —L‘L Ö%à—N‘N 3Ö'ñ /ñ :AÓA¹°Aœ™m¨AÓ.Ó/Ò/¹ˆFÐA÷3 5ð4 �g˜vÐ%Ð%ùó/!3ùò
 @øô &ô 5Ü*¬3¨s«8Ó4Ð4ûð5üò B÷3 5×4ús`   ©%F4Á+E=
Á9F4Â
FÂFÂA3F4ÄFÄ(,F4ÅF/Å.F4Å=F4ÆF,	ÆF'	Æ'F,	Æ,F4Æ4G	Nr  Tr   r�  r‚  r  )r*   r(   rz  r  r  )	r   ró   rÊ   rû   r�  r‚  r"  r(   rz  s	   fff    @@r#   Úsave_toolset_envr„  E  sQ   üé € ÷
 @÷&ñ &ô: $+×#4Ò#4°TÓ#:×:Ñ€E�FØ�$˜  g¨u°iÀÈ(ÐTZÐ[Ð[ñ ;ùs   ‡,A	³A´A	z%/api/tools/toolsets/{name}/post-setupc                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# rò   )r!   r   r   )r"   s   "r#   r$   r$   n  s(   € ÷ ñ Ü
ðÜ%ðÜ08¼µñr%   c              ƒ  óÞ   a aa"  € ^ RI Ho SP                  ;'       g    TpVV V3R lp\        W44      G Rj  x€L
  \	        VRRSP
                  .RRRR	7      pSP
                  VR
&   V#  L25i)zÎSpawn ``hermes tools post-setup <key>`` (long-running installs) as a
background action tailed via ``GET /api/actions/tools-post-setup/status``;
``profile`` is threaded so hooks see the drawer's HERMES_HOME.)Úvalid_post_setup_keysc                  óz   <€ \        S4       S P                  S! 4       9  d   \        R S P                   24      hR# )zUnknown post-setup key: N)r¶   r/   r´   )ró   r   r‡  s   €€€r#   Ú	_validateÚ)run_toolset_post_setup.<locals>._validatew  s7   ø€ ä˜tÔ$Ø�8‰8Ñ0Ó2Ô2ÜÐ!9¸$¿(¹(¸ÐDÓEÐEñ 3r%   Nrå   r	  r
  z Failed to spawn tools post-setupzFailed to run post-setup©Úlog_msgÚprefixr/   )r™   r‡  rÊ   r   r   r/   )r   ró   rÊ   rú   r‰  rì   r‡  s   ff&   @r#   Úrun_toolset_post_setuprŽ  m  so   úé € õ >à—L‘L×+Ð+ G€M÷Fô ˜=Ó
4×4Ð4Ü!Ø˜ ¨t¯x©xÐ8Ð:LØ2Ð;UôW€Fð —H‘H€Fˆ5�MØ€Mñ 5ùs   …3A-¸A+¹3A-z/api/tools/terminal/backendsc                ó:   € V ^8„  d   QhR\         \        ,          /# rÉ   rË   )r"   s   "r#   r$   r$   †  s   € ÷ *ñ *¬´#­ñ *r%   c              ƒ  óX   a "  € V 3R lp\         P                  ! V4      G Rj  x€L
 #  L5i)zœTerminal backend rows with health probes: ``status`` is ``ready`` /
``needs_setup`` / ``unavailable``; a probe failure is a status, never an
error response.c                  óf  <€ \        S4      ;_uu_ 4        \        4       p V P                  R 4      p\        V\        4      '       g   / p\        4       p\        VP                  R4      ;'       g    R4      P                  4       P                  4       pY2 Uu0 uF  qDR,          kK  	  up9  d   Rp. pV FT  p\        VR,          V4      w  rgVP                  RVR,          RVR,          RVR,          RVR,          V8H  RVRV/4       KV  	  R	R	R	4       RXR
X/# u upi   + '       g   i     L; i)Úterminalrš   rt   r   râ   rã   Úactiver"  r¾   NÚbackends)r   r   r4   rº   r2   r?   r!   r5   Úlowerrƒ   rë   )	r’   r.   r¯   r“  r9  r”  r"  r¾   rÊ   s	           €r#   rß   Ú$get_terminal_backends.<locals>._readŠ  s  ø€ Ü˜G×$Õ$Ü “]ˆFØ!Ÿ:™: jÓ1ˆLÜ˜l¬D×1Ò1Ø!�Ü)Ó+ˆDÜ˜×)Ñ)¨)Ó4×?Ð?¸Ó@×FÑFÓH×NÑNÓPˆFØ°TÓ:±T¨c &Ÿk˜k±TÑ:Ô:Ø �àˆHÛ�Ü!8¸¸V½ÀlÓ!S‘�Ø—‘Ø˜C �K¨°#°gµ,ÀÈsÐS`ÕOaØ˜c &�k¨VÑ3°X¸vÀxÐQWð!Yö Zñ ÷ %ð  ˜& *¨hÐ7Ð7ùò ;÷ %×$ús%   •AD Á0'D ÂD
Â(A%D ÄD Ä D0	N)r  r  )rÊ   rß   s   f r#   Úget_terminal_backendsr—  …  s$   øé € õ
8ô& ×"Ò" 5Ó)×)Ð)Ñ)ùs   ƒ *£(¤*z/api/tools/terminal/backendc                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r   ró   rÊ   )r   r   r!   )r"   s   "r#   r$   r$   ¡  s    € ÷ ,ñ ,Ü
ð,Ü*2´3­-ñ,r%   c              ƒ  óÐ   a aa"  € S P                   ;'       g    RP                  4       P                  4       oVV V3R lp\        P                  ! V4      G Rj  x€L
  RRRS/#  L
5i)uò   Persist ``terminal.backend``.  A backend that still needs setup is
allowed â€” the picker shows guidance instead of blocking, like the CLI.
Validated inside the target profile's scope, like the GET: plugin backends
are registered per profile.r)   c                  ó–  <€ \        SP                  ;'       g    S4      ;_uu_ 4        \        4        U u0 uF  q R ,          kK  	  pp SV9  d5   \        RSP                  : RRP                  \        V4      4       24      h\        4       pS\        VR4      R&   \        V4       RRR4       R# u up i   + '       g   i     R# ; i)r   zUnknown terminal backend: z. Use one of: r|  r’  rš   N)
r   rÊ   r?   r´   rš   r`   ré   r   r¼   r   )r9  Úvalid_namesr’   rš   ró   rÊ   s      €€€r#   rû   Ú%select_terminal_backend.<locals>._run©  s³   ø€ Ü §¡× 7Ð 7°×8Õ8Ü2HÔ2JÓKÑ2J¨3˜vŸ;˜;Ñ2JˆKÐKØ˜kÔ)Ü"Ø0°·±Ñ0@ð A#Ø#'§9¡9¬V°KÓ-@Ó#AÐ"BðDóEð Eô !“]ˆFØ;BŒM˜& *Ó-¨iÑ8Ü˜Ô÷ 9Ñ8ùÚK÷ 9×8Ð8ús   ©B7¶B2ÁA!B7Â2B7Â7C	Nr  Trš   )rš   r5   r•  r  r  )ró   rÊ   rû   rš   s   ff @r#   Úselect_terminal_backendr�     sZ   úé € ð �|‰|×!Ð!˜r×(Ñ(Ó*×0Ñ0Ó2€G÷	 ô ×
Ò
˜DÓ
!×!Ð!Ø�$˜	 7Ð+Ð+ñ "ùs   …AA&ÁA$ÁA&z/api/tools/computer-use/statusc                ó:   € V ^8„  d   QhR\         \        ,          /# rÉ   rË   )r"   s   "r#   r$   r$   ¹  s   € ÷ @ñ @¬8´C­=ñ @r%   c              ƒ  ó@   "  € ^ RI Hp \        W4      G Rj  x€L
 #  L5i)zxComputer Use readiness for the desktop card (payload shape: see
``tools.computer_use.permissions.computer_use_status``).)Úcomputer_use_statusN)Útools.computer_use.permissionsr   r   )rÊ   r   s   & r#   Úget_computer_use_statusr¢  ¸  s   é € õ Cä! 'Ó?×?Ð?Ñ?ùs   ‚—˜z)/api/tools/computer-use/permissions/grantc                ó:   € V ^8„  d   QhR\         \        ,          /# rÉ   rË   )r"   s   "r#   r$   r$   Â  s   € ÷ 	0ñ 	0´(¼3µ-ñ 	0r%   c              ƒ  ón   "  € \         P                  R8w  d   \        R4      h\        V . RORRRR7      # 5i)zÑSpawn ``hermes computer-use permissions grant`` (macOS-only: launches
CuaDriver via LaunchServices so the TCC dialog is attributed correctly).
The frontend polls ``GET /api/actions/computer-use-grant/status``.Údarwinz3Computer Use permission grants are a macOS concept.zcomputer-use-grantz.Failed to spawn computer-use permissions grantzFailed to request permissionsr‹  )zcomputer-useÚpermissionsÚgrant)ÚsysrÜ   r´   r   )rÊ   s   &r#   Úgrant_computer_use_permissionsr©  Á  s;   é € ô
 ‡|�|�xÔÜÐPÓQÐQÜØÒ9Ð;OØ@Ø.ô0ð 0ùs   ‚35r  )NN)GÚ__doc__r  rR   r¨  Útypingr   r   r   r   Úfastapir   r   Úhermes_cli.web_depsr   r>   r	   Ústarlette.concurrencyr
   Úhermes_cli.web_modelsr   r   r   r   r   r   Úhermes_cli.web_routers._commonr   r   r   r   r   r   r  r   r   Úrouterr   r   r,   r7   r?   rX   rf   rn   rs   r   rƒ   rT  r�   r›   r£   r°   r¶   r¼   r´   rÇ   r4   rð   Úputr  rA  rU  r[  rw  r„  ÚpostrŽ  r—  r�  r¢  r©  rv   r%   r#   Ú<module>r´     sl  ðñó Û Û 
ß ,Ó ,ç ,å $Ý HÝ 3÷*÷ *÷M÷ Mó Mñ 
‹€á�=Ð"5Ó6€Ù�=Ð"5Ó6€õõ'õCõAõ8	'õõ Nð Ñ'ØÐ#Ø	ÐØÐ!ØÐ%ð€õ7ð, '¨°[À+ÐNÐ õ
õ
2õLõ]õ7õõ9õ_ð ‡�Ð!Ó"ö.ó #ð.ðb ‡�Ð(Ó)ö=2ó *ð=2ð@ ‡�Ð/Ó0öR*ó 1ðR*ðj ‡�Ð/Ó0ö$>ó 1ð$>ðN ‡�Ð.Ó/öKó 0ðKð> ‡�Ð1Ó2öQ)ó 3ðQ)ðh ‡�Ð,Ó-ö$\ó .ð$\ðN ‡�Ð4Ó5öó 6ðð. ‡�Ð*Ó+ö*ó ,ð*ð4 ‡�Ð)Ó*ö,ó +ð,ð. ‡�Ð,Ó-ö@ó .ð@ð ‡�Ð8Ó9ö	0ó :ò	0r%   