
    im                       d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZmZmZ ddiZdFdZ ed           G d d                      Z ed           G d d                      Z dGdZ!dHdZ"dIdZ#dJd Z$dJd!Z%dKd,Z&	 dLdMd/Z'd-d0dNd4Z(d5d6d7d8d9Z)dOd;Z*d<d=d>d?d9Z+d9Z,	 dLdPdAZ-dQdDZ.dRdEZ/d-S )Sz8Helpers for Nous subscription managed-tool capabilities.    )annotations)	dataclass)Path)DictIterableOptionalSet)get_nous_auth_status)get_env_valueload_config)is_managed_tool_gateway_ready)is_truthy_value)fal_key_is_configuredhas_direct_modal_credentialsmanaged_nous_tools_enabled normalize_browser_cloud_providernormalize_modal_moderesolve_modal_backend_stateresolve_openai_audio_api_keycliz
hermes-clisectionobjectreturnboolc                x    t          | t                    sdS t          |                     d          d          S )zCReturn True when a config section explicitly opts into the gateway.Fuse_gateway)default)
isinstancedictr   get)r   s    A/home/ubuntu/.hermes/hermes-agent/hermes_cli/nous_subscription.py_uses_gatewayr"      s8    gt$$ u7;;}55uEEEE    T)frozenc                  |    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   dZded<   dZded<   dS )NousFeatureStatestrkeylabelr   included_by_default	availableactivemanaged_by_nousdirect_overridetoolset_enabled current_providerFexplicit_configuredN)__name__
__module____qualname____annotations__r1   r2    r#   r!   r&   r&   $   s         HHHJJJOOOLLL %%%%%%%r#   r&   c                      e Zd ZU ded<   ded<   ded<   ded<   edd	            Zedd
            Zedd            Zedd            Zedd            Z	ddZ
dS )NousSubscriptionFeaturesr   
subscribednous_auth_presentprovider_is_nouszDict[str, NousFeatureState]featuresr   r&   c                    | j         d         S )Nwebr=   selfs    r!   r?   zNousSubscriptionFeatures.web9       }U##r#   c                    | j         d         S )N	image_genr@   rA   s    r!   rE   z"NousSubscriptionFeatures.image_gen=   s    }[))r#   c                    | j         d         S )Nttsr@   rA   s    r!   rG   zNousSubscriptionFeatures.ttsA   rC   r#   c                    | j         d         S )Nbrowserr@   rA   s    r!   rI   z NousSubscriptionFeatures.browserE   s    }Y''r#   c                    | j         d         S )Nmodalr@   rA   s    r!   rK   zNousSubscriptionFeatures.modalI   s    }W%%r#   Iterable[NousFeatureState]c              #  6   K   d}|D ]}| j         |         V  d S )Nr?   rE   rG   rI   rK   r@   )rB   orderedr(   s      r!   itemszNousSubscriptionFeatures.itemsM   s:      A 	% 	%C-$$$$$	% 	%r#   N)r   r&   )r   rL   )r3   r4   r5   r6   propertyr?   rE   rG   rI   rK   rP   r7   r#   r!   r9   r9   2   s         ))))$ $ $ X$ * * * X* $ $ $ X$ ( ( ( X( & & & X&% % % % % %r#   r9   configDict[str, object]c                    |                      d          }t          |t                    rt          |          S t          |t                    r*|                                rd|                                iS i S )Nmodelr   )r    r   r   r'   strip)rR   	model_cfgs     r!   _model_config_dictrX   S   sn    

7##I)T"" I)S!! .ioo&7&7 .9??,,--Ir#   toolset_keyr'   c                   ddl m} |                     d          }t          |t                    r|sdt
          d         gi}t           ||                    }|sdS |                                D ]\  }}t          |t                    rt          |          }n!t
                              |          }|r|gng }|st
                              |          }|r|g}t                      }	|D ]I}
t          |
t                    r|
s	 |	
                     ||
                     :# t          $ r Y Fw xY w|r|                    |	          r dS dS )Nr   )resolve_toolsetplatform_toolsetsr   FT)toolsetsr[   r    r   r   _DEFAULT_PLATFORM_TOOLSETSsetrP   listr'   update	Exceptionissubset)rR   rY   r[   r\   target_toolsplatformraw_toolsetstoolset_namesdefault_toolsetavailable_toolstoolset_names              r!   _toolset_enabledrk   \   s   ((((((

#677'.. I6G I"%?%F$GH{3344L u"3"9"9";";  ,lD)) 	I ..MM8<<XFFO1@H_--bM 	28<<XFFO 2!0 1$'EE) 	 	LlC00  &&|'D'DEEEE     	L11/BB 	445s   
D))
D65D6c                     dd l } |                     d          }t          t                    j        j        dz  dz  dz  }t          |p|                                          S )Nr   zagent-browsernode_modulesz.bin)shutilwhichr   __file__parentr   exists)rn   agent_browser_bin	local_bins      r!   _has_agent_browserru      sb    MMM_55X$~5>P  !7Y%5%5%7%7888r#   r1   c                F    dddddd}|                     | pd| pd          S )NBrowserbasezBrowser Use	FirecrawlCamofoxzLocal browser)browserbasebrowser-use	firecrawlcamofoxlocalr~   r    r1   mappings     r!   _browser_labelr      s?    $$   G ;;'274D4WXXXr#   c                H    ddddddd}|                     | pd| pd          S )	N
OpenAI TTS
ElevenLabszEdge TTSzxAI TTSzMistral Voxtral TTSNeuTTS)openai
elevenlabsedgexaimistralneuttsr   r   r   s     r!   
_tts_labelr      sB    "( G ;;'163C3QzRRRr#   browser_tool_enabledbrowser_providerbrowser_provider_explicitbrowser_local_availabledirect_camofoxdirect_browserbasedirect_browser_usedirect_firecrawlmanaged_browser_availabletuple[str, bool, bool, bool]c        	           |rddt          |           dfS |r|pd}	|	dk    r(t          |o|          }
t          | o|
          }|	|
|dfS |	dk    rB|p|}t          |o|          }
t          | o|o|o|           }t          | o|
          }|	|
||fS |	dk    r(t          |o|          }
t          | o|
          }|	|
|dfS |	dk    r|	dddfS d}	t          |          }
t          | o|
          }|	|
|dfS |s|r<t          |          }
t          | o|o|o|           }t          | o|
          }d|
||fS |r&t          |          }
t          | o|
          }d|
|dfS t          |          }
t          | o|
          }d|
|dfS )zBResolve browser availability using the same precedence as runtime.r}   TFr~   rz   r{   r|   )r   )r   r   r   r   r   r   r   r   r   r1   r+   r,   provider_availablemanageds                 r!   _resolve_browser_feature_stater      sa     B$%9 : :EAA  :+6w},,4K9KLLI.<9==F#Y==},,!:!P>P4K9KLLI$ +++-+ +*	 G .<9==F#Y??{**4I9IJJI.<9==F#Y==y((#UE588"011	*8y99FE99  	9$6 	9011	  ''')' '&	
 
 *8y99i88 7011	*8y99i66,--I&4955FIvu,,r#   NOptional[Dict[str, object]]c                   | t                      pi } t          |           } t          |           }t          |                    d          pd                                                                          dk    }	 t                      }n# t          $ r i }Y nw xY wt                      }t          |                    d                    }|p|}t          | d          }t          | d          }t          | d          }	t          | d          }
t          | d	          }t          |                     d          t                    r|                     d          ni }t          |                     d          t                    r|                     d          ni }t          |                     d          t                    r|                     d          ni }t          |                     d	          t                    r|                     d	          ni }t          |                    d
          pd                                                                          }t          |                    d          pd                                                                          }d|v }t          |r|                    d          nd           }t          |                    d
          pd                                                                          }t          |                    d                    }t          |          }t          |          }t          |          }t          |                     d          t                    r|                     d          ni }t          |          }t          t!          d                    }t          t!          d          pt!          d                    }t          t!          d                    }t          t!          d                    }t#                      }t          t%                                } t          t!          d                    }!t          t!          d                    }"t          t!          d          ot!          d                    }#t          t!          d                    }$t'                      }%|rd}d}d}d}|rd}|rd} d}!|rd}$d}#|o|ot)          d          }&|o|ot)          d          }'|o|ot)          d          }(|o|ot)          d          })|o|ot)          d          }*t+          ||%|*          }+|dk    o|&o| },t          |o!|,p|d k    o|p|dk    o|p|d!k    o|p|d"k    o|          }-t          |&p|p|p|p|          }.|o|'o| }/t          |o|/p|          }0t          |'p|          }1|pd}2|	o
|2d#k    o|(o|  }3t          |2d$v p3|2d#k    o|(p| p)|2d%k    o|!p!|2d&k    ot          t!          d'                              }4t          |	o|4          }5t-                      }6t/          |
|||6|"|#|$||)(	  	        \  }7}8}9}:|dk    rd};d)}<t          |          }=d}>n|+d*         d+k    r#t          |          };d)}<t          |          }=d}>n~|+d*         d,k    r#d};d)}<t          |          }=t          |          }>nO|d+k    rd};t          |*          }<d}=d}>n3|d,k    rd};t          |%          }<d}=d}>nd};t          |*p|%          }<d}=d}>d}?|                     d          }@t          |@t                    rd|@v r|d-v}?t1          dd.d)|.|-|,|-o|, ||pdt          |          /
  
        t1          dd0d)|1|0|/|0o|/ ||rd1n|/rd2nd|/
  
        t1          dd3d)|4|5|3|5o|3 |	t3          |2          |?/
  
        t1          dd4d)|8|9|:|9o|: |
t5          |7          |/
  
        t1          dd5d|<|=|;|dk    o|>||dk    rd6n|pd|dk    /
  
        d7}At7          ||||A8          S )9Nproviderr0   nous	logged_inr?   rE   rG   rI   terminalbackendr   cloud_providerr~   
modal_modeEXA_API_KEYFIRECRAWL_API_KEYFIRECRAWL_API_URLPARALLEL_API_KEYTAVILY_API_KEYELEVENLABS_API_KEYCAMOFOX_URLBROWSERBASE_API_KEYBROWSERBASE_PROJECT_IDBROWSER_USE_API_KEYFr|   z	fal-queuezopenai-audior{   rK   )
has_directmanaged_readyexaparalleltavilyr   >   r   r   r   r   MISTRAL_API_KEY)	r   r   r   r   r   r   r   r   r   Tselected_backendr   direct>   r0   r   z	Web tools)
r(   r)   r*   r+   r,   r-   r.   r/   r1   r2   zImage generationFALzNous Subscriptionr   zBrowser automationzModal executionModalrN   )r:   r;   r<   r=   )r   r   rX   r'   r    rV   lowerr
   rb   r   r   rk   r   r   r   r"   r   r   r   r   r   r   ru   r   r&   r   r   r9   )BrR   rW   r<   nous_statusmanaged_tools_flagr;   r:   web_tool_enabledimage_tool_enabledtts_tool_enabledr   modal_tool_enabledweb_cfgtts_cfgbrowser_cfgterminal_cfgweb_backendtts_providerr   r   terminal_backendr   web_use_gatewaytts_use_gatewaybrowser_use_gatewayimage_gen_cfgimage_use_gateway
direct_exar   direct_paralleldirect_tavily
direct_faldirect_openai_ttsdirect_elevenlabsr   r   r   direct_modalmanaged_web_availablemanaged_image_availablemanaged_tts_availabler   managed_modal_availablemodal_stateweb_managed
web_activeweb_availableimage_managedimage_activeimage_availabletts_current_providertts_managedtts_available
tts_activer   browser_current_providerbrowser_availablebrowser_activebrowser_managedmodal_managedmodal_availablemodal_activemodal_direct_overridetts_explicit_configuredraw_tts_cfgr=   sB                                                                     r!   get_nous_subscription_featuresr      s7
    ~$"&\\F"6**I9==44:;;AACCIIKKvU*,,    455[__[99::!6%6J'66)&+>>'66+FI>>)&*==#-fjj.?.?#F#FNfjjBG#-fjj.?.?#F#FNfjjBG+5fjj6K6KT+R+RZ&**Y'''XZK-7

:8N8NPT-U-U]6::j)))[]Lgkk),,23399;;AACCKw{{:..8&99??AAGGIIL 0K ?7-FP()))D  	LY''273399;;AACC  &&& J $G,,O#G,,O'44/9&**[:Q:QSW/X/X`FJJ{+++^`M%m44mM2233JM*=>>d-PcBdBdee=);<<==O'78899M&((J9;;<<]+?@@AA-6677Nm,ABBn}UmGnGnoom,ABBCC/11L   
 
 "!! #"".s3DsIfgrIsIs0u5FuKhitKuKu.v3DvIfguIvIv 2 y7H yMjkxMyMy0q5FqKhipKqKq--  K ,_1F_O_K_K 	
 ;u$3;{*?/?; z)=o; x'9M	 	J cc/?c?cVc M 'U+BU:~M*L0KMML2@jAAO'16 	" H,	"!	" "!	   22 	Z H,]2G2\K\	Z L0F5F	Z !I-X$}EV7W7W2X2X	 M &8=99J022 	'1)"; 7%--)";
	 
	 
	  7"".// %	'	(I	5	5/00.// %	'	(H	4	4.// $%7 8 8	y	 	 677 %	x		|,, %6F,GG %#**U##K+t$$ C{)B)B".l"B   $#'&:{?,(.B $[ 1 1
 
 
 &$ $%)(>->.&0dUUm7c7J7Jac *
 
 
   $#'&:{?,'(<== 7
 
 
 $& $'!+*B?/B0+,DEE 9
 
 
 "# %%),7Q<Q.(8G(C(CWWIYId]d 0G ;
 
 
c= =H~ $+)	   s   >B BB)enabled_toolsetsr   Optional[Iterable[str]]set[str]c               "   t                      st                      S t          |           }|j        st                      S t          |pd          }t                      }|                     d          }t          |t                    si }|| d<   |                     d          }t          |t                    si }|| d<   |                     d          }t          |t                    si }|| d<   d|v rb|j        j        sVt          d          sGt          d          s8t          d          s)t          d          sd	|d
<   |
                    d           d|v rC|j        j        s7t                      s)t          d          sd|d<   |
                    d           d|v rD|j        j        s8t          d          s)t          d          sd|d<   |
                    d           d|v r#t                      s|
                    d           |S )Nr7   r?   rG   rI   r   r   r   r   r|   r   r   r   r   r   r   r{   r   rE   )r   r_   r   r<   r    r   r   r?   r2   r   addrG   r   rI   r   )rR   r   r=   selected_toolsetschangedr   r   r   s           r!   apply_nous_managed_defaultsr     sC   
 &'' uu-f55H$ uu,233GjjGgt$$  ujjGgt$$  u**Y''Kk4(( ('y!!!(,*J!()) ")** " ,-- " ,--	 " )	E!!!(,*J!$&& "-.. " '
E%%%h.>.R%+,, &.// & )6$%I'''0E0G0G'K   Nr#   z Web search & extract (Firecrawl)zImage generation (FAL)zText-to-speech (OpenAI TTS)z Browser automation (Browser Use)r?   rE   rG   rI   Dict[str, bool]c                    t          t          d          p;t          d          p,t          d          pt          d          pt          d                    t                      t          t                      pt          d                    t          t          d          pt          d          ot          d	                    d
S )z4Return a dict of tool_key -> has_direct_credentials.r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r7   r#   r!   _get_gateway_direct_credentialsr   &  s     -.. ,011,/00, -.., ]++
 
 +,,(** 3122
 
 /00 b344`G_9`9`
 
  r#   z!Firecrawl/Exa/Parallel/Tavily keyzFAL keyzOpenAI/ElevenLabs keyzBrowser Use/Browserbase key&tuple[list[str], list[str], list[str]]c                l   t                      sg g g fS | t                      pi } |                     d          }t          |t                    rLt          |                    d          pd                                                                          dk    rg g g fS t                      }t          |                     d                    t          |                     d                    t          |                     d                    t          |                     d	                    d
}g }g }g }t          D ]m}|                    |          r|                    |           -|                    |          r|                    |           X|                    |           n|||fS )az  Return (unconfigured, has_direct, already_managed) tool key lists.

    - unconfigured: tools with no direct credentials (easy switch)
    - has_direct: tools where the user has their own API keys
    - already_managed: tools already routed through the gateway

    All lists are empty when the user is not a paid Nous subscriber or
    is not using Nous as their provider.
    NrU   r   r0   r   r?   rE   rG   rI   r   )r   r   r    r   r   r'   rV   r   r   r"   _ALL_GATEWAY_KEYSappend)rR   rW   r   opted_inunconfiguredr   already_managedr(   s           r!   get_gateway_eligible_toolsr   F  s    &'' 2rz~$" 

7##Ii&& #immJ.G.G.M2*N*N*T*T*V*V*\*\*^*^bh*h*h2rz,..F VZZ..//"6::k#:#:;;VZZ..// I!6!677	 H !LJ!#O  % %<< 	%""3''''ZZ__ 	%c""""$$$$_44r#   	tool_keys	list[str]c                   t                      }|                     d          }t          |t                    si }|| d<   |                     d          }t          |t                    si }|| d<   |                     d          }t          |t                    si }|| d<   d|v rd|d<   d|d<   |                    d           d|v rd|d	<   d|d<   |                    d           d|v rd
|d<   d|d<   |                    d           d|v rK|                     d          }t          |t                    si }|| d<   d|d<   |                    d           |S )zApply Tool Gateway config for the given tool keys.

    Sets ``use_gateway: true`` in each tool's config section so the
    runtime prefers the gateway even when direct API keys are present.

    Returns the set of tools that were actually changed.
    r?   rG   rI   r|   r   Tr   r   r   r{   r   rE   )r_   r    r   r   r   )rR   r  r   r   r   r   	image_cfgs          r!   apply_gateway_defaultsr  w  s    GjjGgt$$  ujjGgt$$  u**Y''Kk4(( ('y	(	!%E	&
!%EI(5$%%)M"IiJJ{++	)T** 	,I"+F;#'	- K   Nr#   c                   t          |           \  }}}|s|st                      S 	 ddlm} n# t          $ r t                      cY S w xY wg d}|r)|D ]&}|                    dt          |          d           '|r)|D ]&}|                    dt          |          d           '|r6|D ]3}|                    dt          |          dt          |                     4g }g }|r|r|                    d	           |                    d
           |                    d           |                    d           |                    d           |                    d           n|rU|                    d           |                    d           |                    d           |                    d           nT|                    d           |                    d
           |                    d           |                    d           |rd                    |          nd}	|sdnt          |          dz
  }
	  |d||
|	          }n1# t          t          t          t          f$ r t                      cY S w xY w||         }|dk    rt                      S |d
k    rt          t                    }n|}t!          | |          }|rvddlm}  ||            |t          |          z
  }t'          |          D ]0}t                              ||          }t+          d| d           1|r|st+          d           |S )a6  If eligible tools exist, prompt the user to enable the Tool Gateway.

    Uses prompt_choice() with a description parameter so the curses TUI
    shows the tool context alongside the choices.

    Returns the set of tools that were enabled, or empty set if the user
    declined or no tools were eligible.
    r   )prompt_choice)r0   zD  The Tool Gateway gives you access to web search, image generation,zH  text-to-speech, and browser automation through your Nous subscription.uL     No need to sign up for separate API keys — just pick the tools you want.r0   u     ✓ u    — using Tool Gatewayu     ○ u    — not configuredu    — using z3Enable for all tools (existing keys kept, not used)allz+Enable only for tools without existing keysr   SkipskipzEnable Tool Gatewayz2Enable Tool Gateway (existing keys kept, not used)
N   z1Your Nous subscription includes the Tool Gateway.)description)save_configz: enabled via Nous subscriptionz(  (all tools already using Tool Gateway))r   r_   hermes_cli.setupr  rb   r   _GATEWAY_TOOL_LABELS_GATEWAY_DIRECT_LABELSjoinlenKeyboardInterruptEOFErrorOSError
SystemExitr`   r   r  hermes_cli.configr  sortedr    print)rR   r   r   r   r  
desc_partskchoiceschoice_keysr  default_idxidxactionto_applyr   r  newly_switchedr(   r)   s                      r!   prompt_enable_tool_gatewayr$    s    1K60R0R-L*o 
 uu2222222   uu  J  Y  	Y 	YAW';A'>WWWXXXX U 	U 	UAS';A'>SSSTTTT h 	h 	hAf';A'>ffKabcKdffgggg GK #
 #LMMM5!!!DEEE>***v6""""	 #,--->***v6"""" 	KLLL5!!!v6"""+5?$))J'''4K &;!!3w<<!+;Km?#	
 
 
 x*=   uu Fuu )**$VX66G 	>111111F 3#7#77.)) 	C 	CC(,,S#66EA5AAABBBB 	>> 	><===Ns!   . A	A	 I +I>=I>)r   r   r   r   )rR   rS   r   rS   )rR   rS   rY   r'   r   r   )r   r   )r1   r'   r   r'   )r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )N)rR   r   r   r9   )rR   rS   r   r   r   r   )r   r   )rR   r   r   r   )rR   rS   r  r  r   r   )rR   rS   r   r   )0__doc__
__future__r   dataclassesr   pathlibr   typingr   r   r   r	   hermes_cli.authr
   r  r   r   tools.managed_tool_gatewayr   utilsr   tools.tool_backend_helpersr   r   r   r   r   r   r   r^   r"   r&   r9   rX   rk   ru   r   r   r   r   r   r  r   r  r   r   r  r$  r7   r#   r!   <module>r.     s-   > > " " " " " " ! ! ! ! ! !       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 8 8 8 8 8 D D D D D D ! ! ! ! ! !                  
< 
F F F F $
& 
& 
& 
& 
& 
& 
& 
& $% % % % % % % %@   " " " "J9 9 9 9Y Y Y Y	S 	S 	S 	S?- ?- ?- ?-F +/u u u u u| 158 8 8 8 8 8@ .)(1	     . /",	   ;  +/.5 .5 .5 .5 .5b3 3 3 3le e e e e er#   