§
    ‰eîiÑ  ã                  ó’   — d Z ddlmZ ddlZddlmZ ddlmZmZ dZ	dZ
h d£Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d„Zdd„ZdS )!z*Shared helpers for tool backend selection.é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚlocalÚauto>   r   ÚdirectÚmanagedÚreturnÚboolc                 óœ   — 	 ddl m}   | ¦   «         }|                     d¦  «        sdS ddlm}  |¦   «         rdS dS # t
          $ r Y dS w xY w)u  Return True when the user has an active paid Nous subscription.

    The Tool Gateway is available to any Nous subscriber who is NOT on
    the free tier.  We intentionally catch all exceptions and return
    False â€” never block the agent startup path.
    r   )Úget_nous_auth_statusÚ	logged_inF)Úcheck_nous_free_tierT)Úhermes_cli.authr   ÚgetÚhermes_cli.modelsr   Ú	Exception)r   Ústatusr   s      ú</home/div/.hermes/hermes-agent/tools/tool_backend_helpers.pyÚmanaged_nous_tools_enabledr      s�   € ðØ8Ð8Ð8Ð8Ð8Ð8à%Ð%Ñ'Ô'ˆØ�zŠz˜+Ñ&Ô&ð 	Ø�5à:Ð:Ð:Ð:Ð:Ð:àÐÑ!Ô!ð 	Ø�5ØˆtøÝð ð ð Øˆuˆuðøøøs   ‚%= ©= ½
AÁ
AÚvalueúobject | NoneÚstrc                óˆ   — t          | pt          ¦  «                             ¦   «                              ¦   «         }|pt          S )z)Return a normalized browser provider key.)r   Ú_DEFAULT_BROWSER_PROVIDERÚstripÚlower)r   Úproviders     r   Ú normalize_browser_cloud_providerr    &   s9   € å�5Ð5Õ5Ñ6Ô6×<Ò<Ñ>Ô>×DÒDÑFÔF€HØÐ0Õ0Ð0ó    c                óš   — t          | pt          ¦  «                             ¦   «                              ¦   «         }|t          v r|S t          S )z=Return the requested modal mode when valid, else the default.)r   Ú_DEFAULT_MODAL_MODEr   r   Ú_VALID_MODAL_MODES)r   Úmodes     r   Úcoerce_modal_moder&   ,   sD   € åˆuÐ+Õ+Ñ,Ô,×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<€DØÕ!Ð!Ð!ØˆÝÐr!   c                ó    — t          | ¦  «        S )z)Return a normalized modal execution mode.)r&   )r   s    r   Únormalize_modal_moder(   4   s   € å˜UÑ#Ô#Ð#r!   c                 ó¼   — t          t          j        d¦  «        rt          j        d¦  «        p't          j        ¦   «         dz                       ¦   «         ¦  «        S )z?Return True when direct Modal credentials/config are available.ÚMODAL_TOKEN_IDÚMODAL_TOKEN_SECRETz.modal.toml)r   ÚosÚgetenvr   ÚhomeÚexists© r!   r   Úhas_direct_modal_credentialsr1   9   sQ   € åÝ	ŒÐ#Ñ	$Ô	$Ð	H­¬Ð3GÑ)HÔ)Hð 	2ÝŒI‰KŒK˜-Ñ'×/Ò/Ñ1Ô1ñô ð r!   Ú
modal_modeÚ
has_directÚmanaged_readyúDict[str, Any]c               óú   — t          | ¦  «        }t          | ¦  «        }|dk    ot          ¦   «          }|dk    rt          ¦   «         r|rdnd}n%|dk    r|rdnd}nt          ¦   «         r|rdn|rdnd}||||||dœS )zØResolve direct vs managed Modal backend selection.

    Semantics:
    - ``direct`` means direct-only
    - ``managed`` means managed-only
    - ``auto`` prefers managed when available, then falls back to direct
    r
   Nr	   )Úrequested_moder%   r3   r4   Úmanaged_mode_blockedÚselected_backend)r&   r(   r   )r2   r3   r4   r7   Únormalized_moder8   r9   s          r   Úresolve_modal_backend_stater;   A   sÌ   € õ ' zÑ2Ô2€NÝ*¨:Ñ6Ô6€Oà˜)Ò#ÐHÕ,FÑ,HÔ,HÐ(Hð ð ˜)Ò#Ð#Ý(BÑ(DÔ(DÐ`ÈÐ`˜9˜9Ð\`ÐÐØ	˜HÒ	$Ð	$Ø'1Ð;˜8˜8°tÐÐå(BÑ(DÔ(DÐ|ÈÐ|˜9˜9ÐhrÐ\|Ð\dÐ\dÐx|Ðð )ØØ Ø&Ø 4Ø,ðð ð r!   c                 óz   — t          j        dd¦  «        pt          j        dd¦  «                             ¦   «         S )zCPrefer the voice-tools key, but fall back to the normal OpenAI key.ÚVOICE_TOOLS_OPENAI_KEYÚ ÚOPENAI_API_KEY)r,   r-   r   r0   r!   r   Úresolve_openai_audio_api_keyr@   e   s7   € õ 	Œ	Ð*¨BÑ/Ô/ð 	+ÝŒ9Ð% rÑ*Ô*ß‚e�g„gðr!   Úconfig_sectionc                óâ   — 	 ddl m}  |¦   «         pi                      | ¦  «        }t          |t          ¦  «        r"t          |                     d¦  «        ¦  «        S n# t          $ r Y nw xY wdS )z�Return True when the user opted into the Tool Gateway for this tool.

    Reads ``<section>.use_gateway`` from config.yaml.  Never raises.
    r   )Úload_configÚuse_gatewayF)Úhermes_cli.configrC   r   Ú
isinstanceÚdictr   r   )rA   rC   Úsections      r   Úprefers_gatewayrI   m   s�   € ð
Ø1Ð1Ð1Ð1Ð1Ð1Ø�;‘=”=Ð& B×+Ò+¨NÑ;Ô;ˆÝ�g�tÑ$Ô$ð 	4Ý˜Ÿš MÑ2Ô2Ñ3Ô3Ð3ð	4øåð ð ð Øˆðøøøàˆ5s   ‚AA Á
A,Á+A,c                 ó¾   — t          j        d¦  «        } | €%	 ddlm}  |d¦  «        } n# t          $ r d} Y nw xY wt          | o|                      ¦   «         ¦  «        S )a+  Return True when FAL_KEY is set to a non-whitespace value.

    Consults both ``os.environ`` and ``~/.hermes/.env`` (via
    ``hermes_cli.config.get_env_value`` when available) so tool-side
    checks and CLI setup-time checks agree.  A whitespace-only value
    is treated as unset everywhere.
    ÚFAL_KEYNr   )Úget_env_value)r,   r-   rE   rL   r   r   r   )r   rL   s     r   Úfal_key_is_configuredrM   |   s   € õ ŒI�iÑ Ô €EØ€}ð	Ø7Ð7Ð7Ð7Ð7Ð7à!�M )Ñ,Ô,ˆEˆEøÝð 	ð 	ð 	ØˆEˆEˆEð	øøøå�Ð'˜%Ÿ+š+™-œ-Ñ(Ô(Ð(s   ˜* ª9¸9)r   r   )r   r   r   r   )r2   r   r3   r   r4   r   r   r5   )r   r   )rA   r   r   r   )Ú__doc__Ú
__future__r   r,   Úpathlibr   Útypingr   r   r   r#   r$   r   r    r&   r(   r1   r;   r@   rI   rM   r0   r!   r   ú<module>rR      s)  ðØ 0Ð 0à "Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð ð $Ð ØÐ Ø2Ð2Ð2Ð ðð ð ð ð.1ð 1ð 1ð 1ðð ð ð ð$ð $ð $ð $ð
ð ð ð ð!ð !ð !ð !ðHð ð ð ðð ð ð ð)ð )ð )ð )ð )ð )r!   