
    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dl	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)is_truthy_value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/ubuntu/.hermes/hermes-agent/tools/tool_backend_helpers.pymanaged_nous_tools_enabledr      s    888888%%''zz+&& 	5::::::!! 	5t   uu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FH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)   6   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_credentialsr2   ;   sQ    	#	$	$	H3G)H)H 	2IKK-'//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 )zResolve 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&   r4   r5   managed_mode_blockedselected_backend)r'   r)   r   )r3   r4   r5   r8   normalized_moder9   r:   s          r   resolve_modal_backend_stater<   C   s     'z22N*:66O)#H,F,H,H(H  )##(B(D(D``99\`	H	$	$'1;88t(B(D(D||99hr\|\d\dx| ) & 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   r1   r"   r   resolve_openai_audio_api_keyrA   g   s7     		*B// 	+9%r**eggr"   config_sectionc                    	 ddl m}  |            pi                     |           }t          |t                    r$t          |                    d          d          S n# t          $ r Y nw xY wdS )zReturn 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)default)hermes_cli.configrD   r   
isinstancedictr   r   )rB   rD   sections      r   prefers_gatewayrK   o   s    
111111;==&B++N;;gt$$ 	N"7;;}#=#=uMMMM	N   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.   rG   rN   r   r   r   )r   rN   s     r   fal_key_is_configuredrO   ~   s     Ii  E}	777777!M),,EE 	 	 	EEE	'%++--(((s   * 99)r   r   )r   r   r   r   )r3   r   r4   r   r5   r   r   r6   )r   r   )rB   r   r   r   )__doc__
__future__r   r-   pathlibr   typingr   r   utilsr   r   r$   r%   r   r!   r'   r)   r2   r<   rA   rK   rO   r1   r"   r   <module>rU      s;   0 0 " " " " " " 				               ! ! ! ! ! ! $  222    .1 1 1 1   $ $ $ $
   ! ! ! !H      ) ) ) ) ) )r"   