§
    ¦¨îiHy ã                   ó  — U d Z ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZ ddlmZmZmZmZ ddlmZmZ ddlmZmZ ddlmZmZ dd	lmZ  ej        e¦  «        Z ee ¦  «        j!        j!         "                    ¦   «         Z#dd
l$m%Z&m'Z(m)Z*m+Z,m-Z. g d¢Z/h d£Z0dhdhdœZ1e	e2ee2         f         e3d<   de2de2de4fd„Z5d„ Z6de7fd„Z8ddl9m:Z; d„  e;j<        ¦   «         D ¦   «         Z:dddddg dddd d!gd"œd#d$d%g d&d'œd(d)d*d d+d,d-œgdd'œd.d/d0d1d2d-œgd3d4œd5d)d6d7d8d9d-œgd:d'œd;d)d<d=d>d?d-œgd@d'œdAdBdCdDdEdFd-œgdGd'œdHdIdJg dKdKdLœgdMœdNdOdPdQdddRdSg ddTdUdVgdWœdXdYdZdSdUd[d\d-œgd]œd^d)d_d`dadbdcd-œgd]œddd)dedfdgdhdid-œgd]œdjdkdldmdndodpd-œgd]œdqdrdsdSdVdtduœgd]œgdvœdwdxdddyg ddzd{gd|d}œd~d)dd{d€d�d-œgd|d‚œgdMœdƒd„d…dd†g d‡ddˆd‰gdŠd‹œ	dŒd$d�g dŽdŠd�œd�d)d‘d’d“d”d-œd•d–duœgd—dŠd�œd˜d)d™d‰dšd›d-œgd‡dŠd�œdœd)d™dUd[d\d-œgdSdŠd�œd�dždŸd d¡d¢d£d¤œgd¥d¥d�œgdMœd¦d§d¨d©dªd«duœd¬d­d®d¯œgd°œgdMœd±d²d³d´g dµd¶œgdMœd·d¸d¹dºd»d¼d½d¾d-œd¿dÀdÁd-œgdÂd¶œgdÃœdÄœZ=dÅgdÅgdÆœZ>dÇe2fdÈ„Z?de
e2         fdÉ„Z@�ddÊeAdËee
e2                  de	e2ee2         f         fdÌ„ZB�ddÍe4de4fdÎ„ZCddÏœdÊeAde2dÐe4dee2         fdÑ„ZDdÊeAde2dÒee2         fdÓ„ZE�dde2dÊeAde4fdÔ„ZF�d	dÕe2dÖeGdÍeHdeHfd×„ZIdaJee	e2eHf                  e3dØ<   de	e2eHf         fdÙ„ZK�d
dÛe2dÜee2         de2dee2         fdÝ„ZLde2dÊeAfdÞ„ZMdeGeA         fdß„ZNdàeAdÊeAdeGeA         fdá„ZOde2dÊeAde4fdâ„ZPde2dàeAdÊeAfdã„ZQdäeAdÊeAde4fdå„ZRdæeGdÊeAdeHfdç„ZSdè„ ZTd|d~dzeTdéœiZUdêe2dëeAdìeAde2fdí„ZVdîe2dÊeAddfdï„ZWdðe2fdñ„ZXdðe2dÊeAddfdò„ZYdðe2dÊeAddfdó„ZZdäeAdÊeAfdô„Z[de2fdõ„Z\dÊeAfdö„Z]de2dàeAdÊeAfd÷„Z^däeAdÊeAfdø„Z_de2fdù„Z`�ddûe4dÊeAfdü„ZadÊeAfdý„ZbdÊeAde2dþe
e2         dÿe2f�d „ZcdÊeA�de
e2         dÿe2dee2         f�d„Zd�d
�de7�deAde2f�d„Ze�d„ ZfdS (  uY  
Unified tool configuration for Hermes Agent.

`hermes tools` and `hermes setup tools` both enter this module.
Select a platform â†’ toggle toolsets on/off â†’ for newly enabled tools
that need API keys, run through provider-aware configuration.

Saves per-platform tool configuration to ~/.hermes/config.yaml under
the `platform_toolsets` key.
é    N)ÚPath)ÚDictÚListÚOptionalÚSet)Úload_configÚsave_configÚget_env_valueÚsave_env_value)ÚColorsÚcolor)Úapply_nous_managed_defaultsÚget_nous_subscription_features)Úfal_key_is_configuredÚmanaged_nous_tools_enabled)Úbase_url_hostname)Úprint_errorÚ
print_infoÚprint_successÚprint_warningÚprompt))Úwebu   ðŸ”� Web Search & Scrapingzweb_search, web_extract)Úbrowseru   ðŸŒ� Browser Automationznavigate, click, type, scroll)Úterminalu   ðŸ’» Terminal & Processeszterminal, process)Úfileu   ðŸ“� File Operationszread, write, patch, search)Úcode_executionu   âš¡ Code ExecutionÚexecute_code)Úvisionu    ðŸ‘�ï¸�  Vision / Image AnalysisÚvision_analyze)Ú	image_genu   ðŸŽ¨ Image GenerationÚimage_generate)Úmoau   ðŸ§  Mixture of AgentsÚmixture_of_agents)Úttsu   ðŸ”Š Text-to-SpeechÚtext_to_speech)Úskillsu   ðŸ“š Skillszlist, view, manage)Útodou   ðŸ“‹ Task Planningr'   )Úmemoryu   ðŸ’¾ Memoryz!persistent memory across sessions)Úsession_searchu   ðŸ”Ž Session Searchzsearch past conversations)Úclarifyu   â�“ Clarifying Questionsr*   )Ú
delegationu   ðŸ‘¥ Task DelegationÚdelegate_task)Úcronjobu   â�° Cron JobszBcreate/list/update/pause/resume/run, with optional attached skills)Ú	messagingu   ðŸ“¨ Cross-Platform MessagingÚsend_message)Úrlu   ðŸ§ª RL TrainingzTinker-Atropos training tools)Úhomeassistantu   ðŸ�  Home Assistantzsmart home device control)Úspotifyu   ðŸŽµ Spotifyz$playback, search, playlists, library)Údiscordu   ðŸ’¬ Discord (read/participate)z-fetch messages, search members, create thread)Údiscord_adminu   ðŸ›¡ï¸�  Discord Server Adminz&list channels/roles, pin, assign roles>   r0   r"   r3   r2   r4   r1   r3   )r3   r4   Ú_TOOLSET_PLATFORM_RESTRICTIONSÚts_keyÚplatformÚreturnc                 óF   — t                                | ¦  «        }|du p||v S )z�Return True if ``ts_key`` is configurable on ``platform``.

    Toolsets without a restriction entry are allowed everywhere (the default).
    N)r5   Úget)r6   r7   Úalloweds      ú9/home/div/.hermes/hermes-agent/hermes_cli/tools_config.pyÚ_toolset_allowed_for_platformr=   ^   s+   € õ
 -×0Ò0°Ñ8Ô8€GØ�dˆ?Ð1˜h¨'Ð1Ð1ó    c                  ó  — t          t          ¦  «        } d„ | D ¦   «         }	 ddlm}m}  |¦   «           |¦   «         D ]=}|d         |v rŒ|                     |d         ¦  «         |                      |¦  «         Œ>n# t          $ r Y nw xY w| S )u  Return CONFIGURABLE_TOOLSETS + any plugin-provided toolsets.

    Plugin toolsets are appended at the end so they appear after the
    built-in toolsets in the TUI checklist. A plugin whose toolset key
    already appears in ``CONFIGURABLE_TOOLSETS`` is skipped â€” bundled
    plugins (e.g. ``plugins/spotify``) share their toolset key with the
    built-in entry, and we want the built-in label/description to win.
    Without the dedupe, ``hermes tools`` â†’ "reconfigure existing" would
    list the same toolset twice.
    c                 ó   — h | ]\  }}}|’Œ	S © rA   ©Ú.0r6   Ú_s      r<   ú	<setcomp>z7_get_effective_configurable_toolsets.<locals>.<setcomp>s   s   € Ð.Ð.Ð.‘|�v˜q !ˆFÐ.Ð.Ð.r>   r   ©Údiscover_pluginsÚget_plugin_toolsets)ÚlistÚCONFIGURABLE_TOOLSETSÚhermes_cli.pluginsrG   rH   ÚaddÚappendÚ	Exception)ÚresultÚseenrG   rH   Úentrys        r<   Ú$_get_effective_configurable_toolsetsrR   g   sÒ   € õ Õ'Ñ(Ô(€FØ.Ð. vÐ.Ñ.Ô.€Dð	ØLÐLÐLÐLÐLÐLÐLÐLØÐÑÔÐØ(Ð(Ñ*Ô*ð 	!ð 	!ˆEØ�QŒx˜4ÐÐØØ�HŠH�U˜1”XÑÔÐØ�MŠM˜%Ñ Ô Ð Ð ð		!øõ
 ð ð ð Øˆðøøøà€Ms   ¢AA= Á=
B
Â	B
c                  óŒ   — 	 ddl m} m}  | ¦   «          d„  |¦   «         D ¦   «         S # t          $ r t	          ¦   «         cY S w xY w)z3Return the set of toolset keys provided by plugins.r   rF   c                 ó   — h | ]\  }}}|’Œ	S rA   rA   rB   s      r<   rE   z+_get_plugin_toolset_keys.<locals>.<setcomp>†   s   € ÐAÐAÐA™<˜6 1 a�ÐAÐAÐAr>   )rK   rG   rH   rN   ÚsetrF   s     r<   Ú_get_plugin_toolset_keysrV   �   st   € ðØLÐLÐLÐLÐLÐLÐLÐLØÐÑÔÐØAÐAÐ+>Ð+>Ñ+@Ô+@ÐAÑAÔAÐAøÝð ð ð Ý‰uŒuˆˆˆðøøøs   ‚%( ¨AÁA)Ú	PLATFORMSc                 ó4   — i | ]\  }}||j         |j        d œ“ŒS )©ÚlabelÚdefault_toolsetrY   )rC   ÚkÚinfos      r<   ú
<dictcomp>r^   �   s;   € ð ð ð áˆˆ4ð �”°Ô0DÐEÐEðð ð r>   zText-to-Speechu   ðŸ”ŠzNous SubscriptionÚsubscriptionz.Managed OpenAI TTS billed to your subscriptionÚopenaiTr$   ÚVOICE_TOOLS_OPENAI_KEYÚOPENAI_API_KEY)ÚnameÚbadgeÚtagÚenv_varsÚtts_providerÚrequires_nous_authÚmanaged_nous_featureÚoverride_env_varszMicrosoft Edge TTSu   â˜… recommended Â· freezGood quality, no API key neededÚedge)rc   rd   re   rf   rg   z
OpenAI TTSÚpaidzHigh quality voiceszOpenAI API keyz$https://platform.openai.com/api-keys)Úkeyr   ÚurlzxAI TTSz"Grok voices - requires xAI API keyÚXAI_API_KEYzxAI API keyzhttps://console.x.ai/Úxai)rc   re   rf   rg   Ú
ElevenLabszMost natural voicesÚELEVENLABS_API_KEYzElevenLabs API keyz+https://elevenlabs.io/app/settings/api-keysÚ
elevenlabszMistral (Voxtral TTS)zMultilingual, native OpusÚMISTRAL_API_KEYzMistral API keyzhttps://console.mistral.ai/ÚmistralzGoogle Gemini TTSÚpreviewz,30 prebuilt voices, controllable via promptsÚGEMINI_API_KEYzGemini API keyz&https://aistudio.google.com/app/apikeyÚgeminiÚ	KittenTTSu   local Â· freez.Lightweight local ONNX TTS (~25MB), no API keyÚ	kittentts)rc   rd   re   rf   rg   Ú
post_setup)rc   ÚiconÚ	providerszWeb Search & ExtractzSelect Search Provideruc   A free DuckDuckGo search skill is also included â€” skip this if you don't need a premium provider.u   ðŸ”�z-Managed Firecrawl billed to your subscriptionÚ	firecrawlr   ÚFIRECRAWL_API_KEYÚFIRECRAWL_API_URL)rc   rd   re   Úweb_backendrf   rh   ri   rj   zFirecrawl Cloudu   â˜… recommendedz(Full-featured search, extract, and crawlzFirecrawl API keyzhttps://firecrawl.dev)rc   rd   re   r�   rf   ÚExaz)Neural search with semantic understandingÚexaÚEXA_API_KEYzExa API keyzhttps://exa.aiÚParallelzAI-powered search and extractÚparallelÚPARALLEL_API_KEYzParallel API keyzhttps://parallel.aiÚTavilyz	free tieru4   Search, extract, and crawl â€” 1000 free searches/moÚtavilyÚTAVILY_API_KEYzTavily API keyzhttps://app.tavily.com/homezFirecrawl Self-Hostedu   free Â· self-hostedz(Run your own Firecrawl instance (Docker)z9Your Firecrawl instance URL (e.g., http://localhost:3002))rm   r   )rc   Úsetup_titleÚ
setup_noter|   r}   úImage Generationu   ðŸŽ¨z8Managed FAL image generation billed to your subscriptionr    ÚFAL_KEYÚfal)rc   rd   re   rf   rh   ri   rj   Úimagegen_backendzFAL.aiz@Pick from flux-2-klein, flux-2-pro, gpt-image, nano-banana, etc.zFAL API keyzhttps://fal.ai/dashboard/keys)rc   rd   re   rf   r�   zBrowser Automationu   ðŸŒ�z%Nous Subscription (Browser Use cloud)z/Managed Browser Use billed to your subscriptionzbrowser-user   ÚBROWSER_USE_API_KEYÚagent_browser)	rc   rd   re   rf   Úbrowser_providerrh   ri   rj   r{   zLocal Browserz$Headless Chromium, no API key neededÚlocal)rc   rd   re   rf   r“   r{   ÚBrowserbasez&Cloud browser with stealth and proxiesÚBROWSERBASE_API_KEYzBrowserbase API keyzhttps://browserbase.comÚBROWSERBASE_PROJECT_IDzBrowserbase project IDÚbrowserbasezBrowser Usez#Cloud browser with remote executionzBrowser Use API keyzhttps://browser-use.comÚ	FirecrawlÚCamofoxu   free Â· localz)Anti-detection browser (Firefox/Camoufox)ÚCAMOFOX_URLzCamofox server URLzhttp://localhost:9377z)https://github.com/jo-inc/camofox-browser)rm   r   Údefaultrn   Úcamofoxz
Smart Homeu   ðŸ� zHome AssistantzREST API integrationÚ
HASS_TOKENz&Home Assistant Long-Lived Access TokenÚHASS_URLzHome Assistant URLzhttp://homeassistant.local:8123)rm   r   rœ   )rc   re   rf   ÚSpotifyu   ðŸŽµzSpotify Web APIu%   PKCE OAuth â€” opens the setup wizardr2   )rc   re   rf   r{   zRL Trainingu   ðŸ§ª)é   é   zTinker / AtroposzRL training platformÚTINKER_API_KEYzTinker API keyz/https://tinker-console.thinkingmachines.ai/keysÚWANDB_API_KEYzWandB API keyzhttps://wandb.ai/authorizeÚrl_training)rc   r|   Úrequires_pythonr}   )r$   r   r    r   r1   r2   r0   )ÚOPENROUTER_API_KEYzhttps://openrouter.ai/keys)r   r"   Úpost_setup_keyc                 óV  — ddl }| dv rÜt          dz  dz  }|                     ¦   «         s”|                     d¦  «        rt	          d¦  «         ddl}|                     g d¢d	d	t          t          ¦  «        ¬
¦  «        }|j        dk    rt          d¦  «         dS ddl
m} t          d |¦   «         › d�¦  «         dS |                     ¦   «         st          d¦  «         dS dS | dk    �r,t          dz  dz  dz  }|                     ¦   «         s|                     d¦  «        rjt	          d¦  «         ddl}|                     g d¢d	d	t          t          ¦  «        ¬
¦  «        }|j        dk    rt          d¦  «         nt          d¦  «         |                     ¦   «         r>t	          d¦  «         t	          d¦  «         t	          d¦  «         t	          d¦  «         dS |                     d¦  «        s t          d¦  «         t	          d¦  «         dS dS | dk    �r5	 t          d¦  «         t          d¦  «         dS # t          $ r Y nw xY wddl}t	          d¦  «         d}	 |                     t          j        d d!d"d#|d$d%gd	d	d&¬'¦  «        }|j        dk    r.t          d(¦  «         t	          d)¦  «         t	          d*¦  «         nUt          d+¦  «         t	          d,|j                             ¦   «         dd&…         › �¦  «         t	          d-|› d.�¦  «         dS dS # |j        $ r& t          d/¦  «         t	          d-|› d.�¦  «         Y dS w xY w| d0k    rîdd1lm} 	 dd2lm}	 n9# t0          $ r,}
t          d3|
› �¦  «         t	          d4¦  «         Y d}
~
dS d}
~
ww xY wt	          d5¦  «         	  |	 |dddd6d¬7¦  «        ¦  «         t          d8¦  «         dS # t2          $ r,}
t          d9|
› �¦  «         t	          d:¦  «         Y d}
~
dS d}
~
wt0          $ r,}
t          d;|
› �¦  «         t	          d4¦  «         Y d}
~
dS d}
~
ww xY w| d<k    �rZ	 t          d=¦  «         dS # t          $ �r: t          d>z  }|                     ¦   «         rë|d?z                       ¦   «         rÔt	          d@¦  «         ddl}|                     dA¦  «        }|r7|                     |d!d"dBt          j        dCt          |¦  «        gd	d	¬D¦  «        }n5|                     t          j        d d!d"dCt          |¦  «        gd	d	¬D¦  «        }|j        dk    rt          dE¦  «         Y dS t          dF¦  «         t	          dG¦  «         Y dS t          dH¦  «         t	          dI¦  «         t	          dG¦  «         Y dS w xY wdS )JzBRun post-setup hooks for tools that need extra installation steps.r   N)r’   r˜   Únode_moduleszagent-browserÚnpmz8    Installing Node.js dependencies for browser tools...)r«   Úinstallz--silentT)Úcapture_outputÚtextÚcwdz"    Node.js dependencies installed©Údisplay_hermes_homez*    npm install failed - run manually: cd z/hermes-agent && npm installzV    Node.js not found - browser tools require: npm install (in hermes-agent directory)r�   z@askjozcamofox-browserz(    Installing Camofox browser server...z    Camofox installedz2    npm install failed - run manually: npm installz    Start the Camofox server:z       npx @askjo/camofox-browserz4    First run downloads the Camoufox engine (~300MB)zV    Or use Docker: docker run -p 9377:9377 -e CAMOFOX_PORT=9377 jo-inc/camofox-browserz2    Node.js not found. Install Camofox via Docker:zI      docker run -p 9377:9377 -e CAMOFOX_PORT=9377 jo-inc/camofox-browserrz   z"    kittentts is already installedz6    Installing kittentts (~25-80MB model, CPU-only)...z^https://github.com/KittenML/KittenTTS/releases/download/0.8.1/kittentts-0.8.1-py3-none-any.whlz-mÚpipr¬   z-UÚ	soundfilez--quieti,  )r­   r®   Útimeoutz    kittentts installedz>    Voices: Jasper, Bella, Luna, Bruno, Rosie, Hugo, Kiki, LeozO    Models: KittenML/kitten-tts-nano-0.8-int8 (25MB), micro (41MB), mini (80MB)z    kittentts install failed:z      z,    Run manually: python -m pip install -U 'z' soundfilez'    kittentts install timed out (>5min)r2   )ÚSimpleNamespace)Úlogin_spotify_commandz!    Could not load Spotify auth: z%    Run manually: hermes auth spotifyz    Starting Spotify login...F)Ú	client_idÚredirect_uriÚscopeÚ
no_browserr´   z    Spotify authenticatedz$    Spotify login did not complete: z"    Run later: hermes auth spotifyz    Spotify login failed: r¥   Útinker_atroposztinker-atroposzpyproject.tomlz*    Installing tinker-atropos submodule...Úuvz--pythonz-e)r­   r®   z    tinker-atropos installedz1    tinker-atropos install failed - run manually:z*      uv pip install -e "./tinker-atropos"z-    tinker-atropos submodule not found - run:z-      git submodule update --init --recursive)ÚshutilÚPROJECT_ROOTÚexistsÚwhichÚ_print_infoÚ
subprocessÚrunÚstrÚ
returncodeÚ_print_successÚhermes_constantsr±   Ú_print_warningÚ
__import__ÚImportErrorÚsysÚ
executableÚstderrÚstripÚTimeoutExpiredÚtypesrµ   Úhermes_cli.authr¶   rN   Ú
SystemExit)r¨   r½   rª   rÂ   rO   r±   Úcamofox_dirÚ	wheel_urlrµ   r¶   ÚexcÚ
tinker_dirÚuv_bins                r<   Ú_run_post_setuprØ   ·  s¤  € à€M€M€MØÐ9Ð9Ð9Ý# nÑ4°ÑFˆØ×"Ò"Ñ$Ô$ð 	u¨¯ª°eÑ)<Ô)<ð 	uÝÐRÑSÔSÐSØÐÐÐØ—^’^Ø.Ð.Ð.Ø#¨$µC½Ñ4EÔ4Eð $ñ ô ˆFð Ô  AÒ%Ð%ÝÐCÑDÔDÐDÐDÐDà@Ð@Ð@Ð@Ð@Ð@ÝÐÐL_ÐL_ÑLaÔLaÐÐÐñ  Aô  Að  Að  Að  AØ×$Ò$Ñ&Ô&ð 	uÝÐsÑtÔtÐtÐtÐtð	uð 	uð 
˜9Ò	$Ñ	$Ý" ^Ñ3°hÑ>ÐARÑRˆØ×!Ò!Ñ#Ô#ð 
	U¨¯ª°UÑ(;Ô(;ð 
	UÝÐBÑCÔCÐCØÐÐÐØ—^’^Ø.Ð.Ð.Ø#¨$µC½Ñ4EÔ4Eð $ñ ô ˆFð Ô  AÒ%Ð%ÝÐ6Ñ7Ô7Ð7Ð7åÐSÑTÔTÐTØ×ÒÑÔð 	eÝÐ7Ñ8Ô8Ð8ÝÐ:Ñ;Ô;Ð;ÝÐNÑOÔOÐOÝÐpÑqÔqÐqÐqÐqØ—’˜eÑ$Ô$ð 	eÝÐOÑPÔPÐPÝÐcÑdÔdÐdÐdÐdð	eð 	eð 
˜;Ò	&Ñ	&ð	Ý�{Ñ#Ô#Ð#ÝÐ?Ñ@Ô@Ð@ØˆFøÝð 	ð 	ð 	ØˆDð	øøøàÐÐÐÝÐLÑMÔMÐMð5ð 	ð	_Ø—^’^Ý”  u¨i¸¸yÈ+ÐW`ÐaØ#¨$¸ð $ñ ô ˆFð Ô  AÒ%Ð%ÝÐ8Ñ9Ô9Ð9ÝÐ\Ñ]Ô]Ð]ÝÐmÑnÔnÐnÐnåÐ>Ñ?Ô?Ð?ÝÐB V¤]×%8Ò%8Ñ%:Ô%:¸4¸C¸4Ô%@ÐBÐBÑCÔCÐCÝÐaÈ9ÐaÐaÐaÑbÔbÐbÐbÐbð	 oÐnøð
 Ô(ð 	_ð 	_ð 	_ÝÐDÑEÔEÐEÝÐ]ÀyÐ]Ð]Ð]Ñ^Ô^Ð^Ð^Ð^Ð^ð	_øøøð 
˜9Ò	$Ð	$ð 	*Ð)Ð)Ð)Ð)Ð)ð	Ø=Ð=Ð=Ð=Ð=Ð=Ð=øÝð 	ð 	ð 	ÝÐD¸sÐDÐDÑEÔEÐEÝÐ?Ñ@Ô@Ð@ØˆFˆFˆFˆFˆFøøøøð	øøøõ 	Ð3Ñ4Ô4Ð4ð	AØ!Ð! / /Ø¨T¸Ø ¨$ð#ñ #ô #ñ ô ð õ Ð6Ñ7Ô7Ð7Ð7Ð7øÝð 	>ð 	>ð 	>õ ÐGÀ#ÐGÐGÑHÔHÐHÝÐ<Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=øøøøÝð 	Að 	Að 	AÝÐ=¸Ð=Ð=Ñ>Ô>Ð>ÝÐ?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøð 
˜=Ò	(Ñ	(ð	JÝÐ'Ñ(Ô(Ð(Ð(Ð(øÝð 	Jñ 	Jð 	JÝ%Ð(8Ñ8ˆJØ× Ò Ñ"Ô"ð J¨
Ð5EÑ(E×'MÒ'MÑ'OÔ'Oð JÝÐHÑIÔIÐIØ!Ð!Ð!Ð!ØŸš dÑ+Ô+�Øð 	Ø'Ÿ^š^Ø ¨	°:½s¼~ÈtÕUXÐYcÑUdÔUdÐeØ'+°$ð ,ñ ô �F�Fð
 (Ÿ^š^Ýœ¨¨u°iÀÅsÈ:ÁÄÐWØ'+°$ð ,ñ ô �Fð Ô$¨Ò)Ð)Ý"Ð#AÑBÔBÐBÐBÐBÐBå"Ð#VÑWÔWÐWÝÐ LÑMÔMÐMÐMÐMÐMåÐNÑOÔOÐOÝÐKÑLÔLÐLÝÐHÑIÔIÐIÐIÐIÐIð1	Jøøøð 
)Ð	(s€   È I  É 
IÉIÉ&B7L! Ì!,MÍMÍ!M( Í(
NÍ2!NÎNÎ1(O Ï
QÏ%!PÐQÐ!Q Ñ QÑQ! Ñ!C0V&ÕV&Õ5-V&Ö%V&c                  ót  — dg} t          d¦  «        r|                      d¦  «         t          d¦  «        r|                      d¦  «         t          d¦  «        r|                      d¦  «         t          d¦  «        r|                      d	¦  «         t          d
¦  «        r|                      d¦  «         | S )zBReturn platform keys that are configured (have tokens or are CLI).ÚcliÚTELEGRAM_BOT_TOKENÚtelegramÚDISCORD_BOT_TOKENr3   ÚSLACK_BOT_TOKENÚslackÚWHATSAPP_ENABLEDÚwhatsappÚ	QQ_APP_IDÚqqbot)r
   rM   )Úenableds    r<   Ú_get_enabled_platformsrå   <  s¼   € àˆg€GÝÐ)Ñ*Ô*ð #Ø�Š�zÑ"Ô"Ð"ÝÐ(Ñ)Ô)ð "Ø�Š�yÑ!Ô!Ð!ÝÐ&Ñ'Ô'ð  Ø�Š�wÑÔÐÝÐ'Ñ(Ô(ð #Ø�Š�zÑ"Ô"Ð"Ý�[Ñ!Ô!ð  Ø�Š�wÑÔÐØ€Nr>   ÚconfigÚ	platformsc                 óZ   — |€t          ¦   «         }i }|D ]}t          | |¦  «        ||<   Œ|S )zêReturn a summary of enabled toolsets per platform.

    When ``platforms`` is None, this uses ``_get_enabled_platforms`` to
    auto-detect platforms. Tests can pass an explicit list to avoid relying
    on environment variables.
    )rå   Ú_get_platform_tools)ræ   rç   ÚsummaryÚpkeys       r<   Ú_platform_toolset_summaryrì   L  sC   € ð ÐÝ*Ñ,Ô,ˆ	à#%€GØð :ð :ˆÝ+¨F°DÑ9Ô9ˆ�‰ˆØ€Nr>   rœ   c                 ó   — | €|S t          | t          ¦  «        r| S t          | t          ¦  «        r| dk    S t          | t          ¦  «        r2|                      ¦   «                              ¦   «         }|dv rdS |dv rdS |S )z=Parse bool-like config values used by tool/platform settings.Nr   >   Ú1ÚonÚyesÚtrueT>   Ú0ÚnoÚoffÚfalseF)Ú
isinstanceÚboolÚintrÄ   rÎ   Úlower)Úvaluerœ   Úlowereds      r<   Ú_parse_enabled_flagrü   \  s‘   € à€}ØˆÝ�%�ÑÔð ØˆÝ�%�ÑÔð Ø˜ŠzÐÝ�%�ÑÔð Ø—+’+‘-”-×%Ò%Ñ'Ô'ˆØÐ0Ð0Ð0Ø�4ØÐ1Ð1Ð1Ø�5Ø€Nr>   ©Úinclude_default_mcp_serversrþ   c                óx	  ‡‡‡‡— ddl m}m} |                      d¦  «        pi }|                     ‰¦  «        }|�t	          |t
          ¦  «        st          ‰         d         }|g}d„ |D ¦   «         }d„ t          D ¦   «         Št          ¦   «         Šd„ t           	                    ¦   «         D ¦   «         Št          ˆfd	„|D ¦   «         ¦  «        }|rˆˆfd
„|D ¦   «         }	�n
t          ¦   «         }
|D ] }|
                      ||¦  «        ¦  «         Œ!t          ¦   «         }	t          D ][\  }}}t          |‰¦  «        sŒt           ||¦  «        ¦  «        }|r*|                     |
¦  «        r|	                     |¦  «         Œ\t          t           ¦  «        }‰|v r‰t"          vr|                     ‰¦  «         d|v r)t'          j        d¦  «        r|                     d¦  «         |	|z  }	t           |t          ‰         d         ¦  «        ¦  «        }t          ¦   «         }‰D ] }|                      ||¦  «        ¦  «         Œ!t          ¦   «         }|	D ] }|                      ||¦  «        ¦  «         Œ!‰‰z  ‰z  }|d„ |D ¦   «         z  }|t          t           ¦  «        ‰hz
  z  }|                     ¦   «         D ]¥\  }}||v rŒ
|                     d¦  «        rŒ t           ||¦  «        ¦  «        }|r|                     |¦  «        sŒP|                     |¦  «        rŒf|                     |¦  «        s*|	                     |¦  «         |                     |¦  «         Œ¦‰r{|                      di ¦  «        }t          |                     ‰g ¦  «        ¦  «        }‰D ]?}||v r|	                     |¦  «         Œ|t           v rŒ&||vr|	                     |¦  «         Œ@ˆˆˆfd„|D ¦   «         }|                      d¦  «        pi }d„ |                     ¦   «         D ¦   «         }d|v r+t          ¦   «         }|	                     ||z
  dhz
  ¦  «         n||z  }|	                     ||z
  ¦  «         |r2|sd|v r|	                     |¦  «         n+|	                     |¦  «         n|	                     |¦  «         |	S )zBResolve which individual toolset names are enabled for a platform.r   )Úresolve_toolsetÚTOOLSETSÚplatform_toolsetsNr[   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rA   ©rÄ   ©rC   Útss     r<   ú
<listcomp>z'_get_platform_tools.<locals>.<listcomp>  s   € Ð5Ð5Ð5 •S˜‘W”WÐ5Ð5Ð5r>   c                 ó   — h | ]\  }}}|’Œ	S rA   rA   rB   s      r<   rE   z&_get_platform_tools.<locals>.<setcomp>�  ó   € ÐJÐJÐJ¡L F¨A¨q˜ÐJÐJÐJr>   c                 ó   — h | ]
}|d          ’ŒS ©r[   rA   ©rC   Úps     r<   rE   z&_get_platform_tools.<locals>.<setcomp>ƒ  ó   € ÐNÐNÐN°a˜QÐ0Ô1ÐNÐNÐNr>   c              3   ó    •K  — | ]}|‰v V — Œ	d S ©NrA   )rC   r  Úconfigurable_keyss     €r<   ú	<genexpr>z&_get_platform_tools.<locals>.<genexpr>Š  s)   øè è € ÐNÐN¸"˜bÐ$5Ð5ÐNÐNÐNÐNÐNÐNr>   c                 ó<   •— h | ]}|‰v ¯t          |‰¦  «        ¯|’ŒS rA   ©r=   )rC   r  r  r7   s     €€r<   rE   z&_get_platform_tools.<locals>.<setcomp>�  s?   ø€ ð 
ð 
ð 
ØØÐ&Ð&Ð&Õ+HÈÈXÑ+VÔ+VÐ&ð Ø&Ð&Ð&r>   r1   rž   c                 ó<   — h | ]}|                      d ¦  «        ¯|’ŒS )zhermes-)Ú
startswith)rC   r\   s     r<   rE   z&_get_platform_tools.<locals>.<setcomp>Á  s)   € Ð<Ð<Ð<�1 A§L¢L°Ñ$;Ô$;Ð<ˆQÐ<Ð<Ð<r>   ÚincludesÚknown_plugin_toolsetsc                 ó,   •— h | ]}|‰vr
|‰vr|‰v¯|’ŒS rA   rA   )rC   r  r  Úplatform_default_keysÚplugin_ts_keyss     €€€r<   rE   z&_get_platform_tools.<locals>.<setcomp>é  sH   ø€ ð ð ð àØÐ&Ð&Ð&Ø�nÐ$Ð$ØÐ+Ð+Ð+ð	 	ð ,Ð+Ð+r>   Úmcp_serversc                 ó¦   — h | ]N\  }}t          |t          ¦  «        ¯t          |                     d d¦  «        d¬¦  «        ¯?t	          |¦  «        ’ŒOS )rä   T©rœ   )rö   Údictrü   r:   rÄ   )rC   rc   Ú
server_cfgs      r<   rE   z&_get_platform_tools.<locals>.<setcomp>ö  sg   € ð ð ð áˆD�*Ý�j¥$Ñ'Ô'ðõ   
§¢¨y¸$Ñ ?Ô ?ÈÐNÑNÔNð	ÝˆD‰	Œ	ðð ð r>   Úno_mcp)Útoolsetsr   r  r:   rö   rI   rW   rJ   rV   ÚvaluesÚanyrU   Úupdater=   ÚissubsetrL   Ú_DEFAULT_OFF_TOOLSETSr5   ÚremoveÚosÚgetenvÚitems) ræ   r7   rþ   r   r  r  Útoolset_namesÚ
default_tsÚhas_explicit_configÚenabled_toolsetsÚall_tool_namesÚts_namer6   rD   Úts_toolsÚdefault_offÚplatform_tool_universeÚconfigurable_tool_universeÚckÚclaimedÚskipÚts_defÚ	known_mapÚknown_for_platformÚptsÚexplicit_passthroughr  Úenabled_mcp_serversÚexplicit_mcp_serversr  r  r  s     `                           @@@r<   ré   ré   m  sØ  øøøø€ ð 3Ð2Ð2Ð2Ð2Ð2Ð2Ð2àŸ
š
Ð#6Ñ7Ô7Ð=¸2ÐØ%×)Ò)¨(Ñ3Ô3€MàÐ¥J¨}½dÑ$CÔ$CÐÝ˜xÔ(Ð):Ô;ˆ
Ø#˜ˆð 6Ð5 }Ð5Ñ5Ô5€MàJÐJÕ4IÐJÑJÔJÐÝ-Ñ/Ô/€NØNÐN½9×;KÒ;KÑ;MÔ;MÐNÑNÔNÐõ ÐNÐNÐNÐNÀÐNÑNÔNÑNÔNÐàð %(ð
ð 
ð 
ð 
ð 
Ø&ð
ñ 
ô 
ÐÑõ ™œˆØ$ð 	<ð 	<ˆGØ×!Ò! / /°'Ñ":Ô":Ñ;Ô;Ð;Ð;å™5œ5ÐÝ1ð 	-ð 	-‰LˆF�A�qÝ0°¸ÑBÔBð ØÝ˜?˜?¨6Ñ2Ô2Ñ3Ô3ˆHØð -˜H×-Ò-¨nÑ=Ô=ð -Ø ×$Ò$ VÑ,Ô,Ð,øåÕ/Ñ0Ô0ˆð �{Ð"Ð" xÕ7UÐ'UÐ'UØ×Ò˜xÑ(Ô(Ð(ð ˜kÐ)Ð)­b¬i¸Ñ.EÔ.EÐ)Ø×Ò˜Ñ/Ô/Ð/Ø˜KÑ'Ðõ !  µ¸8Ô1DÐEVÔ1WÑ!XÔ!XÑYÔYÐÝ!$¡¤ÐØð ?ð ?ˆØ"×)Ò)¨/¨/¸"Ñ*=Ô*=Ñ>Ô>Ð>Ð>Ý‰eŒe€GØ"ð 0ð 0ˆØ�Š�� vÑ.Ô.Ñ/Ô/Ð/Ð/Ø˜~Ñ-Ð0EÑE€DØÐ<Ð<˜Ð<Ñ<Ô<Ñ<€DØ�CÕ%Ñ&Ô&¨(¨Ñ3Ñ3€DØ"Ÿ.š.Ñ*Ô*ð %ð %‰ˆ�Ø�Tˆ>ˆ>ØØ�:Š:�jÑ!Ô!ð 	ØÝ�� vÑ.Ô.Ñ/Ô/ˆØð 	˜x×0Ò0Ð1GÑHÔHð 	ØØ×ÒÐ7Ñ8Ô8ð 	ØØ× Ò  Ñ)Ô)ð 	%Ø× Ò  Ñ(Ô(Ð(Ø�NŠN˜8Ñ$Ô$Ð$øð ð *Ø—J’JÐ6¸Ñ;Ô;ˆ	Ý  §¢¨x¸Ñ!<Ô!<Ñ=Ô=ÐØ!ð 		*ð 		*ˆCØ�mÐ#Ð#à ×$Ò$ SÑ)Ô)Ð)Ð)ØÕ-Ð-Ð-àØÐ.Ð.Ð.à ×$Ò$ SÑ)Ô)Ð)øð
ð ð ð ð ð àðñ ô Ðð —*’*˜]Ñ+Ô+Ð1¨r€Kðð à +× 1Ò 1Ñ 3Ô 3ðñ ô Ðð �=Ð Ð Ý"™uœuÐØ×ÒÐ 4Ð7JÑ JÈhÈZÑ WÑXÔXÐXÐXà3Ð6IÑIÐØ×ÒÐ 4Ð7JÑ JÑKÔKÐKØ"ð 6Øð 	9 8¨}Ð#<Ð#<Ø×#Ò#Ð$8Ñ9Ô9Ð9Ð9à×#Ò#Ð$7Ñ8Ô8Ð8Ð8à×ÒÐ 4Ñ5Ô5Ð5àÐr>   Úenabled_toolset_keysc                 óx  ‡‡‡— |                       di ¦  «         ˆfd„|D ¦   «         }d„ t          D ¦   «         Št          ¦   «         }‰|z  Šd„ t                               ¦   «         D ¦   «         Š|                      di ¦  «                             ‰g ¦  «        }t          |t          ¦  «        sg }d„ |D ¦   «         }ˆˆfd„|D ¦   «         }|                     d¦  «         t          ||z  ¦  «        | d         ‰<   |r.|                       di ¦  «         t          |¦  «        | d         ‰<   t          | ¦  «         d	S )
zÀSave the selected toolset keys for a platform to config.

    Preserves any non-configurable toolset entries (like MCP server names)
    that were already in the config for this platform.
    r  c                 ó4   •— h | ]}t          |‰¦  «        ¯|’ŒS rA   r  )rC   r  r7   s     €r<   rE   z'_save_platform_tools.<locals>.<setcomp>  s9   ø€ ð ð ð ØÝ(¨¨XÑ6Ô6ðØ
ðð ð r>   c                 ó   — h | ]\  }}}|’Œ	S rA   rA   rB   s      r<   rE   z'_save_platform_tools.<locals>.<setcomp>  r	  r>   c                 ó   — h | ]
}|d          ’ŒS r  rA   r  s     r<   rE   z'_save_platform_tools.<locals>.<setcomp>&  r  r>   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rA   r  r  s     r<   r  z(_save_platform_tools.<locals>.<listcomp>,  s   € Ð=Ð=Ð= R�˜R™œÐ=Ð=Ð=r>   c                 ó$   •— h | ]}|‰v¯|‰v¯
|’ŒS rA   rA   )rC   rQ   r  r  s     €€r<   rE   z'_save_platform_tools.<locals>.<setcomp>0  s:   ø€ ð ð ð ØØÐ)Ð)Ð)¨eÐ;PÐ.PÐ.Pð 	Ø.PÐ.PÐ.Pr>   r!  r  N)Ú
setdefaultrJ   rV   rW   r#  r:   rö   rI   ÚdiscardÚsortedr	   )ræ   r7   r@  Úplugin_keysÚexisting_toolsetsÚpreserved_entriesr  r  s    `    @@r<   Ú_save_platform_toolsrM    s   øøø€ ð ×ÒÐ)¨2Ñ.Ô.Ð.ð
ð ð ð Ø)ðñ ô Ðð KÐJÕ4IÐJÑJÔJÐÝ*Ñ,Ô,€KØ˜Ñ$Ðð
 OÐN½9×;KÒ;KÑ;MÔ;MÐNÑNÔNÐð Ÿ
š
Ð#6¸Ñ;Ô;×?Ò?ÀÈ"ÑMÔMÐÝÐ'­Ñ.Ô.ð ØÐØ=Ð=Ð+<Ð=Ñ=Ô=Ððð ð ð ð Ø,ðñ ô Ðð ×Ò˜hÑ'Ô'Ð'õ -3Ð3GÐJ[Ñ3[Ñ,\Ô,\€FÐÔ Ñ)ð ð HØ×ÒÐ1°2Ñ6Ô6Ð6Ý4:¸;Ñ4GÔ4GˆÐ&Ô'¨Ñ1å�ÑÔÐÐÐr>   c                 ó@  — |€t          ¦   «         }| dk    r*	 ddlm}  |¦   «         \  }}}|duS # t          $ r Y dS w xY w| dv r;t	          |¦  «        }|j                             | ¦  «        }|r|j        s|j        rdS t                               | ¦  «        }|rLt          ||¦  «        D ]9}	|	                     dg ¦  «        }
|
s dS t          d	„ |
D ¦   «         ¦  «        r dS Œ:dS t                               | g ¦  «        }|sdS t          d
„ |D ¦   «         ¦  «        S )z6Check if a toolset's required API keys are configured.Nr   r   )Úresolve_vision_provider_clientF>   r$   r   r   r    Trf   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS ©rm   N©r
   )rC   Úes     r<   r  z$_toolset_has_keys.<locals>.<genexpr>a  s.   è è € Ð=Ð=¨q•=  5¤Ñ*Ô*Ð=Ð=Ð=Ð=Ð=Ð=r>   c              3   ó:   K  — | ]\  }}t          |¦  «        V — Œd S r  rR  )rC   ÚvarrD   s      r<   r  z$_toolset_has_keys.<locals>.<genexpr>i  s.   è è € Ð=Ð=¡f c¨1�}˜SÑ!Ô!Ð=Ð=Ð=Ð=Ð=Ð=r>   )r   Úagent.auxiliary_clientrO  rN   r   Úfeaturesr:   Ú	availableÚmanaged_by_nousÚTOOL_CATEGORIESÚ_visible_providersÚallÚTOOLSET_ENV_REQUIREMENTS)r6   ræ   rO  Ú	_providerÚclientÚ_modelrW  ÚfeatureÚcatÚproviderrf   Úrequirementss               r<   Ú_toolset_has_keysre  F  s�  € à€~Ý‘”ˆà�ÒÐð	ØMÐMÐMÐMÐMÐMà(FÐ(FÑ(HÔ(HÑ%ˆI�v˜vØ Ð%Ð%øÝð 	ð 	ð 	Ø�5�5ð	øøøð Ð7Ð7Ð7Ý1°&Ñ9Ô9ˆØÔ#×'Ò'¨Ñ/Ô/ˆØð 	˜Ô)ð 	¨WÔ-Dð 	Ø�4õ ×
Ò
˜fÑ
%Ô
%€CØ
ð Ý*¨3°Ñ7Ô7ð 	ð 	ˆHØ—|’| J°Ñ3Ô3ˆHØð Ø�t�tÝÐ=Ð=°HÐ=Ñ=Ô=Ñ=Ô=ð Ø�t�tðàˆuõ ,×/Ò/°¸Ñ;Ô;€LØð ØˆtÝÐ=Ð=°Ð=Ñ=Ô=Ñ=Ô=Ð=s   ˜0 °
>½>ÚquestionÚchoicesc                 ó,   — ddl m}  || |||¬¦  «        S )z?Single-select menu (arrow keys). Delegates to curses_radiolist.r   )Úcurses_radiolist)ÚselectedÚcancel_returns)Úhermes_cli.curses_uiri  )rf  rg  rœ   ri  s       r<   Ú_prompt_choicerm  n  s/   € à5Ð5Ð5Ð5Ð5Ð5ØÐ˜H g¸ÐPWÐXÑXÔXÐXr>   Ú_tool_token_cachec                  ó"  — t           �t           S 	 ddl} |                      d¦  «        }n3# t          $ r& t                               d¦  «         i a t           cY S w xY w	 ddl}ddlm} n3# t          $ r& t                               d¦  «         i a t           cY S w xY wi }| 	                    ¦   «         D ]U}| 
                    |¦  «        }|r<t          j        d|dœ¦  «        }t          |                     |¦  «        ¦  «        ||<   ŒV|a t           S )	aL  Return estimated token counts per individual tool name.

    Uses tiktoken (cl100k_base) to count tokens in the JSON-serialised
    OpenAI-format tool schema.  Triggers tool discovery on first call,
    then caches the result for the rest of the process.

    Returns an empty dict when tiktoken or the registry is unavailable.
    Nr   Úcl100k_basez4tiktoken unavailable; skipping tool token estimation)Úregistryz4Tool registry unavailable; skipping token estimationÚfunction)Útyperr  )rn  ÚtiktokenÚget_encodingrN   ÚloggerÚdebugÚmodel_toolsÚtools.registryrq  Úget_all_tool_namesÚ
get_schemaÚ_jsonÚdumpsÚlenÚencode)rt  Úencrx  rq  Úcountsrc   Úschemar®   s           r<   Ú_estimate_tool_tokensrƒ  z  sY  € õ Ð$Ý Ð ð!ØˆˆˆØ×#Ò# MÑ2Ô2ˆˆøÝð !ð !ð !Ý�ŠÐKÑLÔLÐLØÐÝ Ð Ð Ð ð!øøøð
!àÐÐÐØ+Ð+Ð+Ð+Ð+Ð+Ð+øÝð !ð !ð !Ý�ŠÐKÑLÔLÐLØÐÝ Ð Ð Ð ð!øøøð
  €FØ×+Ò+Ñ-Ô-ð 1ð 1ˆØ×$Ò$ TÑ*Ô*ˆØð 	1õ ”;¨
ÀÐGÐGÑHÔHˆDÝ˜sŸzšz¨$Ñ/Ô/Ñ0Ô0ˆF�4‰LøØÐÝÐs!   �* ª-AÁAÁ
A) Á)-BÂBrÚ   Úplatform_labelrä   c                 ó  ‡‡‡‡‡‡— ddl m} ddlmŠ t	          ¦   «         Št          ¦   «         }ˆfd„|D ¦   «         Šg }‰D ]j\  }}}d}	t          |¦  «        s6t                               |¦  «        st                               |¦  «        rd}	| 
                    |› d|› d|	› �¦  «         Œkˆfd	„t          ‰¦  «        D ¦   «         }
d
}‰r"d„ ‰D ¦   «         Šdt          dt          fˆˆˆfd„} |d| › �||
|
|¬¦  «        }ˆfd„|D ¦   «         S )zIMulti-select checklist of toolsets. Returns set of selected toolset keys.r   ©Úcurses_checklist)r   c                 óB   •— g | ]\  }}}t          |‰¦  «        ¯|||f‘ŒS rA   r  ©rC   r\   ÚlÚdr7   s       €r<   r  z-_prompt_toolset_checklist.<locals>.<listcomp>®  óE   ø€ ð ð ð Ù�q˜!˜QÝ(¨¨HÑ5Ô5ðØ	
ˆAˆqˆ	ðð ð r>   Ú z  [no API key]ú  (ú)c                 ó*   •— h | ]\  }\  }}}|‰v ¯|’ŒS rA   rA   )rC   Úir6   rD   rä   s       €r<   rE   z,_prompt_toolset_checklist.<locals>.<setcomp>º  s8   ø€ ð ð ð Ùˆa‘�&˜!˜QØ�WÐÐð 	
ØÐÐr>   Nc                 ó   — g | ]\  }}}|‘Œ	S rA   rA   rB   s      r<   r  z-_prompt_toolset_checklist.<locals>.<listcomp>Â  s   € Ð8Ð8Ð8™l˜f a¨�6Ð8Ð8Ð8r>   Úchosenr8   c                 óÔ   •— t          ¦   «         }| D ]&}|                      ‰‰|         ¦  «        ¦  «         Œ't          ˆfd„|D ¦   «         ¦  «        }|dk    r
d|dz  d›d�S d|› d�S )Nc              3   óD   •K  — | ]}‰                      |d ¦  «        V — ŒdS )r   N©r:   )rC   rc   Útool_tokenss     €r<   r  z?_prompt_toolset_checklist.<locals>.status_fn.<locals>.<genexpr>É  s1   øè è € ÐGÐG°T˜Ÿš¨¨aÑ0Ô0ÐGÐGÐGÐGÐGÐGr>   iè  zEst. tool context: ~z.1fzk tokensz tokens)rU   r%  Úsum)r“  Ú	all_toolsÚidxÚtotalr   r—  Úts_keyss       €€€r<   Ú	status_fnz,_prompt_toolset_checklist.<locals>.status_fnÄ  s–   ø€ å ™UœUˆIØð @ð @�Ø× Ò   °¸´Ñ!>Ô!>Ñ?Ô?Ð?Ð?ÝÐGÐGÐGÐG¸YÐGÑGÔGÑGÔGˆEØ˜Š}ˆ}ØH¨e°d©lÐHÐHÐHÐHÐHØ8¨%Ð8Ð8Ð8Ð8r>   z
Tools for )rk  r�  c                 ó,   •— h | ]}‰|         d          ’ŒS ©r   rA   )rC   r‘  Ú	effectives     €r<   rE   z,_prompt_toolset_checklist.<locals>.<setcomp>Õ  s!   ø€ Ð,Ð,Ð, ˆI�aŒL˜ŒOÐ,Ð,Ð,r>   )rl  r‡  r"  r   rƒ  rR   re  rZ  r:   r]  rM   Ú	enumeraterU   rÄ   )r„  rä   r7   r‡  Úeffective_allÚlabelsr6   Úts_labelÚts_descÚsuffixÚpre_selectedr�  r“  r   r   r—  rœ  s    ``          @@@@r<   Ú_prompt_toolset_checklistr¨  ¤  sÎ  øøøøøø€ à5Ð5Ð5Ð5Ð5Ð5Ø(Ð(Ð(Ð(Ð(Ð(õ (Ñ)Ô)€Kå8Ñ:Ô:€Mðð ð ð Ø#0ðñ ô €Ið
 €FØ%.ð :ð :Ñ!ˆ�˜'ØˆÝ  Ñ(Ô(ð 	&­o×.AÒ.AÀ&Ñ.IÔ.Ið 	&ÕMe×MiÒMiÐjpÑMqÔMqð 	&Ø%ˆFØ�Š˜Ð8Ð8 gÐ8Ð8°Ð8Ð8Ñ9Ô9Ð9Ð9ðð ð ð Ý#,¨YÑ#7Ô#7ðñ ô €Lð €IØð 9Ø8Ð8¨iÐ8Ñ8Ô8ˆð	9�cð 	9¥cð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð ÐØ%�^Ð%Ð%ØØØ#Øðñ ô €Fð -Ð,Ð,Ð, VÐ,Ñ,Ô,Ð,r>   c                 ó‚   — t                                | ¦  «        }|rt          | ||¦  «         dS t          | ¦  «         dS )zÀConfigure a toolset - provider selection + API keys.
    
    Uses TOOL_CATEGORIES for provider-aware config, falls back to simple
    env var prompts for toolsets not in TOOL_CATEGORIES.
    N)rZ  r:   Ú_configure_tool_categoryÚ_configure_simple_requirements)r6   ræ   rb  s      r<   Ú_configure_toolsetr¬  Ú  sM   € õ ×
Ò
˜fÑ
%Ô
%€Cà
ð /Ý  ¨¨fÑ5Ô5Ð5Ð5Ð5õ 	' vÑ.Ô.Ð.Ð.Ð.r>   c            
      ó
  — 	 ddl m}  ddlm}  |¦   «           | ¦   «         }n# t          $ r g cY S w xY wg }|D ]É}t          |dd¦  «        dk    rŒ	 |                     ¦   «         }n# t          $ r Y Œ:w xY wt          |t          ¦  «        sŒT| 	                    | 
                    d|j        ¦  «        | 
                    dd¦  «        | 
                    d	d¦  «        | 
                    d
g ¦  «        |j        dœ¦  «         ŒÊ|S )uV  Build picker-row dicts from plugin-registered image gen providers.

    Each returned dict looks like a regular ``TOOL_CATEGORIES`` provider
    row but carries an ``image_gen_plugin_name`` marker so downstream
    code (config writing, model picker) knows to route through the
    plugin registry instead of the in-tree FAL backend.

    FAL is skipped â€” it's already exposed by the hardcoded
    ``TOOL_CATEGORIES["image_gen"]`` entries. When FAL gets ported to
    a plugin in a follow-up PR, the hardcoded entries go away and this
    function surfaces it alongside OpenAI automatically.
    r   ©Úlist_providers©Ú_ensure_plugins_discoveredrc   Nr�   rd   r�  re   rf   )rc   rd   re   rf   Úimage_gen_plugin_name)Úagent.image_gen_registryr¯  rK   r±  rN   ÚgetattrÚget_setup_schemarö   r  rM   r:   Údisplay_namerc   )r¯  r±  r}   Úrowsrc  r‚  s         r<   Ú_plugin_image_gen_providersr¸  é  sb  € ðØ;Ð;Ð;Ð;Ð;Ð;ØAÐAÐAÐAÐAÐAà"Ð"Ñ$Ô$Ð$Ø"�NÑ$Ô$ˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøð €DØð 
ð 
ˆÝ�8˜V TÑ*Ô*¨eÒ3Ð3àð	Ø×.Ò.Ñ0Ô0ˆFˆFøÝð 	ð 	ð 	ØˆHð	øøøå˜&¥$Ñ'Ô'ð 	ØØ�ŠàŸ
š
 6¨8Ô+@ÑAÔAØŸš G¨RÑ0Ô0Ø—z’z %¨Ñ,Ô,Ø"ŸJšJ z°2Ñ6Ô6Ø)1¬ðð ñ	
ô 	
ð 	
ð 	
ð €Ks   ‚ # £2±2ÁA'Á'
A4Á3A4rb  c                 óz  — t          |¦  «        }g }|                      dg ¦  «        D ]X}|                     d¦  «        rt          ¦   «         sŒ&|                     d¦  «        r|j        sŒC|                     |¦  «         ŒY|                      d¦  «        dk    r!|                     t          ¦   «         ¦  «         |S )zBReturn provider entries visible for the current auth/config state.r}   ri   rh   rc   r�   )r   r:   r   Únous_auth_presentrM   Úextendr¸  )rb  ræ   rW  Úvisiblerc  s        r<   r[  r[    sÄ   € å-¨fÑ5Ô5€HØ€GØ—G’G˜K¨Ñ,Ô,ð !ð !ˆØ�<Š<Ð.Ñ/Ô/ð 	Õ8RÑ8TÔ8Tð 	ØØ�<Š<Ð,Ñ-Ô-ð 	°hÔ6Pð 	ØØ�Š�xÑ Ô Ð Ð ð ‡w‚wˆv�„Ð,Ò,Ð,Ø�ŠÕ2Ñ4Ô4Ñ5Ô5Ð5à€Nr>   c                 ó¬  — t                                | ¦  «        }|st          | |¦  «         S | dk    r0|                     di ¦  «        }t          |t          ¦  «         pd|vS | dk    r0|                     di ¦  «        }t          |t          ¦  «         pd|vS | dk    r0|                     di ¦  «        }t          |t          ¦  «         pd|vS | dk    rot          ¦   «         rdS 	 d	d
lm} d	dlm	}  |¦   «           |¦   «         D ]*}	 | 
                    ¦   «         r dS Œ# t          $ r Y Œ'w xY wn# t          $ r Y nw xY wdS t          | |¦  «         S )zBReturn True when enabling this toolset should open provider setup.r$   rc  r   Úbackendr   Úcloud_providerr    Fr   r®  r°  T)rZ  r:   re  rö   r  r   r³  r¯  rK   r±  Úis_availablerN   )	r6   ræ   rb  Útts_cfgÚweb_cfgÚbrowser_cfgr¯  r±  rc  s	            r<   Ú#_toolset_needs_configuration_promptrÄ  )  sÑ  € å
×
Ò
˜fÑ
%Ô
%€CØð 5Ý$ V¨VÑ4Ô4Ð4Ð4à�‚€Ø—*’*˜U BÑ'Ô'ˆÝ˜g¥tÑ,Ô,Ð,ÐI°
À'Ð0IÐIØ�‚€Ø—*’*˜U BÑ'Ô'ˆÝ˜g¥tÑ,Ô,Ð,ÐH°	ÀÐ0HÐHØ�ÒÐØ—j’j ¨BÑ/Ô/ˆÝ˜k­4Ñ0Ô0Ð0ÐWÐ4DÈKÐ4WÐWØ�ÒÐõ !Ñ"Ô"ð 	Ø�5ð	Ø?Ð?Ð?Ð?Ð?Ð?ØEÐEÐEÐEÐEÐEà&Ð&Ñ(Ô(Ð(Ø*˜NÑ,Ô,ð ð �ðØ×,Ò,Ñ.Ô.ð %Ø$˜u˜uð%øå ð ð ð Ø�Hðøøøð	øõ ð 	ð 	ð 	ØˆDð	øøøàˆtå  ¨Ñ0Ô0Ð0Ð0s<   Ã'"D3 Ä
D"ÄD3 Ä!D3 Ä"
D/Ä,D3 Ä.D/Ä/D3 Ä3
E Ä?E c                 óª  — |                      dd¦  «        }|d         }t          ||¦  «        }|                      d¦  «        r€|d         }t          j        |k     rht	          ¦   «          t          d|› d|d         › d|d	         › d
t          j        j        › dt          j        j        › d�¦  «         t          d¦  «         dS t          |¦  «        d	k    r¹|d         }t	          ¦   «          t	          t          d|› d|› d|d         › d�t          j        ¦  «        ¦  «         |                      d¦  «        rt          d|d         › �¦  «         |                      d¦  «        rt          d|d         › �¦  «         t          ||¦  «         dS t	          ¦   «          |                      dd¦  «        }t	          t          d|› d|› d|› d�t          j        ¦  «        ¦  «         |                      d¦  «        rt          d|d         › �¦  «         t	          ¦   «          g }	|D ]·}
|
                      d¦  «        rd|
d         › d�nd}|
                      d¦  «        rd|
d         › �nd}d}|
                      dg ¦  «        }|rt          d„ |D ¦   «         ¦  «        rt          |
|¦  «        rd}n|sd}nd}|	                     |
d         › |› |› |› �¦  «         Œ¸|	                     d ¦  «         t#          ||¦  «        }t%          d|› d!�|	|¦  «        }|t          |¦  «        k    rt          d"|› �¦  «         dS t          ||         |¦  «         dS )#z2Configure a tool category with provider selection.r|   r�  rc   r¦   ú  z requires Python r   ú.é   z+ (current: r�  z3  Upgrade Python and reinstall to enable this tool.Nú  --- Ú ú (ú) ---re   rŒ   r‹   zChoose a providerz - z ---rd   ú [Ú]õ    â€” rf   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rQ  rR  ©rC   Úvs     r<   r  z+_configure_tool_category.<locals>.<genexpr>z  ó.   è è € Ð"MÐ"M¸q¥=°°5´Ñ#:Ô#:Ð"MÐ"MÐ"MÐ"MÐ"MÐ"Mr>   ú	 [active]ú [configured]u(   Skip â€” keep defaults / configure laterú:z
  Skipped )r:   r[  rË   Úversion_infoÚprintÚ_print_errorÚmajorÚminorrÁ   r~  r   r   ÚCYANÚ_configure_providerr\  Ú_is_provider_activerM   Ú_detect_active_provider_indexrm  )r6   rb  ræ   r|   rc   r}   Úreqrc  ÚtitleÚprovider_choicesr  rd   re   Ú
configuredrf   Údefault_idxÚprovider_idxs                    r<   rª  rª  O  së  € à�7Š7�6˜2ÑÔ€DØˆvŒ;€DÝ" 3¨Ñ/Ô/€Ið ‡w‚wÐ Ñ!Ô!ð ØÐ#Ô$ˆÝÔ˜cÒ!Ð!Ý‰GŒGˆGÝð  E˜dð  Eð  E°S¸´Vð  Eð  E¸cÀ!¼fð  Eð  EÕRUÔRbÔRhð  Eð  EÕknÔk{ô  lBð  Eð  Eð  Eñ  Fô  Fð  FÝÐMÑNÔNÐNØˆFå
ˆ9�~„~˜ÒÐà˜Q”<ˆÝ‰ŒˆÝ�eÐC˜TÐCÐC DÐCÐC¨H°VÔ,<ÐCÐCÐCÅVÄ[ÑQÔQÑRÔRÐRØ�<Š<˜ÑÔð 	0ÝÐ.˜X eœ_Ð.Ð.Ñ/Ô/Ð/à�7Š7�<Ñ Ô ð 	2ÝÐ0˜S Ô.Ð0Ð0Ñ1Ô1Ð1Ý˜H fÑ-Ô-Ð-Ð-Ð-õ 	‰Œˆà—’˜Ð':Ñ;Ô;ˆÝ�eÐ8˜TÐ8Ð8 DÐ8Ð8¨UÐ8Ð8Ð8½&¼+ÑFÔFÑGÔGÐGØ�7Š7�<Ñ Ô ð 	2ÝÐ0˜S Ô.Ð0Ð0Ñ1Ô1Ð1Ý‰Œˆð ÐØð 	Lð 	LˆAØ*+¯%ª%°©.¬.Ð@Ð&˜˜7œÐ&Ð&Ð&Ð&¸bˆEØ()¯ª¨e©¬Ð<Ð$˜!˜Eœ(Ð$Ð$Ð$¸"ˆCØˆJØ—u’u˜Z¨Ñ,Ô,ˆHØð 1�sÐ"MÐ"MÀHÐ"MÑ"MÔ"MÑMÔMð 1Ý& q¨&Ñ1Ô1ð 1Ø!,�J�JØ!ð 1Ø!#�J�Jà!0�JØ×#Ò# q¨¤yÐ$J°%Ð$J¸Ð$J¸jÐ$JÐ$JÑKÔKÐKÐKð 	×ÒÐ JÑKÔKÐKõ 4°I¸vÑFÔFˆå% m¨5 m m mÐ5EÀ{ÑSÔSˆð �3˜y™>œ>Ò)Ð)ÝÐ+ TÐ+Ð+Ñ,Ô,Ð,ØˆFå˜I lÔ3°VÑ<Ô<Ð<Ð<Ð<r>   rc  c                 ó|  — |                       d¦  «        }|rD|                      di ¦  «        }t          |t          ¦  «        o|                      d¦  «        |k    S |                       d¦  «        }|�r€t          |¦  «        }|j                              |¦  «        }|€dS |dk    rf|                      di ¦  «        }t          |t          ¦  «        r4|                      d¦  «        }|dvrdS |                      d¦  «        du rdS |j        S |                       d	¦  «        r:|j        o2|                      d
i ¦  «                              d¦  «        | d	         k    S d| v r<|                      di ¦  «                              d¦  «        }|j        o| d         |k    S |                       d¦  «        r<|                      di ¦  «                              d¦  «        }|j        o|| d         k    S |j        S |                       d	¦  «        r3|                      d
i ¦  «                              d¦  «        | d	         k    S d| v r5|                      di ¦  «                              d¦  «        }| d         |k    S |                       d¦  «        r5|                      di ¦  «                              d¦  «        }|| d         k    S |                       d¦  «        rh|                      di ¦  «        }t          |t          ¦  «        sdS |                      d¦  «        }| d         dk    o|dv o|                      d¦  «         S dS )z>Check if a provider entry matches the currently active config.r²  r    rc  ri   NF©Nr�  r�   Úuse_gatewayrg   r$   r“   r   r¿  r�   r   r¾  r�   r�   )r:   rö   r  r   rW  rY  )	rc  ræ   Úplugin_nameÚ	image_cfgÚmanaged_featurerW  ra  Úconfigured_providerÚcurrents	            r<   rÞ  rÞ  “  sV  € à—,’,Ð6Ñ7Ô7€KØð XØ—J’J˜{¨BÑ/Ô/ˆ	Ý˜)¥TÑ*Ô*ÐW¨y¯}ª}¸ZÑ/HÔ/HÈKÒ/WÐWà—l’lÐ#9Ñ:Ô:€OØñ 'Ý1°&Ñ9Ô9ˆØÔ#×'Ò'¨Ñ8Ô8ˆØˆ?Ø�5Ø˜kÒ)Ð)ØŸ
š
 ;°Ñ3Ô3ˆIÝ˜)¥TÑ*Ô*ð !Ø&/§m¢m°JÑ&?Ô&?Ð#Ø&Ð.?Ð?Ð?Ø ˜5Ø—=’= Ñ/Ô/°5Ð8Ð8Ø ˜5ØÔ*Ð*Ø�<Š<˜Ñ'Ô'ð 	àÔ'ð VØ—J’J˜u bÑ)Ô)×-Ò-¨jÑ9Ô9¸XÀnÔ=UÒUðð  Ð)Ð)Ø—j’j ¨BÑ/Ô/×3Ò3Ð4DÑEÔEˆGØÔ*ÐV¨xÐ8JÔ/KÈwÒ/VÐVØ�<Š<˜Ñ&Ô&ð 	RØ—j’j ¨Ñ+Ô+×/Ò/°	Ñ:Ô:ˆGØÔ*ÐQ¨w¸(À=Ô:QÒ/QÐQØÔ&Ð&à‡|‚|�NÑ#Ô#ð QØ�zŠz˜% Ñ$Ô$×(Ò(¨Ñ4Ô4¸ÀÔ8PÒPÐPØ˜XÐ%Ð%Ø—*’*˜Y¨Ñ+Ô+×/Ò/Ð0@ÑAÔAˆØÐ*Ô+¨wÒ6Ð6Ø‡|‚|�MÑ"Ô"ð 2Ø—*’*˜U BÑ'Ô'×+Ò+¨IÑ6Ô6ˆØ˜( =Ô1Ò1Ð1Ø‡|‚|Ð&Ñ'Ô'ð 	
Ø—J’J˜{¨BÑ/Ô/ˆ	Ý˜)¥TÑ*Ô*ð 	Ø�5Ø'Ÿmšm¨JÑ7Ô7ÐàÐ'Ô(¨EÒ1ð 1Ø#Ð'8Ð8ð1à—M’M -Ñ0Ô0Ð0ð	
ð
 ˆ5r>   r}   c                 óÂ   — t          | ¦  «        D ]N\  }}t          ||¦  «        r|c S |                     dg ¦  «        }|rt          d„ |D ¦   «         ¦  «        r|c S ŒOdS )z8Return the index of the currently active provider, or 0.rf   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rQ  rR  rÑ  s     r<   r  z0_detect_active_provider_index.<locals>.<genexpr>Ò  s.   è è € ÐFÐF¸�M¨!¨E¬(Ñ3Ô3ÐFÐFÐFÐFÐFÐFr>   r   )r¡  rÞ  r:   r\  )r}   ræ   r‘  r  rf   s        r<   rß  rß  Ë  s€   € å˜)Ñ$Ô$ð ð ‰ˆˆ1Ý˜q &Ñ)Ô)ð 	ØˆHˆHˆHà—5’5˜ RÑ(Ô(ˆØð 	�ÐFÐF¸XÐFÑFÔFÑFÔFð 	ØˆHˆHˆHøØˆ1r>   c                  ó   — ddl m} m} | |fS )z5Lazy-load the FAL model catalog from the tool module.r   ©Ú
FAL_MODELSÚDEFAULT_MODEL)Útools.image_generation_toolrò  ró  rñ  s     r<   Ú_fal_model_catalogrõ  ä  s%   € àEÐEÐEÐEÐEÐEÐEÐEØ�}Ð$Ð$r>   )ÚdisplayÚ
config_keyÚ
catalog_fnÚmodel_idÚmetaÚwidthsc           
      óÐ   — | d|d         › �›d|                      dd¦  «        d|d         › �›d|                      dd¦  «        d|d         › �›d|                      dd¦  «        › �S )zIFormat a single picker row with column-aligned speed / strengths / price.Ú<ÚmodelrÆ  Úspeedr�  Ú	strengthsÚpricer–  )rù  rú  rû  s      r<   Ú_format_imagegen_model_rowr  ó  s¥   € ð ð 	#�f˜W”oð 	#Ð*ð 	#ð 	#Ø�8Š8�G˜RÑ Ô ð	#Ø#)¨'¤?ð	#Ø7ð	#ð 	#à�8Š8�K Ñ$Ô$ð	#à'-¨kÔ':ð	#à?ð	#ð 	#ð �8Š8�G˜RÑ Ô ð	#ð 	#ðr>   Úbackend_namec           	      óÞ  ‡‡— t                                | ¦  «        }|sdS  |d         ¦   «         \  Š}‰sdS |d         }|                     |i ¦  «        }t          |t          ¦  «        si }|||<   |                     d¦  «        p|Š‰‰vr|Št          ‰                     ¦   «         ¦  «        }‰gˆfd„|D ¦   «         z   }t          d„ |D ¦   «         ¦  «        t          ˆfd„|D ¦   «         d¬	¦  «        t          ˆfd
„|D ¦   «         d¬	¦  «        dœ}t          ¦   «          ddd|d         › �›ddd|d         › �›ddd|d         › �›d�}	t          t          |	t          j        ¦  «        ¦  «         g }
|D ]9}t          |‰|         |¦  «        }|‰k    r|dz  }|
                     |¦  «         Œ:t          d|d         › d�|
d¬	¦  «        }||         }||d<   t          d|› �¦  «         dS )uú   Prompt the user to pick a model for the given imagegen backend.

    Writes selection to ``config[backend_config_key]["model"]``. Safe to
    call even when stdin is not a TTY â€” curses_radiolist falls back to
    keeping the current selection.
    Nrø  r÷  rþ  c                 ó    •— g | ]
}|‰k    ¯|‘ŒS rA   rA   ©rC   ÚmÚcurrent_models     €r<   r  z-_configure_imagegen_model.<locals>.<listcomp>  ó#   ø€ Ð LÐ LÐ L q¸¸mÒ9KÐ9K Ð9KÐ9KÐ9Kr>   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r  ©r~  ©rC   r  s     r<   r  z,_configure_imagegen_model.<locals>.<genexpr>  ó(   è è € Ð/Ð/ •S˜‘V”VÐ/Ð/Ð/Ð/Ð/Ð/r>   c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS ©rÿ  r�  N©r~  r:   ©rC   r  Úcatalogs     €r<   r  z,_configure_imagegen_model.<locals>.<genexpr>  ó=   øè è € ÐJÐJ¸1•c˜' !œ*Ÿ.š.¨°"Ñ5Ô5Ñ6Ô6ÐJÐJÐJÐJÐJÐJr>   é   r  c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS ©r   r�  Nr  r  s     €r<   r  z,_configure_imagegen_model.<locals>.<genexpr>  ó=   øè è € ÐRÐRÀ1�#˜g aœjŸnšn¨[¸"Ñ=Ô=Ñ>Ô>ÐRÐRÐRÐRÐRÐRr>   r   ©rþ  rÿ  r   rÆ  ÚModelrý  ÚSpeedrÿ  Ú	Strengthsr   ú  Priceõ     â†� currently in useú	  Choose rö  ú model:ú  Model set to: )ÚIMAGEGEN_BACKENDSr:   rG  rö   r  rI   ÚkeysÚmaxrØ  r   r   rÜ  r  rM   rm  rÆ   )r  ræ   r¾  Údefault_modelÚcfg_keyÚcur_cfgÚ	model_idsÚorderedrû  Úheaderr·  ÚmidÚrowrš  r“  r  r  s                  @@r<   Ú_configure_imagegen_modelr,  ý  s¤  øø€ õ  ×#Ò# LÑ1Ô1€GØð Øˆà2˜W \Ô2Ñ4Ô4Ñ€Gˆ]Øð Øˆà�lÔ#€GØ×Ò ¨Ñ,Ô,€GÝ�g�tÑ$Ô$ð "ØˆØ!ˆˆw‰Ø—K’K Ñ(Ô(Ð9¨M€MØ˜GÐ#Ð#Ø%ˆå�W—\’\‘^”^Ñ$Ô$€IàˆoÐ LÐ LÐ LÐ L¨IÐ LÑ LÔ LÑL€Gõ Ð/Ð/ YÐ/Ñ/Ô/Ñ/Ô/ÝÐJÐJÐJÐJÀ	ÐJÑJÔJÐTUÐVÑVÔVÝÐRÐRÐRÐRÈ	ÐRÑRÔRÐ\]Ð^Ñ^Ô^ðð €Fõ 
�G„G€Gð	ˆWð 	�v˜g”ð 	Ð+ð 	ð 	Øð	Ø˜G”_ð	Ø)ð	ð 	àð	à Ô,ð	à1ð	ð 	ð 	ð õ 
�%��œÑ
$Ô
$Ñ%Ô%Ð%à€DØð ð ˆÝ(¨¨g°c¬l¸FÑCÔCˆØ�-ÒÐØÐ+Ñ+ˆCØ�Š�CÑÔÐÐå
Ø/�G˜IÔ&Ð/Ð/Ð/ØØðñ ô €Cð �SŒ\€FØ€GˆGÑÝÐ. fÐ.Ð.Ñ/Ô/Ð/Ð/Ð/r>   ré  c                 ó  — 	 ddl m} ddlm}  |¦   «           || ¦  «        }n# t          $ r i dfcY S w xY w|€i dfS 	 |                     ¦   «         pg }|                     ¦   «         }n# t          $ r i dfcY S w xY wd„ |D ¦   «         }||fS )ua  Return ``(catalog_dict, default_model_id)`` for a plugin provider.

    ``catalog_dict`` is shaped like the legacy ``FAL_MODELS`` table â€”
    ``{model_id: {"display", "speed", "strengths", "price", ...}}`` â€”
    so the existing picker code paths work without change. Returns
    ``({}, None)`` if the provider isn't registered or has no models.
    r   )Úget_providerr°  Nc                 óR   — i | ]$}t          |t          ¦  «        ¯d |v ¯|d          |“Œ%S )Úid)rö   r  r  s     r<   r^   z-_plugin_image_gen_catalog.<locals>.<dictcomp>R  s2   € ÐOÐOÐO˜a­Z¸½4Ñ-@Ô-@ÐOÀTÈQÀYÀYˆq�Œw˜ÀYÀYÀYr>   )r³  r.  rK   r±  rN   Úlist_modelsr$  )ré  r.  r±  rc  Úmodelsrœ   r  s          r<   Ú_plugin_image_gen_catalogr3  ;  sö   € ðØ9Ð9Ð9Ð9Ð9Ð9ØAÐAÐAÐAÐAÐAà"Ð"Ñ$Ô$Ð$Ø�< Ñ,Ô,ˆˆøÝð ð ð Ø�4ˆxˆˆˆðøøøàÐØ�4ˆxˆðØ×%Ò%Ñ'Ô'Ð-¨2ˆØ×(Ò(Ñ*Ô*ˆˆøÝð ð ð Ø�4ˆxˆˆˆðøøøàOÐO 6ÐOÑOÔO€GØ�GÐÐs   ‚!$ ¤5´5¿*A* Á*A;Á:A;c           	      ó„  ‡‡— t          | ¦  «        \  Š}‰sdS |                     di ¦  «        }t          |t          ¦  «        si }||d<   |                     d¦  «        p|Š‰‰vr|Št          ‰                     ¦   «         ¦  «        }‰gˆfd„|D ¦   «         z   }t          d„ |D ¦   «         ¦  «        t          ˆfd„|D ¦   «         d¬¦  «        t          ˆfd	„|D ¦   «         d
¬¦  «        dœ}t          ¦   «          ddd|d         › �›ddd|d         › �›ddd|d         › �›d�}t          t          |t          j        ¦  «        ¦  «         g }|D ]9}	t          |	‰|	         |¦  «        }
|	‰k    r|
dz  }
|                     |
¦  «         Œ:t          d| › d�|d
¬¦  «        }||         }||d<   t          d|› �¦  «         dS )züPrompt the user to pick a model for a plugin-registered backend.

    Writes selection to ``image_gen.model``. Mirrors
    :func:`_configure_imagegen_model` but sources its catalog from the
    plugin registry instead of :data:`IMAGEGEN_BACKENDS`.
    Nr    rþ  c                 ó    •— g | ]
}|‰k    ¯|‘ŒS rA   rA   r  s     €r<   r  z8_configure_imagegen_model_for_plugin.<locals>.<listcomp>j  r	  r>   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r  r  r  s     r<   r  z7_configure_imagegen_model_for_plugin.<locals>.<genexpr>m  r  r>   c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS r  r  r  s     €r<   r  z7_configure_imagegen_model_for_plugin.<locals>.<genexpr>n  r  r>   r  r  c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS r  r  r  s     €r<   r  z7_configure_imagegen_model_for_plugin.<locals>.<genexpr>o  r  r>   r   r  rÆ  r  rý  r  rÿ  r  r   r  r  r  r  r   )r3  rG  rö   r  r:   rI   r"  r#  rØ  r   r   rÜ  r  rM   rm  rÆ   )ré  ræ   r$  r&  r'  r(  rû  r)  r·  r*  r+  rš  r“  r  r  s                @@r<   Ú$_configure_imagegen_model_for_pluginr9  V  sq  øø€ õ 7°{ÑCÔCÑ€Gˆ]Øð Øˆà×Ò ¨RÑ0Ô0€GÝ�g�tÑ$Ô$ð &ØˆØ%ˆˆ{ÑØ—K’K Ñ(Ô(Ð9¨M€MØ˜GÐ#Ð#Ø%ˆå�W—\’\‘^”^Ñ$Ô$€IØˆoÐ LÐ LÐ LÐ L¨IÐ LÑ LÔ LÑL€Gõ Ð/Ð/ YÐ/Ñ/Ô/Ñ/Ô/ÝÐJÐJÐJÐJÀ	ÐJÑJÔJÐTUÐVÑVÔVÝÐRÐRÐRÐRÈ	ÐRÑRÔRÐ\]Ð^Ñ^Ô^ðð €Fõ 
�G„G€Gð	ˆWð 	�v˜g”ð 	Ð+ð 	ð 	Øð	Ø˜G”_ð	Ø)ð	ð 	àð	à Ô,ð	à1ð	ð 	ð 	ð õ 
�%��œÑ
$Ô
$Ñ%Ô%Ð%à€DØð ð ˆÝ(¨¨g°c¬l¸FÑCÔCˆØ�-ÒÐØÐ+Ñ+ˆCØ�Š�CÑÔÐÐå
Ø(�KÐ(Ð(Ð(ØØðñ ô €Cð �SŒ\€FØ€GˆGÑÝÐ. fÐ.Ð.Ñ/Ô/Ð/Ð/Ð/r>   c                 óÂ   — |                      di ¦  «        }t          |t          ¦  «        si }||d<   | |d<   d|d<   t          d| › �¦  «         t	          | |¦  «         dS )z<Persist a plugin-backed image generation provider selection.r    rc  Frè  z  image_gen.provider set to: N)rG  rö   r  rÆ   r9  )ré  ræ   Úimg_cfgs      r<   Ú!_select_plugin_image_gen_providerr<  �  sy   € à×Ò ¨RÑ0Ô0€GÝ�g�tÑ$Ô$ð &ØˆØ%ˆˆ{ÑØ%€GˆJÑØ"€GˆMÑÝÐ@°;Ð@Ð@ÑAÔAÐAÝ(¨°fÑ=Ô=Ð=Ð=Ð=r>   c           	      óþ	  — |                       dg ¦  «        }|                       d¦  «        }|                       d¦  «        r't          |¦  «        }|j        st          d¦  «         dS |                       d¦  «        r3|                     di ¦  «        }| d         |d<   t          |¦  «        |d	<   d
| v rd| d
         }|                     di ¦  «        }|dk    rd|d<   t          d¦  «         n|r||d<   t          d|› �¦  «         t          |¦  «        |d	<   |                       d¦  «        rK|                     di ¦  «        }| d         |d<   t          |¦  «        |d	<   t          d| d         › �¦  «         |r|dvrd|                     |i ¦  «        d	<   n|s}t                               ¦   «         D ]c\  }	}
| |
                      dg ¦  «        v rF|                      |	¦  «        }t          |t          ¦  «        r|                      d	¦  «        rd|d	<    nŒd|sí|                       d¦  «        rt          | d         ¦  «         t          d| d         › d�¦  «         |rt          d¦  «         |                       d¦  «        }|rt          ||¦  «         dS |                       d¦  «        }|rWt          ||¦  «         |                     di ¦  «        }t          |t          ¦  «        r|                      d¦  «        d vrd!|d<   dS d}|D �]}t          |d"         ¦  «        }|rt          d|d"         › d#�¦  «         Œ4|                      d$d%¦  «        }|rt          d&|› �¦  «         |                      d'd%¦  «        }|r.t!          d(|                      d)|d"         ¦  «        › �|¦  «        }n.t!          d(|                      d)|d"         ¦  «        › �d¬*¦  «        }|r&t#          |d"         |¦  «         t          d+¦  «         Œút          d,¦  «         d}�Œ|                       d¦  «        r|rt          | d         ¦  «         |r²t          d| d         › d-�¦  «         |                       d¦  «        }|rt          ||¦  «         dS |                       d¦  «        }|r[t          ||¦  «         |                     di ¦  «        }t          |t          ¦  «        r"|                      d¦  «        d vrd!|d<   dS dS dS dS dS ).zAConfigure a single provider - prompt for API keys and set config.rf   ri   rh   úE  Nous Subscription is only available after logging into Nous Portal.Nrg   r$   rc  rè  r“   r   r”   r¿  ú  Browser set to local modeú!  Browser cloud provider set to: r�   r   r¾  ú  Web backend set to: ©r   r$   r   Tr}   Fr{   rÆ  rc   ú - no configuration needed!úB  Requests for this tool will be billed to your Nous subscription.r²  r�   r    rç  r�   rm   z: already configuredrn   r�  ú  Get yours at: rœ   ú    r   ©Úpasswordú	    Savedú    Skippedz configured!)r:   r   rº  rÈ   rG  r÷   rÆ   rZ  r+  rö   r  rØ   rÁ   r<  r,  r
   Ú_promptr   )rc  ræ   rf   rë  rW  rÁ  ÚbprÃ  rÂ  Úcat_keyrb  Úsectionré  r¾  r;  Úall_configuredrU  Úexistingrn   Údefault_valrú   s                        r<   rÝ  rÝ  ™  sÛ  € à�|Š|˜J¨Ñ+Ô+€HØ—l’lÐ#9Ñ:Ô:€Oà‡|‚|Ð(Ñ)Ô)ð Ý1°&Ñ9Ô9ˆØÔ)ð 	ÝÐbÑcÔcÐcØˆFð ‡|‚|�NÑ#Ô#ð 7Ø×#Ò# E¨2Ñ.Ô.ˆØ& ~Ô6ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�Ñð ˜XÐ%Ð%ØÐ(Ô)ˆØ×'Ò'¨	°2Ñ6Ô6ˆØ�Š=ˆ=Ø,3ˆKÐ(Ñ)ÝÐ8Ñ9Ô9Ð9Ð9Øð 	EØ,.ˆKÐ(Ñ)ÝÐC¸rÐCÐCÑDÔDÐDÝ%)¨/Ñ%:Ô%:ˆ�MÑ"ð ‡|‚|�MÑ"Ô"ð KØ×#Ò# E¨2Ñ.Ô.ˆØ% mÔ4ˆ�	ÑÝ!% oÑ!6Ô!6ˆ�ÑÝÐI°¸Ô0GÐIÐIÑJÔJÐJð ð 
˜?Ð2KÐKÐKØ@Dˆ×Ò˜/¨2Ñ.Ô.¨}Ñ=Ð=Øð õ ,×1Ò1Ñ3Ô3ð 	ð 	‰LˆG�SØ˜3Ÿ7š7 ;°Ñ3Ô3Ð3Ð3Ø Ÿ*š* WÑ-Ô-�Ý˜g¥tÑ,Ô,ð 3°·²¸]Ñ1KÔ1Kð 3Ø-2�G˜MÑ*Ø�ð	 4ð ð Ø�<Š<˜Ñ%Ô%ð 	4Ý˜H \Ô2Ñ3Ô3Ð3ÝÐI˜H VÔ,ÐIÐIÐIÑJÔJÐJØð 	^ÝÐ\Ñ]Ô]Ð]ð —l’lÐ#:Ñ;Ô;ˆØð 	Ý-¨k¸6ÑBÔBÐBØˆFà—,’,Ð1Ñ2Ô2ˆØð 	,Ý% g¨vÑ6Ô6Ð6ð ×'Ò'¨°RÑ8Ô8ˆGÝ˜'¥4Ñ(Ô(ð ,¨W¯[ª[¸Ñ-DÔ-DÐL]Ð-]Ð-]Ø&+�˜
Ñ#Øˆð €NØð 'ñ 'ˆÝ   U¤Ñ,Ô,ˆØð 	'ÝÐ@  E¤
Ð@Ð@Ð@ÑAÔAÐAÐAð —'’'˜% Ñ$Ô$ˆCØð 6ÝÐ4¨sÐ4Ð4Ñ5Ô5Ð5àŸ'š' )¨RÑ0Ô0ˆKØð WÝÐ F s§w¢w¨x¸¸U¼Ñ'DÔ'DÐ FÐ FÈÑTÔT��åÐ F s§w¢w¨x¸¸U¼Ñ'DÔ'DÐ FÐ FÐQUÐVÑVÔV�àð 'Ý˜s 5œz¨5Ñ1Ô1Ð1Ý˜{Ñ+Ô+Ð+Ð+å˜}Ñ-Ô-Ð-Ø!&�‘ð ‡|‚|�LÑ!Ô!ð 0 nð 0Ý˜ Ô.Ñ/Ô/Ð/àð ,ÝÐ:˜H VÔ,Ð:Ð:Ð:Ñ;Ô;Ð;Ø—l’lÐ#:Ñ;Ô;ˆØð 	Ý-¨k¸6ÑBÔBÐBØˆFà—,’,Ð1Ñ2Ô2ˆØð 	,Ý% g¨vÑ6Ô6Ð6Ø×'Ò'¨°RÑ8Ô8ˆGÝ˜'¥4Ñ(Ô(ð ,¨W¯[ª[¸Ñ-DÔ-DÐL]Ð-]Ð-]Ø&+�˜
Ñ#Ð#Ð#ð,ð ,ð	,ð 	,ð,ð ,Ð-]Ð-]r>   c                 ó  ‡ — ‰ dk    �ræt          d¦  «        rdS t          ¦   «          t          t          dt          j        ¦  «        ¦  «         g d¢}t          d|d¦  «        }|dk    rzt          d¦  «         t          d	d
¬¦  «        }|rG|                     ¦   «         r3t          d|                     ¦   «         ¦  «         t          d¦  «         �nt          d¦  «         �n	|dk    �rt          d¦  «                             ¦   «         pd}t          |¦  «        dk    }|rdnd}t          |d
¬¦  «        }|r¤|                     ¦   «         r�t          d|                     ¦   «         ¦  «         t          ¦   «         }|                     di ¦  «                             di ¦  «        }	||	d<   t          |¦  «         |rt          dd¦  «         t          d¦  «         nt          d¦  «         dS t                                ‰ g ¦  «        }
|
sdS d„ |
D ¦   «         }|sdS t%          ˆ fd„t'          ¦   «         D ¦   «         ‰ ¦  «        }t          ¦   «          t          t          d|› d�t          j        ¦  «        ¦  «         |D ]„\  }}|rt          d|› �¦  «         t          d|› �d
¬¦  «        }|rF|                     ¦   «         r2t          ||                     ¦   «         ¦  «         t          d¦  «         Œut          d¦  «         Œ…dS ) zMSimple fallback for toolsets that just need env vars (no provider selection).r   Nz8  Vision / Image Analysis requires a multimodal backend:)u   OpenRouter â€” uses GeminiuB   OpenAI-compatible endpoint â€” base URL, API key, and vision modelÚSkipz  Configure vision backendé   r   z(  Get key at: https://openrouter.ai/keysz    OPENROUTER_API_KEYTrG  r§   rI  rJ  rÈ  z&    OPENAI_BASE_URL (blank for OpenAI)zhttps://api.openai.com/v1zapi.openai.comz    OPENAI_API_KEYz    API keyrb   Ú	auxiliaryÚbase_urlÚAUXILIARY_VISION_MODELzgpt-4o-minic                 ó:   — g | ]\  }}t          |¦  «        °||f‘ŒS rA   rR  )rC   rU  rn   s      r<   r  z2_configure_simple_requirements.<locals>.<listcomp><  s-   € ÐQÐQÐQ™h˜c 3½mÈCÑ>PÔ>PÐQ��SˆzÐQÐQÐQr>   c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   ©rC   r\   rŠ  rD   r6   s       €r<   r  z1_configure_simple_requirements.<locals>.<genexpr>@  ó5   øè è € Ð\Ð\™7˜1˜a ÐPQÐU[ÒP[ÐP[�QÐP[ÐP[ÐP[ÐP[Ð\Ð\r>   rÆ  z requires configuration:ú  Get key at: rF  )re  rØ  r   r   ÚYELLOWrm  rÁ   rK  rÎ   r   rÆ   rÈ   r   r   rG  r	   r]  r:   ÚnextrR   )r6   rg  rš  rú   rV  Úis_native_openaiÚ	key_labelÚapi_keyÚ_cfgÚ_auxrd  Úmissingr¤  rU  rn   s   `              r<   r«  r«    s>  ø€ à�ÒÑÝ˜XÑ&Ô&ð 	ØˆFÝ‰ŒˆÝ�eÐNÕPVÔP]Ñ^Ô^Ñ_Ô_Ð_ð
ð 
ð 
ˆõ
 Ð9¸7ÀAÑFÔFˆØ�!Š8ˆ8ÝÐBÑCÔCÐCÝÐ4¸tÐDÑDÔDˆEØð .˜Ÿš™œð .ÝÐ3°U·[²[±]´]ÑCÔCÐCÝ˜{Ñ+Ô+Ð+Ñ+å˜}Ñ-Ô-Ð-Ñ-Ø�AŠX‰XÝÐGÑHÔH×NÒNÑPÔPÐoÐToˆHÝ0°Ñ:Ô:Ð>NÒNÐØ0@ÐSÐ,Ð,ÀmˆIÝ˜i°$Ð7Ñ7Ô7ˆGØð .˜7Ÿ=š=™?œ?ð .ÝÐ/°·²±´ÑAÔAÐAå"‘}”}�Ø—’ {°BÑ7Ô7×BÒBÀ8ÈRÑPÔP�Ø#+��ZÑ Ý˜DÑ!Ô!Ð!Ø#ð LÝ"Ð#;¸]ÑKÔKÐKÝ˜{Ñ+Ô+Ð+Ð+å˜}Ñ-Ô-Ð-Øˆå+×/Ò/°¸Ñ;Ô;€LØð ØˆàQÐQ¨,ÐQÑQÔQ€GØð ØˆåÐ\Ð\Ð\Ð\Õ&JÑ&LÔ&LÐ\Ñ\Ô\Ð^dÑeÔe€HÝ	�G„G€GÝ	�%Ð7�XÐ7Ð7Ð7½¼Ñ
GÔ
GÑHÔHÐHàð *ð *‰ˆˆSØð 	0ÝÐ.¨Ð.Ð.Ñ/Ô/Ð/Ý˜˜s˜˜¨tÐ4Ñ4Ô4ˆØð 	*�U—[’[‘]”]ð 	*Ý˜3 §¢¡¤Ñ.Ô.Ð.Ý˜;Ñ'Ô'Ð'Ð'å˜=Ñ)Ô)Ð)Ð)ð*ð *r>   c                 ót  — g }t          ¦   «         D ]e\  }}}t                               |¦  «        }t                               |¦  «        }|s|r't	          || ¦  «        r|                     ||f¦  «         Œf|st          d¦  «         dS d„ |D ¦   «         }|                     d¦  «         t          d|t          |¦  «        dz
  ¦  «        }|t          |¦  «        k    rdS ||         \  }}t                               |¦  «        }|rt          ||| ¦  «         nt          |¦  «         t          | ¦  «         dS )z<Let user reconfigure an existing tool's provider or API key.z#No configured tools to reconfigure.Nc                 ó   — g | ]\  }}|‘ŒS rA   rA   )rC   rD   rZ   s      r<   r  z%_reconfigure_tool.<locals>.<listcomp>^  s   € Ð2Ð2Ð2™˜˜EˆuÐ2Ð2Ð2r>   ÚCancelz+  Which tool would you like to reconfigure?rÈ  )rR   rZ  r:   r]  re  rM   rÁ   rm  r~  Ú%_configure_tool_category_for_reconfigÚ _reconfigure_simple_requirementsr	   )	ræ   Úconfigurabler6   r¤  rD   rb  Úreqsrg  rš  s	            r<   Ú_reconfigure_toolrl  O  sb  € ð €LÝCÑEÔEð 8ð 8Ñˆ�˜!Ý×!Ò! &Ñ)Ô)ˆÝ'×+Ò+¨FÑ3Ô3ˆØð 	8�$ð 	8Ý  ¨Ñ0Ô0ð 8Ø×#Ò# V¨XÐ$6Ñ7Ô7Ð7øàð ÝÐ9Ñ:Ô:Ð:Øˆà2Ð2 \Ð2Ñ2Ô2€GØ‡N‚N�8ÑÔÐå
ÐFÈÕQTÐU\ÑQ]ÔQ]Ð`aÑQaÑ
bÔ
b€Cà
�c�,ÑÔÒÐØˆà# CÔ(Ñ€FˆHÝ
×
Ò
˜fÑ
%Ô
%€Cà
ð 1Ý-¨f°c¸6ÑBÔBÐBÐBå(¨Ñ0Ô0Ð0å�ÑÔÐÐÐr>   c                 óÀ  — |                      dd¦  «        }|d         }t          ||¦  «        }t          |¦  «        dk    r_|d         }t          ¦   «          t          t	          d|› d|› d|d         › d	�t
          j        ¦  «        ¦  «         t          ||¦  «         dS t          ¦   «          t          t	          d|› d|› d
�t
          j        ¦  «        ¦  «         t          ¦   «          g }|D ]·}|                      d¦  «        rd|d         › d�nd}	|                      d¦  «        rd|d         › �nd}
d}|                      dg ¦  «        }|rt          d„ |D ¦   «         ¦  «        rt          ||¦  «        rd}n|sd}nd}| 
                    |d         › |	› |
› |› �¦  «         Œ¸t          ||¦  «        }t          d||¦  «        }t          ||         |¦  «         dS )zBReconfigure a tool category - provider selection + API key update.r|   r�  rc   rÈ  r   rÉ  rÊ  rË  rÌ  z - Choose a provider ---rd   rÍ  rÎ  re   rÏ  rf   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rQ  rR  rÑ  s     r<   r  z8_configure_tool_category_for_reconfig.<locals>.<genexpr>‡  rÓ  r>   rÔ  rÕ  z  Select provider:N)r:   r[  r~  rØ  r   r   rÜ  Ú_reconfigure_providerr\  rÞ  rM   rß  rm  )r6   rb  ræ   r|   rc   r}   rc  râ  r  rd   re   rã  rf   rä  rå  s                  r<   rh  rh  q  s  € à�7Š7�6˜2ÑÔ€DØˆvŒ;€DÝ" 3¨Ñ/Ô/€Iå
ˆ9�~„~˜ÒÐØ˜Q”<ˆÝ‰ŒˆÝ�eÐC˜TÐCÐC DÐCÐC¨H°VÔ,<ÐCÐCÐCÅVÄ[ÑQÔQÑRÔRÐRÝ˜h¨Ñ/Ô/Ð/Ð/Ð/å‰ŒˆÝ�eÐB˜TÐBÐB DÐBÐBÐBÅFÄKÑPÔPÑQÔQÐQÝ‰ŒˆàÐØð 	Lð 	LˆAØ*+¯%ª%°©.¬.Ð@Ð&˜˜7œÐ&Ð&Ð&Ð&¸bˆEØ()¯ª¨e©¬Ð<Ð$˜!˜Eœ(Ð$Ð$Ð$¸"ˆCØˆJØ—u’u˜Z¨Ñ,Ô,ˆHØð 1�sÐ"MÐ"MÀHÐ"MÑ"MÔ"MÑMÔMð 1Ý& q¨&Ñ1Ô1ð 1Ø!,�J�JØ!ð 1Ø!#�J�Jà!0�JØ×#Ò# q¨¤yÐ$J°%Ð$J¸Ð$J¸jÐ$JÐ$JÑKÔKÐKÐKå3°I¸vÑFÔFˆå%Ð&:Ð<LÈkÑZÔZˆÝ˜i¨Ô5°vÑ>Ô>Ð>Ð>Ð>r>   c           	      óT	  — |                       dg ¦  «        }|                       d¦  «        }|                       d¦  «        r't          |¦  «        }|j        st          d¦  «         dS |                       d¦  «        r7| d         |                     di ¦  «        d<   t          d	| d         › �¦  «         d
| v rd| d
         }|dk    r)d|                     di ¦  «        d<   t          d¦  «         n-|r+||                     di ¦  «        d<   t          d|› �¦  «         |                       d¦  «        r7| d         |                     di ¦  «        d<   t          d| d         › �¦  «         |r<|dvr8|                     |i ¦  «        }t          |t          ¦  «        si }|||<   d|d<   n|s}t           	                    ¦   «         D ]c\  }}| |                      dg ¦  «        v rF|                      |¦  «        }t          |t          ¦  «        r|                      d¦  «        rd|d<    nŒd|sá|                       d¦  «        rt          | d         ¦  «         t          d| d         › d�¦  «         |rt          d¦  «         |                       d¦  «        }	|	rt          |	|¦  «         dS |                       d¦  «        }
|
rKt          |
|¦  «         |
d k    r5|                     d!i ¦  «        }t          |t          ¦  «        r
d |d<   d|d<   dS |D �]}t          |d"         ¦  «        }|r$t          d|d"         › d#|dd$…         › d%�¦  «         |                      d&d'¦  «        }|rt          d(|› �¦  «         |                      d)d'¦  «        }t          d*|                      d+|d"         ¦  «        › d,�| ¬-¦  «        }|rL|                     ¦   «         r8t#          |d"         |                     ¦   «         ¦  «         t          d.¦  «         Œüt          d/¦  «         �Œ|                       d¦  «        }	|	rt          |	|¦  «         dS |                       d¦  «        }
|
rMt          |
|¦  «         |
d k    r9|                     d!i ¦  «        }t          |t          ¦  «        rd |d<   d|d<   dS dS dS dS )0z)Reconfigure a provider - update API keys.rf   ri   rh   r>  Nrg   r$   rc  z  TTS provider set to: r“   r”   r   r¿  r?  r@  r�   r   r¾  rA  rB  Trè  r}   Fr{   rÆ  rc   rC  rD  r²  r�   r�   r    rm   ú: configured (é   ú...)rn   r�  rE  rœ   rF  r   ú (Enter to keep current)rG  ú    Updatedú    Kept current)r:   r   rº  rÈ   rG  rÆ   rö   r  rZ  r+  rØ   rÁ   r<  r,  r
   rK  rÎ   r   )rc  ræ   rf   rë  rW  rL  rN  rM  rb  ré  r¾  r;  rU  rP  rn   rQ  rú   s                    r<   ro  ro  –  sd  € à�|Š|˜J¨Ñ+Ô+€HØ—l’lÐ#9Ñ:Ô:€Oà‡|‚|Ð(Ñ)Ô)ð Ý1°&Ñ9Ô9ˆØÔ)ð 	ÝÐbÑcÔcÐcØˆFà‡|‚|�NÑ#Ô#ð MØ3;¸NÔ3Kˆ×Ò˜% Ñ$Ô$ ZÑ0ÝÐK°¸.Ô1IÐKÐKÑLÔLÐLà˜XÐ%Ð%ØÐ(Ô)ˆØ�Š=ˆ=ØAHˆF×Ò˜i¨Ñ,Ô,Ð-=Ñ>ÝÐ8Ñ9Ô9Ð9Ð9Øð 	EØACˆF×Ò˜i¨Ñ,Ô,Ð-=Ñ>ÝÐC¸rÐCÐCÑDÔDÐDð ‡|‚|�MÑ"Ô"ð KØ2:¸=Ô2Iˆ×Ò˜% Ñ$Ô$ YÑ/ÝÐI°¸Ô0GÐIÐIÑJÔJÐJàð ˜?Ð2KÐKÐKØ×#Ò# O°RÑ8Ô8ˆÝ˜'¥4Ñ(Ô(ð 	.ØˆGØ&-ˆF�?Ñ#Ø!%ˆ�ÑÐØð Ý+×1Ò1Ñ3Ô3ð 	ð 	‰LˆG�SØ˜3Ÿ7š7 ;°Ñ3Ô3Ð3Ð3Ø Ÿ*š* WÑ-Ô-�Ý˜g¥tÑ,Ô,ð 3°·²¸]Ñ1KÔ1Kð 3Ø-2�G˜MÑ*Ø�ð	 4ð ð Ø�<Š<˜Ñ%Ô%ð 	4Ý˜H \Ô2Ñ3Ô3Ð3ÝÐI˜H VÔ,ÐIÐIÐIÑJÔJÐJØð 	^ÝÐ\Ñ]Ô]Ð]Ø—l’lÐ#:Ñ;Ô;ˆØð 	Ý-¨k¸6ÑBÔBÐBØˆFà—,’,Ð1Ñ2Ô2ˆØð 	3Ý% g¨vÑ6Ô6Ð6Ø˜%ÒÐØ ×+Ò+¨K¸Ñ<Ô<�Ý˜g¥tÑ,Ô,ð 3Ø*/�G˜JÑ'Ø-2�G˜MÑ*Øˆàð ,ñ ,ˆÝ   U¤Ñ,Ô,ˆØð 	KÝÐI˜S œZÐIÐI°xÀÀÀ´|ÐIÐIÐIÑJÔJÐJØ�gŠg�e˜RÑ Ô ˆØð 	2ÝÐ0¨3Ð0Ð0Ñ1Ô1Ð1Ø—g’g˜i¨Ñ,Ô,ˆÝÐV˜sŸwšw x°°U´Ñ<Ô<ÐVÐVÐVÐepÐapÐqÑqÔqˆØð 	,�U—[’[‘]”]ð 	,Ý˜3˜uœ: u§{¢{¡}¤}Ñ5Ô5Ð5Ý˜=Ñ)Ô)Ð)Ð)åÐ*Ñ+Ô+Ð+Ñ+ð —,’,Ð6Ñ7Ô7€KØð Ý)¨+°vÑ>Ô>Ð>Øˆà�lŠlÐ-Ñ.Ô.€GØð /Ý! '¨6Ñ2Ô2Ð2Ø�eÒÐØ×'Ò'¨°RÑ8Ô8ˆGÝ˜'¥4Ñ(Ô(ð /Ø&+�˜
Ñ#Ø).�˜Ñ&Ð&Ð&ð/ð /àÐð/ð /r>   c           	      óv  ‡ — t                                ‰ g ¦  «        }|sdS t          ˆ fd„t          ¦   «         D ¦   «         ‰ ¦  «        }t	          ¦   «          t	          t          d|› d�t          j        ¦  «        ¦  «         |D ]´\  }}t          |¦  «        }|rt          d|› d|dd…         › d�¦  «         |rt          d|› �¦  «         t          d	|› d
�d¬¦  «        }|rF|                     ¦   «         r2t          ||                     ¦   «         ¦  «         t          d¦  «         Œ¥t          d¦  «         ŒµdS )z(Reconfigure simple env var requirements.Nc              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   rZ  s       €r<   r  z3_reconfigure_simple_requirements.<locals>.<genexpr>û  r[  r>   rÆ  rÖ  rq  rr  rs  r\  rF  rt  TrG  ru  rv  )r]  r:   r^  rR   rØ  r   r   rÜ  r
   rÁ   rK  rÎ   r   rÆ   )r6   rd  r¤  rU  rn   rP  rú   s   `      r<   ri  ri  õ  sl  ø€ å+×/Ò/°¸Ñ;Ô;€LØð ØˆåÐ\Ð\Ð\Ð\Õ&JÑ&LÔ&LÐ\Ñ\Ô\Ð^dÑeÔe€HÝ	�G„G€GÝ	�%Ð �XÐ Ð Ð ¥&¤+Ñ
.Ô
.Ñ/Ô/Ð/à ð ,ð ,‰ˆˆSÝ  Ñ%Ô%ˆØð 	DÝÐB˜SÐBÐB°¸¸!¸´ÐBÐBÐBÑCÔCÐCØð 	0ÝÐ.¨Ð.Ð.Ñ/Ô/Ð/ÝÐ<˜sÐ<Ð<Ð<ÀtÐLÑLÔLˆØð 	,�U—[’[‘]”]ð 	,Ý˜3 §¢¡¤Ñ.Ô.Ð.Ý˜=Ñ)Ô)Ð)Ð)åÐ*Ñ+Ô+Ð+Ð+ð,ð ,r>   FÚfirst_installc                 ó,  ‡!‡"‡#— |€t          ¦   «         }t          ¦   «         }t          ¦   «          t          | dd¦  «        �r t	          t          ¦   «         ¦  «        }t          t          dt          j        t          j	        ¦  «        ¦  «         t          ¦   «          t          ||¦  «        }|D �]!}t          |         }|                     |t          ¦   «         ¦  «        }t	          |¦  «        }	t          t          d|d         › �t          j	        ¦  «        t          d|	› d|› d	�t          j        ¦  «        z   ¦  «         |ret          |¦  «        D ]TŠ#t!          ˆ#fd
„t          ¦   «         D ¦   «         ‰#¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒUŒút          t          dt          j        ¦  «        ¦  «         �Œ#t          ¦   «          dS t          t          dt          j        t          j	        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         t          ¦   «          |�rÿ|D �]ù}t          |         }t%          ||d¬¦  «        }|t&          z
  }t)          |d         ||¦  «        }||z
  }||z
  }|rdt          |¦  «        D ]TŠ"t!          ˆ"fd„t          ¦   «         D ¦   «         ‰"¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒU|rdt          |¦  «        D ]TŠ"t!          ˆ"fd„t          ¦   «         D ¦   «         ‰"¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒUt-          ||¬¦  «        Š!t/          ¦   «         r^t          ‰!¦  «        D ]NŠ#t!          ˆ#fd„t0          D ¦   «         ‰#¦  «        }
t          t          d|
› d�t          j        ¦  «        ¦  «         ŒOˆ!fd„t          |¦  «        D ¦   «         }|rçt          ¦   «          t          t          dt	          |¦  «        › d�t          j        ¦  «        ¦  «         |D ]TŠ#t!          ˆ#fd„t          ¦   «         D ¦   «         ‰#¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒUt          t          dt          j        ¦  «        ¦  «         t          ¦   «          |D ]Š#t5          ‰#|¦  «         Œt7          |||¦  «         t9          |¦  «         t          t          d |d         › d!�t          j        ¦  «        ¦  «         t          ¦   «          �ŒûdS g }g }|D ]…}t          |         }t%          ||d¬¦  «        }t	          |¦  «        }	t	          t          ¦   «         ¦  «        }|                     d"|d         › d|	› d|› d#�¦  «         |                     |¦  «         Œ†t	          |¦  «        d$k    r|                     d%¦  «         |                     d&¦  «         t=          |                     d'¦  «        ¦  «        }|r|                     d(¦  «         |                     d)¦  «         t	          |¦  «        d$k    rt	          |¦  «        nd*}t	          |¦  «        t	          |¦  «        d$k    rd$nd+z   }|r|d$z   nd*}||rd,nd$z   }	 t?          d.|d+¬/¦  «        }||k    r�np||k    rtA          |¦  «         t          ¦   «          Œ?||k    rtC          |¦  «         t          ¦   «          Œc||k    �rÀt          ¦   «         }|D ]}|t%          ||d¬¦  «        z  }Œt)          d0|¦  «        }||k    �rJ|D �] }t%          ||d¬¦  «        }||z
  }||z
  }t          |         }|s|rùt          t          d|d         › d1�t          j        ¦  «        ¦  «         t          |¦  «        D ]TŠ"t!          ˆ"fd2„t          ¦   «         D ¦   «         ‰"¦  «        }
t          t          d3|
› �t          j        ¦  «        ¦  «         ŒUt          |¦  «        D ]TŠ"t!          ˆ"fd4„t          ¦   «         D ¦   «         ‰"¦  «        }
t          t          d5|
› �t          j        ¦  «        ¦  «         ŒUt          |¦  «        D ]VŠ#tD                               ‰#¦  «        stF                               ‰#¦  «        r tI          ‰#|¦  «        rt5          ‰#|¦  «         ŒWt7          |||¦  «         �Œ¢t9          |¦  «         t          t          d6t          j        ¦  «        ¦  «         tK          |¦  «        D ]_\  }}t	          t%          ||d¬¦  «        ¦  «        }t	          t          ¦   «         ¦  «        }d"t          |         d         › d|› d|› d#�||<   Œ`n't          t          d7t          j        ¦  «        ¦  «         t          ¦   «          �Œ*||         }t          |         }t%          ||d¬¦  «        }t)          |d         |¦  «        }||k    �rŽ||z
  }||z
  }|rdt          |¦  «        D ]TŠ"t!          ˆ"fd8„t          ¦   «         D ¦   «         ‰"¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒU|rdt          |¦  «        D ]TŠ"t!          ˆ"fd9„t          ¦   «         D ¦   «         ‰"¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒUt          |¦  «        D ]VŠ#tD                               ‰#¦  «        stF                               ‰#¦  «        r tI          ‰#|¦  «        rt5          ‰#|¦  «         ŒWt7          |||¦  «         t9          |¦  «         t          t          d |d         › d:�t          j        ¦  «        ¦  «         n0t          t          d;|d         › �t          j        ¦  «        ¦  «         t          ¦   «          t	          t%          ||d¬¦  «        ¦  «        }t	          t          ¦   «         ¦  «        }d"|d         › d|› d|› d#�||<   �ŒŠt          ¦   «          d+d<l&m'}  t          t          d= | ¦   «         › d>�t          j        ¦  «        ¦  «         t          t          d?t          j        ¦  «        ¦  «         t          ¦   «          dS )@a	  Entry point for `hermes tools` and `hermes setup tools`.

    Args:
        first_install: When True (set by the setup wizard on fresh installs),
            skip the platform menu, go straight to the CLI checklist, and
            prompt for API keys on all enabled tools that need them.
        config: Optional config dict to use.  When called from the setup
            wizard, the wizard passes its own dict so that platform_toolsets
            are written into it and survive the wizard's final save_config().
    Nrê   Fu   âš• Tool SummaryrÆ  rZ   rŽ  ú/r�  c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   rZ  s       €r<   r  z tools_command.<locals>.<genexpr>-  ó5   øè è € Ð!iÐ!i©¨¨1¨aÐ]^ÐbhÒ]hÐ]h !Ð]hÐ]hÐ]hÐ]hÐ!iÐ!ir>   u       âœ“ z    (none enabled)u   âš• Hermes Tool Configurationz'  Enable or disable tools per platform.z;  Tools that need API keys will be configured when enabled.zM  Guide: https://hermes-agent.nousresearch.com/docs/user-guide/features/toolsrý   c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   ©rC   r\   rŠ  rD   r  s       €r<   r  z tools_command.<locals>.<genexpr>I  ó5   øè è € Ð!eÐ!e©¨¨1¨aÐ]^ÐbdÒ]dÐ]d !Ð]dÐ]dÐ]dÐ]dÐ!eÐ!er>   z  + c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   r  s       €r<   r  z tools_command.<locals>.<genexpr>M  r€  r>   z  - )r/  c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   rZ  s       €r<   r  z tools_command.<locals>.<genexpr>V  s.   øè è € Ð!XÐ!X©¨¨1¨aÈAÐQWÊKÈK !ÈKÈKÈKÈKÐ!XÐ!Xr>   u     âœ“ z': using your Nous subscription defaultsc                 ó„   •— g | ]<}t                                |¦  «        st                               |¦  «        r|‰v¯:|‘Œ=S rA   )rZ  r:   r]  )rC   r6   Úauto_configureds     €r<   r  z!tools_command.<locals>.<listcomp>]  s]   ø€ ð ð ð Ø!Ý#×'Ò'¨Ñ/Ô/ðå3K×3OÒ3OÐPVÑ3WÔ3Wðð  /Ð1Ð1ð à1Ð1Ð1r>   z  Configuring z	 tool(s):c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   rZ  s       €r<   r  z tools_command.<locals>.<genexpr>g  r}  r>   u       â€¢ z1  You can skip any tool you don't need right now.u     âœ“ Saved z tool configurationz
Configure z	 enabled)rÈ  z Configure all platforms (global)z2Reconfigure an existing tool's provider or API keyr  zConfigure MCP server toolsÚDoneéÿÿÿÿr   rT  TzSelect an option:r  zAll platformsrÖ  c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   r  s       €r<   r  z tools_command.<locals>.<genexpr>µ  ó5   øè è € Ð)mÐ)m±°°1°aÐefÐjlÒelÐel¨!ÐelÐelÐelÐelÐ)mÐ)mr>   z    + c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   r  s       €r<   r  z tools_command.<locals>.<genexpr>¸  r‰  r>   z    - u+     âœ“ Saved configuration for all platformsz  No changesc              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   r  s       €r<   r  z tools_command.<locals>.<genexpr>Û  r€  r>   c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S r  rA   r  s       €r<   r  z tools_command.<locals>.<genexpr>ß  r€  r>   z configurationz  No changes to r°   z  Tool configuration saved to z/config.yamlz:  Changes take effect on next 'hermes' or gateway restart.)(r   rå   rØ  r´  r~  rR   r   r   rÜ  ÚBOLDrì   rW   r:   rU   ÚDIMrI  r^  ÚGREENré   r'  r¨  ÚREDr   r   rJ   r]  r¬  rM  r	   rM   r÷   rm  rl  Ú _configure_mcp_tools_interactiverZ  r]  rÄ  r¡  rÇ   r±   )$Úargsry  ræ   Úenabled_platformsr›  rê   rë   Úpinforä   ÚcountrZ   Úcurrent_enabledÚchecklist_preselectedÚnew_enabledÚaddedÚremovedÚto_configureÚplatform_choicesÚplatform_keysrí  Ú_has_mcpÚ_global_idxÚ_reconfig_idxÚ_mcp_idxÚ	_done_idxrš  Úall_currentÚpkÚprevÚpinfo_innerÚciÚ	new_countr±   r„  r  r6   s$                                    @@@r<   Útools_commandr©    s¥  øøø€ ð €~Ý‘”ˆÝ.Ñ0Ô0Ðå	�G„G€Gõ ˆt�Y Ñ&Ô&ñ ÝÕ8Ñ:Ô:Ñ;Ô;ˆÝ�eÐ&­¬µV´[ÑAÔAÑBÔBÐBÝ‰ŒˆÝ+¨FÐ4EÑFÔFˆØ%ð 
	?ñ 
	?ˆDÝ˜d”OˆEØ—k’k $­©¬Ñ.Ô.ˆGÝ˜‘L”LˆEÝ•%Ð-˜U 7œ^Ð-Ð-­v¬{Ñ;Ô;½eÐDZÈ%ÐDZÐDZÐRWÐDZÐDZÐDZÕ\bÔ\fÑ>gÔ>gÑgÑhÔhÐhØð ?Ý$ W™oœoð Cð C�FÝ Ð!iÐ!iÐ!iÐ!iÕ3WÑ3YÔ3YÐ!iÑ!iÔ!iÐkqÑrÔr�EÝ�%Ð 2¨5Ð 2Ð 2µF´LÑAÔAÑBÔBÐBÐBðCõ •eÐ0µ&´*Ñ=Ô=Ñ>Ô>Ð>Ñ>Ý‰ŒˆØˆÝ	�%Ð/µ´½f¼kÑ
JÔ
JÑKÔKÐKÝ	�%Ð9½6¼:Ñ
FÔ
FÑGÔGÐGÝ	�%ÐMÍvÌzÑ
ZÔ
ZÑ[Ô[Ð[Ý	�%Ð_ÕagÔakÑ
lÔ
lÑmÔmÐmÝ	�G„G€Gð ñ 9Ø%ð 6	ñ 6	ˆDÝ˜d”OˆEÝ1°&¸$Ð\aÐbÑbÔbˆOð %4Õ6KÑ$KÐ!õ 4°E¸'´NÐDYÐ[_Ñ`Ô`ˆKà /Ñ1ˆEØ%¨Ñ3ˆGØð ?Ý  ™-œ-ð ?ð ?�BÝ Ð!eÐ!eÐ!eÐ!eÕ3WÑ3YÔ3YÐ!eÑ!eÔ!eÐgiÑjÔj�EÝ�%  u  µ´Ñ=Ô=Ñ>Ô>Ð>Ð>Øð =Ý  ™/œ/ð =ð =�BÝ Ð!eÐ!eÐ!eÐ!eÕ3WÑ3YÔ3YÐ!eÑ!eÔ!eÐgiÑjÔj�EÝ�%  u  µ´
Ñ;Ô;Ñ<Ô<Ð<Ð<å9ØØ!,ðñ ô ˆOõ *Ñ+Ô+ð hÝ$ _Ñ5Ô5ð hð h�FÝ Ð!XÐ!XÐ!XÐ!XÕ3HÐ!XÑ!XÔ!XÐZ`ÑaÔa�EÝ�%Ð W¨Ð WÐ WÐ WÕY_ÔYeÑfÔfÑgÔgÐgÐgðð ð ð Ý%+¨KÑ%8Ô%8ðñ ô ˆLð ð 	7Ý‘”�Ý•eÐI­S°Ñ->Ô->ÐIÐIÐIÍ6Ì=ÑYÔYÑZÔZÐZØ*ð Að A�FÝ Ð!iÐ!iÐ!iÐ!iÕ3WÑ3YÔ3YÐ!iÑ!iÔ!iÐkqÑrÔr�EÝ�%Ð 2¨5Ð 2Ð 2µF´JÑ?Ô?Ñ@Ô@Ð@Ð@Ý•eÐOÕQWÔQ[Ñ\Ô\Ñ]Ô]Ð]Ý‘”�Ø*ð 7ð 7�FÝ& v¨vÑ6Ô6Ð6Ð6å  ¨¨{Ñ;Ô;Ð;Ý˜ÑÔÐÝ•%ÐJ u¨W¤~ÐJÐJÐJÍFÌLÑYÔYÑZÔZÐZÝ‰GŒGˆG‰Gàˆð ÐØ€MØ!ð #ð #ˆÝ˜$”ˆÝ% f¨dÐPUÐVÑVÔVˆÝ�G‘”ˆÝÕ8Ñ:Ô:Ñ;Ô;ˆØ×ÒÐ X¨U°7¬^Ð XÐ XÀÐ XÐ XÈÐ XÐ XÐ XÑYÔYÐYØ×Ò˜TÑ"Ô"Ð"Ð"å
ˆ=ÑÔ˜AÒÐØ×ÒÐ BÑCÔCÐCØ×ÒÐPÑQÔQÐQõ �F—J’J˜}Ñ-Ô-Ñ.Ô.€HØð >Ø×ÒÐ <Ñ=Ô=Ð=à×Ò˜FÑ#Ô#Ð#õ ),¨MÑ(:Ô(:¸QÒ(>Ð(>•#�mÑ$Ô$Ð$ÀB€KÝ˜Ñ&Ô&­s°=Ñ/AÔ/AÀAÒ/EÐ/E¨!¨!È1ÑM€MØ&.Ð6� Ñ!Ð!°B€HØ hÐ!5  °AÑ6€Iða]ÝÐ0Ð2BÈAÐNÑNÔNˆð �)ÒÐÙð �-ÒÐÝ˜fÑ%Ô%Ð%Ý‰GŒGˆGØð �(Š?ˆ?Ý,¨VÑ4Ô4Ð4Ý‰GŒGˆGØð �+ÒÑå™%œ%ˆKØ#ð bð b�ØÕ2°6¸2Ð[`ÐaÑaÔaÑa��Ý3°OÀ[ÑQÔQˆKØ˜kÒ)Ñ)Ø'ð Bñ B�BÝ.¨v°rÐW\Ð]Ñ]Ô]�DØ'¨$Ñ.�EØ" [Ñ0�GÝ"+¨B¤-�KØð G ð GÝ�eÐ$@¨°WÔ)=Ð$@Ð$@Ð$@Å&Ä*ÑMÔMÑNÔNÐNÝ"(¨¡-¤-ð Ið I˜BÝ$(Ð)mÐ)mÐ)mÐ)mÕ;_Ñ;aÔ;aÐ)mÑ)mÔ)mÐoqÑ$rÔ$r˜EÝ!¥%Ð(8°Ð(8Ð(8½&¼,Ñ"GÔ"GÑHÔHÐHÐHÝ"(¨¡/¤/ð Gð G˜BÝ$(Ð)mÐ)mÐ)mÐ)mÕ;_Ñ;aÔ;aÐ)mÑ)mÔ)mÐoqÑ$rÔ$r˜EÝ!¥%Ð(8°Ð(8Ð(8½&¼*Ñ"EÔ"EÑFÔFÐFÐFå"(¨¡-¤-ð Cð C˜Ý+×/Ò/°Ñ7Ô7ð CÕ;S×;WÒ;WÐX^Ñ;_Ô;_ð CÝBÀ6È6ÑRÔRð CÝ 2°6¸6Ñ BÔ BÐ BøÝ(¨°°[ÑAÔAÐAÑAÝ˜FÑ#Ô#Ð#Ý•eÐIÍ6Ì<ÑXÔXÑYÔYÐYå'¨Ñ6Ô6ð pð p‘F�B˜Ý #Õ$7¸ÀÐ`eÐ$fÑ$fÔ$fÑ gÔ g�IÝÕ DÑ FÔ FÑGÔG�EØ+o½	À"¼ÀgÔ8NÐ+oÐ+oÐS\Ð+oÐ+oÐ_dÐ+oÐ+oÐ+oÐ$ RÑ(Ð(ðpõ
 •e˜N­F¬JÑ7Ô7Ñ8Ô8Ð8Ý‰GŒGˆGÙà˜SÔ!ˆÝ˜$”ˆõ .¨f°dÐX]Ð^Ñ^Ô^ˆõ 0°°g´ÀÑPÔPˆà˜/Ò)Ñ)Ø /Ñ1ˆEØ%¨Ñ3ˆGàð ?Ý  ™-œ-ð ?ð ?�BÝ Ð!eÐ!eÐ!eÐ!eÕ3WÑ3YÔ3YÐ!eÑ!eÔ!eÐgiÑjÔj�EÝ�%  u  µ´Ñ=Ô=Ñ>Ô>Ð>Ð>Øð =Ý  ™/œ/ð =ð =�BÝ Ð!eÐ!eÐ!eÐ!eÕ3WÑ3YÔ3YÐ!eÑ!eÔ!eÐgiÑjÔj�EÝ�%  u  µ´
Ñ;Ô;Ñ<Ô<Ð<Ð<õ ! ™-œ-ð ;ð ;�Ý#×'Ò'¨Ñ/Ô/ð ;Õ3K×3OÒ3OÐPVÑ3WÔ3Wð ;Ý:¸6À6ÑJÔJð ;Ý*¨6°6Ñ:Ô:Ð:øå  ¨¨{Ñ;Ô;Ð;Ý˜ÑÔÐÝ•%ÐE u¨W¤~ÐEÐEÐEÅvÄ|ÑTÔTÑUÔUÐUÐUå•%Ð;¨5°¬>Ð;Ð;½V¼ZÑHÔHÑIÔIÐIå‰Œˆõ Õ+¨F°DÐV[Ð\Ñ\Ô\Ñ]Ô]ˆ	ÝÕ8Ñ:Ô:Ñ;Ô;ˆØ \¨U°7¬^Ð \Ð \À	Ð \Ð \ÈEÐ \Ð \Ð \Ð˜ÑñCa]õF 
�G„G€GØ4Ð4Ð4Ð4Ð4Ð4Ý	�%ÐTÐ1DÐ1DÑ1FÔ1FÐTÐTÐTÕV\ÔV`Ñ
aÔ
aÑbÔbÐbÝ	�%ÐLÍfÌjÑ
YÔ
YÑZÔZÐZÝ	�G„G€G€G€Gr>   c           
      óª	  ‡‡‡— ddl m} |                      d¦  «        pi }|st          d¦  «         dS d„ |                     ¦   «         D ¦   «         }|st          d¦  «         dS t          ¦   «          t          t          dt          j        ¦  «        ¦  «         t          t          d	t          |¦  «        › d
d 
                    |¦  «        › �t          j        ¦  «        ¦  «         	 ddlm}  |¦   «         Šn*# t          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w‰s t!          d¦  «         t          d¦  «         dS ˆfd„|D ¦   «         }|r|D ]}t!          d|› d�¦  «         Œt#          d„ ‰                     ¦   «         D ¦   «         ¦  «        }t          t          d|› dt          ‰¦  «        › d�t          j        ¦  «        ¦  «         t          ¦   «          d}	‰                     ¦   «         D �]k\  }
}|st          d|
› d�¦  «         Œ|                     |
i ¦  «        }|                     d¦  «        pi }|                     d¦  «        pg }|                     d¦  «        pg }g }|D ]Z\  }}t          |¦  «        dk    r|dd…         dz   n|}|r|                     |› d|› d �¦  «         ŒE|                     |¦  «         Œ[t+          ¦   «         }d!„ |D ¦   «         Št-          ‰¦  «        D ]R\  }}|r||v r|                     |¦  «         Œ!|r||vr|                     |¦  «         Œ=|                     |¦  «         ŒS |d"|
› dt          |¦  «        › d#�|||¬$¦  «        Š‰|k    rt          d|
› d%�¦  «         �Œ�ˆˆfd&„t1          t          ‰¦  «        ¦  «        D ¦   «         }|                     |
i ¦  «        }|                     di ¦  «        }|r||d<   |                     dd¦  «         n,|                     dd¦  «         |                     dd¦  «         t          ‰¦  «        }t          |¦  «        |z
  }t7          d|
› d'|› d(|› d)�¦  «         d*}	�Œm|	rFt9          | ¦  «         t          ¦   «          t          t          d+t          j        ¦  «        ¦  «         dS t          t          d,t          j        ¦  «        ¦  «         dS )-zýProbe MCP servers for available tools and let user toggle them on/off.

    Connects to each configured MCP server, discovers tools, then shows
    a per-server curses checklist.  Writes changes back as ``tools.exclude``
    entries in config.yaml.
    r   r†  r  zNo MCP servers configured.Nc                 óH   — g | ]\  }}|                      d d¦  «        dv¯|‘Œ S )rä   T)Frõ   rò   ró   rô   r–  )rC   r\   rÒ  s      r<   r  z4_configure_mcp_tools_interactive.<locals>.<listcomp>  s@   € ð ð ð Ùˆa�Ø�5Š5�˜DÑ!Ô!Ð)KÐKÐKð 	
ØKÐKÐKr>   zAll MCP servers are disabled.z'  Discovering tools from MCP servers...z  Connecting to z server(s): ú, )Úprobe_mcp_server_toolszFailed to probe MCP servers: z-Could not discover tools from any MCP server.zKCheck that server commands/URLs are correct and dependencies are installed.c                 ó   •— g | ]}|‰v¯|‘Œ	S rA   rA   )rC   ÚnÚserver_toolss     €r<   r  z4_configure_mcp_tools_interactive.<locals>.<listcomp>'  s#   ø€ Ð@Ð@Ð@�A¨!°<Ð*?Ð*?ˆaÐ*?Ð*?Ð*?r>   z  Could not connect to 'ú'c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r  r  )rC   Útoolss     r<   r  z3_configure_mcp_tools_interactive.<locals>.<genexpr>,  s(   è è € ÐDÐD U•c˜%‘j”jÐDÐDÐDÐDÐDÐDr>   z  Found z tool(s) across z
 server(s)FrÆ  z: no tools foundr³  ÚincludeÚexcludeéF   z...rŽ  r�  c                 ó   — g | ]
}|d          ‘ŒS rŸ  rA   ©rC   Úts     r<   r  z4_configure_mcp_tools_interactive.<locals>.<listcomp>G  s   € Ð*Ð*Ð*˜q�a˜”dÐ*Ð*Ð*r>   zMCP Server: z tools))rk  z: no changesc                 ó(   •— g | ]}|‰v¯‰|         ‘ŒS rA   rA   )rC   r‘  r“  Ú
tool_namess     €€r<   r  z4_configure_mcp_tools_interactive.<locals>.<listcomp>a  s#   ø€ ÐXÐXÐX¨ÈÐQWÈÈ�z !”}ÈÈÈr>   ú: z
 enabled, z	 disabledTu"     âœ“ MCP tool configuration savedz  No changes to MCP tools)rl  r‡  r:   rÁ   r+  rØ  r   r   r]  r~  ÚjoinrŽ  Útools.mcp_toolr­  rN   rÙ  rÈ   r˜  r#  r�  rM   rU   r¡  rL   ÚrangerG  ÚpoprÆ   r	   )ræ   r‡  r  Úenabled_namesr­  rÕ   Úfailedrc   Útotal_toolsÚany_changesÚserver_namer³  Úsrv_cfgÚ	tools_cfgÚinclude_listÚexclude_listr£  Ú	tool_nameÚdescriptionÚ
desc_shortr§  r‘  Únew_excludeÚenabled_countÚdisabled_countr“  r°  r»  s                            @@@r<   r‘  r‘  ÿ  sÛ  øøø€ ð 6Ð5Ð5Ð5Ð5Ð5à—*’*˜]Ñ+Ô+Ð1¨r€KØð ÝÐ0Ñ1Ô1Ð1Øˆðð Ø!×'Ò'Ñ)Ô)ðñ ô €Mð ð ÝÐ3Ñ4Ô4Ð4Øˆå	�G„G€GÝ	�%Ð9½6¼=Ñ
IÔ
IÑJÔJÐJÝ	�%Ð]¥3 }Ñ#5Ô#5Ð]Ð]À4Ç9Â9È]ÑC[ÔC[Ð]Ð]Õ_eÔ_iÑ
jÔ
jÑkÔkÐkðØ9Ð9Ð9Ð9Ð9Ð9Ø-Ð-Ñ/Ô/ˆˆøÝð ð ð ÝÐ:°SÐ:Ð:Ñ;Ô;Ð;Øˆˆˆˆˆøøøøðøøøð ð ÝÐFÑGÔGÐGÝÐaÑbÔbÐbØˆð AÐ@Ð@Ð@˜Ð@Ñ@Ô@€FØð ?Øð 	?ð 	?ˆDÝÐ=°dÐ=Ð=Ð=Ñ>Ô>Ð>Ð>åÐDÐD¨l×.AÒ.AÑ.CÔ.CÐDÑDÔDÑDÔD€KÝ	�%ÐU˜;ÐUÐU½¸LÑ8IÔ8IÐUÐUÐUÕW]ÔWcÑ
dÔ
dÑeÔeÐeÝ	�G„G€Gà€Kà*×0Ò0Ñ2Ô2ð Cñ CÑˆ�UØð 	ÝÐ:˜[Ð:Ð:Ð:Ñ;Ô;Ð;Øà—/’/ +¨rÑ2Ô2ˆØ—K’K Ñ(Ô(Ð.¨Bˆ	Ø —}’} YÑ/Ô/Ð5°2ˆØ —}’} YÑ/Ô/Ð5°2ˆð ˆØ&+ð 	)ð 	)Ñ"ˆI�{Ý58¸Ñ5EÔ5EÈÒ5JÐ5J˜ S b SÔ)¨EÑ1Ð1ÐP[ˆJØð )Ø—’ Ð<Ð<¨zÐ<Ð<Ð<Ñ=Ô=Ð=Ð=à—’˜iÑ(Ô(Ð(Ð(õ "%¡¤ˆØ*Ð* EÐ*Ñ*Ô*ˆ
Ý% jÑ1Ô1ð 	$ð 	$‰LˆAˆyØð 
$à Ð,Ð,Ø ×$Ò$ QÑ'Ô'Ð'øØð $à LÐ0Ð0Ø ×$Ò$ QÑ'Ô'Ð'øð × Ò  Ñ#Ô#Ð#Ð#à!Ð!Ø>˜;Ð>Ð>­3¨u©:¬:Ð>Ð>Ð>ØØØ'ð	
ñ 
ô 
ˆð �\Ò!Ð!ÝÐ6˜[Ð6Ð6Ð6Ñ7Ô7Ð7Ùð YÐXÐXÐXÐX­eµC¸
±O´OÑ.DÔ.DÐXÑXÔXˆð ×(Ò(¨°bÑ9Ô9ˆØ×&Ò& w°Ñ3Ô3ˆ	àð 	+Ø#.ˆI�iÑ à�MŠM˜) TÑ*Ô*Ð*Ð*ð �MŠM˜) TÑ*Ô*Ð*Ø�MŠM˜) TÑ*Ô*Ð*å˜F™œˆÝ˜U™œ mÑ3ˆÝØR�ÐRÐR ÐRÐR¸ÐRÐRÐRñ	
ô 	
ð 	
ð ˆ‰àð >Ý�FÑÔÐÝ‰ŒˆÝ�eÐ8½&¼,ÑGÔGÑHÔHÐHÐHÐHå�eÐ/µ´Ñ<Ô<Ñ=Ô=Ð=Ð=Ð=s   Ã(C9 Ã9
D ÄDÄD r,  Úactionc                 ó¢   — t          | |d¬¦  «        }|dk    r|t          |¦  «        z
  }n|t          |¦  «        z  }t          | ||¦  «         dS )z/Add or remove built-in toolsets for a platform.Frý   ÚdisableN)ré   rU   rM  )ræ   r7   r,  rÐ  rä   Úupdateds         r<   Ú_apply_toolset_changerÔ  ‚  s`   € å! &¨(ÐPUÐVÑVÔV€GØ�ÒÐØ�C Ñ.Ô.Ñ.ˆˆà�C Ñ.Ô.Ñ.ˆÝ˜ ¨7Ñ3Ô3Ð3Ð3Ð3r>   Útargetsc                 ó¨  ‡	— t          ¦   «         }|                      d¦  «        pi }|D ]¨}|                     dd¦  «        \  }Š	||vr|                     |¦  «         Œ5||                              di ¦  «        }t          |                     d¦  «        pg ¦  «        }|dk    r‰	|vr|                     ‰	¦  «         nˆ	fd„|D ¦   «         }||d<   Œ©|S )z‡Add or remove specific MCP tools from a server's exclude list.

    Returns the set of server names that were not found in config.
    r  rÖ  rÈ  r³  rµ  rÒ  c                 ó    •— g | ]
}|‰k    ¯|‘ŒS rA   rA   )rC   r¹  rÊ  s     €r<   r  z%_apply_mcp_change.<locals>.<listcomp>Ÿ  s   ø€ Ð<Ð<Ð<˜Q¨Q°)ª^¨^�q¨^¨^¨^r>   )rU   r:   ÚsplitrL   rG  rI   rM   )
ræ   rÕ  rÐ  Úfailed_serversr  ÚtargetrÅ  rÇ  rµ  rÊ  s
            @r<   Ú_apply_mcp_changerÛ  Œ  sú   ø€ õ
  #™uœu€NØ—*’*˜]Ñ+Ô+Ð1¨r€Kàð 'ð 'ˆØ!'§¢¨c°1Ñ!5Ô!5Ñˆ�YØ˜kÐ)Ð)Ø×Ò˜{Ñ+Ô+Ð+ØØ Ô,×7Ò7¸ÀÑDÔDˆ	Ý�y—}’} YÑ/Ô/Ð5°2Ñ6Ô6ˆØ�YÒÐØ Ð'Ð'Ø—’˜yÑ)Ô)Ð)øà<Ð<Ð<Ð< 'Ð<Ñ<Ô<ˆGØ&ˆ	�)ÑÐàÐr>   r/  r  c                 óî  ‡‡— t          ¦   «         }ˆfd„|D ¦   «         }d„ t          D ¦   «         Št          d‰› d�¦  «         |D ]s\  }}}|‰vrŒ|| v rt          dt          j        ¦  «        nt          dt          j        ¦  «        }t          d|› d|› dt          |t          j        ¦  «        › �¦  «         Œtˆfd„|D ¦   «         }	|	r‘t          ¦   «          t          d	‰› d�¦  «         |	D ]m\  }}|| v rt          dt          j        ¦  «        nt          dt          j        ¦  «        }t          d|› d|› dt          |t          j        ¦  «        › �¦  «         Œn|�rt          ¦   «          t          d
¦  «         |                     ¦   «         D ]æ\  }
}| 	                    d¦  «        pi }| 	                    d¦  «        pg }| 	                    d¦  «        pg }|r)t          |
› dd                     |¦  «        › d�¦  «         Œu|rAt          |
› dt          d                     |¦  «        t          j        ¦  «        › d�¦  «         Œ¸t          |
› dt          dt          j        ¦  «        › �¦  «         ŒådS dS )zBPrint a summary of enabled/disabled toolsets and MCP tool filters.c                 óB   •— g | ]\  }}}t          |‰¦  «        ¯|||f‘ŒS rA   r  r‰  s       €r<   r  z%_print_tools_list.<locals>.<listcomp>¨  rŒ  r>   c                 ó   — h | ]\  }}}|’Œ	S rA   rA   rB   s      r<   rE   z$_print_tools_list.<locals>.<setcomp>¬  s   € ÐEÐEÐE™|˜v q¨!�FÐEÐEÐEr>   zBuilt-in toolsets (z):u   âœ“ enabledu   âœ— disabledrÆ  c                 ó(   •— g | ]\  }}}|‰v¯
||f‘ŒS rA   rA   )rC   r\   rŠ  rD   Úbuiltin_keyss       €r<   r  z%_print_tools_list.<locals>.<listcomp>·  s-   ø€ ÐOÐOÐO¡  A q¸À,Ð9NÐ9N�q˜!�fÐ9NÐ9NÐ9Nr>   zPlugin toolsets (zMCP servers:r³  rµ  r´  z  [include only: r¬  rÎ  z  [excluded: zall tools enabledN)rR   rJ   rØ  r   r   r�  r�  rŽ  r+  r:   rÁ   r½  r]  )r/  r  r7   r¢  r   r6   rZ   rD   ÚstatusÚplugin_entriesÚsrv_namerÆ  rÇ  rµ  r´  rà  s     `            @r<   Ú_print_tools_listrä  ¥  sý  øø€ å8Ñ:Ô:€Mðð ð ð Ø#0ðñ ô €Ið FÐEÕ/DÐEÑEÔE€Lå	Ð
, Ð
,Ð
,Ð
,Ñ-Ô-Ð-Ø%ð Cð CÑˆ��qØ˜Ð%Ð%ØØ8>ÐBRÐ8RÐ8R•%˜¥v¤|Ñ4Ô4Ð4Ý˜^­V¬ZÑ8Ô8ð 	åÐA�6ÐAÐA˜VÐAÐA¥u¨UµF´JÑ'?Ô'?ÐAÐAÑBÔBÐBÐBð PÐOÐOÐO¨IÐOÑOÔO€NØð GÝ‰ŒˆÝÐ. (Ð.Ð.Ð.Ñ/Ô/Ð/Ø+ð 	Gð 	G‰MˆF�EØ<BÐFVÐ<VÐ<V•e˜M­6¬<Ñ8Ô8Ð8Ý  µ´Ñ<Ô<ð åÐE�vÐEÐE ÐEÐE­5°½¼
Ñ+CÔ+CÐEÐEÑFÔFÐFÐFàñ UÝ‰ŒˆÝˆnÑÔÐØ!,×!2Ò!2Ñ!4Ô!4ð 		Uð 		UÑˆH�gØŸš GÑ,Ô,Ð2°ˆIØ—m’m IÑ.Ô.Ð4°"ˆGØ—m’m IÑ.Ô.Ð4°"ˆGØð UÝ˜xÐOÐO¸$¿)º)ÀGÑ:LÔ:LÐOÐOÐOÑPÔPÐPÐPØð UÝ˜xÐaÐaµe¸D¿IºIÀgÑ<NÔ<NÕPVÔP]Ñ6^Ô6^ÐaÐaÐaÑbÔbÐbÐbå˜xÐSÐS­5Ð1DÅfÄjÑ+QÔ+QÐSÐSÑTÔTÐTÐTðUð Uð		Uð 		Ur>   c                 óz  ‡‡‡‡‡— | j         }t          | dd¦  «        Št          ¦   «         }‰t          vr/t	          d‰› dd                     t          ¦  «        › �¦  «         dS |dk    r8t          t          |‰d¬	¦  «        |                     d
¦  «        pi ‰¦  «         dS | j	        }d„ |D ¦   «         }d„ |D ¦   «         }d„ t          D ¦   «         t          ¦   «         z  Šˆfd„|D ¦   «         Š‰r&‰D ]}t	          d|› d�¦  «         Œˆfd„|D ¦   «         }ˆfd„|D ¦   «         Š‰rt‰D ]c}t          t                               |¦  «        pt          ¦   «         ¦  «        }t	          d|› d‰› dd                     |¦  «        › d�¦  «         Œdˆfd„|D ¦   «         }|rt          |‰||¦  «         t          ¦   «         Š|r)t!          |||¦  «        Š‰D ]}t	          d|› d�¦  «         Œt#          |¦  «         ˆˆfd„|D ¦   «         }	|	r3|dk    rdnd}
t%          |
› dd                     |	¦  «        › �¦  «         dS dS )zÁEnable, disable, or list tools for a platform.

    Built-in toolsets use plain names (e.g. ``web``, ``memory``).
    MCP tools use ``server:tool`` notation (e.g. ``github:create_issue``).
    r7   rÚ   zUnknown platform 'z
'. Valid: r¬  NrI   Frý   r  c                 ó   — g | ]}d |v¯|‘Œ	S ©rÖ  rA   r¸  s     r<   r  z0tools_disable_enable_command.<locals>.<listcomp>ã  s   € Ð:Ð:Ð:˜Q¨S¸¨\¨\�q¨\¨\¨\r>   c                 ó   — g | ]}d |v ¯|‘Œ	S rç  rA   r¸  s     r<   r  z0tools_disable_enable_command.<locals>.<listcomp>ä  s   € Ð2Ð2Ð2˜¨°¨¨�1¨¨¨r>   c                 ó   — h | ]\  }}}|’Œ	S rA   rA   rB   s      r<   rE   z/tools_disable_enable_command.<locals>.<setcomp>æ  s   € ÐGÐGÐG¡ ¨¨A�fÐGÐGÐGr>   c                 ó   •— g | ]}|‰v¯|‘Œ	S rA   rA   ©rC   r¹  Úvalid_toolsetss     €r<   r  z0tools_disable_enable_command.<locals>.<listcomp>ç  s#   ø€ ÐNÐNÐN˜a°a¸~Ð6MÐ6M˜Ð6MÐ6MÐ6Mr>   zUnknown toolset 'r±  c                 ó   •— g | ]}|‰v ¯|‘Œ	S rA   rA   rë  s     €r<   r  z0tools_disable_enable_command.<locals>.<listcomp>ë  s#   ø€ ÐMÐMÐM ¸¸nÐ9LÐ9L˜1Ð9LÐ9LÐ9Lr>   c                 ó4   •— g | ]}t          |‰¦  «        °|‘ŒS rA   r  )rC   r¹  r7   s     €r<   r  z0tools_disable_enable_command.<locals>.<listcomp>î  s9   ø€ ð ð ð ØÝ,¨Q°Ñ9Ô9ðØ	ðð ð r>   z	Toolset 'z ' is not available on platform 'z	' (only: r�  c                 ó   •— g | ]}|‰v¯|‘Œ	S rA   rA   )rC   r¹  Úrestricted_targetss     €r<   r  z0tools_disable_enable_command.<locals>.<listcomp>ù  s$   ø€ ÐUÐUÐU ¸ÐBTÐ9TÐ9T˜1Ð9TÐ9TÐ9Tr>   zMCP server 'z' not found in configc                 ó^   •— g | ])}|‰v¯d |vs|                      d ¦  «        d         ‰v¯'|‘Œ*S )rÖ  r   )rØ  )rC   r¹  rÙ  Úunknown_toolsetss     €€r<   r  z0tools_disable_enable_command.<locals>.<listcomp>	  sP   ø€ ð ð ð ØØÐ$Ð$Ð$¨#°Q¨,¨,¸!¿'º'À#¹,¼,Àq¼/ÐQ_Ð:_Ð:_ð 	
Ø:_Ð:_Ð:_r>   rÒ  ÚDisabledÚEnabledr¼  )Útools_actionr´  r   rW   rÙ  r½  rä  ré   r:   ÚnamesrJ   rV   rI  r5   rU   rÔ  rÛ  r	   rÆ   )r’  rÐ  ræ   rÕ  Útoolset_targetsÚmcp_targetsrc   r;   ÚsrvÚ
successfulÚverbrÙ  r7   rð  rò  rì  s              @@@@@r<   Útools_disable_enable_commandrü  Ï  s=  øøøøø€ ð Ô€FÝ�t˜Z¨Ñ/Ô/€HÝ‰]Œ]€Fà•yÐ Ð ÝÐT¨(ÐTÐT¸d¿iºiÍ	Ñ>RÔ>RÐTÐTÑUÔUÐUØˆà�ÒÐÝÕ-¨f°hÐ\aÐbÑbÔbØ Ÿ*š* ]Ñ3Ô3Ð9°r¸8ñ	Eô 	Eð 	Eàˆàœ€GØ:Ð: 'Ð:Ñ:Ô:€OØ2Ð2˜gÐ2Ñ2Ô2€KàGÐGÕ1FÐGÑGÔGÕJbÑJdÔJdÑd€NØNÐNÐNÐN ?ÐNÑNÔNÐØð NØ$ð 	6ð 	6ˆDÝÐ4¨TÐ4Ð4Ð4Ñ5Ô5Ð5Ð5ØMÐMÐMÐM oÐMÑMÔMˆðð ð ð Ø"ðñ ô Ðð ð VØ&ð 	ð 	ˆDÝÕ;×?Ò?ÀÑEÔEÐNÍÉÌÑOÔOˆGÝð0˜Dð 0ð 0À(ð 0ð 0ØŸ)š) GÑ,Ô,ð0ð 0ð 0ñô ð ð ð VÐUÐUÐU oÐUÑUÔUˆàð IÝ˜f h°ÀÑHÔHÐHå"™uœu€NØð DÝ*¨6°;ÀÑGÔGˆØ!ð 	Dð 	DˆCÝÐB¨ÐBÐBÐBÑCÔCÐCÐCå�ÑÔÐðð ð ð ð Øðñ ô €Jð ð ;Ø# yÒ0Ð0ˆzˆz°iˆÝ˜$Ð9Ð9 $§)¢)¨JÑ"7Ô"7Ð9Ð9Ñ:Ô:Ð:Ð:Ð:ð;ð ;r>   r  )TrŸ  )rÚ   )NFN)gÚ__doc__Újsonr|  Úloggingr)  rË   Úpathlibr   Útypingr   r   r   r   Úhermes_cli.configr   r	   r
   r   Úhermes_cli.colorsr   r   Úhermes_cli.nous_subscriptionr   r   Útools.tool_backend_helpersr   r   Úutilsr   Ú	getLoggerÚ__name__rv  Ú__file__ÚparentÚresolver¾   Úhermes_cli.cli_outputr   rÙ  r   rÁ   r   rÆ   r   rÈ   r   rK  rJ   r'  r5   rÄ   Ú__annotations__r÷   r=   rR   rU   rV   Úhermes_cli.platformsrW   Ú_PLATFORMS_REGISTRYr+  rZ  r]  rØ   rå   r  rì   rü   ré   rM  re  rI   rø   rm  rn  rƒ  r¨  r¬  r¸  r[  rÄ  rª  rÞ  rß  rõ  r!  r  r,  r3  r9  r<  rÝ  r«  rl  rh  ro  ri  r©  r‘  rÔ  rÛ  rä  rü  rA   r>   r<   ú<module>r     s×  ðð	ð 	ð 	ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ðð ð ð ð ð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð YÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ #Ð #Ð #Ð #Ð #Ð #à	ˆÔ	˜8Ñ	$Ô	$€àˆt�H‰~Œ~Ô$Ô+×3Ò3Ñ5Ô5€ð
ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð Ð ð8 ^Ð]Ð]Ð ð ˆ{Ø�[ð7ð 7Ð   S¨#¨c¬( ]Ô 3ð ð ñ ð2¨#ð 2¸ð 2Àð 2ð 2ð 2ð 2ðð ð ð4 #ð ð ð ð ð BÐ AÐ AÐ AÐ AÐ Aðð à,Ð&Ô,Ñ.Ô.ðñ ô €	ð !Øð ,Ø'ØGØØ (Ø&*Ø(-Ø&>Ð@PÐ%Qð	ð 	ð -Ø2Ø8ØØ &ðð ð %ØØ,à4Ð@PÐYð  Að  Aðð !)ðð ð "Ø;à)°]ÐKbÐcÐcðð !&ðð ð %ØØ,à0Ð<Pð  ZGð  Hð  Hðð !-ðð ð 0ØØ2à-Ð9JÐSpÐqÐqðð !*ðð ð ,Ø"ØEà,Ð8HÐQyÐzÐzðð !)ðð ð $Ø(ØGØØ +Ø)ðð ð}F
ðJð JðX 'Ø/Ø{Øð ,Ø'ØFØ*ØØ&*Ø(-Ø&9Ð;NÐ%Oð	ð 	ð *Ø*ØAØ*à/Ð;NÐWnÐoÐoððð ð ØØBØ$à)°]ÐK[Ð\Ð\ððð ð #ØØ6Ø)à.Ð:LÐUjÐkÐkððð ð !Ø$ØMØ'à,Ð8HÐQnÐoÐoððð ð 0Ø.ØAØ*à/Ð;vÐwÐwððð ð_8
ð>ð >ð@ #Øð ,Ø'ØQØØ&*Ø(3Ø&/ [Ø$)ð	ð 	ð !ØØYà%°ÐGfÐgÐgðð %*ðð ð
ðð ð4 %Øð @Ø'ØHØØ$1Ø&*Ø(1Ø&;Ð%<Ø-ð
ð 
ð (Ø2Ø=ØØ$+Ø-ðð ð &ØØ?à1Ð=RÐ[tÐuÐuØ4Ð@XÐYÐYðð %2Ø-ð
ð 
ð &ØØ<à1Ð=RÐ[tÐuÐuðð %2Ø-ð	ð 	ð $ØØ<à/Ð;NÐWnÐoÐoðð %0Ø-ð	ð 	ð "Ø(ØBà)Ð5IÐVmØGðIð Iðð %.Ø'ð
ð 
ðg>
ðBð BðH Øð )Ø-à(Ð4\Ð]Ð]Ø&Ð2FÐStÐuÐuððð ð	
ðð ð Øð *Ø>ØØ'ð	ð ð
ðð ð ØØ"ð +Ø-à,Ð8Hð  RCð  Dð  DØ+°ÐOkÐlÐlðð ,ðð ð

ð	ð ðCQð Q€ðl JÐJØIÐJðð Ð ð@J Cð @Jð @Jð @Jð @JðJ  S¤	ð ð ð ð ñ ð  dð °xÀÀSÄ	Ô7Jð ÐVZÐ[^Ð`cÐdgÔ`hÐ[hÔVið ð ð ð ñ ð ¨ð ¸ð ð ð ð ð* )-ð	^ð ^ð ^Øð^àð^ð "&ð	^ð
 	ˆ„Xð^ð ^ð ^ð ^ðB5 ð 5°ð 5ÈCÐPSÌHð 5ð 5ð 5ð 5ñp#>ð #>˜cð #>¨4ð #>¸4ð #>ð #>ð #>ð #>ñPYð Y˜Sð Y¨4ð Y¸#ð YÀcð Yð Yð Yð Yð /3Ð �8˜D  c œNÔ+Ð 2Ð 2Ñ 2ð'˜t C¨ Hœ~ð 'ð 'ð 'ð 'ñT1-ð 1-¨cð 1-¸CÀ¼Hð 1-ÐPSð 1-Ð`cÐdgÔ`hð 1-ð 1-ð 1-ð 1-ðl/˜sð /¨Dð /ð /ð /ð /ð* T¨$¤Zð *ð *ð *ð *ðZ˜Dð ¨$ð °4¸´:ð ð ð ð ð&#1°ð #1¸Tð #1Àdð #1ð #1ð #1ð #1ðLA= Sð A=¨tð A=¸Tð A=ð A=ð A=ð A=ðH5 $ð 5°ð 5¸ð 5ð 5ð 5ð 5ðp	¨Tð 	¸4ð 	ÀCð 	ð 	ð 	ð 	ð2%ð %ð %ð 
ØØ!Ø(ðð ðÐ ð¨ð °Dð À$ð È3ð ð ð ð ð;0¨Cð ;0¸ð ;0À$ð ;0ð ;0ð ;0ð ;0ð|¨3ð ð ð ð ð640°cð 40À4ð 40ÈDð 40ð 40ð 40ð 40ðn	>°3ð 	>Àð 	>Èð 	>ð 	>ð 	>ð 	>ðt, $ð t,°ð t,ð t,ð t,ð t,ðn<*¨3ð <*ð <*ð <*ð <*ð~˜dð ð ð ð ðD"?°#ð "?¸Dð "?È$ð "?ð "?ð "?ð "?ðJ\/ Dð \/°$ð \/ð \/ð \/ð \/ð~,¨Sð ,ð ,ð ,ð ,ñ4jð j¨Dð jÀ$ð jð jð jð jð`}>¨Tð }>ð }>ð }>ð }>ðF4 $ð 4°#ð 4ÀdÈ3Äið 4ÐY\ð 4ñ 4ð 4ð 4ð˜dñ ¨T°#¬Yð Àð ÈÈCÌð ñ ð ð ñ2'Uñ 'U¨ñ 'U¸$ð 'UÈ#ð 'Uñ 'Uð 'Uð 'UñT=;ð =;ð =;ð =;ð =;r>   