§
    øžyjUÂ  ã                  ó,  — U 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mZ ddlmZ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ddddddddœZ de!d<   d`d„Z" ed¬¦  «         G d„ d¦  «        ¦   «         Z# ed¬¦  «         G d„ d ¦  «        ¦   «         Z$dad#„Z%dbd&„Z&dcd'„Z'dcd(„Z(ddd*„Z)ddd+„Z*ddd,„Z+dcd-„Z,ded9„Z-	 dfd;d<œdgd?„Z.d:d;d@œdhdD„Z/dEdFdGdHdIdJdKœZ0didM„Z1dNdOdOdPdQdRdKœZ2dKZ3	 dfd;d<œdjdT„Z4dkdW„Z5dd<œdldX„Z6dYd:dZœdmd^„Z7dnd_„Z8d:S )oz8Helpers for Nous subscription managed-tool capabilities.é    )Úannotations)Ú	dataclass)ÚPath)ÚDictÚIterableÚOptionalÚSet)Úget_env_valueÚload_config)ÚNousPortalAccountInfoÚ&format_nous_portal_entitlement_messageÚget_nous_portal_account_info)Ú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Ú	firecrawlÚfalú	fal-videoúopenai-audioúbrowser-useÚmodal©ÚwebÚ	image_genÚ	video_genÚttsÚsttÚbrowserr   zDict[str, str]Ú!MANAGED_FEATURE_COVERAGE_CATEGORYÚ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    úB/home/ragecks/.hermes/hermes-agent/hermes_cli/nous_subscription.pyÚ_uses_gatewayr2   2   s8   € å�g�tÑ$Ô$ð ØˆuÝ˜7Ÿ;š; }Ñ5Ô5¸uÐ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__rA   rB   © r3   r1   r6   r6   9   sŠ   € € € € € € à€H€H�HØ€J€J�JØÐÐÑØ€O€O�OØ€L€L�LØÐÐÑØÐÐÑØÐÐÑØÐÐÐÐÑØ %ÐÐ%Ð%Ð%Ñ%Ð%Ð%r3   r6   c                  óö   — e Zd ZU ded<   ded<   ded<   ded<   dZded	<   edd„¦   «         Zedd„¦   «         Z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]ÚfeaturesNzOptional[NousPortalAccountInfo]Úaccount_infor)   r6   c                ó   — | j         d         S )Nr    ©rM   ©Úselfs    r1   r    zNousSubscriptionFeatures.webO   ó   € àŒ}˜UÔ#Ð#r3   c                ó   — | j         d         S )Nr!   rP   rQ   s    r1   r!   z"NousSubscriptionFeatures.image_genS   ó   € àŒ}˜[Ô)Ð)r3   c                ó   — | j         d         S )Nr#   rP   rQ   s    r1   r#   zNousSubscriptionFeatures.ttsW   rS   r3   c                ó   — | j         d         S )Nr$   rP   rQ   s    r1   r$   zNousSubscriptionFeatures.stt[   rS   r3   c                ó   — | j         d         S )Nr%   rP   rQ   s    r1   r%   z NousSubscriptionFeatures.browser_   s   € àŒ}˜YÔ'Ð'r3   c                ó   — | j         d         S )Nr"   rP   rQ   s    r1   r"   z"NousSubscriptionFeatures.video_genc   rU   r3   c                ó   — | j         d         S )Nr   rP   rQ   s    r1   r   zNousSubscriptionFeatures.modalg   s   € àŒ}˜WÔ%Ð%r3   úIterable[NousFeatureState]c              #  ó6   K  — d}|D ]}| j         |         V — Œd S )Nr   rP   )rR   Úorderedr8   s      r1   ÚitemszNousSubscriptionFeatures.itemsk   s:   è è € ØUˆØð 	%ð 	%ˆCØ”- Ô$Ð$Ð$Ð$Ð$ð	%ð 	%r3   )r)   r6   )r)   r[   )rC   rD   rE   rF   rN   Úpropertyr    r!   r#   r$   r%   r"   r   r^   rG   r3   r1   rI   rI   G   sI  € € € € € € àÐÐÑØÐÐÑØÐÐÑØ)Ð)Ð)Ñ)Ø48€LÐ8Ð8Ð8Ñ8àð$ð $ð $ñ „Xð$ð ð*ð *ð *ñ „Xð*ð ð$ð $ð $ñ „Xð$ð ð$ð $ð $ñ „Xð$ð ð(ð (ð (ñ „Xð(ð ð*ð *ð *ñ „Xð*ð ð&ð &ð &ñ „Xð&ð%ð %ð %ð %ð %ð %r3   rI   ÚconfigúDict[str, object]c                óö   — |                       d¦  «        }t          |t          ¦  «        rt          |¦  «        S t          |t          ¦  «        r*|                     ¦   «         rd|                     ¦   «         iS i S )NÚmodelr-   )r0   r.   r/   r7   Ústrip)r`   Ú	model_cfgs     r1   Ú_model_config_dictrf   q   sn   € Ø—
’
˜7Ñ#Ô#€IÝ�)�TÑ"Ô"ð Ý�I‰ŒÐÝ�)�SÑ!Ô!ð . i§o¢oÑ&7Ô&7ð .Ø˜9Ÿ?š?Ñ,Ô,Ð-Ð-Ø€Ir3   Útoolset_keyr7   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)Útoolsetsri   r0   r.   r/   Ú_DEFAULT_PLATFORM_TOOLSETSÚsetr^   Úlistr7   ÚupdateÚ	ExceptionÚissubset)r`   rg   ri   rj   Útarget_toolsÚplatformÚraw_toolsetsÚtoolset_namesÚdefault_toolsetÚavailable_toolsÚtoolset_names              r1   Ú_toolset_enabledry   z   s´  € Ø(Ð(Ð(Ð(Ð(Ð(àŸ
š
Ð#6Ñ7Ô7ÐÝÐ'­Ñ.Ô.ð IÐ6Gð IØ"Õ%?ÀÔ%FÐ$GÐHÐå�� {Ñ3Ô3Ñ4Ô4€LØð Øˆuà"3×"9Ò"9Ñ";Ô";ð ð Ñˆ�,Ý�l¥DÑ)Ô)ð 	IÝ  Ñ.Ô.ˆMˆMå8×<Ò<¸XÑFÔFˆOØ1@ÐH˜_Ð-Ð-ÀbˆMØð 	2Ý8×<Ò<¸XÑFÔFˆOØð 2Ø!0Ð 1�å$'¡E¤EˆØ)ð 	ð 	ˆLÝ˜l­CÑ0Ô0ð ¸ð ØðØ×&Ò&  °|Ñ'DÔ'DÑEÔEÐEÐEøÝð ð ð Ø�ðøøøð ð 	˜L×1Ò1°/ÑBÔBð 	Ø�4�4øàˆ5s   Ä
D)Ä)
D6Ä5D6c                 óÀ  — dd l } ddlm}m}  ||                      d¦  «        ¦  «        rdS  |¦   «                              dd¦  «        }|r&|                      d|¬¦  «        }|r ||¦  «        rdS t          t          ¦  «        j        j        dz  d	z  }| 	                    ¦   «         r3|                      dt          |¦  «        ¬¦  «        }|r ||¦  «        rdS d
S )Nr   )Úagent_browser_runnableÚwith_hermes_node_pathzagent-browserTÚPATHr@   )ÚpathÚnode_modulesz.binF)ÚshutilÚhermes_constantsr{   r|   Úwhichr0   r   Ú__file__ÚparentÚis_dirr7   )r€   r{   r|   Úmanaged_pathÚmanaged_hitÚlocal_bin_dirÚlocal_whichs          r1   Ú_has_agent_browserrŠ   Ÿ   s  € Ø€M€M€MàNÐNÐNÐNÐNÐNÐNÐNð
 Ð˜fŸlšl¨?Ñ;Ô;Ñ<Ô<ð Øˆtð )Ð(Ñ*Ô*×.Ò.¨v°rÑ:Ô:€LØð Ø—l’l ?¸�lÑFÔFˆØð 	Ð1Ð1°+Ñ>Ô>ð 	Ø�4õ �‘N”NÔ)Ô0°>ÑAÀFÑJ€MØ×ÒÑÔð Ø—l’l ?½¸]Ñ9KÔ9K�lÑLÔLˆØð 	Ð1Ð1°+Ñ>Ô>ð 	Ø�4Øˆ5r3   c                 ó„   — t          ¦   «         sdS 	 ddlm} m} n# t          $ r Y dS w xY w |¦   «         rdS  | ¦   «         S )uÞ  Return True when the *local* browser backend would actually start.

    The ``agent-browser`` CLI being present is necessary but not sufficient for
    local mode: agent-browser also needs a Chromium build on disk (without one
    it hangs on first use until the command timeout fires), unless the
    Lightpanda engine is selected â€” text-only navigation needs no Chromium.

    This mirrors the local-mode tail of
    :func:`tools.browser_tool.check_browser_requirements`, so the setup/status
    surfaces advertise local browser readiness only when the runtime would
    actually run it. Cloud providers (Browserbase, Browser Use, Firecrawl) host
    their own Chromium and therefore gate on :func:`_has_agent_browser` alone.
    Fr   ©Ú_chromium_installedÚ_using_lightpanda_engineT)rŠ   Útools.browser_toolr�   rŽ   rp   rŒ   s     r1   Ú_local_browser_runnabler�   Á   s‚   € õ ÑÔð ØˆuðØTÐTÐTÐTÐTÐTÐTÐTÐTøÝð ð ð ð ˆtˆtðøøøð  ÐÑ!Ô!ð ØˆtØÐÑ Ô Ð s   ’ ›
)¨)rA   c                óF   — ddddddœ}|                      | pd| pd¦  «        S )NÚBrowserbasezBrowser UseÚ	FirecrawlÚCamofoxzLocal browser)Úbrowserbaser   r   ÚcamofoxÚlocalr—   ©r0   ©rA   Úmappings     r1   Ú_browser_labelr›   Ü   s?   € à$Ø$Ø ØØ ðð €Gð �;Š;Ð'Ð2¨7Ð4DÐ4WÈÑXÔXÐXr3   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     r1   Ú
_tts_labelr¦   ç   sB   € àØ"ØØØ(Øðð €Gð �;Š;Ð'Ð1¨6Ð3CÐ3QÀzÑRÔRÐRr3   c                óD   — dddddœ}|                      | pd| pd¦  «        S )NzOpenAI WhisperzGroq WhisperzMistral Voxtral TranscribezLocal faster-whisper)r    Úgroqr¤   r—   r—   r˜   r™   s     r1   Ú
_stt_labelr©   ó   s=   € à"ØØ/Ø'ð	ð €Gð �;Š;Ð'Ð2¨7Ð4DÐ4^ÐH^Ñ_Ô_Ð_r3   c                 ór   — t          d¦  «        rdS 	 ddlm}  t          | ¦  «        S # t          $ r Y dS w xY w)a2  Whether a local STT backend could serve transcription right now.

    True when faster-whisper is importable or a custom local STT command
    is configured. Used both for feature detection and to stop
    ``apply_nous_managed_defaults`` from flipping a working local setup
    to the managed gateway.
    ÚHERMES_LOCAL_STT_COMMANDTr   ©Ú_HAS_FASTER_WHISPERF)r
   Útools.transcription_toolsr­   r*   rp   r¬   s    r1   Ú_local_stt_backend_availabler¯   ý   sb   € õ Ð/Ñ0Ô0ð ØˆtðØAÐAÐAÐAÐAÐAåÐ'Ñ(Ô(Ð(øÝð ð ð Øˆuˆuðøøøs   “( ¨
6µ6Úbrowser_tool_enabledÚbrowser_providerÚbrowser_provider_explicitÚbrowser_local_availableÚbrowser_local_runnableÚ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 )u9  Resolve browser availability using the same precedence as runtime.

    ``browser_local_available`` means "the agent-browser CLI is present" â€” the
    only local requirement for cloud providers, which host their own Chromium.
    ``browser_local_runnable`` additionally requires a usable local Chromium
    build (or the Lightpanda engine), mirroring the local-mode tail of
    :func:`tools.browser_tool.check_browser_requirements`. Local mode must gate
    on the latter, or setup/status advertise a browser that fails on first use
    when Chromium is missing.
    r–   TFr—   r•   r   r   )r*   )r°   r±   r²   r³   r´   rµ   r¶   r·   r¸   r¹   rA   r;   r<   Úprovider_availableÚmanageds                  r1   Ú_resolve_browser_feature_stater¾     sa  € ð. ð BØ˜$¥Ð%9Ñ :Ô :¸EÐAÐAà ð :Ø+Ð6¨wÐØ˜}Ò,Ð,ÝÐ4ÐKÐ9KÑLÔLˆIÝÐ.Ð<°9Ñ=Ô=ˆFØ# Y°¸Ð=Ð=Ø˜}Ò,Ð,Ø!:Ð!PÐ>PÐÝÐ4ÐKÐ9KÑLÔLˆIÝØ$ð +Ø+ð+à-ð+ð +Ð*ñ	ô ˆGõ Ð.Ð<°9Ñ=Ô=ˆFØ# Y°¸Ð?Ð?Ø˜{Ò*Ð*ÝÐ4ÐIÐ9IÑJÔJˆIÝÐ.Ð<°9Ñ=Ô=ˆFØ# Y°¸Ð=Ð=Ø˜yÒ(Ð(Ø# U¨E°5Ð8Ð8à"ÐÝÐ/Ñ0Ô0ˆ	ÝÐ*Ð8¨yÑ9Ô9ˆØ ¨F°EÐ9Ð9à ð 	9Ð$6ð 	9ÝÐ0Ñ1Ô1ˆ	ÝØ ð 'Ø'ð'à)ð'ð 'Ð&ñ	
ô 
ˆõ Ð*Ð8¨yÑ9Ô9ˆØ˜i¨°Ð8Ð8àð 7ÝÐ0Ñ1Ô1ˆ	ÝÐ*Ð8¨yÑ9Ô9ˆØ˜i¨°Ð6Ð6åÐ+Ñ,Ô,€IÝÐ&Ð4¨9Ñ5Ô5€FØ�I˜v uÐ,Ð,r3   NF©Úforce_freshúOptional[Dict[str, object]]rÀ   c               óR  ‡]— | €t          ¦   «         pi } t          | ¦  «        } t          | ¦  «        }t          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         dk    }	 |rt          d¬¦  «        Š]nt          ¦   «         Š]n# t          $ r d Š]Y nw xY wt          ‰]o‰]j
        o‰]j        ¦  «        }t          ‰]o‰]j
        ¦  «        }dMˆ]fd
„}|p|}t          | d¦  «        }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¦  «        t          ¦  «        r|                      d¦  «        ni }t          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }t          |                     d¦  «        pd¦  «                             ¦   «                              ¦   «         }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!          |¦  «        }t          |                      d¦  «        t          ¦  «        r|                      d¦  «        ni }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#          d¦  «        ¦  «        }'t%          ¦   «         }(|(})t          t'          ¦   «         ¦  «        }*t          t#          d¦  «        ¦  «        }+t          t#          d¦  «        ¦  «        },t          t#          d ¦  «        ot#          d!¦  «        ¦  «        }-t          t#          d"¦  «        ¦  «        }.t)          ¦   «         }/t          t'          ¦   «         ¦  «        }0t          t#          d#¦  «        ¦  «        }1t          t#          d$¦  «        ¦  «        }2	 d%d&lm}3 t          |3¦  «        pt          t#          d'¦  «        ¦  «        }4n,# t          $ r t          t#          d'¦  «        ¦  «        }4Y nw xY w|rd(}$d(}#d(}%d(}&| rd(}(|"rd(})|rd(}*d(}+|rd(}0d(}1d(}2d(}4|rd(}.d(}-|o|ot/          d)¦  «        o
 |d)¦  «        }5|o|ot/          d*¦  «        o
 |d+¦  «        }6|o|ot/          d*¦  «        o
 |d,¦  «        }7|o|ot/          d-¦  «        o
 |d-¦  «        }8|8}9|o|ot/          d.¦  «        o
 |d.¦  «        }:|o|ot/          d/¦  «        o
 |d/¦  «        };t1          ||/|;|¬0¦  «        }<|d)k    o|5o|$ }=t          |oQ|=pO|d1k    o|#pG|d)k    o|$p?|d2k    o|%p7|d3k    o|&p/|d4k    o|'p'|d4k    o|'p|d1k    o|#p|d)k    o|$p|d2k    o|%p|d3k    o|&¦  «        }>t          |5p	|#p|$p|%p|&p|'¦  «        }?|	o|6o|( }@t          |	o|@p|(¦  «        }At          |6p|(¦  «        }B|
o|7o|) }Ct          |
o|Cp|)¦  «        }Dt          |7p|)¦  «        }E|pd}F|o
|Fd5k    o|8o|* }Gt          |Fd6v p3|Fd5k    o|8p|*p)|Fd7k    o|+p!|Fd8k    ot          t#          d$¦  «        ¦  «        ¦  «        }Ht          |o|H¦  «        }I|pd}J|Jd5k    o|9o|0 }Kt          |Jdk    r|4p|Jd5k    o|9p|0p|Jd9k    o|1p|Jd8k    o|2¦  «        }L|L}Mt3          ¦   «         }Nt5          ¦   «         }Ot7          ||||N|O|,|-|.|$|:¬:¦
  «
        \  }P}Q}R}S|d/k    rd(}Td}Ut          |¦  «        }Vd(}Wn­|<d;         d<k    r#t          |¦  «        }Td}Ut          |¦  «        }Vd(}Wn~|<d;         d=k    r#d(}Td}Ut          |¦  «        }Vt          |¦  «        }WnO|d<k    rd(}Tt          |;¦  «        }Ud(}Vd(}Wn3|d=k    rd(}Tt          |/¦  «        }Ud(}Vd(}Wnd(}Tt          |;p|/¦  «        }Ud(}Vd(}Wd(}X|                      d¦  «        }Yt          |Yt          ¦  «        rd|Yv r|d>v}Xd(}Z|                      d¦  «        }[t          |[t          ¦  «        rd|[v r|d?v}Zt9          dd@d|?|>|=|>o|= ||p|pdt          |p|¦  «        ¬A¦
  «
        t9          ddBd|B|A|@|Ao|@ |	|(rdCn|@rdDnd|(¬A¦
  «
        t9          ddEd(|E|D|C|Do|C |
|)rdCn|CrdDnd|)¬A¦
  «
        t9          ddFd|H|I|G|Io|G |t;          |F¦  «        |X¬A¦
  «
        t9          ddGd|L|M|K|Mo|K dt=          |J¦  «        |Z¬A¦
  «
        t9          ddHd|Q|R|S|Ro|S |t?          |P¦  «        |¬A¦
  «
        t9          d/dId(|U|V|T|d/k    o|W||d/k    rdJn|pd|d/k    ¬A¦
  «
        dKœ}\tA          ||||\‰]¬L¦  «        S )NNÚproviderr@   ÚnousTr¿   Úcategoryr7   r)   r*   c                óL   •— t          ‰o‰                     | ¦  «        ¦  «        S ©N)r*   Útool_gateway_entitled_for)rÅ   rN   s    €r1   Ú_entitled_forz5get_nous_subscription_features.<locals>._entitled_forx  s$   ø€ Ý�LÐU \×%KÒ%KÈHÑ%UÔ%UÑVÔVÐVr3   r    r!   r"   r#   r%   Úterminalr$   ÚbackendÚsearch_backendr¢   r—   Úcloud_providerÚ
modal_modeÚEXA_API_KEYÚFIRECRAWL_API_KEYÚFIRECRAWL_API_URLÚPARALLEL_API_KEYÚTAVILY_API_KEYÚSEARXNG_URLÚELEVENLABS_API_KEYÚCAMOFOX_URLÚBROWSERBASE_API_KEYÚBROWSERBASE_PROJECT_IDÚBROWSER_USE_API_KEYÚGROQ_API_KEYÚMISTRAL_API_KEYr   r¬   r«   Fr   z	fal-queuer   r   r   r   r   )Ú
has_directÚmanaged_readyÚmanaged_enabledÚexaÚparallelÚtavilyÚsearxngr    >   r¢   r¥   r¡   r¤   r¨   )
r°   r±   r²   r³   r´   rµ   r¶   r·   r¸   r¹   Úselected_backendr½   Údirect>   r@   r¢   >   r@   r—   z	Web tools)
r8   r9   r:   r;   r<   r=   r>   r?   rA   rB   zImage generationÚFALzNous SubscriptionzVideo generationr�   zSpeech-to-textzBrowser automationzModal executionÚModalr   )rJ   rK   rL   rM   rN   )rÅ   r7   r)   r*   )!r   r/   rf   r7   r0   rd   Úlowerr   rp   r*   Ú	logged_inÚtool_gateway_entitledry   r.   r   r   r2   r
   r   r   r   r®   r­   r   r   rŠ   r�   r¾   r6   r¦   r©   r›   rI   )^r`   rÀ   re   rL   Úmanaged_tools_flagrK   rÉ   rJ   Úweb_tool_enabledÚimage_tool_enabledÚvideo_tool_enabledÚtts_tool_enabledr°   Úmodal_tool_enabledÚweb_cfgÚtts_cfgÚstt_cfgÚbrowser_cfgÚterminal_cfgÚweb_backendÚweb_search_backendÚtts_providerÚstt_providerr²   r±   Úterminal_backendrÎ   Úweb_use_gatewayÚtts_use_gatewayÚstt_use_gatewayÚbrowser_use_gatewayÚimage_gen_cfgÚimage_use_gatewayÚvideo_gen_cfgÚvideo_use_gatewayÚ
direct_exar¸   Údirect_parallelÚdirect_tavilyÚdirect_searxngÚ
direct_falÚdirect_fal_videoÚdirect_openai_ttsÚdirect_elevenlabsrµ   r¶   r·   Údirect_modalÚdirect_openai_sttÚdirect_groq_sttÚdirect_mistral_sttr­   Úlocal_stt_availableÚmanaged_web_availableÚmanaged_image_availableÚmanaged_video_availableÚmanaged_tts_availableÚmanaged_stt_availabler¹   Úmanaged_modal_availableÚmodal_stateÚweb_managedÚ
web_activeÚweb_availableÚimage_managedÚimage_activeÚimage_availableÚvideo_managedÚvideo_activeÚvideo_availableÚtts_current_providerÚtts_managedÚtts_availableÚ
tts_activeÚstt_current_providerÚstt_managedÚstt_availableÚ
stt_activer³   r´   Úbrowser_current_providerÚbrowser_availableÚbrowser_activeÚbrowser_managedÚmodal_managedÚmodal_availableÚmodal_activeÚmodal_direct_overrideÚtts_explicit_configuredÚraw_tts_cfgÚstt_explicit_configuredÚraw_stt_cfgrM   rN   s^                                                                                                @r1   Úget_nous_subscription_featuresr3  [  s¾  ø€ ð
 €~Ý‘”Ð$ "ˆÝ�&‰\Œ\€FÝ" 6Ñ*Ô*€IÝ˜9Ÿ=š=¨Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔC×IÒIÑKÔKÈvÒUÐðØð 	:Ý7ÀDÐIÑIÔIˆLˆLå7Ñ9Ô9ˆLøøÝð ð ð Øˆˆˆðøøøõ Øð 	/ØÔ"ð	/àÔ.ñô Ðõ
 ˜\ÐD¨lÔ.DÑEÔEÐðWð Wð Wð Wð Wð Wà!Ð6Ð%6€Jå'¨°Ñ6Ô6ÐÝ)¨&°+Ñ>Ô>ÐÝ)¨&°+Ñ>Ô>ÐÝ'¨°Ñ6Ô6ÐÝ+¨F°IÑ>Ô>ÐÝ)¨&°*Ñ=Ô=Ðå#-¨f¯jªj¸Ñ.?Ô.?ÅÑ#FÔ#FÐNˆf�jŠj˜ÑÔÐÈB€GÝ#-¨f¯jªj¸Ñ.?Ô.?ÅÑ#FÔ#FÐNˆf�jŠj˜ÑÔÐÈB€GÝ#-¨f¯jªj¸Ñ.?Ô.?ÅÑ#FÔ#FÐNˆf�jŠj˜ÑÔÐÈB€GÝ+5°f·j²jÀÑ6KÔ6KÍTÑ+RÔ+RÐZ�&—*’*˜YÑ'Ô'Ð'ÐXZ€KÝ-7¸¿
º
À:Ñ8NÔ8NÕPTÑ-UÔ-UÐ]�6—:’:˜jÑ)Ô)Ð)Ð[]€Lå�g—k’k )Ñ,Ô,Ð2°Ñ3Ô3×9Ò9Ñ;Ô;×AÒAÑCÔC€Kõ ˜WŸ[š[Ð)9Ñ:Ô:Ð@¸bÑAÔA×GÒGÑIÔI×OÒOÑQÔQÐÝ�w—{’{ :Ñ.Ô.Ð8°&Ñ9Ô9×?Ò?ÑAÔA×GÒGÑIÔI€Lõ
 �w—{’{ :Ñ.Ô.Ð9°'Ñ:Ô:×@Ò@ÑBÔB×HÒHÑJÔJ€LØ 0°KÐ ?ÐÝ7Ø-FÐPˆ�ŠÐ(Ñ)Ô)Ð)ÈDñô Ðõ 	ˆL×Ò˜YÑ'Ô'Ð2¨7Ñ3Ô3×9Ò9Ñ;Ô;×AÒAÑCÔCð õ &Ø×Ò˜Ñ&Ô&ñô €Jõ $ GÑ,Ô,€OÝ# GÑ,Ô,€OÝ# GÑ,Ô,€OÝ'¨Ñ4Ô4ÐÝ/9¸&¿*º*À[Ñ:QÔ:QÕSWÑ/XÔ/XÐ`�F—J’J˜{Ñ+Ô+Ð+Ð^`€MÝ% mÑ4Ô4ÐÝ/9¸&¿*º*À[Ñ:QÔ:QÕSWÑ/XÔ/XÐ`�F—J’J˜{Ñ+Ô+Ð+Ð^`€MÝ% mÑ4Ô4Ðå•m MÑ2Ô2Ñ3Ô3€JÝ�MÐ*=Ñ>Ô>ÐdÅ-ÐPcÑBdÔBdÑeÔeÐÝ�=Ð);Ñ<Ô<Ñ=Ô=€OÝ�Ð'7Ñ8Ô8Ñ9Ô9€MÝ�-¨Ñ6Ô6Ñ7Ô7€NÝ&Ñ(Ô(€JØ!ÐÝÕ9Ñ;Ô;Ñ<Ô<ÐÝ�]Ð+?Ñ@Ô@ÑAÔAÐÝ�-¨Ñ6Ô6Ñ7Ô7€NÝ�mÐ,AÑBÔBÐnÅ}ÐUmÑGnÔGnÑoÔoÐÝ�mÐ,AÑBÔBÑCÔCÐÝ/Ñ1Ô1€Lõ Õ9Ñ;Ô;Ñ<Ô<ÐÝ�=¨Ñ8Ô8Ñ9Ô9€OÝ�mÐ,=Ñ>Ô>Ñ?Ô?ÐðNØAÐAÐAÐAÐAÐAÝ"Ð#6Ñ7Ô7ð 
½4ÝÐ4Ñ5Ô5ñ<
ô <
ÐÐøõ ð Nð Nð NÝ"¥=Ð1KÑ#LÔ#LÑMÔMÐÐÐðNøøøð ð Ø ÐØˆ
ØˆØˆØð Øˆ
Øð !Ø ÐØð "Ø!ÐØ!ÐØð $Ø!ÐØˆØ"ÐØ#ÐØð #Ø"ÐØ"Ðð 	ð 	'Øð	'å)¨+Ñ6Ô6ð	'ð ˆM˜+Ñ&Ô&ð	 ð 	ð 	!Øð	!å)¨+Ñ6Ô6ð	!ð ˆM˜%Ñ Ô ð	 ð 	ð 	'Øð	'å)¨+Ñ6Ô6ð	'ð ˆM˜+Ñ&Ô&ð	 ð 	ð 	*Øð	*å)¨.Ñ9Ô9ð	*ð ˆM˜.Ñ)Ô)ð	 ð 2Ðàð 	)Øð	)å)¨-Ñ8Ô8ð	)ð ˆM˜-Ñ(Ô(ð	 ð 	ð 	#Øð	#å)¨'Ñ2Ô2ð	#ð ˆM˜'Ñ"Ô"ð	 õ .ØØØ-Ø*ð	ñ ô €Kð  Ò,Ð_Ð1FÐ_ÐO_ÐK_€KÝØð 	
àð BØ˜uÒ$Ð3¨ðBà˜{Ò*Ð?Ð/?ðBð ˜zÒ)Ð=¨oðBð ˜xÒ'Ð9¨Mð	Bð
 ˜yÒ(Ð;¨^ðBð # iÒ/ÐB°NðBð # eÒ+Ð:°
ðBð # kÒ1ÐFÐ6FðBð # jÒ0ÐD°_ðBð # hÒ.Ð@°=ñô €Jõ$ ØÐu ÐuÐ/?ÐuÀ?ÐuÐVcÐuÐguñô €Mð 'ÐUÐ+BÐUÈ:À~€MÝÐ*ÐL°Ð0KÀÑMÔM€LÝÐ2Ð@°jÑAÔA€Oà&Ð[Ð+BÐ[ÐK[ÐG[€MÝÐ*ÐR°Ð0QÐAQÑSÔS€LÝÐ2ÐFÐ6FÑGÔG€Oà'Ð1¨6Ðàð 	"Ø  HÒ,ð	"à!ð	"ð "Ð!ð	 õ ØÐ 2Ð2ð 	ZØ  HÒ,Ð]Ð2GÐ2\ÐK\ð	Zà  LÒ0ÐFÐ5Fð	Zð ! IÒ-ÐXµ$µ}ÐEVÑ7WÔ7WÑ2XÔ2Xñ	ô €Mõ Ð&Ð8¨=Ñ9Ô9€Jð (Ð2¨7Ðà Ò(ð 	"Ø!ð	"à!Ð!ð õ
 Ø	 Ò	(Ð	@Ð-@ð 	FØ  HÒ,Ð]Ð2GÐ2\ÐK\ð	Fà  FÒ*Ð>¨ð	Fð ! IÒ-ÐDÐ2Dñ	ô €Mð €Jå0Ñ2Ô2ÐÝ4Ñ6Ô6Ðõ 	'Ø1Ø)Ø";Ø 7Ø5Ø%Ø-Ø-Ø)Ø";ð	ñ 	ô 	ñØ ØØØð ˜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Ðð $ÐØ—*’*˜UÑ#Ô#€KÝ�+�tÑ$Ô$ð D¨°{Ð)BÐ)BØ".°mÐ"CÐõ  ØØØ $Ø#ØØ'Ø&Ð:¨{¨?Ø,Ø(ÐDÐ,>ÐDÀ"Ý $ [Ð%FÐ4FÑ GÔ Gð
ñ 
ô 
õ &ØØ$Ø $Ø%ØØ)Ø(Ð>°Ð->Ø.Ø&0Ðd˜U˜UÈmÐ7cÐ7JÐ7JÐacØ *ð
ñ 
ô 
õ &ØØ$Ø %Ø%ØØ)Ø(Ð>°Ð->Ø.Ø&6Ðj˜U˜UÐTaÐ=iÐ=PÐ=PÐgiØ 0ð
ñ 
ô 
õ  ØØØ $Ø#ØØ'Ø&Ð:¨{¨?Ø,Ý'Ð(<Ñ=Ô=Ø 7ð
ñ 
ô 
õ  ØØ"Ø $Ø#ØØ'Ø&Ð:¨{¨?ð !Ý'Ð(<Ñ=Ô=Ø 7ð
ñ 
ô 
õ $ØØ&Ø $Ø'Ø!Ø+Ø*ÐB°?Ð/BØ0Ý+Ð,DÑEÔEØ 9ð
ñ 
ô 
õ "ØØ#Ø %Ø%ØØ)Ø,°Ò7ÐQÐ<QØ.Ø(8¸GÒ(CÐ(C˜W˜WÐIYÐIdÐ]dØ 0°GÒ ;ð
ñ 
ô 
ðYXð X€Hõt $ØØ+Ø)ØØ!ðñ ô ð s$   Á?!B! Â!B0Â/B0Ú>1[0 Û0&\Ü\)Úenabled_toolsetsrÀ   r4  úOptional[Iterable[str]]úset[str]c               ó  — t          | |¬¦  «        }|j        r|j        j        r|j        j        st	          ¦   «         S |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¦  «        }	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¦  «         |j        j
        sut!          ¦   «         sgt          ¦   «         sYt          d¦  «        sJt          d¦  «        s;|j        �4|j                             d¦  «        rd|d<   |                     d¦  «         d|v rD|j        j
        s8t          d¦  «        s)t          d¦  «        sd|	d<   |                     d¦  «         d|v rYt'          ¦   «         sK|                      d¦  «        }
t          |
t          ¦  «        si }
|
| d<   d|
d<   |                     d¦  «         d|v rxt'          ¦   «         sj|j                             d¦  «        rP|                      d¦  «        }t          |t          ¦  «        si }|| d<   d|d<   d|d<   |                     d¦  «         |S )Nr¿   rG   r    r#   r$   r%   rÒ   rÓ   rÐ   rÑ   r   rË   rÕ   r    rÃ   rÚ   rÛ   r   rÙ   r×   r   rÍ   r!   Tr,   r"   r   r   )r3  rN   rè   ré   rm   rL   r0   r.   r/   r    rB   r
   Úaddr#   r   r$   r¯   rÈ   r%   r   )r`   r4  rÀ   rM   Úselected_toolsetsÚchangedrð   rñ   rò   ró   Ú	image_cfgÚ	video_cfgs               r1   Úapply_nous_managed_defaultsr=  õ  sõ  € õ .¨fÀ+ÐNÑNÔN€HàÔðàÔ!Ô+ðð Ô!Ô7ðõ
 ‰uŒuˆØÔ$ð Ý‰uŒuˆåÐ,Ð2°Ñ3Ô3ÐÝ™œ€Gà�jŠj˜ÑÔ€GÝ�g�tÑ$Ô$ð  ØˆØˆˆu‰à�jŠj˜ÑÔ€GÝ�g�tÑ$Ô$ð  ØˆØˆˆu‰à�jŠj˜ÑÔ€GÝ�g�tÑ$Ô$ð  ØˆØˆˆu‰à—*’*˜YÑ'Ô'€KÝ�k¥4Ñ(Ô(ð (ØˆØ'ˆˆyÑàÐ!Ð!Ð!¨(¬,Ô*JÐ!ÝÐ(Ñ)Ô)ð "åÐ)Ñ*Ô*ð "õ Ð,Ñ-Ô-ð "õ Ð,Ñ-Ô-ð	 "ð )ˆ�	ÑØ�Š�EÑÔÐàÐ!Ð!Ð!¨(¬,Ô*JÐ!Ý$Ñ&Ô&ð "åÐ-Ñ.Ô.ð "ð 'ˆ�
ÑØ�Š�EÑÔÐð ŒLÔ,ðå,Ñ.Ô.ðõ )Ñ*Ô*ð	õ
 ˜^Ñ,Ô,ðõ Ð.Ñ/Ô/ðð Ô!Ð-ØÔ!×;Ò;¸NÑKÔKð .ð 'ˆ�
ÑØ�Š�EÑÔÐàÐ%Ð%Ð%¨hÔ.>Ô.RÐ%ÝÐ+Ñ,Ô,ð &åÐ.Ñ/Ô/ð &ð )6ˆÐ$Ñ%Ø�Š�IÑÔÐàÐ'Ð'Ð'Õ0EÑ0GÔ0GÐ'Ø—J’J˜{Ñ+Ô+ˆ	Ý˜)¥TÑ*Ô*ð 	,ØˆIØ"+ˆF�;ÑØ#'ˆ	�-Ñ Ø�Š�KÑ Ô Ð ð
 	Ð(Ð(Ð(Ý%Ñ'Ô'ð 	)àÔ!×;Ò;¸KÑHÔHð 	)ð —J’J˜{Ñ+Ô+ˆ	Ý˜)¥TÑ*Ô*ð 	,ØˆIØ"+ˆF�;ÑØ %ˆ	�*ÑØ#'ˆ	�-Ñ Ø�Š�KÑ Ô Ð à€Nr3   z Web search & extract (Firecrawl)zImage generation (FAL)zVideo generation (FAL)zText-to-speech (OpenAI TTS)zSpeech-to-text (OpenAI Whisper)z Browser automation (Browser Use)©r    r!   r"   r#   r$   r%   úDict[str, bool]c            
     ó
  — t          ¦   «         } t          t          d¦  «        p;t          d¦  «        p,t          d¦  «        pt          d¦  «        pt          d¦  «        ¦  «        | | t          t          ¦   «         pt          d¦  «        ¦  «        t          t          ¦   «         pt          d¦  «        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*   r
   r   )Ú
fal_directs    r1   Ú_get_gateway_direct_credentialsrB  s  s  € å&Ñ(Ô(€JåÝÐ-Ñ.Ô.ð ,ÝÐ0Ñ1Ô1ð,åÐ/Ñ0Ô0ð,õ Ð-Ñ.Ô.ð,õ ˜]Ñ+Ô+ñ
ô 
ð  ØÝÝ(Ñ*Ô*ð 3ÝÐ1Ñ2Ô2ñ
ô 
õ Ý(Ñ*Ô*ð 0Ý˜^Ñ,Ô,ð0åÐ.Ñ/Ô/ñ
ô 
õ
 ÝÐ/Ñ0Ô0ð bÝÐ3Ñ4Ô4Ð`½ÐG_Ñ9`Ô9`ñ
ô 
ð/ð ð r3   z!Firecrawl/Exa/Parallel/Tavily keyzFAL keyzOpenAI/ElevenLabs keyzOpenAI/Groq/Mistral keyzBrowser Use/Browserbase keyú&tuple[list[str], list[str], list[str]]c          
     ó„  — 	 t          |¬¦  «        }n# t          $ r g g g fcY S w xY w|r|j        r|j        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
¦  «        ¦  «        t          |                      d¦  «        ¦  «        t          |                      d¦  «        ¦  «        dœ}g }g }g }t          D ]Ž}	|                     t          |	         ¦  «        sŒ#|                     |	¦  «        r|                     |	¦  «         ŒN|                     |	¦  «        r|                     |	¦  «         Œy|                     |	¦  «         Œ�|||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.
    r¿   Nrc   rÃ   r@   rÄ   r    r!   r"   r#   r$   r%   r>  )r   rp   rè   ré   r   r0   r.   r/   r7   rd   rç   rB  r2   Ú_ALL_GATEWAY_KEYSrÈ   r&   Úappend)
r`   rÀ   rN   re   rä   Úopted_inÚunconfiguredrÜ   Úalready_managedr8   s
             r1   Úget_gateway_eligible_toolsrJ     sP  € ð"Ý3ÀÐLÑLÔLˆˆøÝð ð ð Ø�2�rˆzÐÐÐðøøøàð ˜\Ô3ð ¸Ô8Zð Ø�2�rˆzÐà€~Ý‘”Ð$ "ˆð —
’
˜7Ñ#Ô#€IÝ�i¥Ñ&Ô&ð ­#¨i¯mªm¸JÑ.GÔ.GÐ.MÈ2Ñ*NÔ*N×*TÒ*TÑ*VÔ*V×*\Ò*\Ñ*^Ô*^ÐbhÒ*hÐ*hØ�2�rˆzÐå,Ñ.Ô.€Fõ ˜VŸZšZ¨Ñ.Ô.Ñ/Ô/Ý" 6§:¢:¨kÑ#:Ô#:Ñ;Ô;Ý" 6§:¢:¨kÑ#:Ô#:Ñ;Ô;Ý˜VŸZšZ¨Ñ.Ô.Ñ/Ô/Ý˜VŸZšZ¨Ñ.Ô.Ñ/Ô/Ý  §¢¨IÑ!6Ô!6Ñ7Ô7ðð €Hð !€LØ€JØ!#€OÝ ð %ð %ˆð ×5Ò5Ý-¨cÔ2ñ
ô 
ð 	ð Ø�<Š<˜ÑÔð 	%Ø×"Ò" 3Ñ'Ô'Ð'Ð'Ø�ZŠZ˜‰_Œ_ð 	%Ø×Ò˜cÑ"Ô"Ð"Ð"à×Ò Ñ$Ô$Ð$Ð$Ø˜ _Ð4Ð4s   ‚ “%¤%Ú	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¦  «        }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 rd|d<   d|d<   |                     d¦  «         d|v rK|                      d¦  «        }t          |t          ¦  «        si }|| d<   d|d<   |                     d¦  «         d|v rP|                      d¦  «        }t          |t          ¦  «        si }|| d<   d|d
<   d|d<   |                     d¦  «         |S )zýApply 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    r#   r$   r%   r   rË   Tr,   r    rÃ   r   rÍ   r!   r"   r   )rm   r0   r.   r/   r8  )	r`   rK  r:  rð   rñ   rò   ró   r;  r<  s	            r1   Úapply_gateway_defaultsrN  ã  sX  € õ ™œ€Gà�jŠj˜ÑÔ€GÝ�g�tÑ$Ô$ð  ØˆØˆˆu‰à�jŠj˜ÑÔ€GÝ�g�tÑ$Ô$ð  ØˆØˆˆu‰à�jŠj˜ÑÔ€GÝ�g�tÑ$Ô$ð  ØˆØˆˆu‰à—*’*˜YÑ'Ô'€KÝ�k¥4Ñ(Ô(ð (ØˆØ'ˆˆyÑà�	ÐÐØ(ˆ�	ÑØ!%ˆ�ÑØ�Š�EÑÔÐà�	ÐÐØ&ˆ�
ÑØ!%ˆ�ÑØ�Š�EÑÔÐà�	ÐÐØ&ˆ�
ÑØ!%ˆ�ÑØ�Š�EÑÔÐà�IÐÐØ(5ˆÐ$Ñ%Ø%)ˆ�MÑ"Ø�Š�IÑÔÐà�iÐÐØ—J’J˜{Ñ+Ô+ˆ	Ý˜)¥TÑ*Ô*ð 	,ØˆIØ"+ˆF�;ÑØ#'ˆ	�-Ñ Ø�Š�KÑ Ô Ð à�iÐÐØ—J’J˜{Ñ+Ô+ˆ	Ý˜)¥TÑ*Ô*ð 	,ØˆIØ"+ˆF�;ÑØ %ˆ	�*ÑØ#'ˆ	�-Ñ Ø�Š�KÑ Ô Ð à€Nr3   c               óª  ‡— t          | |¬¦  «        \  }}}|s|st          ¦   «         S 	 ddlm} n# t          $ r t          ¦   «         cY S w xY w	 t          d¬¦  «        }n# t          $ r d}Y nw xY wt          |o|j        duo|j        duo|j        j	        ¦  «        }|rdnd}t          |¦  «        t          |¦  «        z   Šd	„ |D ¦   «         }	|	d
„ |D ¦   «         z  }	t          t          t          |¦  «        ¦  «        ¦  «        }
|rd}nd}	  |||	|
¦  «        }n1# t          t          t          t           f$ r t          ¦   «         cY S w xY wˆfd„|D ¦   «         }|st          ¦   «         S t#          | |¦  «        }|rSddlm}  || ¦  «         t)          |¦  «        D ]2}t*                               ||¦  «        }t/          d|› d|› �¦  «         Œ3|S )a<  If eligible tools exist, prompt the user (per tool) to enable the Tool
    Gateway.

    "Pool enabled" is the trigger: a user with a live free tool pool (or paid
    access) is shown a per-tool checklist of the covered managed backends and
    picks which to route through the gateway. The free pool funds web/image/
    tts/browser but not video, so the checklist only lists covered tools (the
    coverage filter lives in get_gateway_eligible_tools).

    Returns the set of tools that were enabled, or empty set if the user
    declined or no tools were eligible.
    r¿   r   )Úprompt_checklistFNTzfree tool poolzNous subscriptionc                ó(   — g | ]}t           |         ‘ŒS rG   )Ú_GATEWAY_TOOL_LABELS©Ú.0Úks     r1   ú
<listcomp>z.prompt_enable_tool_gateway.<locals>.<listcomp>[  s   € ÐGÐGÐG°QÕ-¨aÔ0ÐGÐGÐGr3   c                óH   — g | ]}t           |         › d t          |         › �‘Œ S )u    â€” keep using your )rR  Ú_GATEWAY_DIRECT_LABELSrS  s     r1   rV  z.prompt_enable_tool_gateway.<locals>.<listcomp>\  sB   € ð ð ð àõ   Ô"ÐTÐTÕ9OÐPQÔ9RÐTÐTðð ð r3   u6   Your free Nous tool pool â€” pick the tools to enable:uN   Your Nous subscription includes the Tool Gateway â€” pick the tools to enable:c                óZ   •— g | ]'}d |cxk    rt          ‰¦  «        k     ¯n n‰|         ‘Œ(S )r   )Úlen)rT  ÚiÚ
offer_keyss     €r1   rV  z.prompt_enable_tool_gateway.<locals>.<listcomp>o  sD   ø€ ÐQÐQÐQ Q¸¸QÐ8PÐ8PÒ8PÐ8PÅÀZÁÄÒ8PÐ8PÐ8PÐ8PÐ8P�:˜a”=Ð8PÐ8PÐ8Pr3   )Úsave_configu     âœ“ z: enabled via )rJ  rm   Úhermes_cli.setuprP  rp   r   r*   Úpaid_service_accessÚtool_accessÚenabledrn   ÚrangerZ  ÚKeyboardInterruptÚEOFErrorÚOSErrorÚ
SystemExitrN  Úhermes_cli.configr]  ÚsortedrR  r0   Úprint)r`   rÀ   rH  rÜ   rI  rP  rN   Ú	pool_onlyÚsource_labelÚlabelsÚpre_selectedÚtitleÚ
chosen_idxÚchosen_keysr:  r]  r8   r9   r\  s                     @r1   Úprompt_enable_tool_gatewayrq  ,  s¦  ø€ õ" 1KØØð1ñ 1ô 1Ñ-€L�*˜oð ð  
ð Ý‰uŒuˆðØ5Ð5Ð5Ð5Ð5Ð5Ð5øÝð ð ð Ý‰uŒuˆˆˆðøøøð
Ý3ÀÐFÑFÔFˆˆøÝð ð ð ØˆˆˆðøøøåØð 	-ØÔ,°DÐ8ð	-àÔ$¨DÐ0ð	-ð Ô$Ô,ñ	ô €Ið (1ÐIÐ#Ð#Ð6I€Lõ
 ! Ñ.Ô.µ°jÑ1AÔ1AÑA€JØGÐG¸,ÐGÑGÔG€FØ
ð ð àðñ ô ñ €Fõ ��c ,Ñ/Ô/Ñ0Ô0Ñ1Ô1€Làð 
ØHˆˆð(ð 	ð
Ø%Ð% e¨V°\ÑBÔBˆ
ˆ
øÝ�x­µ*Ð=ð ð ð Ý‰uŒuˆˆˆðøøøð RÐQÐQÐQ¨*ÐQÑQÔQ€KØð Ý‰uŒuˆå$ V¨[Ñ9Ô9€GØð @Ø1Ð1Ð1Ð1Ð1Ð1àˆ�FÑÔÐÝ˜'‘?”?ð 	@ð 	@ˆCÝ(×,Ò,¨S°#Ñ6Ô6ˆEÝÐ>˜5Ð>Ð>°Ð>Ð>Ñ?Ô?Ð?Ð?Ø€Ns3   ª1 ±AÁAÁA! Á!A0Á/A0ÄD Ä+EÅEzthe Nous Tool Gateway©Ú
capabilityÚcoverage_categoryrs  rt  úOptional[str]c                óˆ  ‡— dˆfd„}	 t          d¬¦  «        }n# t          $ r d}Y nw xY w ||¦  «        rdS |�|j        s6t          | ¬¦  «        sdS 	 t          d¬¦  «        }n# t          $ r d}Y nw xY w ||¦  «        rdS t	          || ‰¬	¦  «        }|r)|                     ¦   «         D ]}t          d
|› �¦  «         ŒdS )u;  Make sure the user is entitled to the Nous Tool Gateway, logging in if
    needed.

    Used by ``hermes tools`` when a user selects a Nous-managed Tool Gateway
    backend (e.g. "Firecrawl (Nous Portal)").  Unlike ``hermes model``'s Nous
    login, this:

    - does NOT change the inference provider (``model.provider`` is untouched),
    - does NOT run model selection, and
    - does NOT offer the bulk "enable for all tools" Tool Gateway prompt.

    It only performs the Nous Portal device-code OAuth (when the user isn't
    already logged in) and refreshes entitlement, so the caller can enable the
    single tool the user picked.

    Entitlement is satisfied by paid service access OR a live free tool pool.
    When ``coverage_category`` is given (e.g. ``"fal"`` for image gen), the pool
    must cover that category specifically â€” so a pool user selecting video
    (``"fal-video"``, not pool-funded) is correctly denied.

    Returns ``True`` when the account is entitled after the flow, ``False``
    otherwise (declined login, login failed, or no entitlement).
    r)   r*   c                óH   •— | €dS ‰�|                       ‰¦  «        S | j        S )NF)rÈ   ré   )Úaccountrt  s    €r1   Ú	_entitledz,ensure_nous_portal_access.<locals>._entitled   s1   ø€ Øˆ?Ø�5ØÐ(Ø×4Ò4Ð5FÑGÔGÐGØÔ,Ð,r3   Tr¿   N)rs  Frr  ú  ©r)   r*   )r   rp   rè   Ú_run_nous_portal_login_onlyr   Ú
splitlinesri  )rs  rt  ry  ÚinfoÚmessageÚlines    `    r1   Úensure_nous_portal_accessr�  ƒ  sG  ø€ ð:-ð -ð -ð -ð -ð -ðÝ+¸Ð=Ñ=Ô=ˆˆøÝð ð ð Øˆˆˆðøøøà€y��„ð Øˆtð €|˜4œ>€|Ý*°jÐAÑAÔAð 	Ø�5ð	Ý/¸DÐAÑAÔAˆDˆDøÝð 	ð 	ð 	ØˆDˆDˆDð	øøøð €y��„ð Øˆtõ
 5Ø˜Ð7Hðñ ô €Gð ð Ø×&Ò&Ñ(Ô(ð 	ð 	ˆDÝ�+�t�+�+ÑÔÐÐØˆ5s   ‰ š)¨)ÁA& Á&A5Á4A5c                óÊ  — 	 ddl m}m}m}m}m}m}m}m}m	}	 n*# t          $ r}
t          d|
› �¦  «         Y d}
~
dS d}
~
ww xY wt          ¦   «          t          d| › d�¦  «         	 t          d¦  «                             ¦   «                              ¦   «         }n&# t          t           f$ r t          ¦   «          Y dS w xY w|d	vrt          d
¦  «         dS 	  |¦   «         5   |¦   «                              d¦  «        }ddd¦  «         n# 1 swxY w Y   d} |¦   «         }|r^	 t          d¦  «                             ¦   «                              ¦   «         }n# t          t           f$ r d}Y nw xY w|d	v r |d¬¦  «        }|€
 |¦   «         } |¦   «         5   |¦   «         } ||d|¦  «         |r||d<   n|                     dd¦  «          ||¦  «         ddd¦  «         n# 1 swxY w Y    |	|¦  «          |¦   «          t          d¦  «         dS # t           $ r t          d¦  «         Y dS t&          $ r Y dS t          $ r}
t          d|
› �¦  «         Y d}
~
dS d}
~
ww xY w)zõRun the Nous Portal device-code OAuth and persist credentials only.

    No model selection, no provider switch, no Tool Gateway bulk prompt.
    Returns ``True`` on a successful login, ``False`` if the user declined or
    the flow failed.
    r   )	Ú_auth_store_lockÚ_load_auth_storeÚ_nous_device_code_loginÚ_read_shared_nous_stateÚ_save_auth_storeÚ_save_provider_stateÚ_sync_nous_pool_from_auth_storeÚ_try_import_shared_nous_stateÚ_write_shared_nous_statez%  Could not start Nous Portal login: NFrz  z requires a Nous Portal login.z$  Log in to Nous Portal now? [Y/n]: >   r@   ÚyÚyesz  Skipped Nous Portal login.Úactive_providerz=  Found existing Nous OAuth credentials. Import them? [Y/n]: rŒ  g      .@)Útimeout_secondsrÄ   z  Nous Portal login successful.Tz
  Login cancelled.z  Nous Portal login failed: )Úhermes_cli.authrƒ  r„  r…  r†  r‡  rˆ  r‰  rŠ  r‹  rp   ri  Úinputrd   rç   rd  rc  r0   Úpoprf  )rs  rƒ  r„  r…  r†  r‡  rˆ  r‰  rŠ  r‹  ÚexcÚproceedÚprior_active_providerÚ
auth_stateÚsharedÚ	do_importÚ
auth_stores                    r1   r|  r|  Ç  s)  € ðð
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
ð 
	
øõ ð ð ð ÝÐ;°cÐ;Ð;Ñ<Ô<Ð<Øˆuˆuˆuˆuˆuøøøøðøøøõ 
�G„G€GÝ	Ð
9ˆzÐ
9Ð
9Ð
9Ñ:Ô:Ð:ðÝÐ>Ñ?Ô?×EÒEÑGÔG×MÒMÑOÔOˆˆøÝÕ'Ð(ð ð ð Ý‰ŒˆØˆuˆuðøøøð Ð&Ð&Ð&ÝÐ,Ñ-Ô-Ð-Øˆuð-ð ÐÑÔð 	Nð 	NØ$4Ð$4Ñ$6Ô$6×$:Ò$:Ð;LÑ$MÔ$MÐ!ð	Nð 	Nð 	Nñ 	Nô 	Nð 	Nð 	Nð 	Nð 	Nð 	Nð 	Nøøøð 	Nð 	Nð 	Nð 	Nð ˆ
Ø(Ð(Ñ*Ô*ˆØð 	Qð Ý!ØSñô ç’%‘'”'Ÿ%š%™'œ'ð �	øõ Õ/Ð0ð  ð  ð  Ø�	�	�	ð øøøàÐ,Ð,Ð,Ø:Ð:È4ÐPÑPÔP�
àÐØ0Ð0Ñ2Ô2ˆJàÐÑÔð 		)ð 		)Ø)Ð)Ñ+Ô+ˆJØ Ð  ¨V°ZÑ@Ô@Ð@ð %ð 8Ø0E�
Ð,Ñ-Ð-à—’Ð0°$Ñ7Ô7Ð7ØÐ˜ZÑ(Ô(Ð(ð		)ð 		)ð 		)ñ 		)ô 		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)øøøð 		)ð 		)ð 		)ð 		)ð 	!Ð  Ñ,Ô,Ð,Ø'Ð'Ñ)Ô)Ð)ÝÐ/Ñ0Ô0Ð0ØˆtøÝð ð ð ÝÐ$Ñ%Ô%Ð%ØˆuˆuÝð ð ð ð ˆuˆuÝð ð ð ÝÐ2¨SÐ2Ð2Ñ3Ô3Ð3Øˆuˆuˆuˆuˆuøøøøðøøøsµ   ‚ ™
A £;»A Á%3B ÂB<Â;B<Ã
H ÃD	Ã=H Ä	DÄH ÄDÄH Ä#3E ÅH ÅE-Å*H Å,E-Å-)H ÆAG#ÇH Ç#G'Ç'H Ç*G'Ç+'H ÈI"È0	I"È<	I"ÉIÉI")r'   r(   r)   r*   )r`   ra   r)   ra   )r`   ra   rg   r7   r)   r*   r{  )rA   r7   r)   r7   )r°   r*   r±   r7   r²   r*   r³   r*   r´   r*   rµ   r*   r¶   r*   r·   r*   r¸   r*   r¹   r*   r)   rº   rÇ   )r`   rÁ   rÀ   r*   r)   rI   )r`   ra   r4  r5  rÀ   r*   r)   r6  )r)   r?  )r`   rÁ   rÀ   r*   r)   rC  )r`   ra   rK  rL  r)   r6  )r`   ra   rÀ   r*   r)   r6  )rs  r7   rt  ru  r)   r*   )rs  r7   r)   r*   )9Ú__doc__Ú
__future__r   Údataclassesr   Úpathlibr   Útypingr   r   r   r	   rg  r
   r   Úhermes_cli.nous_accountr   r   r   Útools.managed_tool_gatewayr   Úutilsr   Útools.tool_backend_helpersr   r   r   r   r   r   r   rl   r&   rF   r2   r6   rI   rf   ry   rŠ   r�   r›   r¦   r©   r¯   r¾   r3  r=  rR  rB  rX  rE  rJ  rN  rq  r�  r|  rG   r3   r1   ú<module>r£     sk  ðØ >Ð >Ð >à "Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð ð ð ð ð ð ð
 EÐ DÐ DÐ DÐ DÐ DØ !Ð !Ð !Ð !Ð !Ð !ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆ<ðÐ ð ØØØð ØØð
5ð 
5Ð !ð 
ð 
ð 
ñ 
ðFð Fð Fð Fð €�$ÐÑÔð
&ð 
&ð 
&ð 
&ð 
&ñ 
&ô 
&ñ Ôð
&ð €�$ÐÑÔð&%ð &%ð &%ð &%ð &%ñ &%ô &%ñ Ôð&%ðRð ð ð ð"ð "ð "ð "ðJð ð ð ðD!ð !ð !ð !ð6Yð Yð Yð Yð	Sð 	Sð 	Sð 	Sð`ð `ð `ð `ðð ð ð ð$I-ð I-ð I-ð I-ðZ +/ðTð ðTð Tð Tð Tð Tð Tðz 15Øð	mð mð mð mð mð mðj .Ø)Ø)Ø(Ø,Ø1ðð Ð ðð ð ð ðD /ØØØ"Ø$Ø,ðð Ð ð OÐ ð +/ð@5ð ð@5ð @5ð @5ð @5ð @5ð @5ðFFð Fð Fð FðX ðOð Oð Oð Oð Oð Oðr .Ø'+ðAð Að Að Að Að AðHOð Oð Oð Oð Oð Or3   