§
    øžyj�Ž ã                   ót  — U d Z ddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZmZmZ ddlmZmZmZmZmZ ddlmZmZ ddlmZmZmZmZ ddlmZ dd	lm Z  dd
l!m"Z"m#Z#  ej$        e%¦  «        Z&ddœde'de(fd„Z) e*¦   «         Z+ee,         e-d<    e	e.¦  «        j/        j/         0                    ¦   «         Z1ddl2m3Z4m5Z6m7Z8m9Z:m;Z< g d¢Z=de,de,fd„Z>h d£Z?dhZ@de'fd„ZAde'fd„ZBdhdhdœZCee,ee,         f         e-d<   de,de,de'fd„ZD�d†de,d e,de,fd!„ZEd"„ ZFde*fd#„ZGde,dee,         fd$„ZHdd%lImJZK d&„  eKjL        ¦   «         D ¦   «         ZJd'd(d)d*d+g d,d-œd.d/d0g d1d2d3d4d5gd6œd7d8d9d4d:d;d<œgd1d-œd=d>g d?d@dAœdBd8dCdDdEdFd<œgdGd-œdHd8dIdJdKdLd<œgdMd-œdNdOdPdQdRdSd<œgdTd-œdUdVdWg dXdXdYœdZdVd[g d\d\dYœd]d8d^d_d`dad<œgdbd-œg
dcœdddedfd*dgg dhdidjœd.d/dkg d1d2dd4d5gdlœdmd8dnd4d:d;d<œgd1doœdpdqdrdsdtdud<œgdvdoœdwdxg d?d@dyœdzd8d{dDdEdFd<œgdGdoœd|d8d}d_d`dad<œgdbdoœgdcœd~dd€d�d.d/d‚dƒg d2d„d…d†gd‡œdˆd‰dŠdƒd†d‹dŒœgd�œgdŽœd�d�d.d/d‘g d2d’d“gd”d•œgdcœd–d—d.d/d˜g d2d™d“gd”dšœgdcœd›dœd�dždŸd/d g d@d¡œd¢d8d£d¤d¢d¥d<œgd¦œgdŽœd§d¨d©d*dªg dhd«d¬œd­d/d®g d¯d2d°d±gd²d³œ	d´dµd¶d·d¸d¹dºd»œgd¼d¼d¬œgdcœd½d¾d¿dÀdÁdÂdŒœdÃdÄdÅdÆœgdÇœgdcœdÈdÉdÊdËg dÌdÍœgdcœdÎdÏg dÐ¢dÑdÒdÓg dÔd¡œgdÕœdÖd×dØdÙdÚdÛdÜd<œdÝdÞdÜd<œgdßdÍœdàdádÚdÛdŒœdÝdÞdŒœdâdãdädÆœgdßdÍœgdcœdåœZMdædçgiZNde,fdè„ZOdee,         fdé„ZPdeQfdê„ZRdëd2dìœdíee,         dîe(dïe'fdð„ZSde'fdñ„ZT	 	 	 �d‡dòe'dóe'dôe'de'fdõ„ZUdöZVd÷ZW�dˆdù„ZX�dˆdú„ZY�dˆdû„ZZ�d‰dü„Z[�d‰dý„Z\dþe,de,fdÿ„Z]de'f�d „Z^�de,�de'de'f�d„Z_	 	 	 	 �dŠde,�de'�dee,         �de'de'f
�d„Z`�de,f�d	„Zadee,         f�d
„Zbde(f�d„Zcdee,         f�d„Zd�d‹�deQ�deee,                  dee,ee,         f         f�d„Ze�dŒd e'de'f�d„Zf�deQdee,         f�d„Zg�dee,         de,�de'ddf�d„Zh ei�dh¦  «        Zj�dee,         �deQde,ddf�d„Zkd2�dœ�deQde,�de'dee,         f�d„Zl�deQde,�dee,         f�d„Zm	 �d‹dd�dœde,�deQ�de'�dee         de'f
�d „Zn�d��d!e,�d"eod e(de(f�d#„Zpdaqeee,e(f                  e-�d$<   dee,e(f         f�d%„Zr	 �d†d2�d&œ�d'e,�d(ee,         de,�de'dee,         f
�d)„Zsd2�d&œde,�deQ�de'f�d*„ZtdeoeQ         f�d+„ZudeoeQ         f�d,„ZvdeoeQ         f�d-„Zw�d.e,deof�d/„ZxdeoeQ         f�d0„ZydeoeQ         f�d1„Zzdd�dœ�d2eQ�deQ�de'�dee         deoeQ         f
�d3„Z{d�d&œ�d2eQ�deQ�d4e,�de'de,f
�d5„Z|dÔ�d6„ iZ}eQe-�d7<   �de,de'f�d8„Z~�d9e,de'f�d:„Zde'f�d;„Z€de'f�d<„Z��d=„ �d>„ �d?„ �d@„ �dA„ �dB„ �dC„ �dD„ �dE„ �dFœ	Z‚eQe-�dG<   de'f�dH„Zƒdd�dIœ�dJeQ�deQ�dKee'         de,f�dL„Z„d�d&œde,�deQ�de'de'f�dM„Z…d2�d&œde,�d2eQ�deQ�de'f�dN„Z†d�d&œ�dJeQ�deQ�de'de'f�dO„Z‡d�d&œ�dPeo�deQ�de'de(f�dQ„Zˆ�dR„ Z‰d”�dSd’e‰�dTœiZŠ�dUe,�dVeQ�dWeQde,f�dX„Z‹�dYe,�deQddf�dZ„ZŒ�d[e,f�d\„Z��d[e,�deQddf�d]„ZŽ�d^e,�deQddf�d_„Z��d[e,�deQddf�d`„Z��d[e,f�da„Z‘�d[e,�deQddf�db„Z’g �dc¢g �dd¢g �de¢�df�dgg�dhœZ“dG�dUiZ”�die,�deQddf�dj„Z•d�dkœ�d[e,�deQ�dle'ddf�dm„Z–�dJeQ�deQddf�dn„Z—de,�doe,�deQddf�dp„Z˜d2�d&œ�dJeQ�deQ�de'f�dq„Z™�d‰�dr„Zš�deQ�dseQddf�dt„Z›de,f�du„Zœd2�d&œ�deQ�de'f�dv„Z�de,�deQde'f�dw„Zžd2�d&œde,�d2eQ�deQ�de'f�dx„ZŸd2�d&œ�dJeQ�deQ�de'f�dy„Z de,f�dz„Z¡�dŽ�d{e'�deQf�d|„Z¢�deQf�d}„Z£�deQde,�d~ee,         �de,f�d€„Z¤�deQ�d�ee,         �de,dee,         f�d‚„Z¥�d†�de*�dƒeQde,f�d„„Z¦�d…„ Z§d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)Úcfg_getÚload_configÚsave_configÚget_env_valueÚsave_env_value)ÚColorsÚcolor)Ú!MANAGED_FEATURE_COVERAGE_CATEGORYÚNousSubscriptionFeaturesÚapply_nous_managed_defaultsÚget_nous_subscription_features)Ú&format_nous_portal_entitlement_message)Úfal_key_is_configured)Úbase_url_hostnameÚis_truthy_valueF©Ústreams_to_consoler   Úreturnc                 ó®   — ddl m}  |¦   «         }|sdS | r>	 t          j        � t          j                             ¦   «         rdS n# t
          $ r Y nw xY w|S )un  Win32 creationflags that stop post-setup children flashing a console.

    The dashboard/GUI runs post-setup hooks through a detached, console-less
    ``hermes tools post-setup <key>`` child. On Windows, every console child
    (npm.cmd, npx, pip, powershell, curl) spawned from that console-less
    parent materializes a brand-new console window â€” the "terminal flash"
    users see when clicking "Run setup". ``CREATE_NO_WINDOW`` (via
    :func:`hermes_cli._subprocess_compat.windows_hide_flags`) suppresses it
    without breaking ``capture_output`` â€” unlike ``DETACHED_PROCESS``, stdio
    handles stay inheritable. Returns 0 on POSIX, so passing the result
    unconditionally is safe.

    ``streams_to_console=True`` marks children spawned WITHOUT stdio
    redirection (live installer output, e.g. the verbose cua-driver install).
    Hiding those in an interactive console session would silently swallow
    their output into an invisible console, so the flag is only applied when
    the current process has no usable console of its own (stdout is a
    pipe/log file â€” exactly the GUI-spawn case that flashes).
    r   )Úwindows_hide_flags)Úhermes_cli._subprocess_compatr   ÚsysÚstdoutÚisattyÚ	Exception)r   r   Úflagss      ú=/home/ragecks/.hermes/hermes-agent/hermes_cli/tools_config.pyÚ_post_setup_no_window_flagsr#   (   s…   € ð( AÐ@Ð@Ð@Ð@Ð@àÐÑ Ô €EØð ØˆqØð ð	ÝŒzÐ%­#¬*×*;Ò*;Ñ*=Ô*=Ð%Ø�qøøÝð 	ð 	ð 	ØˆDð	øøøà€Ls   ˜*A Á
AÁAÚ!_warned_invalid_platform_toolsets)Ú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)Úvideou   ðŸŽ¬ Video Analysisz,video_analyze (requires video-capable model))Ú	image_genu   ðŸŽ¨ Image GenerationÚimage_generate)Ú	video_genu   ðŸŽ¬ Video Generationz%video_generate (text/image/reference))Úbflu   ðŸŽ¬ BFL FLUX 3 Videozbfl_flux3_*)Úx_searchu   ðŸ�¦ X (Twitter) Searchz,x_search (requires xAI OAuth or XAI_API_KEY))Úttsu   ðŸ”Š Text-to-SpeechÚtext_to_speech)Ústtu   ðŸŽ™ï¸� Speech-to-Textz9voice transcription (gateway voice messages + voice mode))Úskillsu   ðŸ“š Skillszlist, view, manage)Útodou   ðŸ“‹ Task Planningr<   )Úmemoryu   ðŸ’¾ Memoryz!persistent memory across sessions)Úcontext_engineu   ðŸ§© Context Enginez,runtime tools from the active context engine)Ú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)Ú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)Úyuanbaou   ðŸ¤– Yuanbaozgroup info, member queries, DM)Úcomputer_useu+   ðŸ–±ï¸�  Computer Use (macOS/Windows/Linux)z)background desktop control via cua-driverÚlabelc                 ó  — | pd                      ¦   «         }|s|S |                     dd¦  «        }t          |¦  «        dk    rA|d         r9t          d„ |d         D ¦   «         ¦  «        s|d                               ¦   «         S |S )uá   Strip leading emoji/icons from toolset titles for GUI surfaces.

    Registry labels use ``<emoji> <title>``; plugin toolsets prefix with ``ðŸ”Œ``.
    CLI/TUI keeps the raw ``label`` â€” only HTTP APIs call this helper.
    Ú Né   é   r   c              3   óf   K  — | ],}|                      ¦   «         o|                     ¦   «         V — Œ-d S ©N)ÚisasciiÚisalnum)Ú.0Úchs     r"   ú	<genexpr>z$gui_toolset_label.<locals>.<genexpr>‰   s8   è è € Ð/aÐ/aÐRT°·
²
±´Ð0MÀÇÂÁÄÐ/aÐ/aÐ/aÐ/aÐ/aÐ/aó    )ÚstripÚsplitÚlenÚany)rJ   ÚtextÚpartss      r"   Úgui_toolset_labelr]      s‹   € ð ˆK�R×ÒÑ Ô €DØð ØˆØ�JŠJ�t˜QÑÔ€EÝ
ˆ5�z„z�Q‚€˜5 œ8€­CÐ/aÐ/aÐX]Ð^_ÔX`Ð/aÑ/aÔ/aÑ,aÔ,a€Ø�QŒx�~Š~ÑÔÐØ€KrV   >   Úa2ar2   rF   rE   r7   r5   rG   rD   r:   c                  ó  — 	 ddl m}   | ¦   «          dS # t          $ r Y nw xY w	 ddlm} t           |d¦  «        pd¦  «                             ¦   «         rdS n# t          $ r Y nw xY w	 ddlm} n]# t          $ rP t          t          t          j                             d¦  «        pd¦  «                             ¦   «         ¦  «        cY S w xY wt          t           |d¦  «        pd¦  «                             ¦   «         ¦  «        S )u  Cheap, side-effect-free check for usable xAI credentials.

    Used to auto-enable the ``x_search`` toolset when the user has either
    completed xAI Grok OAuth (SuperGrok / Premium+) or set
    ``XAI_API_KEY``. Does NOT hit the network â€” only inspects the local
    auth store and environment. The tool's runtime ``check_fn`` still
    gates schema registration if creds later expire or get revoked.
    Also reused by ``provider_readiness_status`` for ``post_setup:
    "xai_grok"`` picker rows (xAI TTS, Grok OAuth x_search).
    r   )Ú_read_xai_oauth_tokensT©r   ÚXAI_API_KEYrL   ©Ú
get_secret)Úhermes_cli.authr`   r    Útools.xai_httpr   ÚstrrW   Úagent.secret_scoperd   ÚImportErrorÚboolÚosÚenvironÚget)r`   Ú_xai_get_env_valuerd   s      r"   Ú_xai_credentials_presentro   ¨   sa  € ðØ:Ð:Ð:Ð:Ð:Ð:àÐÑ Ô Ð ØˆtøÝð ð ð ØˆðøøøðØFÐFÐFÐFÐFÐFåÐ!Ð! -Ñ0Ô0Ð6°BÑ7Ô7×=Ò=Ñ?Ô?ð 	Ø�4ð	øåð ð ð ØˆðøøøðFØ1Ð1Ð1Ð1Ð1Ð1Ð1øÝð Fð Fð FÝ•C�œ
Ÿš }Ñ5Ô5Ð;¸Ñ<Ô<×BÒBÑDÔDÑEÔEÐEÐEÐEðFøøøå•�J�J˜}Ñ-Ô-Ð3°Ñ4Ô4×:Ò:Ñ<Ô<Ñ=Ô=Ð=s0   ‚ ”
! !¥2A Á
A'Á&A'Á+A2 Á2ACÃCc                  óŒ   — 	 ddl m}  t           | dd¦  «        pd                     ¦   «         ¦  «        S # t          $ r Y dS w xY w)z=Return whether the active profile has a Home Assistant token.r   rc   Ú
HASS_TOKENrL   F)rh   rd   rj   rW   r    rc   s    r"   Ú"_homeassistant_credentials_presentrr   È   sf   € ðØ1Ð1Ð1Ð1Ð1Ð1å�Z�Z ¨bÑ1Ô1Ð7°R×>Ò>Ñ@Ô@ÑAÔAÐAøÝð ð ð Øˆuˆuðøøøs   ‚25 µ
AÁArF   )rF   rG   Ú_TOOLSET_PLATFORM_RESTRICTIONSÚts_keyÚplatformc                 ó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)rs   rm   )rt   ru   Úalloweds      r"   Ú_toolset_allowed_for_platformrx   Þ   s+   € õ
 -×0Ò0°Ñ8Ô8€GØ�dˆ?Ð1˜h¨'Ð1Ð1rV   ÚcliÚdefaultc                 óp   — t                                | ¦  «        }|r||v r|S t          |¦  «        d         S )ad  Return the platform a platform-less configuration UI should target.

    Most configurable toolsets retain the historical desktop/CLI target. A
    toolset restricted away from that platform must instead be configured on
    one of its supported platforms; otherwise the shared save helper correctly
    drops it and the UI reports a successful no-op.
    r   )rs   rm   Úsorted)rt   rz   rw   s      r"   Ú_toolset_configuration_platformr}   ç   s?   € õ -×0Ò0°Ñ8Ô8€GØð �g Ð(Ð(ØˆÝ�'‰?Œ?˜1ÔÐrV   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 © r€   ©rS   rt   Ú_s      r"   ú	<setcomp>z7_get_effective_configurable_toolsets.<locals>.<setcomp>  s   € Ð.Ð.Ð.‘|�v˜q !ˆFÐ.Ð.Ð.rV   r   ©Údiscover_pluginsÚget_plugin_toolsets)ÚlistÚCONFIGURABLE_TOOLSETSÚhermes_cli.pluginsr…   r†   ÚaddÚappendr    )ÚresultÚseenr…   r†   Úentrys        r"   Ú$_get_effective_configurable_toolsetsr�   õ   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   r„   c                 ó   — h | ]\  }}}|’Œ	S r€   r€   r�   s      r"   rƒ   z+_get_plugin_toolset_keys.<locals>.<setcomp>  s   € ÐAÐAÐA™<˜6 1 a�ÐAÐAÐArV   )r‰   r…   r†   r    Úsetr„   s     r"   Ú_get_plugin_toolset_keysr“     st   € ðØLÐLÐLÐLÐLÐLÐLÐLØÐÑÔÐØAÐAÐ+>Ð+>Ñ+@Ô+@ÐAÑAÔAÐAøÝð ð ð Ý‰uŒuˆˆˆðøøøs   ‚%( ¨AÁAc                 ó8   ‡ — ˆ fd„t          ¦   «         D ¦   «         S )u™  Return the toolset keys the ``hermes tools`` checklist actually offers
    for ``platform``.

    This mirrors exactly what ``_prompt_toolset_checklist`` renders:
    ``_get_effective_configurable_toolsets()`` (built-in + plugin toolsets),
    filtered by ``_toolset_allowed_for_platform``. The checklist's returned
    selection can therefore only ever be a subset of this universe.

    Non-configurable toolsets that ``_get_platform_tools`` resolves at read
    time â€” ``kanban`` and other check_fn-gated toolsets, recovered platform
    composites, MCP server names â€” are NOT in this set because the checklist
    never shows them. Use this to scope the added/removed diff the UI prints,
    so ``hermes tools`` never claims to add or remove a toolset the user was
    never given a checkbox for. The underlying config is unaffected â€” those
    entries are preserved by ``_save_platform_tools`` regardless.
    c                 óN   •— h | ]!\  }}}t          |‰¦  «        r|t          v¯|’Œ"S r€   ©rx   Ú_CONFIG_ONLY_TOOLSETS)rS   rt   r‚   ru   s      €r"   rƒ   z*_checklist_toolset_keys.<locals>.<setcomp>*  sK   ø€ ð ð ð áˆF�A�qÝ(¨°Ñ:Ô:ðð Õ/Ð/Ð/ð 	ð 0Ð/Ð/rV   )r�   )ru   s   `r"   Ú_checklist_toolset_keysr˜     s4   ø€ ð"ð ð ð å@ÑBÔBðñ ô ð rV   )Ú	PLATFORMSc                 ó4   — i | ]\  }}||j         |j        d œ“ŒS )©rJ   Údefault_toolsetr›   )rS   ÚkÚinfos      r"   ú
<dictcomp>rŸ   6  s;   € ð ð ð áˆˆ4ð �”°Ô0DÐEÐEðð ð rV   úText-to-Speechu   ðŸ”ŠzMicrosoft Edge TTSu   â˜… recommended Â· freezGood quality, no API key neededÚedge)ÚnameÚbadgeÚtagÚenv_varsÚtts_providerúNous SubscriptionÚsubscriptionz.Managed OpenAI TTS billed to your subscriptionÚopenaiTr8   ÚVOICE_TOOLS_OPENAI_KEYÚOPENAI_API_KEY)r¢   r£   r¤   r¥   r¦   Úrequires_nous_authÚmanaged_nous_featureÚoverride_env_varsz
OpenAI TTSÚpaidzHigh quality voiceszOpenAI API keyz$https://platform.openai.com/api-keys)Úkeyr)   ÚurlzxAI TTSu2   Grok voices â€” uses xAI Grok OAuth or XAI_API_KEYÚxaiÚxai_grok)r¢   r¤   r¥   r¦   Ú
post_setupÚ
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)r¢   r£   r¤   r¥   r¦   r´   ÚPiperz0Local neural TTS, 44 languages (voices ~20-90MB)ÚpiperzDeepInfra TTSuB   Chatterbox, Qwen3-TTS, â€¦ â€” live catalog from api.deepinfra.comÚDEEPINFRA_API_KEYzDeepInfra API keyz#https://deepinfra.com/dash/api_keysÚ	deepinfra)r¢   ÚiconÚ	providerszSpeech-to-Textu   ðŸŽ™ï¸�zLocal Whisperz$faster-whisper on-device, no API keyÚlocalÚfaster_whisper)r¢   r£   r¤   r¥   Ústt_providerr´   z8Managed OpenAI transcription billed to your subscription)r¢   r£   r¤   r¥   rÇ   r¬   r­   r®   ÚOpenAIz,whisper-1, gpt-4o-transcribe, gpt-transcribe)r¢   r£   r¤   r¥   rÇ   ÚGroqz	free tieru%   Whisper large-v3 family â€” very fastÚGROQ_API_KEYzGroq API keyzhttps://console.groq.com/keysÚgroqÚxAIu/   grok-stt â€” uses xAI Grok OAuth or XAI_API_KEY)r¢   r¤   r¥   rÇ   r´   zElevenLabs Scribeu/   scribe_v2 â€” diarization + audio-event taggingÚ	DeepInfraz'Live STT catalog from api.deepinfra.comú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)r¢   r£   r¤   Úweb_backendr¥   r¬   r­   r®   zFirecrawl Self-Hostedu   free Â· self-hostedz(Run your own Firecrawl instance (Docker)z9Your Firecrawl instance URL (e.g., http://localhost:3002))r°   r)   )r¢   r£   r¤   rÒ   r¥   )r¢   Úsetup_titleÚ
setup_noterÃ   rÄ   úImage Generationu   ðŸŽ¨z8Managed FAL image generation billed to your subscriptionr3   ÚFAL_KEYÚfal)r¢   r£   r¤   r¥   r¬   r­   r®   Úimagegen_backendúVideo Generationu   ðŸŽ¬z8Managed FAL video generation billed to your subscriptionr5   )r¢   r£   r¤   r¥   r¬   r­   r®   Úvideo_gen_plugin_namezX (Twitter) SearchzSelect xAI Credential Sourceu„  Hermes routes X searches through xAI's built-in x_search Responses tool for read-only public X discovery. Use the xurl skill for authenticated X API reads and account actions. Both credential sources hit the same https://api.x.ai/v1/responses endpoint â€” pick whichever you already have. SuperGrok OAuth is preferred when both are set (uses your subscription quota instead of API spend).u   ðŸ�¦z%xAI Grok OAuth (SuperGrok / Premium+)u6   Browser login at accounts.x.ai â€” no API key required)r¢   r£   r¤   r¥   r´   zxAI API keyz&Direct xAI API billing via XAI_API_KEYrb   zhttps://console.x.ai/)r¢   r£   r¤   r¥   úBrowser Automationu   ðŸŒ�zLocal Browserz$Headless Chromium, no API key neededÚagent_browser)r¢   r£   r¤   r¥   Úbrowser_providerr´   z%Nous Subscription (Browser Use cloud)z/Managed Browser Use billed to your subscriptionzbrowser-user+   ÚBROWSER_USE_API_KEYÚbrowserbase)	r¢   r£   r¤   r¥   rÝ   r¬   r­   r®   r´   ÚCamofoxu   free Â· localz)Anti-detection browser (Firefox/Camoufox)ÚCAMOFOX_URLzCamofox server URLzhttp://localhost:9377z)https://github.com/jo-inc/camofox-browser)r°   r)   rz   r±   Úcamofoxz
Smart Homeu   ðŸ� zHome AssistantzREST API integrationrq   z&Home Assistant Long-Lived Access TokenÚHASS_URLzHome Assistant URLzhttp://homeassistant.local:8123)r°   r)   rz   )r¢   r¤   r¥   ÚSpotifyu   ðŸŽµzSpotify Web APIu%   PKCE OAuth â€” opens the setup wizardrE   )r¢   r¤   r¥   r´   z"Computer Use (macOS/Windows/Linux)u   ðŸ–±ï¸�)ÚdarwinÚwin32Úlinuxzcua-driver (background)u    â˜… recommended Â· free Â· localue   Background computer-use via cua-driver â€” does NOT steal your cursor or focus. Works with any model.Ú
cua_driver)r¢   rÃ   Úplatform_gaterÄ   zLangfuse Observabilityu   ðŸ“ŠzLangfuse Cloudz$Hosted Langfuse (cloud.langfuse.com)ÚHERMES_LANGFUSE_PUBLIC_KEYzLangfuse public key (pk-lf-...)zhttps://cloud.langfuse.comÚHERMES_LANGFUSE_SECRET_KEYzLangfuse secret key (sk-lf-...)ÚlangfusezLangfuse Self-HostedzSelf-hosted Langfuse instanceÚHERMES_LANGFUSE_BASE_URLz0Langfuse server URL (e.g. http://localhost:3000)zhttp://localhost:3000)r8   r:   r*   r3   r5   r7   r+   rD   rE   rI   rì   r0   )ÚOPENROUTER_API_KEYzhttps://openrouter.ai/keysc                  ój   — t           j                             dd¦  «                             ¦   «         pdS )zDReturn the configured cua-driver override, or the bare default name.ÚHERMES_CUA_DRIVER_CMDrL   z
cua-driver)rk   rl   rm   rW   r€   rV   r"   Ú_cua_driver_cmdrñ   ó  s*   € åŒ:�>Š>Ð1°2Ñ6Ô6×<Ò<Ñ>Ô>ÐNÀ,ÐNrV   c                  ó"   — ddl m}   | ¦   «         S )z@Resolve cua-driver exactly as the runtime and Desktop status do.r   ©Úresolve_cua_driver_cmd)Útools.computer_use.cua_backendrô   ró   s    r"   Ú_resolved_cua_driver_cmdrö   ø  s#   € àEÐEÐEÐEÐEÐEà!Ð!Ñ#Ô#Ð#rV   c                  óv   — 	 ddl m}   | ¦   «         S # t          $ r t          t          j        ¦  «        cY S w xY w)aY  cua-driver child env with the Hermes telemetry policy applied.

    Delegates to ``cua_backend.cua_driver_child_env`` (telemetry disabled by
    default; user opt-in via ``computer_use.cua_telemetry``). Falls back to the
    current environment if the helper can't be imported, so install/status
    never break on a telemetry-helper error.
    r   ©Úcua_driver_child_env)rõ   rù   r    Údictrk   rl   rø   s    r"   Ú_cua_driver_envrû   ÿ  sY   € ð ØGÐGÐGÐGÐGÐGà#Ð#Ñ%Ô%Ð%øÝð  ð  ð  Ý•B”JÑÔÐÐÐð øøøs   ‚ ’#8·8é,  )ÚtimeoutÚcapture_outputÚargsrý   rþ   c                ó   — t          t          j        ¦  «        j        j        }i t          j        ¥dt          |¦  «        i¥}ddlm}  |¦   «         }|r[	 t          j
        |ddg| ¢|ddd||t          | ¬	¦  «        ¬
¦  «        }|j        dk    r|S n# t          j        t          f$ r Y nw xY wt          j        ddg}	 t          j
        |dgz   dddddt          ¦   «         ¬¦  «        }	|	j        dk    rt          d¦  «        ‚nš# t          j        t          f$ r� 	 t          j
        t          j        ddddgddddddt          ¦   «         ¬¦  «         nE# t          j        t          j        f$ r'}
t          j        |ddd|
› �¬¦  «        cY d}
~
cY S d}
~
ww xY wY nw xY wt          j
        |dg| ¢z   |ddd|t          | ¬	¦  «        ¬¦  «        S )u÷  Install Python packages from a post-setup hook.

    Strategy (in order):
    1. ``uv pip install`` if uv is on PATH â€” fast, doesn't need pip in the venv.
    2. ``python -m pip install`` â€” works on stdlib venvs.
    3. ``python -m ensurepip --upgrade`` then retry pip â€” covers ``uv venv``
       which creates a venv WITHOUT pip.

    Why this exists: the Windows installer creates the venv via ``uv venv``,
    which doesn't seed pip. Post-setup hooks that shelled out to
    ``[sys.executable, '-m', 'pip', 'install', ...]`` failed with
    ``No module named pip`` on every fresh install. uv-first sidesteps that.

    Returns the ``subprocess.CompletedProcess`` from whichever tier succeeded
    (or the last failure for the caller to inspect).
    ÚVIRTUAL_ENVr   )Ú	ensure_uvÚpipÚinstallTúutf-8Úreplacer   ©rþ   r[   ÚencodingÚerrorsrý   ÚenvÚcreationflagsz-mú	--versioné   )rþ   r[   r  r	  rý   r  zpip not in venvÚ	ensurepipz	--upgradez--default-pipéx   )rþ   r[   r  r	  rý   Úcheckr  rM   rL   z(pip not available and ensurepip failed: )Ú
returncoder   ÚstderrN)r   r   Ú
executableÚparentrk   rl   rg   Úhermes_cli.managed_uvr  Ú
subprocessÚrunr#   r  ÚTimeoutExpiredÚFileNotFoundErrorÚCalledProcessErrorÚCompletedProcess)rÿ   rý   rþ   Ú	venv_rootÚuv_envr  Úuv_binrŒ   Úpip_cmdÚprobeÚes              r"   Ú_pip_installr"    s¤  € õ, •S”^Ñ$Ô$Ô+Ô2€IØ:•”
Ð:˜M­3¨y©>¬>Ð:Ð:€Fð 0Ð/Ð/Ð/Ð/Ð/àˆY‰[Œ[€FØð ð	Ý”^Ø˜ 	Ð1¨DÐ1Ø-°DÀ7ÐS\ÐfmØÝ9Ø+9Ð'9ðñ ô ð	ñ ô ˆFð Ô  AÒ%Ð%Ø�ð &øõ Ô)Õ+<Ð=ð 	ð 	ð 	ØˆDð	øøøõ Œ~˜t UÐ+€Gðå”Ø�{�mÑ#Ø d°WÀYÐXZÝ5Ñ7Ô7ð
ñ 
ô 
ˆð
 Ô˜qÒ Ð Ý#Ð$5Ñ6Ô6Ð6ð !øåÔ%Õ'8Ð9ð ð ð ð	ÝŒNÝ”  {°KÀÐQØ#¨$¸ÈÐ\_ÐgkÝ9Ñ;Ô;ðñ ô ð ð øõ
 Ô-­zÔ/HÐIð 	ð 	ð 	åÔ.Ø A¨bØEÀ!ÐEÐEðñ ô ð ð ð ð ð ð ð ð øøøøð	øøøðð ðøøøõ Œ>Ø�9Ð$˜tÐ$Ñ$Ø%¨D¸7È9Ð^eÝ1Ø#1Ð1ð
ñ 
ô 
ðñ ô ð sU   Á<B ÂB-Â,B-Ã AD ÄFÄ7EÅFÅFÅ0FÆ
FÆFÆFÆFÆFc                  óÎ   — t           j        dk    rdS d} 	 t          j                             | ¦  «        sdS t          j        | t          j        ¦  «        S # t          $ r Y dS w xY w)zFReturn whether the upstream installer can write its app bundle target.rå   Tz/Applications)r   ru   rk   ÚpathÚisdirÚaccessÚW_OKr    )Úapplications_dirs    r"   Ú_cua_install_target_writabler)    sr   € å
„|�xÒÐØˆtØ&ÐðÝŒw�}Š}Ð-Ñ.Ô.ð 	Ø�4ÝŒyÐ)­2¬7Ñ3Ô3Ð3øÝð ð ð Øˆtˆtðøøøs   –A ·A Á
A$Á#A$ÚupgradeÚrequire_confirmed_updateÚshow_installer_progressc                 ó¬  — ddl }ddl}ddl}|                     ¦   «         }|dvr| rdS t	          d¦  «         dS |dk    }|dk    }|rdnd	}	t          ¦   «         }
t          ¦   «         }|st| srt          ¦   «         s t          d
¦  «         t          d¦  «         dS  |j	        |	¦  «        s$t	          d|	› d�¦  «         t          d¦  «         dS t          d¬¦  «        S |ré| sç	  |j        |dgdddddt          ¦   «         t          ¦   «         ¬¦  «        j                             ¦   «         }t!          d|
› d|pd› �¦  «         n## t"          $ r t!          d|
› d�¦  «         Y nw xY w|rt          d¦  «         t          d¦  «         n?|rt	          d¦  «         n-t          d¦  «         t          d¦  «         t          d¦  «         dS t          ¦   «         s-t          d ¦  «         t          d!¦  «         t%          |¦  «        S  |j	        |	¦  «        s"t	          d|	› d"�¦  «         t%          |¦  «        S d}|�rd}	 dd#lm}  |¦   «         }n# t"          $ r d}Y nw xY w|�B|                     d$¦  «        s-t!          d|
› d%|                     d&¦  «        pd'› d(�¦  «         dS |€&|r$t          d)|
› d*�¦  «         t          d+¦  «         dS |�z|                     d$¦  «        reddl}t/          |                     d,¦  «        pd-¦  «                             ¦   «                              d.¦  «        }|                     d/|¦  «        r|}|r]	  |j        |dgdddddt          ¦   «         t          ¦   «         ¬¦  «        j                             ¦   «         }n# t"          $ r d-}Y nw xY wd-}t          d0d||¬1¦  «        }|r•|r“	  |j        |dgdddddt          ¦   «         t          ¦   «         ¬¦  «        j                             ¦   «         }|r||k    rt!          d|
› d2|› d3|› �¦  «         n|rt          d|
› d4|› �¦  «         n# t"          $ r Y nw xY w|S )5us  Install or refresh the cua-driver binary used by Computer Use.

    The upstream installer always pulls the latest release tag, so re-running
    it is the canonical way to upgrade. We expose two modes:

    * ``upgrade=False`` â€” original post-setup behaviour: skip if already
      installed, install otherwise. Used by the toolset enable flow where
      we don't want to surprise the user with a network fetch.
    * ``upgrade=True`` â€” always re-run the installer (or call ``cua-driver
      update`` if the binary supports it). Used by ``hermes update`` and
      by ``hermes computer-use install --upgrade``.

    ``require_confirmed_update`` (only meaningful with ``upgrade=True`` and
    an installed binary): when the driver's native ``check-update`` verb
    can't positively confirm that a newer release exists â€” the driver is
    too old for the verb, the GitHub check failed, we're offline, or the
    probe timed out â€” keep the installed version and return instead of
    falling through to the full upstream installer. ``hermes update`` sets
    this so a broken update check costs seconds, not a multi-minute silent
    reinstall on every update (the upstream installer runs up to
    ``_CUA_INSTALLER_TIMEOUT`` and install.ps1's concurrency lock can add
    a further ~600s wait on Windows). ``hermes computer-use install
    --upgrade`` leaves it False â€” an explicit upgrade request should still
    reinstall when the check is indeterminate.

    ``show_installer_progress`` controls the installer's own progress line.
    ``hermes update`` already prints a contextual line before its update
    check, so it disables this to avoid printing the refresh twice.

    Returns True iff cua-driver is installed (or successfully refreshed)
    when the function returns. Supported on macOS, Windows, and Linux
    (Linux is alpha). Silently returns False on unsupported platforms.
    r   N)ÚDarwinÚWindowsÚLinuxFzH    Computer Use (cua-driver) is unsupported on this platform; skipping.r/  r0  Ú
powershellÚcurlz?    /Applications is not writable; skipping cua-driver install.z=    Run from an admin account or install cua-driver manually.ú    u     not found â€” install manually:zG      https://github.com/trycua/cua/blob/main/libs/cua-driver/README.mdÚ
Installing)rJ   r  Tr  r  é   r  z already installed: zunknown versionz already installed.ú@    cua-driver may spawn a UIAccess worker (cua-driver-uia.exe);ú:    Windows/SmartScreen may prompt the first time it runs.ú    Linux support is alpha.z,    Grant macOS permissions if not done yet:ú:      System Settings > Privacy & Security > Accessibilityú=      System Settings > Privacy & Security > Screen Recordingz?    /Applications is not writable; skipping cua-driver refresh.zS    Run `hermes computer-use install --upgrade` from an admin account to update it.u)    not found â€” cannot refresh cua-driver.)Úcua_driver_update_checkÚupdate_availablez# is already on the latest release (Úcurrent_versionÚunknownú).z    Could not confirm a newer z\ release (offline, rate-limited, or driver too old to check); keeping the installed version.z?    Force a refresh with: hermes computer-use install --upgradeÚlatest_versionrL   ÚvVz\d+(\.\d+)*Ú
Refreshing)rJ   ÚverboseÚpin_versionÚshow_progressz upgraded: u    â†’ z up to date: )ru   Úshutilr  ÚsystemÚ_print_warningrñ   rö   r)  Ú_print_infoÚwhichÚ_run_cua_driver_installerr  rû   r#   r   rW   Ú_print_successr    rj   rõ   r;  rm   Úrerg   ÚlstripÚ	fullmatch)r*  r+  r,  Ú_platrF  r  rG  Ú
is_windowsÚis_linuxÚ
fetch_toolÚ
driver_cmdÚbinaryÚversionÚconfirmed_versionÚ_stater;  Ú_reÚ_latestÚbeforeÚokÚafters                        r"   Úinstall_cua_driverr^  Œ  s<  € ðL ÐÐÐØ€M€M€MØÐÐÐà�\Š\‰^Œ^€FØÐ3Ð3Ð3Øð 	ð �5ÝÐaÑbÔbÐbØˆuà˜9Ò$€JØ˜Ò €Hð ",Ð7��°€Jå Ñ"Ô"€JÝ%Ñ'Ô'€Fð ð =˜'ð =Ý+Ñ-Ô-ð 	ÝØQñô ð õ ØOñô ð ð �5ØˆvŒ|˜JÑ'Ô'ð 	ÝÐN *ÐNÐNÐNÑOÔOÐOÝÐaÑbÔbÐbØ�5õ )¨|Ð<Ñ<Ô<Ð<ð ð �gð ð	CØ$�j”nØ˜Ð%Ø#¨$¸ÈÐ\]ÕcrÑctÔctÝ9Ñ;Ô;ðñ ô ô —U’U‘W”Wð	 õ
 Ð` *Ð`Ð`À'ÐB^ÐM^Ð`Ð`ÑaÔaÐaÐaøÝð 	Cð 	Cð 	CÝÐA *ÐAÐAÐAÑBÔBÐBÐBÐBð	Cøøøàð 	YÝÐZÑ[Ô[Ð[ÝÐTÑUÔUÐUÐUØð 	YÝÐ8Ñ9Ô9Ð9Ð9åÐFÑGÔGÐGÝÐTÑUÔUÐUÝÐWÑXÔXÐXØˆtõ (Ñ)Ô)ð ÝØMñ	
ô 	
ð 	
õ 	Øañ	
ô 	
ð 	
õ �F‰|Œ|Ðàˆ6Œ<˜
Ñ#Ô#ð ÝÐS˜jÐSÐSÐSÑTÔTÐTÝ�F‰|Œ|Ðð ÐØñ #,Øˆð	ØNÐNÐNÐNÐNÐNØ,Ð,Ñ.Ô.ˆFˆFøÝð 	ð 	ð 	ØˆFˆFˆFð	øøøàÐ f§j¢jÐ1CÑ&DÔ&DÐÝðC�zð Cð CØ—J’JÐ0Ñ1Ô1Ð>°YðCð Cð Cñô ð ð �4Øˆ>Ð6ˆ>Ýð1°ð 1ð 1ð 1ñô ð õ
 ØQñô ð ð �4ØÐ &§*¢*Ð-?Ñ"@Ô"@Ðð ÐÐÐå˜&Ÿ*š*Ð%5Ñ6Ô6Ð<¸"Ñ=Ô=×CÒCÑEÔE×LÒLÈTÑRÔRˆGØ�}Š}˜^¨WÑ5Ô5ð ,Ø$+Ð!àð ð	Ø#�Z”^Ø˜Ð%Ø#¨$¸ÈÐ\]ÕcrÑctÔctÝ9Ñ;Ô;ðñ ô ô —U’U‘W”Wð	 ˆFøõ
 ð 	ð 	ð 	ØˆFˆFˆFð	øøøð ˆå	"ØØØ%Ø-ð	
ñ 
ô 
€Bð 
ð ˆfð ð	Ø"�J”NØ˜Ð%Ø#¨$¸ÈÐ\]ÕcrÑctÔctÝ9Ñ;Ô;ðñ ô ô —U’U‘W”Wð	 ð
 ð E˜ &š˜ÝÐQ jÐQÐQ¸VÐQÐQÈ%ÐQÐQÑRÔRÐRÐRØð EÝÐC :ÐCÐC¸EÐCÐCÑDÔDÐDøøÝð 	ð 	ð 	ØˆDð	øøøà€IsK   Ã#A E ÅE$Å#E$È>I ÉIÉIÍA	N ÎN%Î$N%ÏBQ Ñ
QÑQi”  éX  r   c                  ó    — t          t          j                             d¦  «        p"t	          t          j        ¦   «         dz  ¦  «        ¦  «        S )zAPackage home shared by the upstream POSIX and Windows installers.ÚCUA_DRIVER_RS_HOMEz.cua-driver)r   rk   rl   rm   rg   Úhomer€   rV   r"   Ú_cua_install_homerc  f  sA   € åÝ
Œ
�ŠÐ+Ñ,Ô,ð 	,Ý�tŒy‰{Œ{˜]Ñ*Ñ+Ô+ñô ð rV   c                  ó*   — t          ¦   «         dz  dz  S )z=Path of the upstream installer's concurrent-install lock dir.Úpackagesz.install.lock.d©rc  r€   rV   r"   Ú_cua_install_lock_dirrg  n  s   € åÑÔ Ñ+Ð.?Ñ?Ð?rV   c                  ó$   — t          ¦   «         dz  S )z0Path of install.ps1's FileShare::None lock file.zinstall.lockrf  r€   rV   r"   Ú_cua_windows_install_lock_fileri  s  s   € åÑÔ Ñ/Ð/rV   c            	      óú  — t          ¦   «         } 	 |                      ¦   «         sdS ddl}ddlm} d}d}d}d}d}d	}|                     d
d¬¦  «        }	|	j        }
|j        |j        |j        |j        |j        |j        |j	        g|
_
        |j	        |
_        |	j        }|j	        g|_
        |j        |_         |
t          | ¦  «        ||z  |z  dd|||z  d¦  «        }| 	                    d¦  «        j        }||k    r0t                                d| |                     ¦   «         ¦  «         dS  ||¦  «        s0t                                d| |                     ¦   «         ¦  «         dS |                      ¦   «         rt                                d| ¦  «         dS t                                d| ¦  «         t+          d| › d�¦  «         dS # t,          $ r&}t                                d|¦  «         Y d}~dS d}~ww xY w)a¸  Delete install.ps1's lock file only when no process still holds it.

    ``install.ps1`` serializes installs with a ``FileStream`` opened using
    ``FileShare::None``. Mirror that primitive with a zero-share
    ``CreateFileW`` probe. ``FILE_FLAG_DELETE_ON_CLOSE`` removes an unlocked
    leftover atomically when the probe handle closes, avoiding a gap where a
    new installer could acquire the file between our probe and deletion.
    Nr   )Úwintypesi   l        i   @é   é€   i   Úkernel32T)Úuse_last_erroréÿÿÿÿzOWindows cua install lock at %s is still held or cannot be removed (winerror %s)zBcould not close Windows cua install lock probe at %s (winerror %s)z7Windows cua install lock probe succeeded but %s remainsz3Cleared stale Windows cua-driver install lock at %sú+    Cleared stale cua-driver install lock (r?  z/stale Windows cua install lock check failed: %s)ri  Úis_fileÚctypesrk  ÚWinDLLÚCreateFileWÚLPCWSTRÚDWORDÚLPVOIDÚHANDLEÚargtypesÚrestypeÚCloseHandleÚBOOLrg   ÚvalueÚloggerÚdebugÚget_last_errorÚexistsrž   rI  r    )Ú	lock_fileÚ_ctypesÚ	_wintypesÚdelete_accessÚgeneric_readÚgeneric_writeÚopen_existingÚfile_attribute_normalÚfile_flag_delete_on_closern  Úcreate_fileÚclose_handleÚhandleÚinvalid_handler!  s                  r"   Ú%_clear_stale_windows_cua_install_lockr�  x  sx  € õ /Ñ0Ô0€IðDKØ× Ò Ñ"Ô"ð 	ØˆFà Ð Ð Ð Ø0Ð0Ð0Ð0Ð0Ð0ð #ˆØ!ˆØ"ˆØˆØ *ÐØ$.Ð!à—>’> *¸T�>ÑBÔBˆØÔ*ˆàÔØŒOØŒOØÔØŒOØŒOØÔð 
ˆÔð (Ô.ˆÔØÔ+ˆØ!*Ô!1Ð 2ˆÔØ(œ~ˆÔà�Ý�	‰NŒNØ˜=Ñ(¨=Ñ8ØØØØ!Ð$=Ñ=Øñ
ô 
ˆð #×)Ò)¨"Ñ-Ô-Ô3ˆØ�^Ò#Ð#Ý�LŠLð(àØ×&Ò&Ñ(Ô(ñ	ô ð ð ˆFàˆ|˜FÑ#Ô#ð 	Ý�LŠLð àØ×&Ò&Ñ(Ô(ñ	ô ð ð ˆFØ×ÒÑÔð 	Ý�LŠLØIØñô ð ð ˆFå�ŠÐIÈ9ÑUÔUÐUÝÐOÀ)ÐOÐOÐOÑPÔPÐPÐPÐPøÝð Kð Kð KÝ�ŠÐFÈÑJÔJÐJÐJÐJÐJÐJÐJÐJøøøøðKøøøs/   �G
 ¦DG
 Ä.9G
 Å)/G
 Æ.G
 Ç

G:ÇG5Ç5G:c                  óØ  — t           j        dk    rt          ¦   «          dS t          ¦   «         } 	 |                      ¦   «         sdS d}| dz  }	 |                     dd¬¦  «                             ¦   «         D ]T}|                     d¦  «        r=t          | 	                    dd	¦  «        d	          
                    ¦   «         ¦  «        } nŒUn# t          t          f$ r d}Y nw xY w|�4	 t          j        |d
¦  «         dS # t          $ r Y nbt           $ r Y dS w xY wd
dl}	 |                     ¦   «         |                      ¦   «         j        z
  }n# t          $ r Y dS w xY w|t(          k     rdS d
dl}|                     | d¬¦  «         t.                               d| ¦  «         t3          d| › d�¦  «         dS # t4          $ r&}t.                               d|¦  «         Y d}~dS d}~ww xY w)a’  Best-effort: remove a stale installer lock left by a dead holder.

    The POSIX installer stamps its holder pid into
    ``~/.cua-driver/packages/.install.lock.d/info``. The Windows installer
    instead holds ``~/.cua-driver/install.lock`` open with
    ``FileShare::None``. Clear either artifact up front only when its
    platform-specific liveness check proves that no install still holds it.
    ræ   Nrž   r  r  )r  r	  zpid=Ú=rM   r   T)Úignore_errorsz+Cleared stale cua-driver install lock at %srq  r?  z'stale cua install lock check failed: %s)r   ru   r�  rg  Úis_dirÚ	read_textÚ
splitlinesÚ
startswithÚintrX   rW   ÚOSErrorÚ
ValueErrorrk   ÚkillÚProcessLookupErrorÚPermissionErrorÚtimeÚstatÚst_mtimeÚ_CUA_LOCK_STALE_AFTERrF  Úrmtreer  rž   rI  r    r€  )Úlock_dirÚ
holder_pidrž   ÚlineÚ_timeÚageÚ_shutilr!  s           r"   Ú_clear_stale_cua_install_lockr©  É  sb  € õ „|�wÒÐÝ-Ñ/Ô/Ð/ØˆÝ$Ñ&Ô&€Hð'CØ�ŠÑ Ô ð 	ØˆFØˆ
Ø˜&Ñ ˆð	ØŸš°À	˜ÑJÔJ×UÒUÑWÔWð ð �Ø—?’? 6Ñ*Ô*ð Ý!$ T§Z¢Z°°QÑ%7Ô%7¸Ô%:×%@Ò%@Ñ%BÔ%BÑ!CÔ!C�JØ�Eðøøõ �Ð$ð 	ð 	ð 	ØˆJˆJˆJð	øøøð Ð!ðÝ”˜
 AÑ&Ô&Ð&à�øÝ%ð ð ð Ø�Ý"ð ð ð à��ðøøøð !Ð Ð Ð ðØ—j’j‘l”l X§]¢]¡_¤_Ô%=Ñ=��øÝð ð ð Ø��ðøøøàÕ*Ò*Ð*Ø�à Ð Ð Ð Ø�Š�x¨tˆÑ4Ô4Ð4Ý�ŠÐAÀ8ÑLÔLÐLÝÐNÀ(ÐNÐNÐNÑOÔOÐOÐOÐOøÝð Cð Cð CÝ�ŠÐ>ÀÑBÔBÐBÐBÐBÐBÐBÐBÐBøøøøðCøøøs—   °F9 ÁF9 ÁA>C ÃF9 ÃC#Ã F9 Ã"C#Ã#F9 Ã)D  Ä 
DÄ
F9 Ä	DÄF9 ÄDÄF9 Ä!.E ÅF9 Å
EÅF9 ÅEÅF9 Å.A	F9 Æ9
G)ÇG$Ç$G)r~  c                 ó:   — d|                       dd¦  «        z   dz   S )z1Return a PowerShell single-quoted string literal.ú'z'')r  )r~  s    r"   Ú_ps_single_quoter¬     s    € à�—’˜s DÑ)Ô)Ñ)¨CÑ/Ð/rV   c                  óª   — t           j        dk    rdS ddl} 	  | j        g d¢| j        | j        d¬¦  «        }n# t
          $ r Y dS w xY w|j        dk    S )zCReturn whether the Windows cua-driver scheduled task is registered.ræ   Fr   N)zschtasks.exez/Queryz/TNzcua-driver-serveé
   )r   r  rý   )r   ru   r  r  ÚDEVNULLr    r  )r  rŒ   s     r"   Ú(_cua_driver_autostart_registered_windowsr°    s‰   € å
„|�wÒÐØˆuØÐÐÐðØ�”ØAÐAÐAØÔ%ØÔ%Øð	
ñ 
ô 
ˆˆøõ ð ð ð ØˆuˆuðøøøàÔ Ò!Ð!s   ˜ 9 ¹
AÁArT  rC  c          
      ó*  — t           j        dk    rdS t          ¦   «         rdS ddl}t	          j        | ¦  «        }|sdS t	          j        d¦  «        pt	          j        d¦  «        pd}dt          |¦  «        › d	�}|rt          d
¦  «         nt          d¦  «         	  |j        |dddd|gdddddt          ¦   «         ¬¦  «        }nE# |j
        $ r t          d¦  «         Y dS t          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w|j        dk    rdS |j        p|j        pd                     ¦   «                              ¦   «         dd…         }t          d¦  «         |D ]}	t          d|	dd…         › �¦  «         Œt          d¦  «         dS )aí  Best-effort repair for Windows installer autostart quoting failures.

    Older install.ps1 builds invoked
    ``& C:\Users\Name With Spaces\...\cua-driver`` from an elevated
    PowerShell command string, which PowerShell split at the first space. If
    the installer left the scheduled task missing, retry by
    launching the resolved binary through Start-Process's structured
    ``-FilePath`` / ``-ArgumentList`` parameters instead of interpolating a
    path into a command string.
    ræ   Tr   NFr1  zpowershell.exez$exe = z�; $proc = Start-Process -FilePath $exe -ArgumentList @('autostart','enable') -Verb RunAs -Wait -PassThru -ErrorAction Stop; exit $proc.ExitCodez(    Registering cua-driver auto-start...z3    Repairing cua-driver auto-start registration...ú
-NoProfileú-ExecutionPolicyÚBypassú-Commandr  r  rü   )rþ   r[   r  r	  rý   r
  z0    cua-driver autostart registration timed out.z.    cua-driver autostart registration failed: rL   éýÿÿÿz-    cua-driver autostart registration failed.ú      éÈ   z<    From an elevated shell, run: cua-driver autostart enable)r   ru   r°  r  rF  rJ  r¬  rI  r  rû   r  rH  r    r  r  r   rW   r–  )
rT  rC  r  rU  ÚpsÚps_cmdrŒ   ÚexcÚtailr¥  s
             r"   Ú$_repair_cua_driver_autostart_windowsr½    s  € õ „|�wÒÐØˆtÝ/Ñ1Ô1ð ØˆtàÐÐÐåŒ\˜*Ñ%Ô%€FØð Øˆuå	Œ�lÑ	#Ô	#Ð	U¥v¤|Ð4DÑ'EÔ'EÐ	UÈ€Bð	Õ" 6Ñ*Ô*ð 	ð 	ð 	ð ð ð KÝÐ>Ñ?Ô?Ð?Ð?åÐIÑJÔJÐJðØ�”Ø�Ð1°8¸ZÈÐPØØØØØÝÑ!Ô!ð
ñ 
ô 
ˆˆøð Ô$ð ð ð ÝÐIÑJÔJÐJØˆuˆuÝð ð ð ÝÐMÈÐMÐMÑNÔNÐNØˆuˆuˆuˆuˆuøøøøðøøøð Ô˜AÒÐØˆtàŒMÐ0˜Vœ]Ð0¨b×7Ò7Ñ9Ô9×DÒDÑFÔFÀrÀsÀsÔK€DÝÐBÑCÔCÐCØð +ð +ˆÝÐ)˜T $ 3 $œZÐ)Ð)Ñ*Ô*Ð*Ð*ÝÐNÑOÔOÐOØˆ5s   Â)C ÃD
Ã$	D
Ã-DÄD
r4  rD  rE  c                 óî  ‡— ddl }ddl}ddl}|                     ¦   «         }|dk    Š|dk    }‰rd}	dddd	d
|	g}
d|	› d�}d}�nddl}d}d|› d�}|                     dd¬¦  «        \  }}t          j        |¦  «         	  |j        ddd||gddddd¬¦  «        }nW# |j	        t          f$ rC}t          d|› �¦  «         	 t          j        |¦  «         n# t          $ r Y nw xY wY d}~dS d}~ww xY w|j        dk    r[t          d|j        pd                     ¦   «         dd…         › �¦  «         	 t          j        |¦  «         n# t          $ r Y nw xY wdS d|g}
d}|r)|rt!          d | › d!�¦  «         nt!          d"| › d#�¦  «         t#          ¦   «         }t%          ¦   «         }|r||d$<   t'          ¦   «          i }‰sd|d%<   ˆfd&„}	 |r† |j        |
f||t+          d¬'¦  «        d(œ|¤Ž}	 |                     t.          ¬)¦  «         n.# |j	        $ r!  ||¦  «         |                     ¦   «          ‚ w xY w |j        |
|j        dd¬*¦  «        }�n) |j        |
f|||j        |j        dddt+          ¦   «         d+œ|¤Ž}	 |                     t.          ¬)¦  «        \  }}n.# |j	        $ r!  ||¦  «         |                     ¦   «          ‚ w xY w |j        |
|j        |d¬*¦  «        }|j        rŽt9          t:          j        d,d¦  «        }|�F	 |                     d-|j        z   d.z   ¦  «         |                     ¦   «          n# t@          $ r Y nw xY w|j        dk    r tB           "                    d/|j        ¦  «         |j        dk    rã |j#        |¦  «        rÓ‰r tI          ||¬0¦  «        st          d1¦  «         |r‚tK          d |› d2�¦  «         ‰rt!          d3¦  «         t!          d4¦  «         nN|rt          d5¦  «         n<t!          d6¦  «         t!          d7¦  «         t!          d8¦  «         t!          d9¦  «         	 |r(	 t          j        |¦  «         dS # t          $ r Y dS w xY wdS t          d:|  &                    ¦   «         › d;�¦  «         t!          d<|› �¦  «         	 |r(	 t          j        |¦  «         dS # t          $ r Y dS w xY wdS # |j	        $ r� t          d:|  &                    ¦   «         › d=t.          › d>�¦  «         ‰st!          d?tO          ¦   «         › �¦  «         t!          d@|› �¦  «         Y |r(	 t          j        |¦  «         dS # t          $ r Y dS w xY wdS t@          $ r\}t          d:|  &                    ¦   «         › dA|› �¦  «         Y d}~|r(	 t          j        |¦  «         dS # t          $ r Y dS w xY wdS d}~ww xY w# |r&	 t          j        |¦  «         w # t          $ r Y w w xY ww xY w)Bu1  Run the upstream cua-driver installer for this platform.

    The scripts are idempotent: they always download the latest release, so
    re-running on an already-installed system performs an upgrade.

    * macOS / Linux â†’ ``curl -fsSL â€¦/install.sh | /bin/bash``.
    * Windows       â†’ ``powershell -NoProfile -ExecutionPolicy Bypass -Command
      "irm â€¦/install.ps1 | iex"``.

    ``pin_version`` (e.g. ``"0.13.1"``) is exported as
    ``CUA_DRIVER_RS_VERSION`` so the installer downloads that exact release
    instead of its baked-in default. The baked version on upstream ``main``
    is bumped by Release Please *before* the release assets are published,
    so an unpinned run inside that window fails with a 404; pinning to the
    version ``check-update`` confirmed sidesteps the race entirely.
    r   Nr/  r0  z_irm https://raw.githubusercontent.com/trycua/cua/main/libs/cua-driver/scripts/install.ps1 | iexr1  r²  r³  r´  rµ  z8powershell -NoProfile -ExecutionPolicy Bypass -Command "ú"zThttps://raw.githubusercontent.com/trycua/cua/main/libs/cua-driver/scripts/install.shz/bin/bash -c "$(curl -fsSL z)"zcua-driver-install-z.sh)ÚprefixÚsuffixr2  z-fsSLz-oTr  r  r  )rþ   r[   r  r	  rý   z*    cua-driver installer download failed: FrL   r¸  z	/bin/bashr3  z( cua-driver (background computer-use)...u   â†’ z cua-driver (Computer Use)...ÚCUA_DRIVER_RS_VERSIONÚstart_new_sessionc                 ó¢  •— dd l }	 ‰s3t          j        t          j        | j        ¦  «        |j        ¦  «         d S dd l}	 |                     | j        ¦  «        }|                     d¬¦  «        }nY# |j	        $ r Y d S |j
        $ r@}t                               d| j        |¦  «         |                      ¦   «          Y d }~d S d }~ww xY wt          |¦  «        D ]Z}	 |                     ¦   «          Œ# |j	        $ r Y Œ$|j
        $ r+}t                               d|j        |¦  «         Y d }~ŒSd }~ww xY w	 |                     ¦   «          d S # |j	        $ r Y d S |j
        $ r@}t                               d| j        |¦  «         |                      ¦   «          Y d }~d S d }~ww xY w# t          t           f$ r |                      ¦   «          Y d S w xY w)Nr   T)Ú	recursivez<could not enumerate cua-driver installer tree for pid %s: %sz4could not kill cua-driver installer child pid %s: %sz5could not kill cua-driver installer parent pid %s: %s)Úsignalrk   ÚkillpgÚgetpgidÚpidÚSIGKILLÚpsutilÚProcessÚchildrenÚNoSuchProcessÚErrorr  r€  r›  Úreversedr™  rœ  )ÚprocÚ_signalÚ_psutilr  Údescendantsr!  ÚchildrQ  s          €r"   Ú_kill_installer_treez7_run_cua_driver_installer.<locals>._kill_installer_treeÇ  s^  ø€ Ø Ð Ð Ð ð/	Øð , Ý”	�"œ* T¤XÑ.Ô.°´Ñ@Ô@Ð@Ð@Ð@ð )Ð(Ð(Ð(ðØ$Ÿ_š_¨T¬XÑ6Ô6�FØ"(§/¢/¸D /Ñ"AÔ"A�K�KøØÔ,ð ð ð Ø�F�FØ”}ð ð ð Ý—L’LØVØœØñô ð ð
 —I’I‘K”K�KØ�F�F�F�F�Føøøøðøøøõ & kÑ2Ô2ð 
ð 
�Eð	ØŸ
š
™œ˜˜øØ"Ô0ð ð ð Ø˜Ø"œ=ð ð ð ÝŸšØRØ!œIØñô ð ð ð ð ð ð øøøøðøøøð
 Ø—K’K‘M”M�M�M�MøØÔ,ð ð ð Ø�D�DØ”}ð  ð  ð  Ý—L’LØOØœØñô ð ð
 —I’I‘K”K�K�K�K�K�K�K�Køøøøð øøøøõ Õ+Ð,ð 	ð 	ð 	Ø�IŠI‰KŒKˆKˆKˆKˆKð	øøøs²   ‡3F% ¼F% Á0A2 Á1F% Á2
CÁ<F% Á?	CÂ5CÂ=F% ÃCÃF% ÃC2Ã1F% Ã2
D2Ã<F% Ã>	D2Ä!D-Ä(F% Ä-D2Ä2F% Ä6E Å
F"ÅF% Å	F"Å"5FÆF% ÆF"Æ"F% Æ%%GÇGr   )Úshellr
  r  ©rý   )r   r  )r×  r
  r   r  r[   r  r	  r  Ú_logz%
--- cua-driver installer output ---
Ú
zcua-driver installer output:
%s)rC  z<    cua-driver installed, but auto-start was not registered.z installed.r6  r7  r8  u.       IMPORTANT â€” grant macOS permissions now:r9  r:  z2    Both must allow the terminal / Hermes process.z    cua-driver z# did not complete. Re-run manually:r·  z timed out after zs.uE       If this repeats, a stale installer lock may be present â€” check z    Re-run manually:  z	 failed: )(ru   rF  r  rG  ÚtempfileÚmkstemprk   Úcloser  r  r™  rH  Úremover  r  rW   rI  rñ   rû   r©  ÚPopenr#   ÚcommunicateÚ_CUA_INSTALLER_TIMEOUTr  ÚPIPEÚSTDOUTr   Úgetattrr   ÚwriteÚflushr    r  r€  rJ  r½  rL  Úlowerrg  )rJ   rC  rD  rE  rP  rF  r  rG  rR  Úps_onelinerÚinstall_cmdÚmanual_hintÚscript_pathÚ	_tempfileÚinstall_urlÚfdÚdlr!  Ú	use_shellrT  Úinstaller_envÚpopen_kwargsrÖ  rÑ  rŒ   Úoutr‚   Ú_update_logrQ  s                               @r"   rK  rK  W  s$	  ø€ ð, ÐÐÐØ€M€M€MØÐÐÐà�\Š\‰^Œ^€FØ˜9Ò$€JØ˜Ò €Hàð 51ð8ð 	ð
 ˜,Ð(:¸HØ˜ð
ˆð
Øðð ð ð 	ð ˆ‰ð 	%Ð$Ð$Ð$ð1ð 	ð D°KÐCÐCÐCˆØ#×+Ò+Ð3HÐQVÐ+ÑWÔW‰ˆˆKÝ
Œ�‰Œˆð	Ø�”Ø˜ $¨°[ÐAØ#¨$¸ÈÐ\_ðñ ô ˆBˆBøð Ô)­7Ð3ð 	ð 	ð 	ÝÐKÈÐKÐKÑLÔLÐLðÝ”	˜+Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøà�5�5�5�5�5øøøøð	øøøð Œ=˜AÒÐÝð5Ø”I�O ×*Ò*Ñ,Ô,¨T¨c¨TÔ2ð5ð 5ñô ð ðÝ”	˜+Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøà�5Ø" KÐ0ˆØ€Iàð EØð 	EÝÐN˜uÐNÐNÐNÑOÔOÐOÐOåÐC˜uÐCÐCÐCÑDÔDÐDÝ Ñ"Ô"€Jå#Ñ%Ô%€MØð =ð 2=ˆÐ-Ñ.õ
 "Ñ#Ô#Ð#ð €LØð 1Ø,0ˆÐ(Ñ)ð1ð 1ð 1ð 1ð 1ðfdð ð 2	TØ#�:Ô#ØðØ#,°-Ý9ÈTÐRÑRÔRðð ð ðð ˆDð
Ø× Ò Õ)?Ð Ñ@Ô@Ð@Ð@øØÔ,ð ð ð Ø$Ð$ TÑ*Ô*Ð*Ø× Ò Ñ"Ô"Ð"Øðøøøð 1�ZÔ0Ø˜Tœ_°TÀ$ðñ ô ˆF‰Fð $�:Ô#ØðØ#,°-Ø!”¨zÔ/@Ø G°IÝ9Ñ;Ô;ð	ð ð
 ðð ˆDðØ×)Ò)Õ2HÐ)ÑIÔI‘��Q�QøØÔ,ð ð ð Ø$Ð$ TÑ*Ô*Ð*Ø× Ò Ñ"Ô"Ð"Øðøøøð 1�ZÔ0Ø˜Tœ_°SÀðñ ô ˆFð Œ}ð TÝ%¥c¤j°&¸$Ñ?Ô?�ØÐ*ðØ#×)Ò)ØEØ$œmñ,à"ñ#ñô ð ð
 $×)Ò)Ñ+Ô+Ð+Ð+øÝ$ð ð ð Ø˜ðøøøàÔ$¨Ò)Ð)Ý—L’LÐ!CÀVÄ]ÑSÔSÐSØÔ Ò!Ð! l f¤l°:Ñ&>Ô&>Ð!Øð Õ"FØ Gð#ñ #ô #ð õ ØRñô ð ð ð VÝÐ= jÐ=Ð=Ð=Ñ>Ô>Ð>Øð 	VÝÐ bÑcÔcÐcÝÐ \Ñ]Ô]Ð]Ð]Øð VÝ"Ð#@ÑAÔAÐAÐAåÐ PÑQÔQÐQÝÐ \Ñ]Ô]Ð]ÝÐ _Ñ`Ô`Ð`ÝÐ TÑUÔUÐUØð( ð 	ðÝ”	˜+Ñ&Ô&Ð&Ð&Ð&øÝð ð ð Ø��ðøøøð	ð 	õ' 	Ð[¨¯ª©¬Ð[Ð[Ð[Ñ\Ô\Ð\ÝÐ*˜[Ð*Ð*Ñ+Ô+Ð+Øð" ð 	ðÝ”	˜+Ñ&Ô&Ð&Ð&Ð&øÝð ð ð Ø��ðøøøð	ð 	øð! Ô$ð ð ð Ýð*˜eŸkšk™mœmð *ð *Ý%ð*ð *ð *ñ	
ô 	
ð 	
ð ð 	Ýð3Ý.Ñ0Ô0ð3ð 3ñô ð õ 	Ð:¨[Ð:Ð:Ñ;Ô;Ð;Øð
 ð 	ðÝ”	˜+Ñ&Ô&Ð&Ð&Ð&øÝð ð ð Ø��ðøøøð	ð 	õ	 ð ð ð ÝÐD¨¯ª©¬ÐDÐDÀÐDÐDÑEÔEÐEØˆuˆuˆuàð 	ðÝ”	˜+Ñ&Ô&Ð&Ð&Ð&øÝð ð ð Ø��ðøøøð	ð 	øøøøð	øøøøð ð 	ðÝ”	˜+Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøð	øøøsN  Á?B ÂC/Â,C*Â?CÃC*Ã
C!ÃC*Ã C!Ã!C*Ã*C/Ä1E Å
EÅEÇ	"S Ç,H ÈS È+H3È3AS É?J ÊS Ê+K	Ë	A S Ì
4L? Ì>S Ì?
MÍ	S ÍMÍC/S Ð?Q Ñ
Q#Ñ"Q#Ñ(7S Ò#R9 Ò9
SÓSÓA)WÔ5W
 Ô9U Õ
UÕUÕ"	WÕ+'WÖW
 ÖV/ Ö/
V=Ö<V=×W×W
 ×
W4×W#×"W4×#
W0×-W4×/W0×0W4Úpost_setup_keyc                 ó.  — ddl }ddlm} | dv �rœt          dz  dz  } |d¦  «        } |d¦  «        }|                     ¦   «         sÃ|rÁt          d	¦  «         ddl} |j        |d
ddgddddt          t          ¦  «        t          ¦   «         ¬¦  «        }|j
        dk    rt          d¦  «         n�ddlm} t          d |¦   «         › d�¦  «         |j        r1t          d|j                             ¦   «         dd…         › �¦  «         n5|                     ¦   «         rt          d¦  «         nt          d¦  «         dS | dk    rdS 	 ddlm}	m}
 n*# t&          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w |	¦   «         rt          d¦  «         dS  |
¦   «         r/t          d¦  «         t          d¦  «         t          d¦  «         dS |st          d ¦  «         dS t          d!¦  «         ddl}t          dz  d"z  dz  }t(          j        d#k    r+|                     d$¦  «        }|                     ¦   «         r|}|                     ¦   «         rt          |¦  «        d
d%gn|d&dd
d%g}	  |j        |ddddt          t          ¦  «        d't          ¦   «         ¬(¦  «        }|j
        dk    rt          d)¦  «         ddlm} d|_        n{t          d*¦  «         |j        p|j        pd+                     ¦   «                              ¦   «         d,d…         }|D ]}t          d|dd…         › �¦  «         Œt          d-¦  «         dS dS # |j        $ r" t          d.¦  «         t          d-¦  «         Y dS t&          $ r,}t          d/|› �¦  «         t          d-¦  «         Y d}~dS d}~ww xY w| d0k    �r-t          dz  d1z  d2z  } |d¦  «        }|                     ¦   «         rt          d3¦  «         nx|rvt          d4¦  «         ddl} |j        |d
ddgddddt          t          ¦  «        t          ¦   «         ¬¦  «        }|j
        dk    rt          d5¦  «         nt          d6¦  «         |                     ¦   «         r>t          d7¦  «         t          d8¦  «         t          d9¦  «         t          d:¦  «         dS |s t          d;¦  «         t          d<¦  «         dS dS | d=k    rt9          d>¬?¦  «         dS | d@k    �rddl}	 t;          d@¦  «         t          dA¦  «         dS # t<          $ r Y nw xY wt          dB¦  «         	 t?          g dC¢dD¬E¦  «        }|j
        dk    r.t          dF¦  «         t          dG¦  «         t          dH¦  «         nSt          dI¦  «         t          d|j        pd+                     ¦   «         ddD…         › �¦  «         t          dJ¦  «         dS dS # |j        $ r" t          dK¦  «         t          dJ¦  «         Y dS w xY w| dLk    �r	 t;          dL¦  «         t          dM¦  «         dS # t<          $ r Y nw xY wt          dN¦  «         dO}	 t?          dP|dQdRgdD¬E¦  «        }|j
        dk    r.t          dS¦  «         t          dT¦  «         t          dU¦  «         nWt          dV¦  «         t          d|j        pd+                     ¦   «         ddD…         › �¦  «         t          dW|› dX�¦  «         dS dS # |j        $ r& t          dY¦  «         t          dW|› dX�¦  «         Y dS w xY w| dZk    �r"	 t;          dZ¦  «         t          d[¦  «         nÓ# t<          $ rÆ t          d\¦  «         	 t?          g d]¢dD¬E¦  «        }|j
        dk    rt          d^¦  «         nTt          d_¦  «         t          d|j        pd+                     ¦   «         ddD…         › �¦  «         t          d`¦  «         Y dS n0# |j        $ r# t          da¦  «         t          d`¦  «         Y Y dS w xY wY nw xY wt          db¦  «         t          dc¦  «         t          dd¦  «         dS | dek    �r	 t;          de¦  «         t          df¦  «         nÓ# t<          $ rÆ t          dg¦  «         	 t?          g dh¢dD¬E¦  «        }|j
        dk    rt          di¦  «         nTt          dj¦  «         t          d|j        pd+                     ¦   «         ddD…         › �¦  «         t          dk¦  «         Y dS n0# |j        $ r# t          dl¦  «         t          dk¦  «         Y Y dS w xY wY nw xY wt          dm¦  «         t          dn¦  «         dS | dok    rîddpl m!} 	 ddql"m#} n9# t&          $ r,}t          dr|› �¦  «         t          ds¦  «         Y d}~dS d}~ww xY wt          dt¦  «         	  | |dddd>d¬u¦  «        ¦  «         t          dv¦  «         dS # tH          $ r,}t          dw|› �¦  «         t          dx¦  «         Y d}~dS d}~wt&          $ r,}t          dy|› �¦  «         t          ds¦  «         Y d}~dS d}~ww xY w| dzk    �r/	 t;          dz¦  «         t          d{¦  «         n\# t<          $ rO t          d|¦  «         t?          dzdRgd}¬E¦  «        }|j
        dk    rt          d~¦  «         nt          d¦  «         Y nw xY w	 dd€l%m&}m'}  |¦   «         }d�|v sdz|v rt          d‚¦  «         n/| (                    d�¦  «          ||¦  «         t          dƒ¦  «         n8# t&          $ r+}t          d„|› �¦  «         t          d…¦  «         Y d}~nd}~ww xY wt          d†¦  «         t          d‡¦  «         dS | dˆk    �ri	 dd‰l"m)} tU           |¦   «          +                    dŠ¦  «        ¦  «        }n# t&          $ r d>}Y nw xY wtY          d‹¦  «        }|rt          dŒ¦  «         dS |rt          d�¦  «         dS t          dŽ¦  «         	 dd�l-m.}m/}m0} dd�l1m2}  n9# t&          $ r,}t          d‘|› �¦  «         t          d’¦  «         Y d}~dS d}~ww xY w |d“g d”¢d¬•¦  «        }!|!dk    r, |¦   «         rt          d–¦  «         dS t          d—¦  «         dS |!d˜k    r= |d™d¬š¦  «        }"|"r | d‹|"¦  «         t          d›¦  «         dS t          dœ¦  «         dS t          d�¦  «         dS dS )žzBRun post-setup hooks for tools that need extra installation steps.r   N)Úfind_node_executable>   rß   rÜ   Únode_moduleszagent-browserÚnpmÚnpxz8    Installing Node.js dependencies for browser tools...r  z--silentz--workspaces=falseTr  r  )rþ   r[   r  r	  Úcwdr  z"    Node.js dependencies installed©Údisplay_hermes_homez*    npm install failed - run manually: cd z//hermes-agent && npm install --workspaces=falser·  r¸  z2    agent-browser already installed, nothing to dozV    Node.js not found - browser tools require: npm install (in hermes-agent directory)rÜ   )Ú_chromium_installedÚ_running_in_dockerz%    Could not check Chromium status: z5    Chromium browser already installed, nothing to doz5    Chromium is missing but you're running in Docker.z6    Pull the latest image to get the bundled Chromium:z:      docker pull ghcr.io/nousresearch/hermes-agent:latestzT    npx not found - install Chromium manually: npx agent-browser install --with-depsz5    Installing Chromium (~170MB one-time download)...z.binræ   z.cmdz--with-depsz-yr_  )rþ   r[   r  r	  rû  rý   r  z    Chromium installedz    Chromium install failed:rL   r¶  z7    Run manually: npx agent-browser install --with-depsz'    Chromium install timed out (>10min)z    Chromium install failed: râ   ú@askjoúcamofox-browserz,    Camofox already installed, nothing to doz(    Installing Camofox browser server...z    Camofox installedzE    npm install failed - run manually: npm install --workspaces=falsez    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-browserrè   F)r*  rÆ   z'    faster-whisper is already installedzF    Installing faster-whisper (model ~150MB downloads on first use)...)ú-Uzfaster-whisperú--quietrü   rØ  z    faster-whisper installedz>    Model sizes: tiny, base (default), small, medium, large-v3z7    Change via stt.local.model in ~/.hermes/config.yamlz"    faster-whisper install failed:z2    Run manually: uv pip install -U faster-whisperz,    faster-whisper install timed out (>5min)r¾   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.whlr  Ú	soundfiler  z    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%    Run manually: uv pip install -U 'z' soundfilez'    kittentts install timed out (>5min)rÀ   z"    piper-tts is already installedzI    Installing piper-tts (~14MB wheel, voices downloaded on first use)...)r  z	piper-ttsr  z    piper-tts installedz    piper-tts install failed:z-    Run manually: uv pip install -U piper-ttsz'    piper-tts install timed out (>5min)zE    Default voice: en_US-lessac-medium (downloaded on first TTS call)zU    Full voice list: https://github.com/OHF-Voice/piper1-gpl/blob/main/docs/VOICES.mdzE    Switch voices by setting tts.piper.voice in ~/.hermes/config.yamlÚddgsz    ddgs is already installedz2    Installing ddgs (DuckDuckGo search package)...)r  r  r  z    ddgs installedz    ddgs install failed:z(    Run manually: uv pip install -U ddgsz"    ddgs install timed out (>5min)zE    No API key required. DuckDuckGo enforces server-side rate limits.z?    Pair with an extract provider if you also need web_extract.rE   )ÚSimpleNamespace)Úlogin_spotify_commandz!    Could not load Spotify auth: z%    Run manually: hermes auth spotifyz    Starting Spotify login...)Ú	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ì   z"    langfuse SDK already installedz    Installing langfuse SDK...r  z    langfuse SDK installeduI       langfuse SDK install failed â€” run manually: uv pip install langfuse)Ú_get_enabled_setÚ_save_enabled_setzobservability/langfusez1    Plugin observability/langfuse already enabledz)    Plugin observability/langfuse enabledz+    Could not enable plugin automatically: z>    Run manually: hermes plugins enable observability/langfusez.    Restart Hermes for tracing to take effect.z    Verify: hermes plugins listr³   )Úget_xai_oauth_auth_statusÚ	logged_inrb   zG    xAI will use your xAI Grok OAuth (SuperGrok / Premium+) credentialsz*    xAI will use your existing XAI_API_KEYz&    xAI needs credentials. Choose one:)Ú_run_xai_oauth_login_from_setupÚprompt_choicer)   )r   z"    Could not load setup helpers: z?    Run later: hermes auth add xai-oauth   (or set XAI_API_KEY)z(    How do you want xAI to authenticate?)uD   Sign in with xAI Grok OAuth (SuperGrok / Premium+) â€” browser loginz#Paste an xAI API key (console.x.ai)u8   Skip â€” configure later via `hermes auth add xai-oauth`)Úchoicesrz   u6       Logged in â€” xAI will use these OAuth credentialszO    xAI Grok OAuth login did not complete. Run later: hermes auth add xai-oauthrM   z    xAI API key©Úpasswordz    XAI_API_KEY savedz=    No API key provided. Run later: hermes auth add xai-oauthz>    xAI will remain inactive until credentials are configured.)3rF  Úhermes_constantsr÷  ÚPROJECT_ROOTr‚  rI  r  r  rg   r#   r  rL  rý  rH  r  rW   Útools.browser_toolrþ  rÿ  r    r   ru   Úwith_suffixÚbrowser_toolÚ_cached_chromium_installedr   r–  r  r^  Ú
__import__ri   r"  Útypesr  re   r  Ú
SystemExitÚhermes_cli.plugins_cmdr  r  rŠ   r  rj   rm   r   Úhermes_cli.setupr  r  r)   Úhermes_cli.configr   )#rõ  rF  r÷  rø  Únpm_binÚnpx_binr  rŒ   rý  rþ  rÿ  r»  Úlocal_abÚlocal_ab_winré  Ú_btr¼  r¥  Úcamofox_dirÚ_npm_binÚ	wheel_urlr  r  r  r  Úenabledr  Úoauth_logged_inÚexisting_api_keyr  r  Ú_setup_promptr   ÚidxÚapi_keys#                                      r"   Ú_run_post_setupr/  a  s—  € à€M€M€MØ5Ð5Ð5Ð5Ð5Ð5àÐ9Ð9Ñ9Ý# nÑ4°ÑFˆð 'Ð& uÑ-Ô-ˆØ&Ð& uÑ-Ô-ˆà×"Ò"Ñ$Ô$ð 	¨ð 	ÝÐRÑSÔSÐSØÐÐÐð
 $�Z”^ð ˜) ZÐ1EÐFØ#¨$¸ÈÕX[Õ\hÑXiÔXiÝ9Ñ;Ô;ðñ ô ˆFð Ô  AÒ%Ð%ÝÐCÑDÔDÐDÐDà@Ð@Ð@Ð@Ð@Ð@Ýð   SÐL_ÐL_ÑLaÔLað   Sð   Sð   Sñ  Tô  Tð  TØ”=ð HÝÐ F¨¬×)<Ò)<Ñ)>Ô)>¸tÀ¸tÔ)DÐ FÐ FÑGÔGÐGøØ× Ò Ñ"Ô"ð 	õ ÐOÑPÔPÐPÐPåÐsÑtÔtÐtØˆFð
 ˜_Ò,Ð,ØˆFð		ðð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	ÝÐHÀ3ÐHÐHÑIÔIÐIØˆFˆFˆFˆFˆFøøøøð	øøøð ÐÑ Ô ð 	ÝÐRÑSÔSÐSØˆFàÐÑÔð 
	ÝØGñô ð õ ØHñô ð õ ØLñô ð ð ˆFàð 	ÝØfñô ð ð ˆFåÐKÑLÔLÐLØÐÐÐõ   .Ñ0°6Ñ9¸OÑKˆÝŒ<˜7Ò"Ð"Ø#×/Ò/°Ñ7Ô7ˆLØ×"Ò"Ñ$Ô$ð (Ø'�ð �ŠÑ Ô ðL�S�‰]Œ]˜I }Ð5Ð5à˜4 °)¸]ÐKð 	ð
	SØ#�Z”^ØØ#¨$¸ÈÕX[Õ\hÑXiÔXiÐsvÝ9Ñ;Ô;ðñ ô ˆFð
 Ô  AÒ%Ð%ÝÐ7Ñ8Ô8Ð8ð 1Ð0Ð0Ð0Ð0Ð0Ø15�Ô.Ð.åÐ=Ñ>Ô>Ð>ØœÐ<¨¬Ð<¸"×CÒCÑEÔE×PÒPÑRÔRÐSUÐSVÐSVÔW�Ø ð 7ð 7�DÝÐ 5¨¨d¨s¨d¬Ð 5Ð 5Ñ6Ô6Ð6Ð6ÝÐUÑVÔVÐVÐVÐVð /Ð.øð Ô(ð 	Sð 	Sð 	SÝÐDÑEÔEÐEÝÐQÑRÔRÐRÐRÐRÐRÝð 	Sð 	Sð 	SÝÐ@¸3Ð@Ð@ÑAÔAÐAÝÐQÑRÔRÐRÐRÐRÐRÐRÐRÐRøøøøð	Søøøð 
˜9Ò	$Ñ	$Ý" ^Ñ3°hÑ>ÐARÑRˆØ'Ð'¨Ñ.Ô.ˆØ×ÒÑÔð 	hÝÐIÑJÔJÐJÐJØð 	hÝÐBÑCÔCÐCØÐÐÐà#�Z”^à˜9 jÐ2FÐGØ#¨$¸ÈÕX[Õ\hÑXiÔXiÝ9Ñ;Ô;ð	ñ ô ˆFð Ô  AÒ%Ð%ÝÐ6Ñ7Ô7Ð7Ð7åÐfÑgÔgÐgØ×ÒÑÔð 	eÝÐ7Ñ8Ô8Ð8ÝÐ:Ñ;Ô;Ð;ÝÐNÑOÔOÐOÝÐpÑqÔqÐqÐqÐqØð 	eÝÐOÑPÔPÐPÝÐcÑdÔdÐdÐdÐdð	eð 	eð 
˜<Ò	'Ð	'Ý 5Ð)Ñ)Ô)Ð)Ð)Ð)à	Ð+Ò	+Ñ	+ØÐÐÐð	ÝÐ'Ñ(Ô(Ð(ÝÐDÑEÔEÐEØˆFøÝð 	ð 	ð 	ØˆDð	øøøåÐ\Ñ]Ô]Ð]ð	NÝ!Ð"EÐ"EÐ"EÈsÐSÑSÔSˆFØÔ  AÒ%Ð%ÝÐ=Ñ>Ô>Ð>ÝÐ\Ñ]Ô]Ð]ÝÐUÑVÔVÐVÐVåÐCÑDÔDÐDÝÐJ f¤mÐ&9°r×%@Ò%@Ñ%BÔ%BÀ4ÀCÀ4Ô%HÐJÐJÑKÔKÐKÝÐPÑQÔQÐQÐQÐQð	 WÐVøð
 Ô(ð 	Nð 	Nð 	NÝÐIÑJÔJÐJÝÐLÑMÔMÐMÐMÐMÐMð	Nøøøð 
˜;Ò	&Ñ	&ð	Ý�{Ñ#Ô#Ð#ÝÐ?Ñ@Ô@Ð@ØˆFøÝð 	ð 	ð 	ØˆDð	øøøåÐLÑMÔMÐMð5ð 	ð	XÝ! 4¨°KÀÐ"KÐUXÐYÑYÔYˆFØÔ  AÒ%Ð%ÝÐ8Ñ9Ô9Ð9ÝÐ\Ñ]Ô]Ð]ÝÐmÑnÔnÐnÐnåÐ>Ñ?Ô?Ð?ÝÐJ f¤mÐ&9°r×%@Ò%@Ñ%BÔ%BÀ4ÀCÀ4Ô%HÐJÐJÑKÔKÐKÝÐZÀIÐZÐZÐZÑ[Ô[Ð[Ð[Ð[ð	 oÐnøð
 Ô(ð 	Xð 	Xð 	XÝÐDÑEÔEÐEÝÐVÀ	ÐVÐVÐVÑWÔWÐWÐWÐWÐWð	Xøøøð 
˜7Ò	"Ñ	"ð	Ý�wÑÔÐÝÐ?Ñ@Ô@Ð@Ð@øÝð 	ð 	ð 	ÝÐcÑdÔdÐdðÝ%Ð&DÐ&DÐ&DÈcÐRÑRÔR�ØÔ$¨Ò)Ð)Ý"Ð#<Ñ=Ô=Ð=Ð=å"Ð#BÑCÔCÐCÝÐ N¨&¬-Ð*=¸2×)DÒ)DÑ)FÔ)FÀtÈÀtÔ)LÐ NÐ NÑOÔOÐOÝÐ OÑPÔPÐPØ�F�Fð >øð Ô,ð ð ð ÝÐHÑIÔIÐIÝÐKÑLÔLÐLØ���ðøøøð >Ð=ð	øøøõ 	Ð[Ñ\Ô\Ð\ÝÐkÑlÔlÐlÝÐ[Ñ\Ô\Ð\Ð\Ð\à	˜6Ò	!Ñ	!ð	Ý�vÑÔÐÝÐ:Ñ;Ô;Ð;Ð;øÝð 	ð 	ð 	ÝÐLÑMÔMÐMðÝ%Ð&?Ð&?Ð&?ÈÐMÑMÔM�ØÔ$¨Ò)Ð)Ý"Ð#7Ñ8Ô8Ð8Ð8å"Ð#=Ñ>Ô>Ð>ÝÐ N¨&¬-Ð*=¸2×)DÒ)DÑ)FÔ)FÀtÈÀtÔ)LÐ NÐ NÑOÔOÐOÝÐ JÑKÔKÐKØ�F�Fð 9øð Ô,ð ð ð ÝÐCÑDÔDÐDÝÐFÑGÔGÐGØ���ðøøøð 9Ð8ð	øøøõ 	Ð[Ñ\Ô\Ð\ÝÐUÑVÔVÐVÐVÐVà	˜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øøøð 
˜:Ò	%Ñ	%ð		lÝ�zÑ"Ô"Ð"ÝÐ?Ñ@Ô@Ð@Ð@øÝð 	lð 	lð 	lÝÐ8Ñ9Ô9Ð9Ý! :¨yÐ"9À3ÐGÑGÔGˆFØÔ  AÒ%Ð%ÝÐ;Ñ<Ô<Ð<Ð<åÐjÑkÔkÐkøøð	løøøð	ZØRÐRÐRÐRÐRÐRÐRÐRØ&Ð&Ñ(Ô(ˆGØ'¨7Ð2Ð2°jÀGÐ6KÐ6KÝÐRÑSÔSÐSÐSà—’Ð4Ñ5Ô5Ð5Ø!Ð! 'Ñ*Ô*Ð*ÝÐJÑKÔKÐKøøÝð 	Zð 	Zð 	ZÝÐNÈÐNÐNÑOÔOÐOÝÐXÑYÔYÐYÐYÐYÐYÐYÐYøøøøð	Zøøøõ 	ÐDÑEÔEÐEÝÐ5Ñ6Ô6Ð6Ð6Ð6à	˜:Ò	%Ñ	%ð	$ØAÐAÐAÐAÐAÐAÝ"Ð#<Ð#<Ñ#>Ô#>×#BÒ#BÀ;Ñ#OÔ#OÑPÔPˆOˆOøÝð 	$ð 	$ð 	$Ø#ˆOˆOˆOð	$øøøå(¨Ñ7Ô7Ðàð 	ÝØYñô ð ð ˆFØð 	ÝÐGÑHÔHÐHØˆFåÐ<Ñ=Ô=Ð=ð
	ðð ð ð ð ð ð ð ð ð ð
 9Ð8Ð8Ð8Ð8Ð8Ð8øÝð 	ð 	ð 	ÝÐEÀÐEÐEÑFÔFÐFÝÐYÑZÔZÐZØˆFˆFˆFˆFˆFøøøøð	øøøð
 ˆmØ6ðð ð ð
 ð
ñ 
ô 
ˆð �!Š8ˆ8Ø.Ð.Ñ0Ô0ð ÝØLñô ð ð ð õ ð;ñô ð ð ð ð �AŠXˆXØ#�mÐ$5ÀÐEÑEÔEˆGØð Ø�˜}¨gÑ6Ô6Ð6ÝÐ6Ñ7Ô7Ð7Ð7Ð7åØSñô ð ð ð õ ÐXÑYÔYÐYÐYÐYðC 
&Ð	%s�  ÅE Å
E8ÅE3Å3E8É.CM	 Í	(N)Í4	N)Í=!N$Î$N)ÔT$ Ô$
T1Ô0T1ÕBW% ×%(XØXØX< Ø<
Y	ÙY	ÙB#\ Ü,\5Ü4\5Ý ] Ý`/Ý9A?_<ß;`/ß<(`)à$`/à(`)à)`/à.`/á)b âeâ"A?d%ä$eä%(eåeåeåeåeæf æ
gæ!g ç gç(h è
i,è!h3è3i,é !i'é'i,é7j êAk/ë.k/ë3Am í
ní!m=í=nî-0o ïo-ï,o-ð5q ñ
q<ñ!q7ñ7q<c                  ó²  — t          ¦   «         } t                               ¦   «         D ]G}|                     dg ¦  «        D ].}|                     d¦  «        }|r|                      |¦  «         Œ/ŒHt
          t          t          t          fD ]L}	  |¦   «         D ].}|                     d¦  «        }|r|                      |¦  «         Œ/Œ=# t          $ r Y ŒIw xY w| S )a­  Return the set of post-setup keys declared by any visible provider.

    Collected from ``TOOL_CATEGORIES`` plus the plugin-registered web /
    image-gen / video-gen / browser providers (which can also carry a
    ``post_setup``). This is the allowlist the ``hermes tools post-setup``
    command and the dashboard post-setup endpoint validate against, so a
    caller can't drive ``_run_post_setup`` with an arbitrary key.
    rÄ   r´   )
r’   ÚTOOL_CATEGORIESÚvaluesrm   rŠ   Ú_plugin_web_search_providersÚ_plugin_image_gen_providersÚ_plugin_video_gen_providersÚ_plugin_browser_providersr    )ÚkeysÚcatÚprovr¹  Úbuilders        r"   Úvalid_post_setup_keysr;  Ü  s  € õ ‘U”U€DÝ×%Ò%Ñ'Ô'ð ð ˆØ—G’G˜K¨Ñ,Ô,ð 	ð 	ˆDØ—’˜,Ñ'Ô'ˆBØð Ø—’˜‘”�øð	õ 	%Ý#Ý#Ý!ð	ð ð ˆð	Ø˜™	œ	ð !ð !�Ø—X’X˜lÑ+Ô+�Øð !Ø—H’H˜R‘L”L�Løð!øõ ð 	ð 	ð 	ØˆHð	øøøà€Ks   Â9CÃ
CÃCc           
      ó¤  — t          | dd¦  «        }|st          d¦  «         dS t          ¦   «         }||vr9t          d|›dd                     t	          |¦  «        ¦  «        pd› �¦  «         dS t          d	|› �¦  «         	 t          |¦  «         n*# t          $ r}t          d
|› �¦  «         Y d}~dS d}~ww xY wt          d|› d�¦  «         dS )u³  ``hermes tools post-setup <key>`` â€” non-interactive post-setup runner.

    Runs the install/bootstrap hook a provider declares (npm install for
    browser/Camofox, pip install for kittentts/piper/ddgs, cua-driver fetch,
    etc.). This is the stable, scriptable target the dashboard spawns so the
    GUI can drive backend setup without re-implementing the install logic.
    Returns a process exit code (0 ok, 2 unknown key).
    rõ  Nz$Usage: hermes tools post-setup <key>rN   zUnknown post-setup key: z. Valid keys: ú, z(none)zRunning post-setup hook: zPost-setup failed: rM   zPost-setup 'z
' completer   )	rä  Ú_print_errorr;  Újoinr|   rI  r/  r    rL  )rÿ   r°   Úvalidr»  s       r"   Úrun_post_setup_commandrA  ü  s,  € õ �$Ð(¨$Ñ
/Ô
/€CØð ÝÐ;Ñ<Ô<Ð<ØˆqÝ!Ñ#Ô#€EØ
�%ÐÐÝðB sð Bð BØŸ9š9¥V¨E¡]¤]Ñ3Ô3Ð?°xðBð Bñ	
ô 	
ð 	
ð ˆqÝÐ1¨CÐ1Ð1Ñ2Ô2Ð2ðÝ˜ÑÔÐÐøÝð ð ð ÝÐ0¨3Ð0Ð0Ñ1Ô1Ð1Øˆqˆqˆqˆqˆqøøøøðøøøõ Ð1 #Ð1Ð1Ð1Ñ2Ô2Ð2Øˆ1s   ÂB Â
B:ÂB5Â5B: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).ry   ÚTELEGRAM_BOT_TOKENÚtelegramÚDISCORD_BOT_TOKENrF   ÚSLACK_BOT_TOKENÚslackÚWHATSAPP_ENABLEDÚwhatsappÚ	QQ_APP_IDÚqqbot)r   r‹   )r)  s    r"   Ú_get_enabled_platformsrL    s¼   € àˆg€GÝÐ)Ñ*Ô*ð #Ø�Š�zÑ"Ô"Ð"ÝÐ(Ñ)Ô)ð "Ø�Š�yÑ!Ô!Ð!ÝÐ&Ñ'Ô'ð  Ø�Š�wÑÔÐÝÐ'Ñ(Ô(ð #Ø�Š�zÑ"Ô"Ð"Ý�[Ñ!Ô!ð  Ø�Š�wÑÔÐØ€NrV   Ú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.
    )rL  Ú_get_platform_tools)rM  rN  ÚsummaryÚpkeys       r"   Ú_platform_toolset_summaryrS  ,  sC   € ð ÐÝ*Ñ,Ô,ˆ	à#%€GØð :ð :ˆÝ+¨F°DÑ9Ô9ˆ�‰ˆØ€NrV   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)Ú
isinstancerj   r˜  rg   rW   rç  )r~  rz   Úlowereds      r"   Ú_parse_enabled_flagr_  <  s‘   € à€}ØˆÝ�%�ÑÔð ØˆÝ�%�ÑÔð Ø˜ŠzÐÝ�%�ÑÔð Ø—+’+‘-”-×%Ò%Ñ'Ô'ˆØÐ0Ð0Ð0Ø�4ØÐ1Ð1Ð1Ø�5Ø€NrV   c                 óp  — | pi                       d¦  «        pi }d„ |                     ¦   «         D ¦   «         }	 ddlm}m}  |¦   «          t           |¦   «                              ¦   «         ¦  «        }||t          |¦  «        z
  z  }n,# t          $ r t           	                    dd¬¦  «         Y nw xY w|S )uc  Names of MCP servers globally enabled in config.yaml or by a plugin.

    Shared by the gateway/CLI platform resolver (``_get_platform_tools``) and
    the cron per-job toolset resolver (``cron.scheduler``) so every path agrees
    on MCP membership. A server is enabled unless its config sets an explicitly
    falsey ``enabled`` (per ``_parse_enabled_flag``: false/0/no/off) â€” a missing
    flag or an unrecognized value is treated as enabled.

    Portable Agent Plugins contribute MCP servers in-memory rather than via
    ``config.yaml`` (see ``PluginManager.get_portable_mcp_servers``). Those are
    included here so their tools fold into platform toolsets like native
    servers do â€” the user's opt-in is enabling the plugin itself. Without this,
    a portable server registers with the MCP runtime but its tools never reach
    the model's schema.
    Úmcp_serversc                 ó¦   — h | ]N\  }}t          |t          ¦  «        ¯t          |                     d d¦  «        d¬¦  «        ¯?t	          |¦  «        ’ŒOS )r)  T©rz   )r]  rú   r_  rm   rg   )rS   r¢   Ú
server_cfgs      r"   rƒ   z+enabled_mcp_server_names.<locals>.<setcomp>^  sg   € ð ð ð áˆD�*Ý�j¥$Ñ'Ô'ðõ   
§¢¨y¸$Ñ ?Ô ?ÈÐNÑNÔNð	ÝˆD‰	Œ	ðð ð rV   r   )r…   Úget_plugin_managerz&Failed to include portable MCP serversT)Úexc_info)
rm   Úitemsr‰   r…   re  r’   Úget_portable_mcp_serversr    r  r€  )rM  ra  Únamesr…   re  Úportables         r"   Úenabled_mcp_server_namesrk  M  sô   € ð  �<˜R×$Ò$ ]Ñ3Ô3Ð9°r€Kðð à +× 1Ò 1Ñ 3Ô 3ðñ ô €EðNØKÐKÐKÐKÐKÐKÐKÐKàÐÑÔÐÝÐ)Ð)Ñ+Ô+×DÒDÑFÔFÑGÔGˆà��C Ñ,Ô,Ñ,Ñ,ˆˆøÝð Nð Nð NÝ�ŠÐ=ÈˆÑMÔMÐMÐMÐMðNøøøà€Ls   ¹AB
 Â
&B3Â2B3Údefault_offÚexplicitly_configuredc                óœ   — |sdS t          | ¦  «        D ]7}t                               |¦  «        }|�||v r|                      |¦  «         Œ8dS )u•  Let platform-native default-off toolsets through on explicit config.

    Toolsets that are both in ``_DEFAULT_OFF_TOOLSETS`` and restricted to
    ``platform`` via ``_TOOLSET_PLATFORM_RESTRICTIONS`` (currently
    ``discord``/``discord_admin`` on the discord platform) are the platform's
    own native tools. They are kept off for *unconfigured* platforms (security
    opt-in), but once a user explicitly saves a toolset list for the platform
    the composite they chose (e.g. ``hermes-discord``, which contains those
    tools) is an opt-in â€” stripping them silently defeats the explicit
    configuration (#35527). Mutates ``default_off`` in place.
    N)r‡   rs   rm   Údiscard)rl  ru   rm  Útsrw   s        r"   Ú _exempt_explicit_platform_nativerq  p  sj   € ð !ð ØˆÝ�;ÑÔð $ð $ˆÝ0×4Ò4°RÑ8Ô8ˆØÐ 8¨wÐ#6Ð#6Ø×Ò Ñ#Ô#Ð#øð$ð $rV   r6   Úenabled_toolsetsc                 ó>  — ddl m} |                     d¦  «        pi                      |¦  «        }t          |t          ¦  «        rd„ |D ¦   «         nt          ¦   «         }t                               |¦  «        }|r|d         nd|› �}d}t          t          ¦  «        D ]}}	|	| v s|	|v rŒt          |	|¦  «        sŒt           ||	d¬	¦  «        ¦  «        }
|€t           ||¦  «        ¦  «        }|
r|
 
                    |¦  «        sŒh|                      |	¦  «         Œ~dS )
ay  Turn on toolsets that shipped after this platform's saved list.

    Either way of saying no outlives this: unchecking in ``hermes tools``
    records the toolset in ``known_builtin_toolsets`` so it reads as declined
    from then on, and ``agent.disabled_toolsets`` is subtracted after every
    rule in :func:`_get_platform_tools`. Mutates ``enabled_toolsets`` in place.
    r   ©Úresolve_toolsetÚknown_builtin_toolsetsc                 ó,   — h | ]}t          |¦  «        ’ŒS r€   ©rg   ©rS   rp  s     r"   rƒ   z4_enable_recently_shipped_toolsets.<locals>.<setcomp>¬  s   € Ð*Ð*Ð*˜B•�B‘”Ð*Ð*Ð*rV   rœ   úhermes-NF©Úinclude_registry)Útoolsetsru  rm   r]  r‡   r’   r™   r|   Ú_RECENTLY_SHIPPED_TOOLSETSrx   ÚissubsetrŠ   )rr  rM  ru   ru  ÚofferedÚdeclinedÚ	plat_infoÚ
default_tsÚcomposite_toolsrt   Úts_toolss              r"   Ú!_enable_recently_shipped_toolsetsr†  Ÿ  s]  € ð )Ð(Ð(Ð(Ð(Ð(à�zŠzÐ2Ñ3Ô3Ð9°r×>Ò>¸xÑHÔH€GÝ.8¸Å$Ñ.GÔ.GÐRÐ*Ð* 'Ð*Ñ*Ô*Ð*ÍSÉUÌU€Hå—’˜hÑ'Ô'€IØ1:ÐT�Ð,Ô-Ð-Ð@TÈ(Ð@TÐ@T€JØ€OåÕ3Ñ4Ô4ð %ð %ˆØÐ%Ð%Ð%¨°8Ð);Ð);ØÝ,¨V°XÑ>Ô>ð 	Øõ �� vÀÐFÑFÔFÑGÔGˆØÐ"Ý! / /°*Ñ"=Ô"=Ñ>Ô>ˆOØð 	˜x×0Ò0°ÑAÔAð 	ØØ×Ò˜VÑ$Ô$Ð$Ð$ð%ð %rV   ©Úinclude_default_mcp_serversrˆ  c                óŒ  ‡‡+‡,‡-‡.— ddl m}m} |                      d¦  «        pi }|                     ‰¦  «        }t	          |t
          ¦  «        }|�t	          |t
          ¦  «        s-t                               ‰¦  «        }|r	|d         }	nd‰› �}	|	g}d„ |D ¦   «         }d„ t          D ¦   «         Š+t          ¦   «         Š-d	„ t           	                    ¦   «         D ¦   «         Š,t          ˆ+fd
„|D ¦   «         ¦  «        }
|
�rOˆ+ˆfd„|D ¦   «         }t          ¦   «         }|D ].}|‰+v s|‰-v rŒ||vrŒ|                      ||¦  «        ¦  «         Œ/|rìt          ¦   «         }t          D ]]\  }}}t          |‰¦  «        sŒt           ||d¬¦  «        ¦  «        }|r*|                     |¦  «        r|                     |¦  «         Œ^t          t           ¦  «        }‰|v r‰t"          vr|                     ‰¦  «         d|v r#t'          ¦   «         r|                     d¦  «         t)          |‰|¬¦  «         ||z  }||z  }t+          || ‰¦  «         �nht          ¦   «         }|D ] }|                      ||¦  «        ¦  «         Œ!t          ¦   «         }t          D ]]\  }}}t          |‰¦  «        sŒt           ||d¬¦  «        ¦  «        }|r*|                     |¦  «        r|                     |¦  «         Œ^t          d‰¦  «        ot-          ¦   «         }|r|                     d¦  «         t          t           ¦  «        }‰|v r‰t"          vr|                     ‰¦  «         d|v r#t'          ¦   «         r|                     d¦  «         |rd|v r|                     d¦  «         t)          |‰|¬¦  «         ||z  }t                               ‰¦  «        }|r|d         nd‰› �}t           ||¦  «        ¦  «        }t          ¦   «         }‰+D ] }|                      ||¦  «        ¦  «         Œ!t          ¦   «         }|D ] }|                      ||¦  «        ¦  «         Œ!‰+‰-z  ‰,z  }|d„ |D ¦   «         z  }|t          t           ¦  «        ‰hz
  z  }|                     ¦   «         D ]½\  }}||v rŒ
|                     d¦  «        rŒ |                     d¦  «        rŒ6t           ||d¬¦  «        ¦  «        }|r|                     |¦  «        sŒh|                     |¦  «        rŒ~|                     |¦  «        s*|                     |¦  «         |                     |¦  «         Œ¾‰-r|                      di ¦  «        pi }t          |                     ‰g ¦  «        pg ¦  «        }‰-D ]?}||v r|                     |¦  «         Œ|t           v rŒ&||vr|                     |¦  «         Œ@|                      d¦  «        pi } t	          | t0          ¦  «        si } t3          |                      d¦  «        pd¦  «                             ¦   «                              ¦   «         }!‰|v o*t	          |                     ‰¦  «        t
          ¦  «        o| }"|!r|!dk    r|"s|                     d¦  «         ˆ+ˆ,ˆ-fd„|D ¦   «         }#t9          | ¦  «        }$d|v r+t          ¦   «         }%|                     |#|$z
  dhz
  ¦  «         n|#|$z  }%|                     |#|$z
  ¦  «         |r2|%sd|v r|                     |%¦  «         n+|                     |$¦  «         n|                     |%¦  «         |                      d¦  «        pi }&|&                     d¦  «        pg }'|'rd„ |'D ¦   «         }(||(z  }|                     ‰¦  «        })t	          |)t
          ¦  «        rƒ|)r�ddl mŠ. d„ |)D ¦   «         }*|*rmt          ˆ.fd „|*D ¦   «         ¦  «        sR‰t<          vrIt<                               ‰¦  «         t>                                d!‰d" !                    |*¦  «        ¦  «         |S )#zBResolve which individual toolset names are enabled for a platform.r   )ru  ÚTOOLSETSÚplatform_toolsetsNrœ   rz  c                 ó,   — g | ]}t          |¦  «        ‘ŒS r€   rx  ry  s     r"   ú
<listcomp>z'_get_platform_tools.<locals>.<listcomp>Þ  s   € Ð5Ð5Ð5 •S˜‘W”WÐ5Ð5Ð5rV   c                 ó   — h | ]\  }}}|’Œ	S r€   r€   r�   s      r"   rƒ   z&_get_platform_tools.<locals>.<setcomp>à  ó   € ÐJÐJÐJ¡L F¨A¨q˜ÐJÐJÐJrV   c                 ó   — h | ]
}|d          ’ŒS ©rœ   r€   ©rS   Úps     r"   rƒ   z&_get_platform_tools.<locals>.<setcomp>â  ó   € ÐNÐNÐN°a˜QÐ0Ô1ÐNÐNÐNrV   c              3   ó    •K  — | ]}|‰v V — Œ	d S rP   r€   )rS   rp  Úconfigurable_keyss     €r"   rU   z&_get_platform_tools.<locals>.<genexpr>é  s)   øè è € ÐNÐN¸"˜bÐ$5Ð5ÐNÐNÐNÐNÐNÐNrV   c                 ó<   •— h | ]}|‰v ¯t          |‰¦  «        ¯|’ŒS r€   ©rx   )rS   rp  r–  ru   s     €€r"   rƒ   z&_get_platform_tools.<locals>.<setcomp>ì  s?   ø€ ð 
ð 
ð 
ØØÐ&Ð&Ð&Õ+HÈÈXÑ+VÔ+VÐ&ð Ø&Ð&Ð&rV   Fr{  rD   )rm  r7   c                 ó<   — h | ]}|                      d ¦  «        ¯|’ŒS )rz  )r—  )rS   r�   s     r"   rƒ   z&_get_platform_tools.<locals>.<setcomp>i	  s)   € Ð<Ð<Ð<�1 A§L¢L°Ñ$;Ô$;Ð<ˆQÐ<Ð<Ð<rV   ÚincludesÚpostureÚknown_plugin_toolsetsÚcontextÚengineÚ
compressorr>   c                 ó,   •— h | ]}|‰vr
|‰vr|‰v¯|’ŒS r€   r€   )rS   rp  r–  Úplatform_default_keysÚplugin_ts_keyss     €€€r"   rƒ   z&_get_platform_tools.<locals>.<setcomp>ª	  sH   ø€ ð ð ð àØÐ&Ð&Ð&Ø�nÐ$Ð$ØÐ+Ð+Ð+ð	 	ð ,Ð+Ð+rV   Úno_mcpÚagentÚdisabled_toolsetsc                 ó,   — h | ]}t          |¦  «        ’ŒS r€   rx  ry  s     r"   rƒ   z&_get_platform_tools.<locals>.<setcomp>Í	  s   € Ð<Ð<Ð< B�˜B™œÐ<Ð<Ð<rV   )Úvalidate_toolsetc                 óZ   — g | ](}t          |t          ¦  «        ¯|¯t          |¦  «        ‘Œ)S r€   )r]  rg   ©rS   Úts     r"   r�  z'_get_platform_tools.<locals>.<listcomp>Ú	  s2   € ÐHÐHÐH˜Q­z¸!½SÑ/AÔ/AÐHÀaÐH•#�a‘&”&ÐHÐHÐHrV   c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S rP   r€   )rS   rª  r§  s     €r"   rU   z&_get_platform_tools.<locals>.<genexpr>Ý	  s/   øè è € Ð<Ð<°Ð(Ð(¨Ñ+Ô+Ð<Ð<Ð<Ð<Ð<Ð<rV   z–platform '%s' has no valid toolsets configured (unknown name(s): %s) - tools will be unavailable. Run `hermes tools` to reconfigure. See issue #38798.r=  )"r}  ru  rŠ  rm   r]  r‡   r™   rˆ   r“   r2  rZ   r’   Úupdaterx   r  rŠ   Ú_DEFAULT_OFF_TOOLSETSrs   rÞ  rr   rq  r†  ro   rg  rú   rg   rW   rç  rk  r§  r$   r  Úwarningr?  )/rM  ru   rˆ  ru  rŠ  r‹  Útoolset_namesrm  r‚  rƒ  Úhas_explicit_configrr  r„  Úts_nameÚexpandedrt   r‚   r…  rl  Úall_tool_namesÚx_search_auto_enabledÚ
_plat_infoÚ_default_tsÚplatform_tool_universeÚconfigurable_tool_universeÚckÚclaimedÚskipÚts_defÚ	known_mapÚknown_for_platformÚptsÚcontext_cfgÚcontext_engine_nameÚexplicit_empty_selectionÚexplicit_passthroughÚenabled_mcp_serversÚexplicit_mcp_serversÚ	agent_cfgr¥  Údisabled_setÚ	_explicitÚ_namedr–  r¡  r¢  r§  s/    `                                         @@@@r"   rP  rP  Â  sH
  øøøøø€ ð 3Ð2Ð2Ð2Ð2Ð2Ð2Ð2àŸ
š
Ð#6Ñ7Ô7Ð=¸2ÐØ%×)Ò)¨(Ñ3Ô3€Mõ
 ' }µdÑ;Ô;ÐàÐ¥J¨}½dÑ$CÔ$CÐÝ—M’M (Ñ+Ô+ˆ	Øð 	.Ø"Ð#4Ô5ˆJˆJð . 8Ð-Ð-ˆJØ#˜ˆð 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Ðàñ l(ð
ð 
ð 
ð 
ð 
Ø&ð
ñ 
ô 
Ðõ ™%œ%ˆØ$ð 	=ð 	=ˆGØÐ+Ð+Ð+¨w¸.Ð/HÐ/HØØ˜hÐ&Ð&ØØ×"Ò" ? ?°7Ñ#;Ô#;Ñ<Ô<Ð<Ð<àð 	)Ý‘u”uˆHÝ 5ð 	)ð 	)‘�˜˜1Ý4°V¸XÑFÔFð Øõ
 ˜˜¨vÈÐNÑNÔNÑOÔO�Øð ) × 1Ò 1°/Ñ BÔ Bð )Ø—L’L Ñ(Ô(Ð(øåÕ3Ñ4Ô4ˆKØ˜;Ð&Ð&¨8Õ;YÐ+YÐ+YØ×"Ò" 8Ñ,Ô,Ð,Ø +Ð-Ð-Õ2TÑ2VÔ2VÐ-Ø×"Ò" ?Ñ3Ô3Ð3Ý,Ø˜XÐ=Rðñ ô ð ð ˜Ñ#ˆHà Ñ(Ðå)Ð*:¸FÀHÑMÔMÐMÑMõ ™œˆØ$ð 	<ð 	<ˆGØ×!Ò! / /°'Ñ":Ô":Ñ;Ô;Ð;Ð;å™5œ5ÐÝ1ð 
	-ð 
	-‰LˆF�A�qÝ0°¸ÑBÔBð Øõ ˜?˜?¨6ÀEÐJÑJÔJÑKÔKˆHØð -˜H×-Ò-¨nÑ=Ô=ð -Ø ×$Ò$ VÑ,Ô,Ð,øõ *¨*°hÑ?Ô?ð +Ý(Ñ*Ô*ð 	ð !ð 	-Ø× Ò  Ñ,Ô,Ð,åÕ/Ñ0Ô0ˆð �{Ð"Ð" xÕ7UÐ'UÐ'UØ×Ò˜xÑ(Ô(Ð(ð ˜kÐ)Ð)Õ.PÑ.RÔ.RÐ)Ø×Ò˜Ñ/Ô/Ð/ð !ð 	+ Z°;Ð%>Ð%>Ø×Ò˜zÑ*Ô*Ð*Ý(Ø˜Ð9Nð	
ñ 	
ô 	
ð 	
ð 	˜KÑ'Ðõ —’˜xÑ(Ô(€JØ3=ÐW�*Ð.Ô/Ð/ÐCWÈXÐCWÐCW€KÝ   °Ñ!=Ô!=Ñ>Ô>ÐÝ!$¡¤ÐØð ?ð ?ˆØ"×)Ò)¨/¨/¸"Ñ*=Ô*=Ñ>Ô>Ð>Ð>Ý‰eŒe€GØ"ð 0ð 0ˆØ�Š�� vÑ.Ô.Ñ/Ô/Ð/Ð/Ø˜~Ñ-Ð0EÑE€DØÐ<Ð<˜Ð<Ñ<Ô<Ñ<€DØ�CÕ%Ñ&Ô&¨(¨Ñ3Ñ3€DØ"Ÿ.š.Ñ*Ô*ð %ð %‰ˆ�Ø�Tˆ>ˆ>ØØ�:Š:�jÑ!Ô!ð 	Øð �:Š:�iÑ Ô ð 	Øõ �� vÀÐFÑFÔFÑGÔGˆØð 	˜x×0Ò0Ð1GÑHÔHð 	ØØ×ÒÐ7Ñ8Ô8ð 	ØØ× Ò  Ñ)Ô)ð 	%Ø× Ò  Ñ(Ô(Ð(Ø�NŠN˜8Ñ$Ô$Ð$øð ð *Ø—J’JÐ6¸Ñ;Ô;ÐA¸rˆ	Ý  §¢¨x¸Ñ!<Ô!<Ð!BÀÑCÔCÐØ!ð 		*ð 		*ˆCØ�mÐ#Ð#à ×$Ò$ SÑ)Ô)Ð)Ð)ØÕ-Ð-Ð-àØÐ.Ð.Ð.à ×$Ò$ SÑ)Ô)Ð)øð —*’*˜YÑ'Ô'Ð-¨2€KÝ�k¥4Ñ(Ô(ð ØˆÝ˜kŸošo¨hÑ7Ô7ÐG¸<ÑHÔH×NÒNÑPÔP×VÒVÑXÔXÐàÐ%Ð%ð 	ÝÐ(×,Ò,¨XÑ6Ô6½Ñ=Ô=ð	àÐð ð
 ð /Ð2°lÒBÐBÐKcÐBØ×ÒÐ-Ñ.Ô.Ð.ðð ð ð ð ð àðñ ô Ðõ 3°6Ñ:Ô:Ðà�=Ð Ð Ý"™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ð —
’
˜7Ñ#Ô#Ð) r€IØ!ŸšÐ&9Ñ:Ô:Ð@¸bÐØð )Ø<Ð<Ð*;Ð<Ñ<Ô<ˆØ˜LÑ(Ðð "×%Ò% hÑ/Ô/€IÝ�)�TÑ"Ô"ð  yð Ø-Ð-Ð-Ð-Ð-Ð-àHÐH )ÐHÑHÔHˆàð	åÐ<Ð<Ð<Ð<°VÐ<Ñ<Ô<Ñ<Ô<ð	ð Õ AÐAÐAå-×1Ò1°(Ñ;Ô;Ð;Ý�NŠNð4ð Ø—	’	˜&Ñ!Ô!ñô ð ð ÐrV   Úenabled_toolset_keysc                 ó  ‡‡	‡
‡— |                       di ¦  «         ˆfd„|D ¦   «         }d„ t          D ¦   «         Š	t          ¦   «         }‰	|z  Š	d„ t                               ¦   «         D ¦   «         Št          | d‰g ¬¦  «        }t          |t          ¦  «        sg }d„ |D ¦   «         }ˆ	ˆfd„|D ¦   «         }|                     d¦  «         t          ||z  ¦  «        | d         ‰<   |rEt          |  
                    d	¦  «        t          ¦  «        si | d	<   t          |¦  «        | d	         ‰<   t          |  
                    d
¦  «        t          ¦  «        si | d
<   t          d„ t          D ¦   «         ¦  «        | d
         ‰<   |  
                    d¦  «        }t          |t          ¦  «        rL| 
                    d¦  «        }t          |t          ¦  «        r"|r ||z
  Š
‰
rˆ
fd„|D ¦   «         }||k    r||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 r€   r˜  )rS   rp  ru   s     €r"   rƒ   z'_save_platform_tools.<locals>.<setcomp>÷	  s9   ø€ ð ð ð ØÝ(¨¨XÑ6Ô6ðØ
ðð ð rV   c                 ó   — h | ]\  }}}|’Œ	S r€   r€   r�   s      r"   rƒ   z'_save_platform_tools.<locals>.<setcomp>ý	  r�  rV   c                 ó   — h | ]
}|d          ’ŒS r‘  r€   r’  s     r"   rƒ   z'_save_platform_tools.<locals>.<setcomp>
  r”  rV   rc  c                 ó,   — g | ]}t          |¦  «        ‘ŒS r€   rx  ry  s     r"   r�  z(_save_platform_tools.<locals>.<listcomp>

  s   € Ð=Ð=Ð= R�˜R™œÐ=Ð=Ð=rV   c                 ó$   •— h | ]}|‰v¯|‰v¯
|’ŒS r€   r€   )rS   rŽ   r–  r¡  s     €€r"   rƒ   z'_save_platform_tools.<locals>.<setcomp>
  s:   ø€ ð ð ð ØØÐ)Ð)Ð)¨eÐ;PÐ.PÐ.Pð 	Ø.PÐ.PÐ.PrV   r£  rœ  rv  c              3   ó"   K  — | ]
\  }}}|V — Œd S rP   r€   r�   s      r"   rU   z'_save_platform_tools.<locals>.<genexpr>+
  s9   è è € ð 8ð 8Ù�6˜1˜aˆð8ð 8ð 8ð 8ð 8ð 8rV   r¤  r¥  c                 ó6   •— g | ]}t          |¦  «        ‰v¯|‘ŒS r€   rx  )rS   rp  Únewly_enableds     €r"   r�  z(_save_platform_tools.<locals>.<listcomp>B
  s4   ø€ ð ð ð ØÝ˜2‘w”w mÐ3Ð3ð Ø3Ð3Ð3rV   N)Ú
setdefaultrˆ   r“   r™   r2  r   r]  r‡   ro  r|   rm   rú   r
   )rM  ru   rÊ  Úplugin_keysÚexisting_toolsetsÚpreserved_entriesrÆ  r¥  Ú	remainingr–  rÓ  r¡  s    `       @@@r"   Ú_save_platform_toolsrÙ  ì	  s²  øøøø€ ð ×ÒÐ)¨2Ñ.Ô.Ð.ð
ð ð ð Ø)ðñ ô Ðð KÐJÕ4IÐJÑJÔJÐÝ*Ñ,Ô,€KØ˜Ñ$Ðð
 OÐN½9×;KÒ;KÑ;MÔ;MÐNÑNÔNÐõ   Ð(;¸XÈrÐRÑRÔRÐÝÐ'­Ñ.Ô.ð ØÐØ=Ð=Ð+<Ð=Ñ=Ô=Ððð ð ð ð Ø,ðñ ô Ðð ×Ò˜hÑ'Ô'Ð'õ -3Ð3GÐJ[Ñ3[Ñ,\Ô,\€FÐÔ Ñ)ð ð Hõ ˜&Ÿ*š*Ð%<Ñ=Ô=½tÑDÔDð 	1Ø.0ˆFÐ*Ñ+Ý4:¸;Ñ4GÔ4GˆÐ&Ô'¨Ñ1õ �f—j’jÐ!9Ñ:Ô:½DÑAÔAð .Ø+-ˆÐ'Ñ(Ý17ð 8ð 8Ý#8ð8ñ 8ô 8ñ 2ô 2€FÐ#Ô$ XÑ.ð" —
’
˜7Ñ#Ô#€IÝ�)�TÑ"Ô"ð 
?Ø%ŸMšMÐ*=Ñ>Ô>ÐÝÐ'­Ñ.Ô.ð 	?Ð3Dð 	?Ø0Ð3DÑDˆMØð ?ðð ð ð Ø!2ðñ ô �	ð Ð 1Ò1Ð1Ø5>�IÐ1Ñ2å�ÑÔÐÐÐrV   ©Úforce_freshÚfeaturesrÛ  rÜ  c                óN  — |€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                               | ¦  «        }	|	rOt          |	|||¬	¦  «        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.Nr0   r   )Úresolve_vision_provider_clientF>   r:   r8   r*   r+   r3   r5   ©rÛ  TrÚ  r¥   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS ©r°   Nra   ©rS   r!  s     r"   rU   z$_toolset_has_keys.<locals>.<genexpr>u
  s.   è è € Ð=Ð=¨q•=  5¤Ñ*Ô*Ð=Ð=Ð=Ð=Ð=Ð=rV   c              3   ó:   K  — | ]\  }}t          |¦  «        V — Œd S rP   ra   )rS   Úvarr‚   s      r"   rU   z$_toolset_has_keys.<locals>.<genexpr>}
  s.   è è € Ð=Ð=¡f c¨1�}˜SÑ!Ô!Ð=Ð=Ð=Ð=Ð=Ð=rV   )r	   Úagent.auxiliary_clientrÞ  r    r   rÜ  rm   Ú	availableÚmanaged_by_nousr1  Ú_visible_providersÚallÚTOOLSET_ENV_REQUIREMENTS)rt   rM  rÛ  rÜ  rÞ  Ú	_providerÚclientÚ_modelÚfeaturer8  Úproviderr¥   Úrequirementss                r"   Ú_toolset_has_keysrñ  L
  s¸  € ð €~Ý‘”ˆà�ÒÐð	ØMÐMÐMÐMÐMÐMà(FÐ(FÑ(HÔ(HÑ%ˆI�v˜vØ Ð%Ð%øÝð 	ð 	ð 	Ø�5�5ð	øøøð ÐKÐKÐKØÐÝ5Ø Kðñ ô ˆHð Ô#×'Ò'¨Ñ/Ô/ˆØð 	˜Ô)ð 	¨WÔ-Dð 	Ø�4õ ×
Ò
˜fÑ
%Ô
%€CØ
ð Ý*ØØØ#Øð	
ñ 
ô 
ð 
	ð 
	ˆHð  —|’| J°Ñ3Ô3ˆHØð Ø�t�tÝÐ=Ð=°HÐ=Ñ=Ô=Ñ=Ô=ð Ø�t�tðàˆuõ ,×/Ò/°¸Ñ;Ô;€LØð ØˆtÝÐ=Ð=°Ð=Ñ=Ô=Ñ=Ô=Ð=s   ˜0 °
>½>Úquestionr  c                 ó,   — ddl m}  || |||¬¦  «        S )z?Single-select menu (arrow keys). Delegates to curses_radiolist.r   )Úcurses_radiolist)ÚselectedÚcancel_returns)Úhermes_cli.curses_uirô  )rò  r  rz   rô  s       r"   Ú_prompt_choicerø  ‚
  s/   € à5Ð5Ð5Ð5Ð5Ð5ØÐ˜H g¸ÐPWÐXÑXÔXÐXrV   Ú_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)Útyperý  )rù  ÚtiktokenÚget_encodingr    r  r€  Úmodel_toolsÚtools.registryrü  Úget_all_tool_namesÚ
get_schemaÚ_jsonÚdumpsrY   Úencode)rÿ  Úencr  rü  Úcountsr¢   Úschemar[   s           r"   Ú_estimate_tool_tokensr  Ž
  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 ]l\  }}}	d}
t          ||¬¦  «        s6t                               |¦  «        st                               |¦  «        rd}
| 
                    |› d|	› d	|
› �¦  «         Œmˆ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_checklistrt  c                 óT   •— g | ]$\  }}}t          |‰¦  «        r|t          v¯|||f‘Œ%S r€   r–   ©rS   r�   ÚlÚdru   s       €r"   r�  z-_prompt_toolset_checklist.<locals>.<listcomp>É
  sO   ø€ ð ð ð Ù�q˜!˜QÝ(¨¨HÑ5Ô5ðð Õ*Ð*Ð*ð 
ˆAˆqˆ	à*Ð*Ð*rV   rL   rß  z  [no API key]ú  (ú)c                 ó*   •— h | ]\  }\  }}}|‰v ¯|’ŒS r€   r€   )rS   Úirt   r‚   r)  s       €r"   rƒ   z,_prompt_toolset_checklist.<locals>.<setcomp>Ù
  s8   ø€ ð ð ð Ùˆa‘�&˜!˜QØ�WÐÐð 	
ØÐÐrV   Nc                 ó   — g | ]\  }}}|‘Œ	S r€   r€   r�   s      r"   r�  z-_prompt_toolset_checklist.<locals>.<listcomp>á
  s   € Ð8Ð8Ð8™l˜f a¨�6Ð8Ð8Ð8rV   Úchosenr   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©rm   )rS   r¢   Útool_tokenss     €r"   rU   z?_prompt_toolset_checklist.<locals>.status_fn.<locals>.<genexpr>è
  s1   øè è € ÐGÐG°T˜Ÿš¨¨aÑ0Ô0ÐGÐGÐGÐGÐGÐGrV   iè  zEst. tool context: ~z.1fzk tokensz tokens)r’   r¬  Úsum)r  Ú	all_toolsr-  Útotalru  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Ð8rV   z
Tools for )rö  r"  c                 ó,   •— h | ]}‰|         d          ’ŒS ©r   r€   )rS   r  Ú	effectives     €r"   rƒ   z,_prompt_toolset_checklist.<locals>.<setcomp>ô
  s!   ø€ Ð,Ð,Ð, ˆI�aŒL˜ŒOÐ,Ð,Ð,rV   )r÷  r  r}  ru  r  r�   rñ  r1  rm   rê  r‹   Ú	enumerater’   rg   )r  r)  ru   rÛ  r  Úeffective_allÚlabelsrt   Úts_labelÚts_descrÁ  Úpre_selectedr"  r  r%  ru  r  r!  s    ``           @@@@r"   Ú_prompt_toolset_checklistr,  ¸
  s×  øøøøøø€ ð 6Ð5Ð5Ð5Ð5Ð5Ø(Ð(Ð(Ð(Ð(Ð(õ (Ñ)Ô)€Kå8Ñ:Ô:€Mðð ð ð Ø#0ðñ ô €Ið €FØ%.ð :ð :Ñ!ˆ�˜'Øˆå! &°kÐBÑBÔBð	&å ×$Ò$ VÑ,Ô,ð	&å0H×0LÒ0LÈVÑ0TÔ0Tð	&ð &ˆ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Ð,Ñ,Ô,Ð,rV   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.
    rß  N)r1  rm   Ú_configure_tool_categoryÚ_configure_simple_requirements)rt   rM  rÛ  r8  s       r"   Ú_configure_toolsetr0  ù
  sR   € õ ×
Ò
˜fÑ
%Ô
%€Cà
ð /Ý  ¨¨fÀ+ÐNÑNÔNÐNÐNÐNõ 	' vÑ.Ô.Ð.Ð.Ð.rV   c                  ó"  — 	 ddl m}  ddlm}  |¦   «           | ¦   «         }n# t          $ r g cY S w xY wg }|D ]Õ}	 |                     ¦   «         }n# t          $ r Y Œ$w xY wt          |t          ¦  «        sŒ>|                     d|j	        ¦  «        |                     dd¦  «        |                     dd¦  «        |                     dg ¦  «        |j
        d	œ}|                     d
¦  «        r|d
         |d
<   |                     |¦  «         ŒÖ|S )uà  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. Every image-gen backend is a plugin now â€” there
    are no hardcoded rows left in ``TOOL_CATEGORIES["image_gen"]`` for
    this function to dedupe against (see issue #26241).
    r   ©Úlist_providers©Ú_ensure_plugins_discoveredr¢   r£   rL   r¤   r¥   )r¢   r£   r¤   r¥   Úimage_gen_plugin_namer´   )Úagent.image_gen_registryr3  r‰   r5  r    Úget_setup_schemar]  rú   rm   Údisplay_namer¢   r‹   ©r3  r5  rÄ   Úrowsrï  r
  Úrows          r"   r4  r4    sg  € ðØ;Ð;Ð;Ð;Ð;Ð;ØAÐAÐAÐAÐAÐAà"Ð"Ñ$Ô$Ð$Ø"�NÑ$Ô$ˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøð €DØð ð ˆð	Ø×.Ò.Ñ0Ô0ˆFˆFøÝð 	ð 	ð 	ØˆHð	øøøå˜&¥$Ñ'Ô'ð 	Øà—J’J˜v xÔ'<Ñ=Ô=Ø—Z’Z ¨Ñ,Ô,Ø—:’:˜e RÑ(Ô(ØŸ
š
 :¨rÑ2Ô2Ø%-¤]ð
ð 
ˆð �:Š:�lÑ#Ô#ð 	5Ø & |Ô 4ˆC�ÑØ�Š�CÑÔÐÐØ€Kó   ‚ # £2±2¼AÁ
AÁAc                  ó"  — 	 ddl m}  ddlm}  |¦   «           | ¦   «         }n# t          $ r g cY S w xY wg }|D ]Õ}	 |                     ¦   «         }n# t          $ r Y Œ$w xY wt          |t          ¦  «        sŒ>|                     d|j	        ¦  «        |                     dd¦  «        |                     dd¦  «        |                     dg ¦  «        |j
        d	œ}|                     d
¦  «        r|d
         |d
<   |                     |¦  «         ŒÖ|S )u`  Build picker-row dicts from plugin-registered video gen providers.

    Mirrors ``_plugin_image_gen_providers`` exactly â€” every video backend
    is a plugin, so this function is the *only* source of provider rows
    for the Video Generation category. The hardcoded ``TOOL_CATEGORIES``
    entry for ``video_gen`` keeps an empty providers list.
    r   r2  r4  r¢   r£   rL   r¤   r¥   )r¢   r£   r¤   r¥   rÚ   r´   )Úagent.video_gen_registryr3  r‰   r5  r    r8  r]  rú   rm   r9  r¢   r‹   r:  s          r"   r5  r5  5  sg  € ðØ;Ð;Ð;Ð;Ð;Ð;ØAÐAÐAÐAÐAÐAà"Ð"Ñ$Ô$Ð$Ø"�NÑ$Ô$ˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøð €DØð ð ˆð	Ø×.Ò.Ñ0Ô0ˆFˆFøÝð 	ð 	ð 	ØˆHð	øøøå˜&¥$Ñ'Ô'ð 	Øà—J’J˜v xÔ'<Ñ=Ô=Ø—Z’Z ¨Ñ,Ô,Ø—:’:˜e RÑ(Ô(ØŸ
š
 :¨rÑ2Ô2Ø%-¤]ð
ð 
ˆð �:Š:�lÑ#Ô#ð 	5Ø & |Ô 4ˆC�ÑØ�Š�CÑÔÐÐØ€Kr=  c                  óB  — 	 ddl m}  ddlm}  |¦   «           | ¦   «         }n# t          $ r g cY S w xY wg }|D ]å}t          |dd¦  «        }|sŒ	 |                     ¦   «         }n# t          $ r Y Œ8w xY wt          |t          ¦  «        sŒR| 	                    d|j
        ¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    d	g ¦  «        ||d
œ}| 	                    d¦  «        r|d         |d<   |                     |¦  «         Œæ|S )a\  Build picker-row dicts from plugin-registered web search providers.

    Each returned dict is a regular ``TOOL_CATEGORIES`` provider row. It
    populates both ``web_backend`` (legacy field consumed by setup +
    selection helpers) and ``web_search_plugin_name`` (informational
    marker) so the picker behaves identically whether a provider is
    hardcoded or plugin-registered.

    After PR #25182, all seven web providers (brave-free, ddgs, searxng,
    exa, parallel, tavily, firecrawl) are plugins; this helper is the sole
    source of provider rows for the Web Search & Extract category.
    r   r2  r4  r¢   Nr£   rL   r¤   r¥   )r¢   r£   r¤   r¥   rÒ   Úweb_search_plugin_namer´   )Úagent.web_search_registryr3  r‰   r5  r    rä  r8  r]  rú   rm   r9  r‹   )Ú_list_web_providersr5  rÄ   r;  rï  r¢   r
  r<  s           r"   r3  r3  e  s…  € ðØSÐSÐSÐSÐSÐSØAÐAÐAÐAÐAÐAà"Ð"Ñ$Ô$Ð$Ø'Ð'Ñ)Ô)ˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøð €DØð ð ˆÝ�x ¨Ñ.Ô.ˆØð 	Øð	Ø×.Ò.Ñ0Ô0ˆFˆFøÝð 	ð 	ð 	ØˆHð	øøøå˜&¥$Ñ'Ô'ð 	Øà—J’J˜v xÔ'<Ñ=Ô=Ø—Z’Z ¨Ñ,Ô,Ø—:’:˜e RÑ(Ô(ØŸ
š
 :¨rÑ2Ô2ØØ&*ð
ð 
ˆð �:Š:�lÑ#Ô#ð 	5Ø & |Ô 4ˆC�ÑØ�Š�CÑÔÐÐØ€Kó   ‚ # £2±2ÁA%Á%
A2Á1A2Úbackendc                 ó   — 	 ddl m}  || ¦  «        }|�Vg }|                     ¦   «         r|                     d¦  «         |                     ¦   «         r|                     d¦  «         |S n# t
          $ r Y nw xY wddgS )u\  Return the capabilities (``search`` / ``extract``) a web backend supports.

    Consults the plugin registry's provider instance (``supports_search`` /
    ``supports_extract``) so the Capabilities GUI can offer per-capability
    selection (``web.search_backend`` / ``web.extract_backend``) only where it
    makes sense â€” e.g. ddgs and brave-free are search-only. Falls back to both
    capabilities when the backend isn't registered (hardcoded setup-flow rows
    like the managed Firecrawl entries resolve before plugin discovery in some
    test contexts, and firecrawl itself supports both).
    r   ©Úget_providerNÚsearchÚextract)rB  rH  Úsupports_searchr‹   Úsupports_extractr    )rE  rH  rï  Úcapss       r"   Úweb_provider_capabilitiesrN  •  s¶   € ðØ:Ð:Ð:Ð:Ð:Ð:à�< Ñ(Ô(ˆØÐØˆDØ×'Ò'Ñ)Ô)ð &Ø—’˜HÑ%Ô%Ð%Ø×(Ò(Ñ*Ô*ð 'Ø—’˜IÑ&Ô&Ð&ØˆKð  øõ ð ð ð Øˆðøøøà�iÐ Ð s   ‚A(A, Á,
A9Á8A9c                  óB  — 	 ddl m}  ddlm}  |¦   «           | ¦   «         }n# t          $ r g cY S w xY wg }|D ]å}t          |dd¦  «        }|sŒ	 |                     ¦   «         }n# t          $ r Y Œ8w xY wt          |t          ¦  «        sŒR| 	                    d|j
        ¦  «        | 	                    dd¦  «        | 	                    dd¦  «        | 	                    d	g ¦  «        ||d
œ}| 	                    d¦  «        r|d         |d<   |                     |¦  «         Œæ|S )a1  Build picker-row dicts from plugin-registered cloud browser providers.

    Each returned dict mirrors the legacy ``TOOL_CATEGORIES["browser"]``
    schema (``name`` / ``badge`` / ``tag`` / ``env_vars`` /
    ``browser_provider`` / ``post_setup``) so the picker behaves identically
    whether a provider was hardcoded or plugin-registered.

    Populates ``browser_provider`` (the legacy config key written to
    ``browser.cloud_provider``) and a ``browser_plugin_name`` marker so
    setup / write paths can route through the registry when they want to.
    r   r2  r4  r¢   Nr£   rL   r¤   r¥   )r¢   r£   r¤   r¥   rÝ   Úbrowser_plugin_namer´   )Úagent.browser_registryr3  r‰   r5  r    rä  r8  r]  rú   rm   r9  r‹   )Ú_list_browser_providersr5  rÄ   r;  rï  r¢   r
  r<  s           r"   r6  r6  ¸  s…  € ðØTÐTÐTÐTÐTÐTØAÐAÐAÐAÐAÐAà"Ð"Ñ$Ô$Ð$Ø+Ð+Ñ-Ô-ˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøð €DØð ð ˆÝ�x ¨Ñ.Ô.ˆØð 	Øð	Ø×.Ò.Ñ0Ô0ˆFˆFøÝð 	ð 	ð 	ØˆHð	øøøå˜&¥$Ñ'Ô'ð 	Øà—J’J˜v xÔ'<Ñ=Ô=Ø—Z’Z ¨Ñ,Ô,Ø—:’:˜e RÑ(Ô(ØŸ
š
 :¨rÑ2Ô2Ø $Ø#'ð
ð 
ˆð �:Š:�lÑ#Ô#ð 	5Ø & |Ô 4ˆC�ÑØ�Š�CÑÔÐÐØ€KrD  c                  óœ  — 	 ddl m} m} ddlm}  |¦   «           |¦   «         }n# t
          $ r g cY S w xY wg }|D �]}t          |dd¦  «        }|sŒ|                     ¦   «                              ¦   «         | v rŒ@	 | 	                    ¦   «         }n# t
          $ r Y Œbw xY wt          |t          ¦  «        sŒ||                     d|j        ¦  «        |                     dd¦  «        |                     dd¦  «        |                     d	g ¦  «        ||d
œ}|                     d¦  «        r|d         |d<   |                     |¦  «         �Œ|S )uû  Build picker-row dicts from plugin-registered TTS providers.

    Issue #30398 â€” the ``register_tts_provider()`` plugin hook
    coexists alongside the 10 built-in TTS providers
    (``edge``/``openai``/``elevenlabs``/â€¦) and the
    ``tts.providers.<name>: type: command`` registry from PR #17843.
    Built-in rows stay hardcoded in ``TOOL_CATEGORIES["tts"]``; this
    function only injects PLUGIN-registered providers.

    Defensive: plugins whose name collides with a built-in TTS provider
    are filtered out â€” even though the registry already rejects them
    at registration time, a future code path that registers directly
    via :func:`agent.tts_registry.register_provider` could slip
    through. Filtering here keeps the picker invariant.
    r   )Ú_BUILTIN_NAMESr3  r4  r¢   Nr£   rL   r¤   r¥   )r¢   r£   r¤   r¥   r¦   Útts_plugin_namer´   )Úagent.tts_registryrT  r3  r‰   r5  r    rä  rç  rW   r8  r]  rú   rm   r9  r‹   )	rT  r3  r5  rÄ   r;  rï  r¢   r
  r<  s	            r"   Ú_plugin_tts_providersrW  ç  s®  € ð ØEÐEÐEÐEÐEÐEÐEÐEØAÐAÐAÐAÐAÐAà"Ð"Ñ$Ô$Ð$Ø"�NÑ$Ô$ˆ	ˆ	øÝð ð ð Øˆ	ˆ	ˆ	ðøøøð €DØð ñ ˆÝ�x ¨Ñ.Ô.ˆØð 	Øà�:Š:‰<Œ<×ÒÑÔ >Ð1Ð1Øð	Ø×.Ò.Ñ0Ô0ˆFˆFøÝð 	ð 	ð 	ØˆHð	øøøå˜&¥$Ñ'Ô'ð 	Øà—J’J˜v xÔ'<Ñ=Ô=Ø—Z’Z ¨Ñ,Ô,Ø—:’:˜e RÑ(Ô(ØŸ
š
 :¨rÑ2Ô2ð !Ø#ð

ð 

ˆð �:Š:�lÑ#Ô#ð 	5Ø & |Ô 4ˆC�ÑØ�Š�CÑÔÐÑØ€Ks   ‚"% ¥4³4Á<BÂ
BÂBr8  c                óô  — |€t          ||¬¦  «        }|j        }t          |o|j        o|j        duo|j        ¦  «        }g }|                      dg ¦  «        D ]|}|                     d¦  «        r|                     d¦  «        s|j        sŒ4|r1|                     d¦  «        dk    r|r|                     d¦  «        sŒg| 	                    |¦  «         Œ}|                      d	¦  «        d
k    r!| 
                    t          ¦   «         ¦  «         |                      d	¦  «        dk    r!| 
                    t          ¦   «         ¦  «         |                      d	¦  «        dk    r!| 
                    t          ¦   «         ¦  «         |                      d	¦  «        dk    r!| 
                    t          ¦   «         ¦  «         |                      d	¦  «        dk    r!| 
                    t          ¦   «         ¦  «         |S )u³  Return provider entries visible for the current auth/config state.

    Nous-managed Tool Gateway rows (``managed_nous_feature``) are always
    shown â€” even to logged-out / unentitled users â€” so the picker advertises
    that the capability exists.  Selecting one drives an inline Nous Portal
    login + entitlement check (see ``_configure_provider``); the row only
    *activates* the gateway once paid access is confirmed.
    Nrß  TrÄ   r¬   r­   r5   z	fal-videor¢   rÕ   rÙ   rÎ   rÛ   r    )r   Úaccount_inforj   r  Úpaid_service_accessÚtool_gateway_entitledrm   Únous_auth_presentÚtool_gateway_entitled_forr‹   Úextendr4  r5  r3  r6  rW  )r8  rM  rÛ  rÜ  ÚacctÚ	pool_onlyÚvisiblerï  s           r"   rè  rè    s  € ð ÐÝ1°&ÀkÐRÑRÔRˆØÔ €Dõ Øð 	'ØŒNð	'àÔ$¨DÐ0ð	'ð Ô&ñ	ô €Ið €GØ—G’G˜K¨Ñ,Ô,ð !ð !ˆð �LŠLÐ-Ñ.Ô.ð	à—L’LÐ!7Ñ8Ô8ð	ð Ô.ð	ð
 ð ð	à—’Ð3Ñ4Ô4¸ÒCÐCØð DØ"×<Ò<¸[ÑIÔIð Dð Ø�Š�xÑ Ô Ð Ð ð ‡w‚wˆv�„Ð,Ò,Ð,Ø�ŠÕ2Ñ4Ô4Ñ5Ô5Ð5ð ‡w‚wˆv�„Ð,Ò,Ð,Ø�ŠÕ2Ñ4Ô4Ñ5Ô5Ð5ð ‡w‚wˆv�„Ð0Ò0Ð0Ø�ŠÕ3Ñ5Ô5Ñ6Ô6Ð6ð ‡w‚wˆv�„Ð.Ò.Ð.Ø�ŠÕ0Ñ2Ô2Ñ3Ô3Ð3ð
 ‡w‚wˆv�„Ð*Ò*Ð*Ø�ŠÕ,Ñ.Ô.Ñ/Ô/Ð/à€NrV   Ú
capabilityc                ó   — dS )aÞ  Deprecated: Nous Tool Gateway rows are no longer hidden.

    Previously this returned a "log in / upgrade" banner shown above a
    category when its Nous-managed rows were filtered out for unentitled
    users. Those rows are now always listed (see ``_visible_providers``), and
    the login + entitlement guidance happens inline when the user selects one
    (``ensure_nous_portal_access``). Kept as a no-op so call sites stay simple;
    always returns an empty string.
    rL   r€   )r8  rM  rb  rÛ  s       r"   Ú_hidden_nous_gateway_messagerd  u  s	   € ð  ˆ2rV   c                  ó"   — t          ¦   «         d uS rP   ©rö   r€   rV   r"   ú<lambda>rg  –  ó   € Õ2Ñ4Ô4¸DÐ@€ rV   Ú_POST_SETUP_INSTALLEDc                 ó�   — t                                | ¦  «        }|€dS 	 t           |¦   «         ¦  «        S # t          $ r Y dS w xY w)zAReturn True when the post_setup install side-effect is satisfied.NT)ri  rm   rj   r    )rõ  Ú	predicates     r"   Ú_post_setup_already_installedrl  š  s]   € å%×)Ò)¨.Ñ9Ô9€IØÐð ˆtðÝ�I�I‘K”KÑ Ô Ð øÝð ð ð Øˆtˆtðøøøs    7 ·
AÁAÚmodule_namec                 óf   — ddl }	 |j                             | ¦  «        duS # t          $ r Y dS w xY w)zACheap importable-without-importing check (no heavy side effects).r   NF)Úimportlib.utilÚutilÚ	find_specr    )rm  Ú	importlibs     r"   Ú_module_installedrs  §  sP   € àÐÐÐðØŒ~×'Ò'¨Ñ4Ô4¸DÐ@Ð@øÝð ð ð Øˆuˆuðøøøs   †" ¢
0¯0c                  óp   — ddl } ddlm} | j                             d¦  «        }|�d|_         |¦   «         S )a2  True when everything ``_run_post_setup("agent_browser")`` installs is
    present: the agent-browser CLI *and* the Chromium build it drives (or the
    Lightpanda engine, which needs no Chromium). Mirrors the hook so "Run
    setup" flips to an installed state only when re-running it would be a
    no-op.r   N)Ú_local_browser_runnableztools.browser_tool)r   Úhermes_cli.nous_subscriptionru  Úmodulesrm   r  )r   ru  Úbts      r"   Ú_agent_browser_installedry  ±  sQ   € ð €J€J€JàDÐDÐDÐDÐDÐDð 
Œ�ŠÐ-Ñ	.Ô	.€BØ	€~Ø(,ˆÔ%à"Ð"Ñ$Ô$Ð$rV   c                  óF   — t           dz  dz  dz                       ¦   «         S )ziTrue when the Camofox npm package ``_run_post_setup("camofox")``
    installs is already in node_modules.rø  r   r  )r  r‚  r€   rV   r"   Ú_camofox_installedr{  Ç  s&   € õ ˜>Ñ)¨HÑ4Ð7HÑH×PÒPÑRÔRÐRrV   c                  ó    — t          d¦  «        S )Nr¾   ©rs  r€   rV   r"   rg  rg  Ô  s   € Õ*¨;Ñ7Ô7€ rV   c                  ó    — t          d¦  «        S )NrÀ   r}  r€   rV   r"   rg  rg  Õ  s   € Õ& wÑ/Ô/€ rV   c                  ó    — t          d¦  «        S )NrÆ   r}  r€   rV   r"   rg  rg  Ö  s   € Õ/Ð0@ÑAÔA€ rV   c                  ó    — t          d¦  «        S )Nr  r}  r€   rV   r"   rg  rg  ×  s   € Õ% fÑ-Ô-€ rV   c                  ó    — t          d¦  «        S )Nrì   r}  r€   rV   r"   rg  rg  Ø  s   € Õ)¨*Ñ5Ô5€ rV   c                  ó   — t          ¦   «         S rP   )ry  r€   rV   r"   rg  rg  Ù  s   € Õ5Ñ7Ô7€ rV   c                  ó   — t          ¦   «         S rP   )Ú_cloud_agent_browser_installedr€   rV   r"   rg  rg  Ú  s   € Õ9Ñ;Ô;€ rV   c                  ó   — t          ¦   «         S rP   )r{  r€   rV   r"   rg  rg  Û  s   € Õ)Ñ+Ô+€ rV   c                  ó"   — t          ¦   «         d uS rP   rf  r€   rV   r"   rg  rg  Ü  rh  rV   )	r¾   rÀ   rÆ   r  rì   rÜ   rß   râ   rè   Ú_POST_SETUP_READYc                  ó"   — ddl m}   | ¦   «         S )uÞ   Installed-check for the ``browserbase`` hook (cloud provider rows).

    Cloud providers host their own Chromium, so their hook only installs the
    agent-browser npm package â€” presence of the CLI is the whole contract.r   ©Ú_has_agent_browser)rv  rŠ  r‰  s    r"   r„  r„  à  s&   € ð
 @Ð?Ð?Ð?Ð?Ð?àÐÑÔÐrV   )rÜ  Ú	is_activerï  r‹  c                ó¬  — |                       dg ¦  «        }|rt          d„ |D ¦   «         ¦  «        rdS dS |                       d¦  «        }|                       d¦  «        s|ro|€t          |¦  «        }|j        sdS |rS|j        }t          j         |¦  «        }t          |o$|j        o|r|                     |¦  «        n|j	        ¦  «        }|sdS |                       d	¦  «        }	|	rl|	d
k    rt          ¦   «         rdndS t                                |	¦  «        }
|
� 	  |
¦   «         rdndS # t          $ r Y dS w xY w|€t          | |¦  «        }|rdndS dS )u/  Compute an honest readiness state for a provider picker row.

    Returns one of:

    - ``"ready"``       â€” usable as-is (keys set / entitled / installed).
    - ``"needs_keys"``  â€” declares env vars and at least one is unset.
    - ``"needs_auth"``  â€” needs a sign-in: Nous Portal login/entitlement for
      managed Tool Gateway rows, or xAI Grok OAuth / XAI_API_KEY for
      ``post_setup: "xai_grok"`` rows.
    - ``"needs_setup"`` â€” keyless row whose ``post_setup`` install hook has
      verifiably not run yet (see ``_POST_SETUP_READY``).

    Keyless â‰  usable: this is the server-side truth the GUI "Ready" pill
    renders from (the old client-side heuristic showed Ready for every
    zero-env-var row, including logged-out Nous Subscription rows).

    ``features`` (a ``NousSubscriptionFeatures``) can be passed to avoid
    re-fetching portal state per row. ``is_active`` is the completed-setup
    fallback signal for post_setup hooks with no registered installed-check
    (selecting a row runs its hook, so the active row has been set up).
    r¥   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rá  ra   râ  s     r"   rU   z,provider_readiness_status.<locals>.<genexpr>  s.   è è € Ð9Ð9¨1�}˜Q˜uœXÑ&Ô&Ð9Ð9Ð9Ð9Ð9Ð9rV   ÚreadyÚ
needs_keysr­   r¬   NÚ
needs_authr´   r³   Úneeds_setup)rm   ré  r   r\  rY  r   rj   r  r]  r[  ro   r‡  r    Ú_is_provider_active)rï  rM  rÜ  r‹  r¥   Úmanaged_featurer_  ÚcategoryÚentitledr´   rk  s              r"   Úprovider_readiness_statusr–  ê  sÉ  € ð8 �|Š|˜J¨Ñ+Ô+€HØð ÝÐ9Ð9°Ð9Ñ9Ô9Ñ9Ô9ð 	Ø�7Øˆ|à—l’lÐ#9Ñ:Ô:€OØ‡|‚|Ð(Ñ)Ô)ð $¨_ð $ØÐÝ5°fÑ=Ô=ˆHØÔ)ð 	 Ø�<Øð 	$ð Ô(ˆDÝ8Ô<¸_ÑMÔMˆHÝØð Ø”Nðð  ð4�D×2Ò2°8Ñ<Ô<Ð<àÔ3ñô ˆHð ð $Ø#�|ð
 —’˜lÑ+Ô+€JØð 7Ø˜Ò#Ð#Ý6Ñ8Ô8ÐJ�7�7¸lÐJÝ%×)Ò)¨*Ñ5Ô5ˆ	ØÐ ðØ"+ )¡+¤+Ð@�w�w°=Ð@øÝð ð ð à�w�wðøøøð
 ÐÝ+¨H°fÑ=Ô=ˆIØ#Ð6ˆwˆw¨Ð6àˆ7s   ÄD+ Ä+
D9Ä8D9c                óú  — t                                | ¦  «        }|st          | ||¬¦  «         S t          |||¬¦  «        D ]+}|                     d¦  «        }|rt	          |¦  «        s d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 | dk    r_	 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ß  r´   Tr8   rï  r*   rE  r+   Úcloud_providerr3   Fr   r2  r4  r5   )r1  rm   rñ  rè  rl  r]  rú   r   r7  r3  r‰   r5  Úis_availabler    r?  )rt   rM  rÛ  r8  rï  r´   Útts_cfgÚweb_cfgÚbrowser_cfgr3  r5  s              r"   Ú#_toolset_needs_configuration_promptr�  :  sú  € õ ×
Ò
˜fÑ
%Ô
%€CØð NÝ$ V¨VÀÐMÑMÔMÐMÐMõ ' s¨FÀÐLÑLÔLð ð ˆØ—\’\ ,Ñ/Ô/ˆ
Øð 	Õ;¸JÑGÔGð 	Ø�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Ø�ÒÐð	Ø?Ð?Ð?Ð?Ð?Ð?ØEÐEÐEÐEÐEÐEà&Ð&Ñ(Ô(Ð(Ø*˜NÑ,Ô,ð ð �ðØ×,Ò,Ñ.Ô.ð %Ø$˜u˜uð%øå ð ð ð Ø�Hðøøøð	øõ ð 	ð 	ð 	ØˆDð	øøøàˆtå  ¨¸[ÐIÑIÔIÐIÐIsx   Ä'"E3 Å
E"ÅE3 Å!E3 Å"
E/Å,E3 Å.E/Å/E3 Å3
F Å?F Æ"G Æ/GÇG ÇG Ç
GÇG ÇGÇG Ç
G%Ç$G%c                óD  — |                      dd¦  «        }|d         }t          |||¬¦  «        }t          ||d|› �|¬¦  «        }|                      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         › �¦  «         |r)|                     ¦   «         D ]}
t          d|
› �¦  «         Œt!          |	||¬¦  «         dS t          ¦   «          |                      dd¦  «        }t          t          d|› d|› d|› d�t          j        ¦  «        ¦  «         |                      d¦  «        rt          d|d         › �¦  «         |r)|                     ¦   «         D ]}
t          d|
› �¦  «         Œt          ¦   «          	 t#          t%          ||¬¦  «        j        ¦  «        }n# t(          $ r d}Y nw xY w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#¦  «        r|rd$}nd%}|                     |d         › |› |› |› |› �¦  «         ŒÚ|                     d&¦  «         t1          |||¬¦  «        }t3          d|› d'�||¦  «        }|t          |¦  «        k    rt          d(|› �¦  «         dS t!          ||         ||¬¦  «         dS ))z2Configure a tool category with provider selection.rÃ   rL   r¢   rß  ú#the Nous Subscription provider for Úrequires_pythonú  z requires Python r   ú.rM   z+ (current: r  z3  Upgrade Python and reinstall to enable this tool.Nú  --- Ú ú (ú) ---r¤   rÔ   rÓ   zChoose a providerz - z ---Fr£   ú [Ú]õ    â€” r¥   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rá  ra   ©rS   Úvs     r"   rU   z+_configure_tool_category.<locals>.<genexpr>É  ó.   è è € Ð"MÐ"M¸q¥=°°5´Ñ#:Ô#:Ð"MÐ"MÐ"MÐ"MÐ"MÐ"MrV   ú	 [active]ú [configured]r­   u*     â˜… Included with your Nous subscriptionu'     â˜… via Nous Portal (login on select)u(   Skip â€” keep defaults / configure laterú:z
  Skipped )rm   rè  rd  r   Úversion_infoÚprintr>  ÚmajorÚminorrI  rY   r   r   ÚCYANr–  rH  Ú_configure_providerrj   r   r\  r    ré  r’  r‹   Ú_detect_active_provider_indexrø  )rt   r8  rM  rÛ  rÃ   r¢   rÄ   Úhidden_nous_messageÚreqrï  r¥  ÚtitleÚ_nous_logged_inÚprovider_choicesr“  r£   r¤   Ú
configuredr¥   Ú
sub_markerÚdefault_idxÚprovider_idxs                         r"   r.  r.    s>  € ð �7Š7�6˜2ÑÔ€DØˆvŒ;€DÝ" 3¨¸KÐHÑHÔH€IÝ6ØØØ4¨dÐ4Ð4Øð	ñ ô Ðð ‡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Øð 	,Ø+×6Ò6Ñ8Ô8ð ,ð ,�Ý˜{ D˜{˜{Ñ+Ô+Ð+Ð+Ý˜H f¸+ÐFÑFÔFÐFÐFÐ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Øð 	,Ø+×6Ò6Ñ8Ô8ð ,ð ,�Ý˜{ D˜{˜{Ñ+Ô+Ð+Ð+Ý‰Œˆð	$Ý"Ý.ØØ +ðñ ô ô $ñ	ô ˆOˆOøõ ð 	$ð 	$ð 	$Ø#ˆOˆOˆOð	$øøøð ÐØð 	Xð 	XˆAØ*+¯%ª%°©.¬.Ð@Ð&˜˜7œÐ&Ð&Ð&Ð&¸bˆEØ()¯ª¨e©¬Ð<Ð$˜!˜Eœ(Ð$Ð$Ð$¸"ˆCØˆJØ—u’u˜Z¨Ñ,Ô,ˆHØð 1�sÐ"MÐ"MÀHÐ"MÑ"MÔ"MÑMÔMð 1Ý& q¨&¸kÐJÑJÔJð 1Ø!,�J�JØ!ð 1Ø!#�J�Jà!0�Jð ˆJØ�uŠuÐ+Ñ,Ô,ð KØ"ð KØ!M�J�Jà!J�JØ×#Ò# q¨¤yÐ$V°%Ð$V¸Ð$V¸jÐ$VÈ*Ð$VÐ$VÑWÔWÐWÐWð 	×ÒÐ JÑKÔKÐKõ 4ØØØ#ð
ñ 
ô 
ˆõ & m¨5 m m mÐ5EÀ{ÑSÔSˆð �3˜y™>œ>Ò)Ð)ÝÐ+ TÐ+Ð+Ñ,Ô,Ð,ØˆFå˜I lÔ3°VÈÐUÑUÔUÐUÐUÐUs   Ê#J5 Ê5KËKc                ó”  — |                       d¦  «        }|rD|                      di ¦  «        }t          |t          ¦  «        o|                      d¦  «        |k    S |                       d¦  «        }|rY|                       d¦  «        sD|                      di ¦  «        }t          |t          ¦  «        o|                      d¦  «        |k    S |                       d¦  «        }|�r!t          ||¬¦  «        }|j                              |¦  «        }	|	€d	S |dk    rˆ|                      di ¦  «        }t          |t          ¦  «        rV|                      d¦  «        }
|
d
vrd	S |                      d¦  «        �&t          |                      d¦  «        d	¬¦  «        sd	S |	j        S |dk    rˆ|                      di ¦  «        }t          |t          ¦  «        rV|                      d¦  «        }
|
d
vrd	S |                      d¦  «        �&t          |                      d¦  «        d	¬¦  «        sd	S |	j        S |                       d¦  «        r"|	j        ot          |dd¦  «        | d         k    S |                       d¦  «        r"|	j        ot          |dd¦  «        | d         k    S d| v r$t          |dd¦  «        }|	j        o| d         |k    S |                       d¦  «        r$t          |dd¦  «        }|	j        o|| d         k    S |	j        S |                       d¦  «        rt          |dd¦  «        | d         k    S |                       d¦  «        rt          |dd¦  «        pd}|| d         k    S d| v rt          |dd¦  «        }| d         |k    S |                       d¦  «        rt          |dd¦  «        }|| d         k    S |                       d¦  «        rw|                      di ¦  «        }t          |t          ¦  «        sd	S |                      d¦  «        }
| d         dk    o(|
d
v o$t          |                      d¦  «        d	¬¦  «         S d	S )z>Check if a provider entry matches the currently active config.r6  r3   rï  rÚ   r­   r5   rß  NF>   NrL   r×   Úuse_gatewayrc  r¦   r8   rÇ   r:   rÝ   r+   r˜  rÒ   r*   rE  rÅ   rØ   r×   )rm   r]  rú   r   rÜ  r   rç  r   )rï  rM  rÛ  Úplugin_nameÚ	image_cfgÚvideo_plugin_nameÚ	video_cfgr“  rÜ  rî  Úconfigured_providerÚcurrents               r"   r’  r’  ñ  s½  € ð —,’,Ð6Ñ7Ô7€KØð XØ—J’J˜{¨BÑ/Ô/ˆ	Ý˜)¥TÑ*Ô*ÐW¨y¯}ª}¸ZÑ/HÔ/HÈKÒ/WÐWà ŸšÐ%<Ñ=Ô=ÐØð ^ §¢Ð.DÑ!EÔ!Eð ^Ø—J’J˜{¨BÑ/Ô/ˆ	Ý˜)¥TÑ*Ô*Ð]¨y¯}ª}¸ZÑ/HÔ/HÐL]Ò/]Ð]à—l’lÐ#9Ñ:Ô:€OØñ ''Ý1°&ÀkÐRÑRÔRˆØÔ#×'Ò'¨Ñ8Ô8ˆØˆ?Ø�5Ø˜kÒ)Ð)ØŸ
š
 ;°Ñ3Ô3ˆIÝ˜)¥TÑ*Ô*ð !Ø&/§m¢m°JÑ&?Ô&?Ð#Ø&Ð.?Ð?Ð?Ø ˜5Ø—=’= Ñ/Ô/Ð;ÅOÐT]×TaÒTaÐboÑTpÔTpÐzð  EAñ  EAô  EAÐ;Ø ˜5ØÔ*Ð*Ø˜kÒ)Ð)ØŸ
š
 ;°Ñ3Ô3ˆIÝ˜)¥TÑ*Ô*ð !Ø&/§m¢m°JÑ&?Ô&?Ð#Ø&Ð.?Ð?Ð?Ø ˜5Ø—=’= Ñ/Ô/Ð;ÅOÐT]×TaÒTaÐboÑTpÔTpÐzð  EAñ  EAô  EAÐ;Ø ˜5ØÔ*Ð*Ø�<Š<˜Ñ'Ô'ð 	àÔ'ð SÝ˜F E¨:Ñ6Ô6¸(À>Ô:RÒRðð �<Š<˜Ñ'Ô'ð 	àÔ'ð SÝ˜F E¨:Ñ6Ô6¸(À>Ô:RÒRðð  Ð)Ð)Ý˜f iÐ1AÑBÔBˆGØÔ*ÐV¨xÐ8JÔ/KÈwÒ/VÐVØ�<Š<˜Ñ&Ô&ð 	RÝ˜f e¨YÑ7Ô7ˆGØÔ*ÐQ¨w¸(À=Ô:QÒ/QÐQØÔ&Ð&à‡|‚|�NÑ#Ô#ð NÝ�v˜u jÑ1Ô1°X¸nÔ5MÒMÐMØ‡|‚|�NÑ#Ô#ð 3å˜& %¨Ñ4Ô4Ð?¸ˆØ˜( >Ô2Ò2Ð2Ø˜XÐ%Ð%Ý˜& )Ð-=Ñ>Ô>ˆØÐ*Ô+¨wÒ6Ð6Ø‡|‚|�MÑ"Ô"ð 2Ý˜& %¨Ñ3Ô3ˆØ˜( =Ô1Ò1Ð1Ø‡|‚|Ð&Ñ'Ô'ð 	
Ø—J’J˜{¨BÑ/Ô/ˆ	Ý˜)¥TÑ*Ô*ð 	Ø�5Ø'Ÿmšm¨JÑ7Ô7ÐàÐ'Ô(¨EÒ1ð QØ#Ð'8Ð8ðQå# I§M¢M°-Ñ$@Ô$@È%ÐPÑPÔPÐPð	
ð
 ˆ5rV   rÄ   c                óÆ   — t          | ¦  «        D ]P\  }}t          |||¬¦  «        r|c S |                     dg ¦  «        }|rt          d„ |D ¦   «         ¦  «        r|c S ŒQdS )z8Return the index of the currently active provider, or 0.rß  r¥   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rá  ra   r«  s     r"   rU   z0_detect_active_provider_index.<locals>.<genexpr>Q  s.   è è € ÐFÐF¸�M¨!¨E¬(Ñ3Ô3ÐFÐFÐFÐFÐFÐFrV   r   )r&  r’  rm   ré  )rÄ   rM  rÛ  r  r“  r¥   s         r"   r·  r·  E  s‡   € õ ˜)Ñ$Ô$ð ð ‰ˆˆ1Ý˜q &°kÐBÑBÔBð 	ØˆHˆHˆHà—5’5˜ RÑ(Ô(ˆØð 	�ÐFÐF¸XÐFÑFÔFÑFÔFð 	ØˆHˆHˆHøØˆ1rV   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Ð  c  s%   € àEÐEÐEÐEÐEÐEÐEÐEØ�}Ð$Ð$rV   zFAL.ai)Ú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¡  ÚspeedrL   Ú	strengthsÚpricer  )rÔ  rÕ  rÖ  s      r"   Ú_format_imagegen_model_rowrÝ  r  s¥   € ð ð 	#�f˜W”oð 	#Ð*ð 	#ð 	#Ø�8Š8�G˜RÑ Ô ð	#Ø#)¨'¤?ð	#Ø7ð	#ð 	#à�8Š8�K Ñ$Ô$ð	#à'-¨kÔ':ð	#à?ð	#ð 	#ð �8Š8�G˜RÑ Ô ð	#ð 	#ðrV   Ú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 r€   r€   ©rS   ÚmÚcurrent_models     €r"   r�  z-_configure_imagegen_model.<locals>.<listcomp>–  ó#   ø€ Ð LÐ LÐ L q¸¸mÒ9KÐ9K Ð9KÐ9KÐ9KrV   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rP   ©rY   ©rS   râ  s     r"   rU   z,_configure_imagegen_model.<locals>.<genexpr>š  ó(   è è € Ð/Ð/ •S˜‘V”VÐ/Ð/Ð/Ð/Ð/Ð/rV   c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS ©rÚ  rL   N©rY   rm   ©rS   râ  Úcatalogs     €r"   rU   z,_configure_imagegen_model.<locals>.<genexpr>›  ó=   øè è € ÐJÐJ¸1•c˜' !œ*Ÿ.š.¨°"Ñ5Ô5Ñ6Ô6ÐJÐJÐJÐJÐJÐJrV   é   rc  c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS ©rÛ  rL   Nrë  rì  s     €r"   rU   z,_configure_imagegen_model.<locals>.<genexpr>œ  ó=   øè è € ÐRÐRÀ1�#˜g aœjŸnšn¨[¸"Ñ=Ô=Ñ>Ô>ÐRÐRÐRÐRÐRÐRrV   r   ©rÙ  rÚ  rÛ  r¡  ÚModelrØ  ÚSpeedrÚ  Ú	StrengthsrÛ  ú  Priceõ     â†� currently in useú	  Choose rÑ  ú model:ú  Model set to: )ÚIMAGEGEN_BACKENDSrm   rÔ  r]  rú   r‡   r7  Úmaxr²  r   r   rµ  rÝ  r‹   rø  rL  )rÞ  rM  rE  Údefault_modelÚcfg_keyÚcur_cfgÚ	model_idsÚorderedrÖ  Úheaderr;  Úmidr<  r-  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Ð.Ð.Ñ/Ô/Ð/Ð/Ð/rV   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   rG  r4  Nc                 óR   — i | ]$}t          |t          ¦  «        ¯d |v ¯|d          |“Œ%S ©Úid©r]  rú   rç  s     r"   rŸ   z-_plugin_image_gen_catalog.<locals>.<dictcomp>Ñ  ó2   € ÐOÐOÐO˜a­Z¸½4Ñ-@Ô-@ÐOÀTÈQÀYÀYˆq�Œw˜ÀYÀYÀYrV   )r7  rH  r‰   r5  r    Úlist_modelsrþ  ©rÃ  rH  r5  rï  Úmodelsrz   rí  s          r"   Ú_plugin_image_gen_catalogr  º  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ÐÐó   ‚!$ ¤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`.
    Nr3   rÙ  c                 ó    •— g | ]
}|‰k    ¯|‘ŒS r€   r€   rá  s     €r"   r�  z8_configure_imagegen_model_for_plugin.<locals>.<listcomp>é  rä  rV   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rP   ræ  rç  s     r"   rU   z7_configure_imagegen_model_for_plugin.<locals>.<genexpr>ì  rè  rV   c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS rê  rë  rì  s     €r"   rU   z7_configure_imagegen_model_for_plugin.<locals>.<genexpr>í  rî  rV   rï  rc  c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS rñ  rë  rì  s     €r"   rU   z7_configure_imagegen_model_for_plugin.<locals>.<genexpr>î  rò  rV   r   ró  r¡  rô  rØ  rõ  rÚ  rö  rÛ  r÷  rø  rù  rú  rû  )r  rÔ  r]  rú   rm   r‡   r7  rý  r²  r   r   rµ  rÝ  r‹   rø  rL  )rÃ  rM  rþ  r   r  r  rÖ  r  r;  r  r<  r-  r  rí  rã  s                @@r"   Ú$_configure_imagegen_model_for_pluginr  Õ  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Ð.Ð.Ñ/Ô/Ð/Ð/Ð/rV   Úsection_namec                 ó8  — |                      | i ¦  «        }t          |t          ¦  «        si }||| <   |                      di ¦  «        }t          |t          ¦  «        si }||d<   |                      di ¦  «        }t          |t          ¦  «        si }||d<   t          d¦  «         t	          dg d¢d¬¦  «        }|dk    rd	|d
<   t          d¦  «         dS |dk    r d|d
<   d|d<   d|d<   t          d¦  «         dS d|d
<   d|d<   d|d<   t          d¦  «         dS )z2Prompt for xAI Imagine stored public URL behavior.r²   Ústoragez~  xAI Imagine can store generated media and create reusable public URLs. xAI may bill for stored files and public URL hosting.z  Stored public URLs:)z9Enable public URLs without automatic expiry (recommended)zDisable stored public URLszEnable public URLs for 2 daysr   rc  rM   Fr)  z!  xAI stored public URLs disabledrN   TÚ
public_urli £ Úexpires_afterz+  xAI stored public URLs enabled for 2 daysNz9  xAI stored public URLs enabled without automatic expiry)rÔ  r]  rú   rH  rø  rL  )r  rM  ÚsectionÚxai_cfgÚstorage_cfgr-  s         r"   Ú_configure_xai_imagine_storager    s�  € à×Ò ¨bÑ1Ô1€GÝ�g�tÑ$Ô$ð 'ØˆØ&ˆˆ|ÑØ× Ò  ¨Ñ+Ô+€GÝ�g�tÑ$Ô$ð !ØˆØ ˆ�‰Ø×$Ò$ Y°Ñ3Ô3€KÝ�k¥4Ñ(Ô(ð )ØˆØ(ˆ�	Ñåð	@ñô ð õ Øð	
ð 	
ð 	
ð
 ðñ ô €Cð ˆa‚x€xØ!&ˆ�IÑÝÐ:Ñ;Ô;Ð;Ð;Ð;Ø	�ŠˆØ!%ˆ�IÑØ$(ˆ�LÑ!Ø'7ˆ�OÑ$ÝÐDÑEÔEÐEÐEÐEà!%ˆ�IÑØ$(ˆ�LÑ!Ø'+ˆ�OÑ$ÝÐRÑSÔSÐSÐSÐSrV   c                 óò   — |                      di ¦  «        }t          |t          ¦  «        si }||d<   | |d<   d|d<   t          d| › �¦  «         t	          | |¦  «         | dk    rt          d|¦  «         dS dS )z<Persist a plugin-backed image generation provider selection.r3   rï  FrÂ  z  image_gen.provider set to: r²   N)rÔ  r]  rú   rL  r  r  )rÃ  rM  Úimg_cfgs      r"   Ú!_select_plugin_image_gen_providerr"  7  sœ   € à×Ò ¨RÑ0Ô0€GÝ�g�tÑ$Ô$ð &ØˆØ%ˆˆ{ÑØ%€GˆJÑØ"€GˆMÑÝÐ@°;Ð@Ð@ÑAÔAÐAÝ(¨°fÑ=Ô=Ð=Ø�eÒÐÝ& {°FÑ;Ô;Ð;Ð;Ð;ð ÐrV   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 )zÆReturn ``(catalog_dict, default_model_id)`` for a video gen plugin.

    Mirrors :func:`_plugin_image_gen_catalog`. Returns ``({}, None)`` when
    the plugin isn't registered or has no models.
    r   rG  r4  Nc                 óR   — i | ]$}t          |t          ¦  «        ¯d |v ¯|d          |“Œ%S r  r
  rç  s     r"   rŸ   z-_plugin_video_gen_catalog.<locals>.<dictcomp>]  r  rV   )r?  rH  r‰   r5  r    r  rþ  r  s          r"   Ú_plugin_video_gen_catalogr%  H  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ÐÐr  c                 ó6  ‡‡— 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 ]’}	‰|	         }
d|	d|d         › �›d|
                     dd¦  «        d|d         › �›d|
                     dd¦  «        d|d         › �›d|
                     dd¦  «        › �}|	‰k    r|dz  }|                     |¦  «         Œ“t          d| › d�|d
¬¦  «        }||         }||d<   t          d|› �¦  «         dS )z¦Prompt for a video gen model from a plugin's catalog.

    Mirrors :func:`_configure_imagegen_model_for_plugin`. Writes the
    selection to ``video_gen.model``.
    Nr5   rÙ  c                 ó    •— g | ]
}|‰k    ¯|‘ŒS r€   r€   rá  s     €r"   r�  z8_configure_videogen_model_for_plugin.<locals>.<listcomp>t  rä  rV   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rP   ræ  rç  s     r"   rU   z7_configure_videogen_model_for_plugin.<locals>.<genexpr>w  rè  rV   c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS rê  rë  rì  s     €r"   rU   z7_configure_videogen_model_for_plugin.<locals>.<genexpr>x  rî  rV   rï  rc  c              3   ój   •K  — | ]-}t          ‰|                              d d¦  «        ¦  «        V — Œ.dS rñ  rë  rì  s     €r"   rU   z7_configure_videogen_model_for_plugin.<locals>.<genexpr>y  rò  rV   r   ró  r¡  rô  rØ  rõ  rÚ  rö  rÛ  r÷  rL   rÜ  rø  rù  rú  rû  )r%  rÔ  r]  rú   rm   r‡   r7  rý  r²  r   r   rµ  r‹   rø  rL  )rÃ  rM  rþ  r   r  r  rÖ  r  r;  r  rÕ  r<  r-  r  rí  rã  s                 @@r"   Ú$_configure_videogen_model_for_pluginr+  a  s  øø€ õ 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Øð 
ð 
ˆØ�sŒ|ˆð'�ð '�v˜g”ð 'Ð+ð 'ð 'Ø�xŠx˜ Ñ$Ô$ð'Ø'-¨g¤ð'Ø;ð'ð 'à�xŠx˜ RÑ(Ô(ð'à+1°+Ô+>ð'àCð'ð 'ð �xŠx˜ Ñ$Ô$ð'ð 'ð 	ð �-ÒÐØÐ+Ñ+ˆCØ�Š�CÑÔÐÐå
Ø(�KÐ(Ð(Ð(ØØðñ ô €Cð �SŒ\€FØ€GˆGÑÝÐ. fÐ.Ð.Ñ/Ô/Ð/Ð/Ð/rV   )ÚbaseÚtinyÚsmallÚmediumzlarge-v3)zwhisper-large-v3-turbozwhisper-large-v3zdistil-whisper-large-v3-en)z	whisper-1zgpt-4o-mini-transcribezgpt-4o-transcribezgpt-transcribeÚ	scribe_v2Ú	scribe_v1)rÅ   rË   r©   r·   rÇ   c                 ó`  — t                                | ¦  «        }|sdS |                     di ¦  «        }t          |t          ¦  «        si }||d<   |                     | i ¦  «        }t          |t          ¦  «        si }||| <   t
                               | d¦  «        }t          |                     |¦  «        pd¦  «                             ¦   «         }t          |¦  «        }||v r| 	                    |¦  «        nd}t          d||¦  «        }	||	         }
|
||<   t          d|
› �¦  «         dS )uâ   Prompt for the STT model after a provider pick (when a catalog exists).

    Providers without a static catalog (xai, deepinfra) skip the prompt â€”
    xAI has a single model and DeepInfra resolves from its live catalog.
    Nr:   rÙ  rL   r   z  Select STT model:z  STT model set to: )ÚSTT_MODEL_CATALOGrm   rÔ  r]  rú   Ú_STT_MODEL_CONFIG_KEYrg   rW   r‡   Úindexrø  rL  )rÇ   rM  rí  Ústt_cfgÚprov_cfgÚ	model_keyrÈ  r  r¿  r-  r  s              r"   Ú_configure_stt_modelr9  ­  s;  € õ  ×#Ò# LÑ1Ô1€GØð ØˆØ×Ò  rÑ*Ô*€GÝ�g�tÑ$Ô$ð  ØˆØˆˆu‰Ø×!Ò! ,°Ñ3Ô3€HÝ�h¥Ñ%Ô%ð )ØˆØ (ˆ�ÑÝ%×)Ò)¨,¸Ñ@Ô@€IÝ�(—,’,˜yÑ)Ô)Ð/¨RÑ0Ô0×6Ò6Ñ8Ô8€GÝ�7‰mŒm€GØ,3°wÐ,>Ð,>�'—-’- Ñ(Ô(Ð(ÀA€KÝ
Ð.°¸Ñ
EÔ
E€CØ�SŒ\€FØ €HˆYÑÝÐ2¨&Ð2Ð2Ñ3Ô3Ð3Ð3Ð3rV   ©rÂ  rÂ  c                óò   — |                      di ¦  «        }t          |t          ¦  «        si }||d<   | |d<   ||d<   t          d| › �¦  «         t	          | |¦  «         | dk    rt          d|¦  «         dS dS )z<Persist a plugin-backed video generation provider selection.r5   rï  rÂ  z  video_gen.provider set to: r²   N)rÔ  r]  rú   rL  r+  r  )rÃ  rM  rÂ  Úvid_cfgs       r"   Ú!_select_plugin_video_gen_providerr=  È  sœ   € à×Ò ¨RÑ0Ô0€GÝ�g�tÑ$Ô$ð &ØˆØ%ˆˆ{ÑØ%€GˆJÑØ(€GˆMÑÝÐ@°;Ð@Ð@ÑAÔAÐAÝ(¨°fÑ=Ô=Ð=Ø�eÒÐÝ& {°FÑ;Ô;Ð;Ð;Ð;ð ÐrV   c                ór  — |                       d¦  «        r3|                     di ¦  «        }| d         |d<   t          |¦  «        |d<   |                       d¦  «        r3|                     di ¦  «        }| d         |d<   t          |¦  «        |d<   d| v r7| d         }|                     di ¦  «        }|r||d	<   t          |¦  «        |d<   |                       d
¦  «        r3|                     di ¦  «        }| d
         |d<   t          |¦  «        |d<   |r|dvrd|                     |i ¦  «        d<   dS |s~t                               ¦   «         D ]f\  }}	| |	                      dg ¦  «        v rG|                      |¦  «        }
t          |
t          ¦  «        r|
                      d¦  «        rd|
d<    dS ŒedS dS )u  Persist the provider/backend config keys for a selected provider.

    This is the pure, non-interactive core of :func:`_configure_provider` â€”
    it writes ``tts.provider`` / ``browser.cloud_provider`` / ``web.backend``
    and the ``use_gateway`` flags based on the provider's markers, but does
    NOT prompt for env vars, run post-setup hooks, gate on Nous auth, or run
    interactive model pickers. Both the CLI configurator and the desktop GUI
    ``PUT .../provider`` endpoint call through here so there is one code path.
    r¦   r8   rï  rÂ  rÇ   r:   rÝ   r+   r˜  rÒ   r*   rE  >   r:   r8   r*   r+   TrÄ   FN)rm   rÔ  rj   r1  rg  r]  rú   )rï  rM  r“  rš  r6  Úbprœ  r›  Úcat_keyr8  r  s              r"   Ú_write_provider_configrA  Ö  s  € ð ‡|‚|�NÑ#Ô#ð 7Ø×#Ò# E¨2Ñ.Ô.ˆØ& ~Ô6ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�Ñð ‡|‚|�NÑ#Ô#ð 7Ø×#Ò# E¨2Ñ.Ô.ˆØ& ~Ô6ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�Ñð ˜XÐ%Ð%ØÐ(Ô)ˆØ×'Ò'¨	°2Ñ6Ô6ˆØð 	/Ø,.ˆKÐ(Ñ)Ý%)¨/Ñ%:Ô%:ˆ�MÑ"ð ‡|‚|�MÑ"Ô"ð 7Ø×#Ò# E¨2Ñ.Ô.ˆØ% mÔ4ˆ�	ÑÝ!% oÑ!6Ô!6ˆ�Ñð ð 
˜?Ð2RÐRÐRØ@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ð	ð ð	ð 	rV   Úprovider_namec                 ó€  ‡— t                                | ¦  «        }|€t          d| › �¦  «        ‚t          ||d¬¦  «        }t	          ˆfd„|D ¦   «         d¦  «        }|€t          d‰›d| ›�¦  «        ‚|                     d¦  «        }t          |||¬	¦  «         |                     d
¦  «        }|rI|                     di ¦  «        }t          |t          ¦  «        si }||d<   ||d<   t          |¦  «        |d<   |                     d¦  «        }	|	rI|                     di ¦  «        }
t          |
t          ¦  «        si }
|
|d<   |	|
d<   t          |¦  «        |
d<   |                     d¦  «        rI|                     di ¦  «        }t          |t          ¦  «        r |                     d¦  «        dvrd|d<   dS dS dS dS )už  Non-interactively persist a provider selection for a toolset.

    Resolves ``provider_name`` within ``ts_key``'s category (matching the
    rows the GUI/CLI picker shows via :func:`_visible_providers`) and writes
    the corresponding backend/provider config keys. Unlike
    :func:`_configure_provider`, this does NOT prompt for API keys, run
    post-setup hooks, gate on Nous Portal auth, or run interactive model
    pickers â€” those are handled separately (env endpoints, post-setup
    endpoints, the model picker) in the desktop GUI.

    Raises ``KeyError`` if the toolset has no category or the provider name
    is not found among the visible providers.
    Nz&Toolset has no configurable category: Trß  c              3   óN   •K  — | ]}|                      d ¦  «        ‰k    ¯|V — Œ dS )r¢   Nr  )rS   r“  rB  s     €r"   rU   z+apply_provider_selection.<locals>.<genexpr>  s7   øè è € ÐLÐL˜1¨Q¯UªU°6©]¬]¸mÒ-KÐ-K�QÐ-KÐ-KÐ-KÐ-KÐLÐLrV   zUnknown provider z for toolset r­   ©r“  r6  r3   rï  rÂ  rÚ   r5   rØ   >   NrL   r×   r×   )
r1  rm   ÚKeyErrorrè  ÚnextrA  rÔ  r]  rú   rj   )rt   rB  rM  r8  rÄ   rï  r“  rÃ  r!  Úvideo_pluginr<  s    `         r"   Úapply_provider_selectionrI  	  s  ø€ õ ×
Ò
˜fÑ
%Ô
%€CØ
€{ÝÐHÀÐHÐHÑIÔIÐIå" 3¨¸DÐAÑAÔA€IÝÐLÐLÐLÐL 	ÐLÑLÔLÈdÑSÔS€HØÐÝÐS¨=ÐSÐSÈÐSÐSÑTÔTÐTà—l’lÐ#9Ñ:Ô:€OÝ˜8 V¸_ÐMÑMÔMÐMð —,’,Ð6Ñ7Ô7€KØð 7Ø×#Ò# K°Ñ4Ô4ˆÝ˜'¥4Ñ(Ô(ð 	*ØˆGØ")ˆF�;ÑØ)ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�Ñà—<’<Ð 7Ñ8Ô8€LØð 7Ø×#Ò# K°Ñ4Ô4ˆÝ˜'¥4Ñ(Ô(ð 	*ØˆGØ")ˆF�;ÑØ*ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�Ñð ‡|‚|Ð&Ñ'Ô'ð (Ø×#Ò# K°Ñ4Ô4ˆÝ�g�tÑ$Ô$ð 	(¨¯ª°ZÑ)@Ô)@ÐHYÐ)YÐ)YØ"'ˆG�JÑÐÐð(ð (ð	(ð 	(Ð)YÐ)YrV   c          	      ó´  — |                       dg ¦  «        }|                       d¦  «        }|rIddlm}m}  ||                       dd¦  «        ›  |j         |¦  «        ¬¦  «        st	          d¦  «         d	S |                       d
¦  «        r|s}t          ||¬¦  «        }t          |j        o|j        j        du ¦  «        }|j	        r|sAt          |j        |                       dd¦  «        › ¬¦  «        }	t	          d|	pd› �¦  «         d	S |                       d¦  «        r3|                     di ¦  «        }
| d         |
d<   t          |¦  «        |
d<   |                       d¦  «        rt          d| d         › �¦  «         d| v r2| d         }|dk    rt          d¦  «         n|rt          d|› �¦  «         |                       d¦  «        rt          d| d         › �¦  «         t          | ||¬¦  «         |�sR|                       d¦  «        rt          | d         ¦  «         t          d| d         › d�¦  «         |rt          d ¦  «         |                       d!¦  «        }|rt!          ||¦  «         d	S |                       d"¦  «        }|r!t#          ||t          |¦  «        ¬#¦  «         d	S |                       d$¦  «        }|rWt%          ||¦  «         |                     d%i ¦  «        }t'          |t(          ¦  «        r|                      d¦  «        d&vrd'|d<   |                       d¦  «        r|st+          | d         |¦  «         d	S d}d(}|rž|sœ|                       d
¦  «        s‡	 d(}t,                               ¦   «         D ]<\  }}|                      d)g ¦  «        }| |v rt1          d*„ |D ¦   «         ¦  «        rd} nŒ=|rt          ||¬¦  «        }|j	         }n# t2          $ r d(}Y nw xY w|rt          d+¦  «         |D �]}t5          |d,         ¦  «        }|rt          d|d,         › d-�¦  «         Œ4|                      d.d/¦  «        }|rt          d0|› �¦  «         |                      d1d/¦  «        }|r.t7          d2|                      d3|d,         ¦  «        › �|¦  «        }n.t7          d2|                      d3|d,         ¦  «        › �d¬4¦  «        }|r&t9          |d,         |¦  «         t          d5¦  «         Œút	          d6¦  «         d(}�Œ|                       d¦  «        r|rt          | d         ¦  «         |�rt          d| d         › d7�¦  «         |                       d!¦  «        }|rt!          ||¦  «         d	S |                       d"¦  «        }|r!t#          ||t          |¦  «        ¬#¦  «         d	S |                       d$¦  «        }|rWt%          ||¦  «         |                     d%i ¦  «        }t'          |t(          ¦  «        r|                      d¦  «        d&vrd'|d<   |                       d¦  «        r|st+          | d         |¦  «         d	S d	S d	S d	S )8zAConfigure a single provider - prompt for API keys and set config.r¥   r­   r   ©r   Úensure_nous_portal_accessr¢   úthe Nous Tool Gateway©rb  Úcoverage_categoryõB     Not enabled â€” Nous Portal access is required for this backend.Nr¬   rß  Tr§   ©rb  r¡  úCNous Subscription is only available after logging into Nous Portal.r¦   r8   rï  rÂ  rÇ   ú  STT provider set to: rÝ   rÅ   ú  Browser set to local modeú!  Browser cloud provider set to: rÒ   ú  Web backend set to: rE  r´   ú - no configuration needed!úB  Requests for this tool will be billed to your Nous subscription.r6  rÚ   r:  rØ   r3   >   NrL   r×   r×   FrÄ   c              3   ó@   K  — | ]}|                      d ¦  «        V — ŒdS )r­   Nr  )rS   Úsibs     r"   rU   z&_configure_provider.<locals>.<genexpr>º  s@   è è € ð 2ð 2Ø8;�C—G’GÐ2Ñ3Ô3ð2ð 2ð 2ð 2ð 2ð 2rV   z-  Available through Nous Portal subscription.r°   z: already configuredr±   rL   ú  Get yours at: rz   r3  r)   r  ú	    Savedú    Skippedz configured!)rm   rv  r   rL  rH  r   rj   rY  rZ  r\  r   rÔ  rL  rA  r/  rI  r"  r=  r  r]  rú   r9  r1  rg  rZ   r    r   Ú_promptr   )rï  rM  rÛ  r¥   r“  r   rL  rÜ  r•  Úmessagerš  r?  rÃ  rH  rE  r!  Úall_configuredÚ_show_portal_hintÚ_has_managed_siblingÚ_cat_keyÚ_catÚ
_providersÚ	_featuresrä  Úexistingr±   Údefault_valr~  s                               r"   r¶  r¶  A  s  € ð �|Š|˜J¨Ñ+Ô+€HØ—l’lÐ#9Ñ:Ô:€Oð ð ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 )Ð(Ø"Ÿ,š, vÐ/FÑGÔGÐIØCÐ?ÔCÀOÑTÔTð
ñ 
ô 
ð 	õ ØTñô ð ð ˆFð
 ‡|‚|Ð(Ñ)Ô)ð °/ð Ý1°&ÀkÐRÑRÔRˆÝØÔ!ÐW hÔ&;Ô&OÐSWÐ&Wñ
ô 
ˆð Ô)ð 	°ð 	Ý<ØÔ%Ø&Ÿlšl¨6Ð3FÑGÔGÐIðñ ô ˆGõ Øg�WÐeÐ eÐgÐgñô ð ð ˆFð ‡|‚|�NÑ#Ô#ð 7Ø×#Ò# E¨2Ñ.Ô.ˆØ& ~Ô6ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�Ñð ‡|‚|�NÑ#Ô#ð MÝÐK°¸.Ô1IÐKÐKÑLÔLÐLð ˜XÐ%Ð%ØÐ(Ô)ˆØ�Š=ˆ=ÝÐ8Ñ9Ô9Ð9Ð9Øð 	EÝÐC¸rÐCÐCÑDÔDÐDð ‡|‚|�MÑ"Ô"ð KÝÐI°¸Ô0GÐIÐIÑJÔJÐJõ
 ˜8 V¸_ÐMÑMÔMÐMàñ  Ø�<Š<˜Ñ%Ô%ð 	4Ý˜H \Ô2Ñ3Ô3Ð3ÝÐI˜H VÔ,ÐIÐIÐIÑJÔJÐJØð 	^ÝÐ\Ñ]Ô]Ð]ð —l’lÐ#:Ñ;Ô;ˆØð 	Ý-¨k¸6ÑBÔBÐBØˆFð  —|’|Ð$;Ñ<Ô<ˆØð 	Ý-¨l¸FÕPTÐUdÑPeÔPeÐfÑfÔfÐfØˆFà—,’,Ð1Ñ2Ô2ˆØð 	,Ý% g¨vÑ6Ô6Ð6ð ×'Ò'¨°RÑ8Ô8ˆGÝ˜'¥4Ñ(Ô(ð ,¨W¯[ª[¸Ñ-DÔ-DÐL]Ð-]Ð-]Ø&+�˜
Ñ#ð �<Š<˜Ñ'Ô'ð 	C°ð 	CÝ  ¨.Ô!9¸6ÑBÔBÐBØˆð €Nð
 ÐØð &˜ð &°·²Ð=QÑ0RÔ0Rð &ð	&Ø#(Ð Ý"1×"7Ò"7Ñ"9Ô"9ð ð ‘�˜$Ø!ŸXšX k°2Ñ6Ô6�
Ø˜zÐ)Ð)­cð 2ð 2Ø?Ið2ñ 2ô 2ñ /ô /Ð)ð ,0Ð(Ø�EøØ#ð DÝ:ØØ +ðñ ô �	ð )2Ô(CÐ$CÐ!øøÝð 	&ð 	&ð 	&Ø %ÐÐÐð	&øøøð ð EÝÐCÑDÔDÐDàð 'ñ 'ˆÝ   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Ý˜ Ô.Ñ/Ô/Ð/àñ CÝÐ:˜H VÔ,Ð:Ð:Ð:Ñ;Ô;Ð;Ø—l’lÐ#:Ñ;Ô;ˆØð 	Ý-¨k¸6ÑBÔBÐBØˆFØ—|’|Ð$;Ñ<Ô<ˆØð 	Ý-¨l¸FÕPTÐUdÑPeÔPeÐfÑfÔfÐfØˆFà—,’,Ð1Ñ2Ô2ˆØð 	,Ý% g¨vÑ6Ô6Ð6Ø×'Ò'¨°RÑ8Ô8ˆGÝ˜'¥4Ñ(Ô(ð ,¨W¯[ª[¸Ñ-DÔ-DÐL]Ð-]Ð-]Ø&+�˜
Ñ#à�<Š<˜Ñ'Ô'ð 	C°ð 	CÝ  ¨.Ô!9¸6ÑBÔBÐBÐBÐBð'Cð Cð$	Cð 	Cð 	Cð 	Cs   Í(A3O ÏO+Ï*O+c                  óä  — t          ¦   «          t          t          dt          j        ¦  «        ¦  «         t          t          dt          j        ¦  «        ¦  «         g d¢} t          d| d¦  «        }t          ¦   «         }|                     di ¦  «        }t          |t          ¦  «        si }||d<   |                     di ¦  «        }t          |t          ¦  «        si }||d<   |dk    r;dD ]}| 
                    |d	¦  «         Œt          |¦  «         t          d
¦  «         d	S |dk    rt          ||¦  «         d	S |dk    �rt          d¦  «                             ¦   «         pd}t!          |¦  «        dk    }|rdnd}t          |d¬¦  «        }	|	r|	                     ¦   «         st#          d¦  «         d	S |rdnd}
t          d|
rd|
› d�nd› �¦  «                             ¦   «         p|
}t%          d|	                     ¦   «         ¦  «         d|d<   ||d<   |r||d<   n| 
                    dd	¦  «         t          |¦  «         t          d|rd |› d�nd› �¦  «         d	S t'          d!¦  «         d	S )"u/  Interactive vision-backend configuration.

    Vision is an auxiliary task whose provider/model are resolved from
    ``auxiliary.vision.{provider,model,base_url}`` in config.yaml (see
    ``agent/auxiliary_client.resolve_vision_provider_client``). Rather than
    forcing the user onto OpenRouter, let them pick any authenticated
    provider + model â€” the same surface as ``hermes model`` â€” or point at a
    custom OpenAI-compatible endpoint. "Auto" leaves the config keys empty so
    the resolver uses the main model / aggregator fallback chain.
    z3  Vision / Image Analysis needs a multimodal model.zA  Pick any provider + model (like /model), or let it auto-detect.)u@   Auto â€” use your main model / aggregator fallback (recommended)zPick a provider and modelu>   Custom OpenAI-compatible endpoint â€” base URL, API key, modelÚSkipz  Configure vision backendr   Ú	auxiliaryr0   )rï  rÙ  Úbase_urlr.  Úapi_modeNz7  Vision set to auto (main model / aggregator fallback)rM   rN   z    Base URL (blank for OpenAI)zhttps://api.openai.com/v1zapi.openai.comz    OPENAI_API_KEYz    API keyTr  r]  zgpt-4o-minirL   z    Vision modelz (blank for r  r«   Úcustomrï  rl  rÙ  z  Vision set to custom endpointr¥  z  Skipped vision configuration)r²  r   r   ÚYELLOWÚDIMrø  r	   rÔ  r]  rú   Úpopr
   rL  Ú _configure_vision_provider_modelr^  rW   r   rH  r   rI  )r  r-  rM  ÚauxÚ
vision_cfgr°   rl  Úis_native_openaiÚ	key_labelr.  rþ  rÙ  s               r"   Ú_configure_vision_backendrw  ý  sÝ  € õ 
�G„G€GÝ	�%ÐEÅvÄ}Ñ
UÔ
UÑVÔVÐVÝ	�%ØKÝŒ
ñô ñ ô ð ð
ð ð €Gõ Ð5°wÀÑ
BÔ
B€Cå‰]Œ]€FØ
×
Ò
˜K¨Ñ
,Ô
,€CÝ�c�4Ñ Ô ð "ØˆØ!ˆˆ{ÑØ—’ ¨"Ñ-Ô-€JÝ�j¥$Ñ'Ô'ð #Øˆ
Ø"ˆˆH‰à
ˆa‚x€xàKð 	&ð 	&ˆCØ�NŠN˜3 Ñ%Ô%Ð%Ð%Ý�FÑÔÐÝÐPÑQÔQÐQØˆà
ˆa‚x€xÝ(¨°Ñ<Ô<Ð<Øˆà
ˆa‚x�xÝÐ<Ñ=Ô=×CÒCÑEÔEÐdÐIdˆÝ,¨XÑ6Ô6Ð:JÒJÐØ,<ÐOÐ(Ð(À-ˆ	Ý˜)¨dÐ3Ñ3Ô3ˆØð 	˜GŸMšM™OœOð 	Ý˜=Ñ)Ô)Ð)ØˆFØ)9ÐA˜˜¸rˆÝØYÀ-ÐWÐ>¨mÐ>Ð>Ð>Ð>ÐUWÐYÐYñ
ô 
ç
Š%‰'Œ'ð#à"ð 	õ 	Ð'¨¯ª©¬Ñ9Ô9Ð9ð "*ˆ
�:ÑØ!)ˆ
�:ÑØð 	*Ø"'ˆJ�wÑÐà�NŠN˜7 DÑ)Ô)Ð)Ý�FÑÔÐÝÐYÈ%Ð9W¸¸e¸¸¸¸ÐUWÐYÐYÑZÔZÐZØˆõ Ð0Ñ1Ô1Ð1Ð1Ð1rV   rt  c                 ób  — 	 ddl m}m} n*# t          $ r}t	          d|› �¦  «         Y d}~dS d}~ww xY wt          |                     d¦  «        pd¦  «                             ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «         }	  ||||d	¬
¦  «        }n+# t          $ r}t	          d|› �¦  «         g }Y d}~nd}~ww xY w|st	          d¦  «         dS d„  ||||¬¦  «        D ¦   «         }	|	                     d¦  «         t          d|	d¦  «        }
|
t          |¦  «        k    rt          d¦  «         dS ||
         }|                     d¦  «        }t          |                     dg ¦  «        ¦  «        }t          |¦  «        dgz   }t          d|                     d¦  «        p|› d�|d¦  «        }|t          |¦  «        k     r	||         }n4t          d¦  «                             ¦   «         }|st	          d¦  «         dS ||d<   ||d<   |                     dd¦  «         |                     dd¦  «         t          | ¦  «         t!          d|› d|› �¦  «         dS )uí  Provider + model picker for vision, mirroring the ``/model`` surface.

    Provider rows come from ``build_aux_picker_rows()`` â€” the shared aux-picker
    substrate â€” so this picker lists exactly what the ``hermes model`` aux-task
    picker lists, including the user's own ``providers:`` / ``custom_providers:``
    endpoints. Lets the user pick a provider and then a model from its curated
    list (or type a custom id), and persists ``auxiliary.vision.provider`` +
    ``.model``.
    r   )Úbuild_aux_picker_rowsÚformat_aux_picker_entriesz   Could not load provider list: Nrï  rL   rÙ  rl  é(   )Úcurrent_providerrã  Úcurrent_base_urlÚ
max_modelsz  Could not detect providers: ze  No authenticated providers found. Configure a provider first with `hermes model`, then re-run this.c                 ó   — g | ]\  }}}|‘Œ	S r€   r€   )rS   Ú_slugrJ   Ú_modelss       r"   r�  z4_configure_vision_provider_model.<locals>.<listcomp>v  s.   € ð ð ð á!ˆE�5˜'ð 	ðð ð rV   )r|  r}  ÚCancelz  Choose vision provider:z  CancelledÚslugr  u   Type a custom model idâ€¦z  Choose vision model for r¢   r°  z    Model idu      No model entered â€” cancelledr.  z  Vision set to z / )Úhermes_cli.inventoryry  rz  r    rH  rg   rm   rW   r‹   rø  rY   rI  r‡   r^  rq  r
   rL  )rM  rt  ry  rz  r»  r|  rã  r}  rÄ   Úprovider_labelsÚpidxr  rƒ  r  Úmodel_choicesÚmidxrÙ  s                    r"   rr  rr  M  sX  € ðð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øõ ð ð ð ÝÐ?¸#Ð?Ð?Ñ@Ô@Ð@Øˆˆˆˆˆøøøøðøøøõ ˜:Ÿ>š>¨*Ñ5Ô5Ð;¸Ñ<Ô<×BÒBÑDÔDÐÝ˜
Ÿš wÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>€MÝ˜:Ÿ>š>¨*Ñ5Ô5Ð;¸Ñ<Ô<×BÒBÑDÔDÐð	Ø)Ð)Ø-Ø'Ø-Øð	
ñ 
ô 
ˆ	ˆ	øõ ð ð ð ÝÐ=¸Ð=Ð=Ñ>Ô>Ð>Øˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøð ð Ýð5ñ	
ô 	
ð 	
ð 	ˆðð à%>Ð%>ØØ-Ø-ð&
ñ &
ô &
ðñ ô €Oð ×Ò˜8Ñ$Ô$Ð$åÐ5°ÈÑJÔJ€DØ�s�9‰~Œ~ÒÐÝ�MÑ"Ô"Ð"Øˆà�tŒ_€FØ�:Š:�fÑÔ€DÝ�&—*’*˜X rÑ*Ô*Ñ+Ô+€Få˜‘L”LÐ$?Ð#@Ñ@€MÝØB V§Z¢Z°Ñ%7Ô%7Ð%?¸4ÐBÐBÐBØØ	ñô €Dð
 �c�&‰kŒkÒÐØ�t”ˆˆå˜Ñ'Ô'×-Ò-Ñ/Ô/ˆØð 	ÝÐ=Ñ>Ô>Ð>ØˆFà!€JˆzÑØ€JˆwÑà‡N‚N�:˜tÑ$Ô$Ð$Ø‡N‚N�9˜dÑ#Ô#Ð#Ý�ÑÔÐÝÐ6 dÐ6Ð6¨uÐ6Ð6Ñ7Ô7Ð7Ð7Ð7s(   ‚ ‹
2•-­2ÃC( Ã(
DÃ2DÄDc                 ó„  ‡ — ‰ dk    r!t          d¦  «        rdS t          ¦   «          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).r0   Nc                 ó:   — g | ]\  }}t          |¦  «        °||f‘ŒS r€   ra   )rS   rä  r±   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ÐQrV   c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   ©rS   r�   r  r‚   rt   s       €r"   rU   z1_configure_simple_requirements.<locals>.<genexpr>°  ó5   øè è € Ð\Ð\™7˜1˜a ÐPQÐU[ÒP[ÐP[�QÐP[ÐP[ÐP[ÐP[Ð\Ð\rV   r¡  z requires configuration:ú  Get key at: r3  Tr  r\  r]  )rñ  rw  rê  rm   rG  r�   r²  r   r   ro  rI  r^  rW   r   rL  rH  )rt   rð  Úmissingr)  rä  r±   r~  s   `      r"   r/  r/     sv  ø€ à�ÒÐÝ˜XÑ&Ô&ð 	ØˆFÝ!Ñ#Ô#Ð#Øˆå+×/Ò/°¸Ñ;Ô;€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 §¢¡¤Ñ.Ô.Ð.Ý˜;Ñ'Ô'Ð'Ð'å˜=Ñ)Ô)Ð)Ð)ð*ð *rV   c                óœ  — g }t          ¦   «         D ]w\  }}}t                               |¦  «        }t                               |¦  «        }|s|r9t	          || |¬¦  «        st          || ¦  «        r|                     ||f¦  «         Œx|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.rß  z#No configured tools to reconfigure.Nc                 ó   — g | ]\  }}|‘ŒS r€   r€   )rS   r‚   rJ   s      r"   r�  z%_reconfigure_tool.<locals>.<listcomp>Õ  s   € Ð2Ð2Ð2™˜˜EˆuÐ2Ð2Ð2rV   r‚  z+  Which tool would you like to reconfigure?rM   )r�   r1  rm   rê  rñ  Ú _toolset_enabled_for_reconfigurer‹   rI  rø  rY   Ú%_configure_tool_category_for_reconfigÚ _reconfigure_simple_requirementsr
   )
rM  rÛ  Úconfigurablert   r)  r‚   r8  Úreqsr  r-  s
             r"   Ú_reconfigure_toolr—  ¿  s�  € ð €LÝCÑEÔEð 8ð 8Ñˆ�˜!Ý×!Ò! &Ñ)Ô)ˆÝ'×+Ò+¨FÑ3Ô3ˆØð 	8�$ð 	8å! &¨&¸kÐJÑJÔJð8å3°F¸FÑCÔCð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Ý-ØØØØ#ð		
ñ 	
ô 	
ð 	
ð 	
õ 	)¨Ñ0Ô0Ð0å�ÑÔÐÐÐrV   c                 ó’   — t           D ]>}t          | |¦  «        sŒ	 t          ||d¬¦  «        }n# t          $ r Y Œ3w xY w| |v r dS Œ?dS )zßReturn True if a configurable toolset is enabled anywhere.

    Reconfigure must include enabled-but-unconfigured categories so users can
    finish provider/API-key setup without disabling and re-enabling the toolset.
    Fr‡  T)r™   rx   rP  r    )rt   rM  ru   r)  s       r"   r’  r’  í  sŠ   € õ ð ð ˆÝ,¨V°XÑ>Ô>ð 	Øð	Ý)ØØØ,1ðñ ô ˆGˆGøõ
 ð 	ð 	ð 	ØˆHð	øøøà�WÐÐØ�4�4ð àˆ5s   œ/¯
<»<c                ó¬  — |                      dd¦  «        }|d         }t          |||¬¦  «        }t          ||d|› �|¬¦  «        }t          |¦  «        dk    rŒ|d         }t	          ¦   «          t	          t          d|› d	|› d
|d         › d�t          j        ¦  «        ¦  «         |r)|                     ¦   «         D ]}	t          d|	› �¦  «         Œt          |||¬¦  «         dS t	          ¦   «          t	          t          d|› d	|› d�t          j        ¦  «        ¦  «         |r)|                     ¦   «         D ]}	t          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         › |› |› |› �¦  «         Œºt          |||¬¦  «        }t          d|
|¦  «        }t          ||         ||¬¦  «         dS )zBReconfigure a tool category - provider selection + API key update.rÃ   rL   r¢   rß  rŸ  rM   r   r£  r¤  r¥  r¦  r¡  z - Choose a provider ---r£   r§  r¨  r¤   r©  r¥   c              3   ó@   K  — | ]}t          |d          ¦  «        V — ŒdS rá  ra   r«  s     r"   rU   z8_configure_tool_category_for_reconfig.<locals>.<genexpr>+  r­  rV   r®  r¯  z  Select provider:N)rm   rè  rd  rY   r²  r   r   rµ  r–  rH  Ú_reconfigure_providerré  r’  r‹   r·  rø  )rt   r8  rM  rÛ  rÃ   r¢   rÄ   r¸  rï  r¥  r¼  r“  r£   r¤   r½  r¥   r¿  rÀ  s                     r"   r“  r“    só  € ð �7Š7�6˜2ÑÔ€DØˆvŒ;€DÝ" 3¨¸KÐHÑHÔH€IÝ6ØØØ4¨dÐ4Ð4Øð	ñ ô Ðõ ˆ9�~„~˜ÒÐØ˜Q”<ˆÝ‰ŒˆÝ�eÐC˜TÐCÐC DÐCÐC¨H°VÔ,<ÐCÐCÐCÅVÄ[ÑQÔQÑRÔRÐRØð 	,Ø+×6Ò6Ñ8Ô8ð ,ð ,�Ý˜{ D˜{˜{Ñ+Ô+Ð+Ð+Ý˜h¨¸KÐHÑHÔHÐHÐHÐHå‰ŒˆÝ�eÐB˜TÐBÐB DÐBÐBÐBÅFÄKÑPÔPÑQÔQÐQØð 	,Ø+×6Ò6Ñ8Ô8ð ,ð ,�Ý˜{ D˜{˜{Ñ+Ô+Ð+Ð+Ý‰ŒˆàÐØð 	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¨&¸kÐJÑJÔJð 1Ø!,�J�JØ!ð 1Ø!#�J�Jà!0�JØ×#Ò# q¨¤yÐ$J°%Ð$J¸Ð$J¸jÐ$JÐ$JÑKÔKÐKÐKå3ØØØ#ð
ñ 
ô 
ˆõ &Ð&:Ð<LÈkÑZÔZˆÝØ�lÔ#ØØ#ð	
ñ 	
ô 	
ð 	
ð 	
ð 	
rV   c          	      ó�  — |                       dg ¦  «        }|                       d¦  «        }|rIddlm}m}  ||                       dd¦  «        ›  |j         |¦  «        ¬¦  «        st	          d¦  «         d	S |                       d
¦  «        r|s}t          ||¬¦  «        }t          |j        o|j        j        du ¦  «        }|j	        r|sAt          |j        |                       dd¦  «        › ¬¦  «        }	t	          d|	pd› �¦  «         d	S |                       d¦  «        rK|                     di ¦  «        }
| d         |
d<   t          |¦  «        |
d<   t          d| d         › �¦  «         |                       d¦  «        rK|                     di ¦  «        }| d         |d<   t          |¦  «        |d<   t          d| 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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|�sF|                       d&¦  «        rt#          | d&         ¦  «         t          d| d         › d'�¦  «         |rt%          d(¦  «         |                       d)¦  «        }|rt'          ||¦  «         d	S |                       d*¦  «        }|r!t)          ||t          |¦  «        ¬+¦  «         d	S |                       d,¦  «        }|rKt+          ||¦  «         |d-k    r5|                     d.i ¦  «        }t          |t          ¦  «        r
d-|d<   d%|d<   |                       d¦  «        r|st-          | d         |¦  «         d	S |D �]}t/          |d/         ¦  «        }|r$t%          d|d/         › d0|d	d1…         › d2�¦  «         |                      d3d4¦  «        }|rt%          d5|› �¦  «         |                      d6d4¦  «        }t1          d7|                      d8|d/         ¦  «        › d9�| ¬:¦  «        }|rL|                     ¦   «         r8t5          |d/         |                     ¦   «         ¦  «         t          d;¦  «         Œüt%          d<¦  «         �Œ|                       d&¦  «        rt#          | d&         ¦  «         |                       d)¦  «        }|rt'          ||¦  «         d	S |                       d*¦  «        }|r!t)          ||t          |¦  «        ¬+¦  «         d	S |                       d,¦  «        }|rKt+          ||¦  «         |d-k    r5|                     d.i ¦  «        }t          |t          ¦  «        r
d-|d<   d%|d<   |                       d¦  «        r|st-          | d         |¦  «         d	S d	S d	S )=z)Reconfigure a provider - update API keys.r¥   r­   r   rK  r¢   rM  rN  rP  Nr¬   rß  Tr§   rQ  r¡  rR  r¦   r8   rï  rÂ  z  TTS provider set to: rÇ   r:   rS  rÝ   r+   rÅ   r˜  rT  rU  rÒ   r*   rE  rV  >   r:   r8   r*   r+   rÄ   Fr´   rW  rX  r6  rÚ   r:  rØ   r×   r3   r°   ú: configured (é   ú...)r±   rL   r[  rz   r3  r)   ú (Enter to keep current)r  ú    Updatedú    Kept current)rm   rv  r   rL  rH  r   rj   rY  rZ  r\  r   rÔ  rL  r]  rú   r1  rg  r/  rI  r"  r=  r  r9  r   r^  rW   r   )rï  rM  rÛ  r¥   r“  r   rL  rÜ  r•  r_  rš  r6  r?  rœ  r›  r  r@  r8  rÃ  rH  rE  r!  rä  rg  r±   rh  r~  s                              r"   r›  r›  B  s  € ð �|Š|˜J¨Ñ+Ô+€HØ—l’lÐ#9Ñ:Ô:€Oð ð ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð
 )Ð(Ø"Ÿ,š, vÐ/FÑGÔGÐIØCÐ?ÔCÀOÑTÔTð
ñ 
ô 
ð 	õ ØTñô ð ð ˆFð ‡|‚|Ð(Ñ)Ô)ð °/ð Ý1°&ÀkÐRÑRÔRˆÝØÔ!ÐW hÔ&;Ô&OÐSWÐ&Wñ
ô 
ˆð Ô)ð 	°ð 	Ý<ØÔ%Ø&Ÿlšl¨6Ð3FÑGÔGÐIðñ ô ˆGõ Øg�WÐeÐ eÐgÐgñô ð ð ˆFà‡|‚|�NÑ#Ô#ð MØ×#Ò# E¨2Ñ.Ô.ˆØ& ~Ô6ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�ÑÝÐK°¸.Ô1IÐKÐKÑLÔLÐLà‡|‚|�NÑ#Ô#ð MØ×#Ò# E¨2Ñ.Ô.ˆØ& ~Ô6ˆ�
ÑÝ!% oÑ!6Ô!6ˆ�ÑÝÐK°¸.Ô1IÐKÐKÑLÔLÐLà˜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àð ˜?Ð2RÐRÐRØ×#Ò# 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à—|’|Ð$;Ñ<Ô<ˆØð 	Ý-¨l¸FÕPTÐUdÑPeÔPeÐfÑfÔfÐfØˆFà—,’,Ð1Ñ2Ô2ˆØð 	3Ý% g¨vÑ6Ô6Ð6Ø˜%ÒÐØ ×+Ò+¨K¸Ñ<Ô<�Ý˜g¥tÑ,Ô,ð 3Ø*/�G˜JÑ'Ø-2�G˜MÑ*à�<Š<˜Ñ'Ô'ð 	C°ð 	CÝ  ¨.Ô!9¸6ÑBÔBÐBØˆàð ,ñ ,ˆÝ   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Ý˜=Ñ)Ô)Ð)Ð)åÐ*Ñ+Ô+Ð+Ñ+à‡|‚|�LÑ!Ô!ð 0Ý˜ Ô.Ñ/Ô/Ð/ð —,’,Ð6Ñ7Ô7€KØð Ý)¨+°vÑ>Ô>Ð>Øˆð —<’<Ð 7Ñ8Ô8€LØð Ý)¨,¸ÍDÐQ`ÑLaÔLaÐbÑbÔbÐbØˆà�lŠlÐ-Ñ.Ô.€GØð /Ý! '¨6Ñ2Ô2Ð2Ø�eÒÐØ×'Ò'¨°RÑ8Ô8ˆGÝ˜'¥4Ñ(Ô(ð /Ø&+�˜
Ñ#Ø).�˜Ñ&ð ‡|‚|�NÑ#Ô#ð ?¨Oð ?Ý˜X nÔ5°vÑ>Ô>Ð>Ð>Ð>ð?ð ?ð ?ð ?rV   c           	      ó¢  ‡ — ‰ dk    rt          ¦   «          dS 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.r0   Nc              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   rŒ  s       €r"   rU   z3_reconfigure_simple_requirements.<locals>.<genexpr>ð  r�  rV   r¡  r°  r�  rž  rŸ  rŽ  r3  r   Tr  r¡  r¢  )rw  rê  rm   rG  r�   r²  r   r   rµ  r   rI  r^  rW   r   rL  )rt   rð  r)  rä  r±   rg  r~  s   `      r"   r”  r”  ã  sŠ  ø€ à�ÒÐõ 	"Ñ#Ô#Ð#Øˆå+×/Ò/°¸Ñ;Ô;€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 §¢¡¤Ñ.Ô.Ð.Ý˜=Ñ)Ô)Ð)Ð)åÐ*Ñ+Ô+Ð+Ð+ð,ð ,rV   Ú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         ||¦  «        }t+          |¦  «        }||z
  |z  }||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/          ‰|d¬¦  «        Š$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�nÔ||k    r tA          ‰d¬0¦  «         t          ¦   «          ŒA||k    rtC          ‰¦  «         t          ¦   «          Œe||k    �rñt          ¦   «         }|D ]}|t%          ‰|d¬¦  «        z  }Œt)          d1|d¬0¦  «        }ˆfd2„t          |¦  «        D ¦   «         }t          |¦  «        }|rçt          ¦   «          t          t          dt	          |¦  «        › d3�t          j        ¦  «        ¦  «         |D ]TŠ&t!          ˆ&fd4„t          ¦   «         D ¦   «         ‰&¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒUt          t          d t          j        ¦  «        ¦  «         t          ¦   «          |D ]Š&t5          ‰&‰¦  «         Œ||k    s|�rd|D �]º}t%          ‰|d¬¦  «        }t+          |¦  «        }||z
  |z  }||z
  |z  }t          |         } |s|rùt          t          d| d         › d5�t          j        ¦  «        ¦  «         t          |¦  «        D ]TŠ%t!          ˆ%fd6„t          ¦   «         D ¦   «         ‰%¦  «        }
t          t          d7|
› �t          j        ¦  «        ¦  «         ŒUt          |¦  «        D ]TŠ%t!          ˆ%fd8„t          ¦   «         D ¦   «         ‰%¦  «        }
t          t          d9|
› �t          j        ¦  «        ¦  «         ŒUt          ||z
  ¦  «        D ]XŠ&tD                               ‰&¦  «        stF                               ‰&¦  «        r"tI          ‰&‰d¬0¦  «        rt5          ‰&‰¦  «         ŒYt7          ‰||¦  «         �Œ¼t9          ‰¦  «         t          t          d:t          j        ¦  «        ¦  «         tK          |¦  «        D ]_\  }!}t	          t%          ‰|d¬¦  «        ¦  «        }"t	          t          ¦   «         ¦  «        }d#t          |         d         › d|"› d|› d$�||!<   Œ`n't          t          d;t          j        ¦  «        ¦  «         t          ¦   «          �Œ]||         }t          |         }t%          ‰|d¬¦  «        }t)          |d         |d¬0¦  «        }ˆfd<„t          |¦  «        D ¦   «         }t          |¦  «        }|rçt          ¦   «          t          t          dt	          |¦  «        › d3�t          j        ¦  «        ¦  «         |D ]TŠ&t!          ˆ&fd=„t          ¦   «         D ¦   «         ‰&¦  «        }
t          t          d|
› �t          j        ¦  «        ¦  «         ŒUt          t          d t          j        ¦  «        ¦  «         t          ¦   «          |D ]Š&t5          ‰&‰¦  «         Œ||k    s|�r¨t+          |¦  «        }||z
  |z  }||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          ||z
  ¦  «        D ]XŠ&tD                               ‰&¦  «        stF                               ‰&¦  «        r"tI          ‰&‰d¬0¦  «        rt5          ‰&‰¦  «         ŒYt7          ‰||¦  «         t9          ‰¦  «         t          t          d!|d         › d@�t          j        ¦  «        ¦  «         n0t          t          dA|d         › �t          j        ¦  «        ¦  «         t          ¦   «          t	          t%          ‰|d¬¦  «        ¦  «        }"t	          t          ¦   «         ¦  «        }d#|d         › d|"› d|› d$�||<   �Œît          ¦   «          d,dBl&m'}# t          t          dC |#¦   «         › dD�t          j        ¦  «        ¦  «         t          t          dEt          j        ¦  «        ¦  «         t          ¦   «          dS )Fa	  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().
    NrQ  Fu   âš• Tool Summaryr¡  rJ   r  ú/r  c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   rŒ  s       €r"   rU   z tools_command.<locals>.<genexpr>"  ó5   øè è € Ð!iÐ!i©¨¨1¨aÐ]^ÐbhÒ]hÐ]h !Ð]hÐ]hÐ]hÐ]hÐ!iÐ!irV   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 rP   r€   ©rS   r�   r  r‚   rp  s       €r"   rU   z tools_command.<locals>.<genexpr>E  ó5   øè è € Ð!eÐ!e©¨¨1¨aÐ]^ÐbdÒ]dÐ]d !Ð]dÐ]dÐ]dÐ]dÐ!eÐ!erV   z  + c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   r«  s       €r"   rU   z tools_command.<locals>.<genexpr>I  r¬  rV   z  - T)rr  rÛ  c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   rŒ  s       €r"   rU   z tools_command.<locals>.<genexpr>R  s-   øè è € ÐTÐT¡G A q¨!ÈÈVÊÈ˜aÈÈÈÈÐTÐTrV   u     âœ“ z': using your Nous subscription defaultsc                 ó„   •— g | ]<}t                                |¦  «        st                               |¦  «        r|‰v¯:|‘Œ=S r€   )r1  rm   rê  )rS   rt   Úauto_configureds     €r"   r�  z!tools_command.<locals>.<listcomp>Y  s]   ø€ ð ð ð Ø!Ý#×'Ò'¨Ñ/Ô/ðå3K×3OÒ3OÐPVÑ3WÔ3Wðð  /Ð1Ð1ð à1Ð1Ð1rV   z  Configuring z	 tool(s):c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   rŒ  s       €r"   rU   z tools_command.<locals>.<genexpr>c  r©  rV   u       â€¢ z1  You can skip any tool you don't need right now.u     âœ“ Saved z tool configurationz
Configure z	 enabled)rM   z Configure all platforms (global)z2Reconfigure an existing tool's provider or API keyra  zConfigure MCP server toolsÚDonerp  r   rN   zSelect an option:rc  rß  zAll platformsc                 ó    •— g | ]J}t                                |¦  «        st                               |¦  «        ¯6t          |‰d ¬¦  «        ¯H|‘ŒKS ©Trß  ©r1  rm   rê  r�  ©rS   rt   rM  s     €r"   r�  z!tools_command.<locals>.<listcomp>¬  sv   ø€ ð %ð %ð %Ø!Ý#×'Ò'¨Ñ/Ô/ð%å3K×3OÒ3OÐPVÑ3WÔ3Wð%õ 8ØØØ $ðñ ô ð%Øð%ð %ð %rV   z selected tool(s):c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   rŒ  s       €r"   rU   z tools_command.<locals>.<genexpr>¼  r©  rV   r°  c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   r«  s       €r"   rU   z tools_command.<locals>.<genexpr>Ð  ó5   øè è € Ð)mÐ)m±°°1°aÐefÐjlÒelÐel¨!ÐelÐelÐelÐelÐ)mÐ)mrV   z    + c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   r«  s       €r"   rU   z tools_command.<locals>.<genexpr>Ó  r¹  rV   z    - u+     âœ“ Saved configuration for all platformsz  No changesc                 ó    •— g | ]J}t                                |¦  «        st                               |¦  «        ¯6t          |‰d ¬¦  «        ¯H|‘ŒKS r´  rµ  r¶  s     €r"   r�  z!tools_command.<locals>.<listcomp>  su   ø€ ð !
ð !
ð !
ØÝ×#Ò# FÑ+Ô+ð!
å/G×/KÒ/KÈFÑ/SÔ/Sð!
õ 4ØØØ ðñ ô ð!
Øð!
ð !
ð !
rV   c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   rŒ  s       €r"   rU   z tools_command.<locals>.<genexpr>  s5   øè è € ÐeÐe¡G A q¨!ÐYZÐ^dÒYdÐYd˜aÐYdÐYdÐYdÐYdÐeÐerV   c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   r«  s       €r"   rU   z tools_command.<locals>.<genexpr>"  r¬  rV   c              3   ó0   •K  — | ]\  }}}|‰k    ¯|V — Œd S rP   r€   r«  s       €r"   rU   z tools_command.<locals>.<genexpr>&  r¬  rV   z configurationz  No changes to rü  z  Tool configuration saved to z/config.yamlz:  Changes take effect on next 'hermes' or gateway restart.)(r	   rL  r²  rä  rY   r�   r   r   rµ  ÚBOLDrS  r™   rm   r’   rp  r|   rG  ÚGREENrP  r­  r,  r˜   ÚREDr   rˆ   ro  r0  rÙ  r
   r‹   rj   rø  r—  Ú _configure_mcp_tools_interactiver1  rê  r�  r&  r  rý  )'rÿ   r¥  rM  Úenabled_platformsr   rQ  rR  Úpinfor)  ÚcountrJ   Úcurrent_enabledÚchecklist_preselectedÚnew_enabledÚ_diff_universeÚaddedÚremovedÚto_configureÚplatform_choicesÚplatform_keysrÈ  Ú_has_mcpÚ_global_idxÚ_reconfig_idxÚ_mcp_idxÚ	_done_idxr-  Úall_currentÚpkÚselected_to_configureÚselected_to_configure_setÚprevÚpinfo_innerÚciÚ	new_countrý  r°  rp  rt   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ð ñ @Ø%ð =	ñ =	ˆDÝ˜d”OˆEÝ1°&¸$Ð\aÐbÑbÔbˆOð %4Õ6KÑ$KÐ!õ 4°E¸'´NÐDYÐ[_Ñ`Ô`ˆKõ 5°TÑ:Ô:ˆNØ  ?Ñ2°nÑDˆEØ&¨Ñ4¸ÑFˆ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õ
 ! Ñ1Ô1ð dð d�ÝÐTÐTÐTÐTÕ/DÐTÑTÔTÐV\Ñ]Ô]�Ý•eÐS UÐSÐSÐSÕU[ÔUaÑbÔbÑcÔcÐcÐcðð ð ð Ý%+¨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ðq]ÝÐ0Ð2BÈAÐNÑNÔNˆð �)ÒÐÙð �-ÒÐÝ˜f°$Ð7Ñ7Ô7Ð7Ý‰GŒGˆGØð �(Š?ˆ?Ý,¨VÑ4Ô4Ð4Ý‰GŒGˆGØð �+ÒÑå™%œ%ˆKØ#ð bð b�ØÕ2°6¸2Ð[`ÐaÑaÔaÑa��Ý3ØØØ ðñ ô ˆKð
%ð %ð %ð %Ý%+¨KÑ%8Ô%8ð%ñ %ô %Ð!õ ),Ð,AÑ(BÔ(BÐ%à$ð 	7Ý‘”�Ý•eÐ[­SÐ1FÑ-GÔ-GÐ[Ð[Ð[Õ]cÔ]jÑkÔkÑlÔlÐlØ3ð 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[Ñ\Ô\Ñ]Ô]Ð]Ý‘”�Ø3ð 7ð 7�FÝ& v¨vÑ6Ô6Ð6Ð6à˜kÒ)Ð)Ð-BÑ)Ø'ð Bñ B�BÝ.¨v°rÐW\Ð]Ñ]Ô]�Dõ &=¸RÑ%@Ô%@�NØ(¨4Ñ/°>ÑA�EØ# kÑ1°^ÑC�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õ #)¨Ð1JÑ)JÑ"KÔ"Kð Cð C˜Ý+×/Ò/°Ñ7Ô7ð CÕ;S×;WÒ;WÐX^Ñ;_Ô;_ð CÝBØ &Ø &Ø,0ð ñ  ô  ð Cõ
 !3°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Ø�'ŒNØØð
ñ 
ô 
ˆð!
ð !
ð !
ð !
Ý!'¨Ñ!4Ô!4ð!
ñ !
ô !
Ðõ %(Ð(=Ñ$>Ô$>Ð!à ð 		3Ý‰GŒGˆGÝ•%ÐW­Ð-BÑ)CÔ)CÐWÐWÐWÕY_ÔYfÑgÔgÑhÔhÐhØ/ð =ð =�ÝÐeÐeÐeÐeÕ/SÑ/UÔ/UÐeÑeÔeÐgmÑnÔn�Ý•eÐ. uÐ.Ð.µ´
Ñ;Ô;Ñ<Ô<Ð<Ð<Ý•%ÐKÍVÌZÑXÔXÑYÔYÐYÝ‰GŒGˆGØ/ð 3ð 3�Ý" 6¨6Ñ2Ô2Ð2Ð2à˜/Ò)Ð)Ð-BÑ)õ 5°TÑ:Ô:ˆNØ  ?Ñ2°nÑDˆEØ&¨Ñ4¸ÑFˆ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  µ´
Ñ;Ô;Ñ<Ô<Ð<Ð<õ ! Ð)BÑ!BÑCÔCð ;ð ;�Ý#×'Ò'¨Ñ/Ô/ð ;Õ3K×3OÒ3OÐPVÑ3WÔ3Wð ;Ý:ØØØ$(ðñ ô ð ;õ
 +¨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q]õ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€GrV   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 �]{\  }
}|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          |¦  «        D ¦   «         }|                     |
i ¦  «        }|                     di ¦  «        }t          |¦  «        t          |¦  «        k    r-|                     dd¦  «         |                     dd¦  «         n||d<   |                     dd¦  «         t          |¦  «        }t          |¦  «        |z
  }t7          d|
› d'|› d(|› d)�¦  «         d*}	�Œ}|	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  ra  zNo MCP servers configured.Nc                 óH   — g | ]\  }}|                      d d¦  «        dv¯|‘Œ S )r)  T>   FrY  rZ  r[  r\  r  )rS   r�   r¬  s      r"   r�  z4_configure_mcp_tools_interactive.<locals>.<listcomp>Z  s@   € ð ð ð Ùˆa�Ø�5Š5�˜DÑ!Ô!Ð)KÐKÐKð 	
ØKÐKÐKrV   zAll MCP servers are disabled.z'  Discovering tools from MCP servers...z  Connecting to z server(s): r=  )Ú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 r€   r€   )rS   ÚnÚserver_toolss     €r"   r�  z4_configure_mcp_tools_interactive.<locals>.<listcomp>s  s#   ø€ Ð@Ð@Ð@�A¨!°<Ð*?Ð*?ˆaÐ*?Ð*?Ð*?rV   z  Could not connect to 'r«  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rP   ræ  )rS   Útoolss     r"   rU   z3_configure_mcp_tools_interactive.<locals>.<genexpr>x  s(   è è € ÐDÐD U•c˜%‘j”jÐDÐDÐDÐDÐDÐDrV   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$  r€   r©  s     r"   r�  z4_configure_mcp_tools_interactive.<locals>.<listcomp>“  s   € Ð*Ð*Ð*˜q�a˜”dÐ*Ð*Ð*rV   zMCP Server: z tools))rö  z: no changesc                 ó    •— g | ]
}‰|         ‘ŒS r€   r€   )rS   r  Ú
tool_namess     €r"   r�  z4_configure_mcp_tools_interactive.<locals>.<listcomp>°  s   ø€ Ð>Ð>Ð>¨!˜
 1œÐ>Ð>Ð>rV   ú: z
 enabled, z	 disabledTu"     âœ“ MCP tool configuration savedz  No changes to MCP tools)r÷  r  rm   rI  rg  r²  r   r   ro  rY   r?  rp  Útools.mcp_toolrß  r    r>  rH  r  r2  rÀ  r‹   r’   r&  rŠ   r|   rÔ  rq  rL  r
   )rM  r  ra  Úenabled_namesrß  r»  Úfailedr¢   Útotal_toolsÚany_changesÚserver_namerä  Úsrv_cfgÚ	tools_cfgÚinclude_listÚexclude_listr(  Ú	tool_nameÚdescriptionÚ
desc_shortr+  r  r  Úchosen_namesÚenabled_countÚdisabled_countrâ  rê  s                             @@r"   rÂ  rÂ  K  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ð Hñ HÑˆ�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Ùð ?Ð>Ð>Ð>­v°f©~¬~Ð>Ñ>Ô>ˆð ×(Ò(¨°bÑ9Ô9ˆØ×&Ò& w°Ñ3Ô3ˆ	åˆv‰;Œ;�#˜e™*œ*Ò$Ð$ð �MŠM˜) TÑ*Ô*Ð*Ø�MŠM˜) TÑ*Ô*Ð*Ð*à#/ˆI�iÑ à�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   Ã'C8 Ã8
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)rP  r’   rÙ  )rM  ru   r¯  rü  r)  Úupdateds         r"   Ú_apply_toolset_changer   Ó  s`   € å! &¨(ÐPUÐVÑVÔV€GØ�ÒÐØ�C Ñ.Ô.Ñ.ˆˆà�C Ñ.Ô.Ñ.ˆÝ˜ ¨7Ñ3Ô3Ð3Ð3Ð3rV   Ú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.
    ra  r°  rM   rä  ræ  rþ  c                 ó    •— g | ]
}|‰k    ¯|‘ŒS r€   r€   )rS   rª  rö  s     €r"   r�  z%_apply_mcp_change.<locals>.<listcomp>ð  s   ø€ Ð<Ð<Ð<˜Q¨Q°)ª^¨^�q¨^¨^¨^rV   )r’   rm   rX   rŠ   rÔ  r‡   r‹   )
rM  r  rü  Úfailed_serversra  Ú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Ø&ˆ	�)ÑÐàÐrV   ra  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 r€   r˜  r  s       €r"   r�  z%_print_tools_list.<locals>.<listcomp>ù  sE   ø€ ð ð ð Ù�q˜!˜QÝ(¨¨HÑ5Ô5ðØ	
ˆAˆqˆ	ðð ð rV   c                 ó   — h | ]\  }}}|’Œ	S r€   r€   r�   s      r"   rƒ   z$_print_tools_list.<locals>.<setcomp>ý  s   € ÐEÐEÐE™|˜v q¨!�FÐEÐEÐErV   zBuilt-in toolsets (z):u   âœ“ enabledu   âœ— disabledr¡  c                 ó(   •— g | ]\  }}}|‰v¯
||f‘ŒS r€   r€   )rS   r�   r  r‚   Úbuiltin_keyss       €r"   r�  z%_print_tools_list.<locals>.<listcomp>  s-   ø€ ÐOÐOÐO¡  A q¸À,Ð9NÐ9N�q˜!�fÐ9NÐ9NÐ9NrV   zPlugin toolsets (zMCP servers:rä  ræ  rå  z  [include only: r=  r¨  z  [excluded: zall tools enabledN)r�   rˆ   r²  r   r   rÀ  rÁ  rp  rg  rm   rI  r?  ro  )rr  ra  ru   r'  r%  rt   rJ   r‚   Ú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rV   c                 ó|  ‡‡‡‡‡— | 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``).
    ru   ry   zUnknown platform 'z
'. Valid: r=  Nr‡   Fr‡  ra  c                 ó   — g | ]}d |v¯|‘Œ	S ©r°  r€   r©  s     r"   r�  z0tools_disable_enable_command.<locals>.<listcomp>4  s   € Ð:Ð:Ð:˜Q¨S¸¨\¨\�q¨\¨\¨\rV   c                 ó   — g | ]}d |v ¯|‘Œ	S r  r€   r©  s     r"   r�  z0tools_disable_enable_command.<locals>.<listcomp>5  s   € Ð2Ð2Ð2˜¨°¨¨�1¨¨¨rV   c                 ó   — h | ]\  }}}|’Œ	S r€   r€   r�   s      r"   rƒ   z/tools_disable_enable_command.<locals>.<setcomp>7  s   € ÐGÐGÐG¡ ¨¨A�fÐGÐGÐGrV   c                 ó   •— g | ]}|‰v¯|‘Œ	S r€   r€   ©rS   rª  Úvalid_toolsetss     €r"   r�  z0tools_disable_enable_command.<locals>.<listcomp>8  s#   ø€ ÐNÐNÐN˜a°a¸~Ð6MÐ6M˜Ð6MÐ6MÐ6MrV   zUnknown toolset 'r«  c                 ó   •— g | ]}|‰v ¯|‘Œ	S r€   r€   r  s     €r"   r�  z0tools_disable_enable_command.<locals>.<listcomp><  s#   ø€ ÐMÐMÐM ¸¸nÐ9LÐ9L˜1Ð9LÐ9LÐ9LrV   c                 ó4   •— g | ]}t          |‰¦  «        °|‘ŒS r€   r˜  )rS   rª  ru   s     €r"   r�  z0tools_disable_enable_command.<locals>.<listcomp>?  s9   ø€ ð ð ð ØÝ,¨Q°Ñ9Ô9ðØ	ðð ð rV   z	Toolset 'z ' is not available on platform 'z	' (only: r  c                 ó   •— g | ]}|‰v¯|‘Œ	S r€   r€   )rS   rª  Úrestricted_targetss     €r"   r�  z0tools_disable_enable_command.<locals>.<listcomp>J  s$   ø€ ÐUÐUÐU ¸ÐBTÐ9TÐ9T˜1Ð9TÐ9TÐ9TrV   zMCP server 'z' not found in configc                 óf   •— g | ]-}|‰vr'|‰vr#d |vs|                      d ¦  «        d         ‰v¯+|‘Œ.S )r°  r   )rX   )rS   rª  r  r  Úunknown_toolsetss     €€€r"   r�  z0tools_disable_enable_command.<locals>.<listcomp>W  s_   ø€ ð ð ð ØØÐ$Ð$Ð$ØÐ'Ð'Ð'Ø˜ˆ\ˆ\˜QŸWšW S™\œ\¨!œ_°NÐBÐBð 	
ð CÐBÐBrV   rþ  ÚDisabledÚEnabledrë  )Útools_actionrä  r	   r™   r>  r?  r  rP  rm   ri  rˆ   r“   r|   rs   r’   r   r  r
   rL  )rÿ   rü  rM  r  Útoolset_targetsÚmcp_targetsr¢   rw   ÚsrvÚ
successfulÚverbr  ru   r  r  r  s              @@@@@r"   Útools_disable_enable_commandr&     sB  øøøøø€ ð Ô€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Ñ:Ô:Ð:Ð:Ð:ð;ð ;rV   )ry   )FFT)r   r   )r   N)r4  TNTrP   )Tr$  )NFN)¨Ú__doc__Újsonr  Úloggingrk   rF  r  r   Úpathlibr   Útypingr   r   r   r   r   r   r	   r
   r   r   Úhermes_cli.colorsr   r   rv  r   r   r   r   Úhermes_cli.nous_accountr   Útools.tool_backend_helpersr   Úutilsr   r   Ú	getLoggerÚ__name__r  rj   r˜  r#   r’   r$   rg   Ú__annotations__Ú__file__r  Úresolver  Úhermes_cli.cli_outputr%   r>  r&   rI  r'   rL  r(   rH  r)   r^  rˆ   r]   r­  r—   ro   rr   rs   rx   r}   r�   r“   r˜   Úhermes_cli.platformsr™   Ú_PLATFORMS_REGISTRYrg  r1  rê  rñ   rö   rú   rû   r"  r)  r^  rá  r¡  rc  rg  ri  r�  r©  r¬  r°  r½  rK  r/  r;  rA  rL  rS  r_  rk  rq  Ú	frozensetr~  r†  rP  rÙ  rñ  r‡   rø  rù  r  r,  r0  r4  r5  r3  rN  r6  rW  rè  rd  ri  rl  rs  ry  r{  r‡  r„  r–  r�  r.  r’  r·  rÐ  rü  rÝ  r  r  r  r  r"  r%  r+  r3  r4  r9  r=  rA  rI  r¶  rw  rr  r/  r—  r’  r“  r›  r”  rÜ  rÂ  r   r  r  r&  r€   rV   r"   ú<module>r9     sá  ðð	ð 	ð 	ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð ð ð ð ð KÐ JÐ JÐ JÐ JÐ JØ <Ð <Ð <Ð <Ð <Ð <Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4Ð 4à	ˆÔ	˜8Ñ	$Ô	$€ð ?Dð ð ð °tð Èð ð ð ð ðH /2¨c©e¬eÐ ! 3 s¤8Ð 3Ð 3Ñ 3àˆt�H‰~Œ~Ô$Ô+×3Ò3Ñ5Ô5€ð
ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð Ð ð>˜Sð  Sð ð ð ð ð: zÐyÐyÐ ð ˜Ð ð> $ð >ð >ð >ð >ð@¨Dð ð ð ð ð" ˆ{Ø�[ð7ð 7Ð   S¨#¨c¬( ]Ô 3ð ð ñ ð2¨#ð 2¸ð 2Àð 2ð 2ð 2ð 2ñð ¨Cð ¸#ð È#ð ð ð ð ðð ð ð4 #ð ð ð ð ð cð ¨c°#¬hð ð ð ð ð6 BÐ AÐ AÐ AÐ AÐ Aðð à,Ð&Ô,Ñ.Ô.ðñ ô €	ð !Øð -Ø2Ø8ØØ &ðð ð ,Ø'ØGØØ (Ø&*Ø(-Ø&>Ð@PÐ%Qð	ð 	ð %ØØ,à4Ð@PÐYð  Að  Aðð !)ðð ð "ØKØØ %Ø(ðð ð %ØØ,à0Ð<Pð  ZGð  Hð  Hðð !-ðð ð 0ØØ2à-Ð9JÐSpÐqÐqðð !*ðð ð ,Ø"ØEà,Ð8HÐQyÐzÐzðð !)ðð ð $Ø(ØGØØ +Ø)ðð ð  Ø(ØIØØ 'Ø%ðð ð (ØØ[à/Ð;NÐW|Ð}Ð}ðð !,ðð ð]W
ð[ð [ðz !Øð (Ø2Ø=ØØ 'Ø.ðð ð ,Ø'ØQØØ (Ø&*Ø(-Ø&>Ð@PÐ%Qð	ð 	ð !ØØEà4Ð@PÐYð  Að  Aðð !)ðð ð Ø$Ø>à*°nÐMlÐmÐmðð !'ðð ð ØHØØ %Ø(ðð ð ,ØØHà0Ð<Pð  ZGð  Hð  Hðð !-ðð ð $ØØ@à/Ð;NÐW|Ð}Ð}ðð !,ðð ðqA
ðEð EðN 'Ø/Ø{Øð ,Ø'ØFØ*ØØ&*Ø(-Ø&9Ð;NÐ%Oð	ð 	ð 0Ø.ØAØ*à/Ð;vÐwÐwððð ð
ð#ð #ðJ #Øð ,Ø'ØQØØ&*Ø(3Ø&/ [Ø$)ð	ð 	ð
ðð ð6 #Øð ,Ø'ØQØØ&*Ø(3Ø&/ [ð
 */ðð ð
ðð ð2 %Ø5ðCð ð @Ø'ØOØØ(ðð ð &ØØ?ð  -Ø"/Ø6ðð ðð	ð ð
ð"ð "ðH %Øð" (Ø2Ø=ØØ$+Ø-ðð ð @Ø'ØHØØ$1Ø&*Ø(1Ø&;Ð%<ð ,ðð ð" "Ø(ØBà)Ð5IÐVmØGðIð Iðð %.Ø'ð
ð 
ð3$
ð#6ð 6ðp Øð )Ø-à(Ð4\Ð]Ð]Ø&Ð2FÐStÐuÐuððð ð	
ðð ð Øð *Ø>ØØ'ð	ð ð
ðð ð 5Øð 6Ð5Ð5ð 2Ø;ðBðð +ðð ð
ðð ð2 )Øð )Ø=à8ÐDeð  oKð  Lð  LØ8ÐDeð  oKð  Lð  Lðð )ðð ð /Ø6à8ÐDeÐfÐfØ8ÐDeÐfÐfØ6ÐBtð  BYð  Zð  Zðð
 )ð	ð 	ð
ðð ðK^ð ^€ðV ÐIÐJðÐ ðO˜ð Oð Oð Oð Oð
$ (¨3¤-ð $ð $ð $ð $ð ˜ð  ð  ð  ð  ð& Øð	Qð Qð QØ
ˆsŒ)ðQð ðQð ð	Qð Qð Qð Qð`
 dð 
ð 
ð 
ð 
ð Ø%*Ø$(ñGð GØðGà"ðGð "ðGð 
ð	Gð Gð Gð Gðd Ð ð
 Ð ñð ð ð ñ@ð @ð @ð @ñ
0ð 0ð 0ð 0ñ
NKð NKð NKð NKñb4Cð 4Cð 4Cð 4Cðn0˜Cð 0 Cð 0ð 0ð 0ð 0ð
"°$ð "ñ "ð "ð "ñ$=°Sñ =Àdð =Ètð =ñ =ð =ð =ðB ØØ!%Øñ	Gð GØñGàñGð ˜#”ñGð ð	Gð
 
ðGñ Gð Gð GñTxZ Cð xZñ xZð xZð xZðv˜s 3œxð ñ ð ð ð@ Cð ñ ð ð ð@  S¤	ð ñ ð ð ñ ñ  dñ °xÀÀSÄ	Ô7Jð ÐVZÐ[^Ð`cÐdgÔ`hÐ[hÔVið ñ ð ð ñ ð ¨ð ¸ð ñ ð ð ñ"  Tð  ¨c°#¬hð  ñ  ð  ð  ñF$Ø�S”ð$Ø%(ñ$ØDHð$à	ð$ñ $ð $ð $ðX '˜Y© wÑ/Ô/Ð ñ %Ø˜#”hñ %Ø(,ð %Ø8;ð %à	ð %ñ  %ð  %ð  %ðN )-ñ	gð gñ gØðgàñgð "&ð	gð
 	ˆ„Xðgñ gð gð gñT	] ð ]°ñ ]ÈCÐPSÌHð ]ñ ]ð ]ð ]ðD ñ1>ð Ø37ñ1>ð 1>ð 1>Øñ1>àñ1>ð ñ	1>ð
 Ð/Ô0ð1>ð 
ð1>ñ 1>ð 1>ð 1>ñlYñ Y˜Sñ Y¨4ð Y¸#ð YÀcð Yñ Yð Yð Yð /3Ð �8˜D  c œNÔ+Ð 2Ñ 2Ñ 2ð'˜t C¨ Hœ~ð 'ñ 'ð 'ð 'ðZ ñ<-ð
 ñ<-ð <-ñ <-Øñ<-à�ŒXð<-ð ñ<-ð
 ð<-ð 	ˆ„Xð<-ñ <-ð <-ð <-ðJ ñ	/ð /ð /Øñ/àñ/ð ð	/ñ /ð /ð /ð(% T¨$¤Zð %ñ %ð %ð %ðP# T¨$¤Zð #ñ #ð #ð #ð`- d¨4¤jð -ñ -ð -ð -ñ`! sð !¨tð !ñ !ð !ð !ðF, 4¨¤:ð ,ñ ,ð ,ð ,ð^5˜t Dœzð 5ñ 5ð 5ð 5ðx Ø37ñSð Sñ SØ	ñSàñSð ñ	Sð
 Ð/Ô0ðSð 
ˆ$„ZðSñ Sð Sð Sðv ñð ñ Ø	ñàñð ñð
 ðð 	ðñ ð ð ðB Ñ@Ð@ðÐ �tð ñ ñ ñ$
°#ð 
¸$ð 
ñ 
ð 
ð 
ñ 3ð ¨4ð ñ ð ð ð% $ð %ñ %ð %ð %ð,S˜Dð Sñ Sð Sð Sñ 8Ð7Ù/Ð/ÙAÐAÙ-Ð-Ù5Ð5Ù7Ð7Ù;Ð;Ù+Ð+Ù@Ð@ñ
ð 
Ð �4ð 
ñ 
ñ 
ð ¨ð  ñ  ð  ð  ð Ø $ñMð Mñ MØñMàñMð
 ˜Œ~ðMð 	ðMñ Mð Mð Mðh ñ	BJð BJð BJØñBJàñBJð ð	BJð
 
ðBJñ BJð BJð BJðT ñoVð oVð oVØñoVà	ñoVð ñoVð
 ðoVñ oVð oVð oVðl ñ	Qð Qñ QØñQàñQð ð	Qð
 
ðQñ Qð Qð Qðp ñ	ð ñ Øñàñð ð	ð
 	ðñ ð ð ñ<%ð %ð %ð 
ÙØ!Ø(ñð ðÐ ñ¨ñ °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(T°ñ (T¸dð (TÀtð (Tñ (Tð (Tð (TñV<°3ñ <Àð <Èð <ñ <ð <ð <ñ"¨3ð ñ ð ð ñ290°cñ 90À4ð 90ÈDð 90ñ 90ð 90ð 90ðD =Ñ<Ð<ØXÑXÐXØ\Ñ\Ð\Ù¡Ð,ñ	ð Ð ð &¡zÐ2Ð ñ4 sñ 4°Dð 4¸Tð 4ñ 4ð 4ð 4ð6 ^cñ <ð <ñ <°3ñ <Àñ <ÐVZð <Ðgkð <ñ <ð <ð <ñ0 Tñ 0°4ð 0ÐPTð 0ñ 0ð 0ð 0ðf5( Sñ 5(¸ñ 5(Àdð 5(Ètð 5(ñ 5(ð 5(ð 5(ðx ñ	yCð yCñ yCØñyCàñyCð ð	yCñ yCð yCð yCñxM2ñ M2ð M2ð M2ñ`P8¨Tñ P8¸tð P8Èð P8ñ P8ð P8ð P8ðf*¨3ð *ñ *ð *ð *ðD ñ+ð +ñ +Øñ+ð ð+ñ +ð +ð +ð\¨Sñ ¸$ð À4ð ñ ð ð ð6 ñ<
ð <
ð <
Øñ<
à	ñ<
ð ñ<
ð
 ð<
ñ <
ð <
ð <
ðF ñ	^?ð ^?ñ ^?Øñ^?àñ^?ð ð	^?ñ ^?ð ^?ð ^?ðB,¨Sð ,ñ ,ð ,ð ,ñBAñ A¨Dñ AÀ$ð Añ Að Að AñN
B>¨Tð B>ñ B>ð B>ð B>ñP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?;ð ?;ð ?;ð ?;ð ?;rV   