§
    øžyjÅD  ã                  ó¦  — d Z ddlmZ ddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZ  ej        e¦  «        ZddlmZ dd	lmZ d
ZdZdZ e	d¬¦  «         G d„ d¦  «        ¦   «         Zd„ Zd=d„Zd>d„Zd?d„Zd@d„Zd@d „Zd@d!„Z dAd#„Z!dBd%„Z"	 	 dCdDd+„Z#	 	 dCdEd,„Z$d-Z%dBd.„Z&dBd/„Z'	 dFdGd0„Z(	 dFdHd2„Z)	 	 dCdId4„Z*d5Z+d6Z,d7Z-dAd8„Z.	 	 dCdJd<„Z/dS )KzIGeneric managed-tool gateway helpers for Nous-hosted vendor passthroughs.é    )ÚannotationsN)ÚdatetimeÚtimezone)Ú	dataclass)ÚCallableÚOptional)Úurlsplit©Úget_hermes_home)Úmanaged_nous_tools_enabledznousresearch.comÚhttpséx   T)Úfrozenc                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   dS )ÚManagedToolGatewayConfigÚstrÚvendorÚgateway_originÚnous_user_tokenÚboolÚmanaged_modeN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú@/home/ragecks/.hermes/hermes-agent/tools/managed_tool_gateway.pyr   r      s?   € € € € € € à€K€K�KØÐÐÑØÐÐÑØÐÐÑÐÐr   r   c                 ó$   — t          ¦   «         dz  S )zDReturn the Hermes auth store path, respecting HERMES_HOME overrides.z	auth.jsonr
   r   r   r   Úauth_json_pathr       s   € åÑÔ˜{Ñ*Ð*r   ÚreturnúOptional[dict]c                 óv  — 	 t          ¦   «         } |                      ¦   «         sd S t          j        |                      d¬¦  «        ¦  «        }|                     di ¦  «        }t          |t          ¦  «        sd S |                     di ¦  «        }t          |t          ¦  «        r|S n# t          $ r Y nw xY wd S )Nz	utf-8-sig)ÚencodingÚ	providersÚnous)	r    Úis_fileÚjsonÚloadsÚ	read_textÚgetÚ
isinstanceÚdictÚ	Exception)ÚpathÚdatar%   Únous_providers       r   Ú_read_nous_provider_stater2   $   sÃ   € ðÝÑÔˆØ�|Š|‰~Œ~ð 	Ø�4ÝŒz˜$Ÿ.š.°+˜.Ñ>Ô>Ñ?Ô?ˆØ—H’H˜[¨"Ñ-Ô-ˆ	Ý˜)¥TÑ*Ô*ð 	Ø�4Ø!Ÿš f¨bÑ1Ô1ˆÝ�m¥TÑ*Ô*ð 	!Ø Ð ð	!øåð ð ð Øˆðøøøàˆ4s   ‚"B) ¦AB) Á;,B) Â)
B6Â5B6ÚvalueÚobjectúOptional[datetime]c                óž  — t          | t          ¦  «        r|                      ¦   «         sd S |                      ¦   «         }|                     d¦  «        r|d d…         dz   }	 t	          j        |¦  «        }n# t          $ r Y d S w xY w|j        € |                     t          j
        ¬¦  «        }|                     t          j
        ¦  «        S )NÚZéÿÿÿÿz+00:00)Útzinfo)r,   r   ÚstripÚendswithr   ÚfromisoformatÚ
ValueErrorr9   Úreplacer   ÚutcÚ
astimezone)r3   Ú
normalizedÚparseds      r   Ú_parse_timestamprC   5   sÉ   € Ý�e�SÑ!Ô!ð ¨¯ª©¬ð ØˆtØ—’‘”€JØ×Ò˜3ÑÔð 0Ø   ”_ xÑ/ˆ
ðÝÔ'¨
Ñ3Ô3ˆˆøÝð ð ð Øˆtˆtðøøøà„}ÐØ—’¥x¤|�Ñ4Ô4ˆØ×Ò�Xœ\Ñ*Ô*Ð*s   Á#A8 Á8
BÂBÚ
expires_atÚskew_secondsÚintr   c                óÐ   — t          | ¦  «        }|€dS |t          j        t          j        ¦  «        z
                       ¦   «         }|t          dt          |¦  «        ¦  «        k    S )NTr   )rC   r   Únowr   r?   Útotal_secondsÚmaxrF   )rD   rE   ÚexpiresÚ	remainings       r   Ú_access_token_is_expiringrM   D   sX   € Ý˜zÑ*Ô*€GØ€ØˆtØ�8œ<­¬Ñ5Ô5Ñ5×DÒDÑFÔF€IØ�˜A�s <Ñ0Ô0Ñ1Ô1Ò1Ð1r   úOptional[str]c                 ó4  — 	 ddl m} m} 	  |d¦  «        }n# | $ r t          j        d¦  «        }Y nw xY wn$# t
          $ r t          j        d¦  «        }Y nw xY wt          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S dS )as  Read the TOOL_GATEWAY_USER_TOKEN env override through the secret scope.

    Availability scans run both inside agent turns (scope installed) and in
    unscoped CLI paths, so this uses the Slack pattern: honor the scope's
    verdict when installed (a scoped miss does NOT borrow the process env
    under multiplex), fall back to ``os.environ`` only when unscoped.
    r   )ÚUnscopedSecretErrorÚ
get_secretÚTOOL_GATEWAY_USER_TOKENN)	Úagent.secret_scoperP   rQ   ÚosÚgetenvr.   r,   r   r:   )rP   rQ   Úexplicits      r   Ú_read_user_token_overriderW   L   sÍ   € ð8ØFÐFÐFÐFÐFÐFÐFÐFð	<Ø!�zÐ";Ñ<Ô<ˆHˆHøØ"ð 	<ð 	<ð 	<Ý”yÐ!:Ñ;Ô;ˆHˆHˆHð	<øøøøøåð 8ð 8ð 8Ý”9Ð6Ñ7Ô7ˆˆˆð8øøøå�(�CÑ Ô ð   X§^¢^Ñ%5Ô%5ð  Ø�~Š~ÑÔÐØˆ4s'   ‚7 ‹ –7 —3°7 ²3³7 ·AÁAc                 óî   — t          ¦   «         } | r| S t          ¦   «         pi }|                     d¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S dS )aë  Cheap probe for a Nous gateway token without triggering refresh.

    Availability scans (`hermes tools`, banner/status paint, provider
    `is_available()` checks) must stay off the synchronous OAuth refresh path.
    This helper therefore only inspects the explicit env override and the
    cached auth-store token, without checking expiry and without making any
    network calls. Truthful refresh handling stays in request/session paths
    that call :func:`read_nous_access_token`.
    Úaccess_tokenN)rW   r2   r+   r,   r   r:   )rV   r1   rY   s      r   Úpeek_nous_access_tokenrZ   b   s{   € õ )Ñ*Ô*€HØð Øˆå-Ñ/Ô/Ð5°2€MØ ×$Ò$ ^Ñ4Ô4€LÝ�,¥Ñ$Ô$ð $¨×);Ò);Ñ)=Ô)=ð $Ø×!Ò!Ñ#Ô#Ð#Øˆ4r   c                 óÎ  — t          ¦   «         } | r| S t          ¦   «         pi }t          ¦   «         }|r*t          |                     d¦  «        t
          ¦  «        s|S 	 ddlm}  |t
          ¬¦  «        }t          |t          ¦  «        r(| 
                    ¦   «         r| 
                    ¦   «         S n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|S )zJRead a Nous Subscriber OAuth access token from auth store or env override.rD   r   )Úresolve_nous_access_token)Úrefresh_skew_secondsz$Nous access token refresh failed: %sN)rW   r2   rZ   rM   r+   Ú'_NOUS_ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚhermes_cli.authr\   r,   r   r:   r.   ÚloggerÚdebug)rV   r1   Úcached_tokenr\   Úrefreshed_tokenÚexcs         r   Úread_nous_access_tokenre   w   s&  € å(Ñ*Ô*€HØð ØˆÝ-Ñ/Ô/Ð5°2€MÝ)Ñ+Ô+€Làð Õ5Ø×Ò˜,Ñ'Ô'Ý/ñô ð ð Ðð	BØ=Ð=Ð=Ð=Ð=Ð=à3Ð3Ý!Hð
ñ 
ô 
ˆõ �o¥sÑ+Ô+ð 	+°×0EÒ0EÑ0GÔ0Gð 	+Ø"×(Ò(Ñ*Ô*Ð*øøÝð Bð Bð BÝ�ŠÐ;¸SÑAÔAÐAÐAÐAÐAÐAÐAøøøøðBøøøð Ðs   ÁAB3 Â3
C"Â=CÃC"r   c                 ó°   — t          j        dd¦  «                             ¦   «                              ¦   «         } | st          S | dv r| S t          d¦  «        ‚)z,Return configured shared gateway URL scheme.ÚTOOL_GATEWAY_SCHEMEÚ >   Úhttpr   z-TOOL_GATEWAY_SCHEME must be 'http' or 'https')rT   rU   r:   ÚlowerÚ_DEFAULT_TOOL_GATEWAY_SCHEMEr=   )Úschemes    r   Úget_tool_gateway_schemerm   “   sZ   € åŒYÐ,¨bÑ1Ô1×7Ò7Ñ9Ô9×?Ò?ÑAÔA€FØð ,Ý+Ð+àÐ"Ð"Ð"Øˆå
ÐDÑ
EÔ
EÐEr   r   c                óš  — |                       ¦   «                              dd¦  «        › d�}t          j        |d¦  «                             ¦   «                              d¦  «        }|r|S t          ¦   «         }t          j        dd¦  «                             ¦   «                              d¦  «        }|r
|› d| › d|› �S |› d| › dt          › �S )	z0Return the gateway origin for a specific vendor.Ú-Ú_Ú_GATEWAY_URLrh   ú/ÚTOOL_GATEWAY_DOMAINú://z	-gateway.)Úupperr>   rT   rU   r:   Úrstriprm   Ú_DEFAULT_TOOL_GATEWAY_DOMAIN)r   Ú
vendor_keyÚexplicit_vendor_urlÚshared_schemeÚshared_domains        r   Úbuild_vendor_gateway_urlr|   Ÿ   sÛ   € à—L’L‘N”N×*Ò*¨3°Ñ4Ô4ÐBÐBÐB€JÝœ) J°Ñ3Ô3×9Ò9Ñ;Ô;×BÒBÀ3ÑGÔGÐØð #Ø"Ð"å+Ñ-Ô-€MÝ”IÐ3°RÑ8Ô8×>Ò>Ñ@Ô@×FÒFÀsÑKÔK€MØð EØÐDÐD FÐDÐD°]ÐDÐDÐDàÐOÐO ÐOÐOÕ1MÐOÐOÐOr   Úgateway_builderúOptional[Callable[[str], str]]Útoken_readerú%Optional[Callable[[], Optional[str]]]ú"Optional[ManagedToolGatewayConfig]c                ó¢   — t          ¦   «         sdS |pt          }|pt          } || ¦  «        } |¦   «         }|r|sdS t          | ||d¬¦  «        S )z8Resolve shared managed-tool gateway config for a vendor.NT)r   r   r   r   )r   r|   re   r   )r   r}   r   Úresolved_gateway_builderÚresolved_token_readerr   r   s          r   Úresolve_managed_tool_gatewayr…   ®   s„   € õ &Ñ'Ô'ð Øˆtà.ÐJÕ2JÐØ(ÐBÕ,BÐà-Ð-¨fÑ5Ô5€NØ+Ð+Ñ-Ô-€OØð  ð Øˆtå#ØØ%Ø'Øð	ñ ô ð r   c                ó8   — t          | ||pt          ¬¦  «        duS )a|  Return True when gateway URL and a likely-usable Nous token are present.

    Defaults to :func:`peek_nous_access_token` so read-only availability scans
    avoid synchronous OAuth refresh. Callers that are about to make a real
    gateway request should use :func:`resolve_managed_tool_gateway` (which
    still defaults to the refresh-aware :func:`read_nous_access_token`).
    )r}   r   N)r…   rZ   )r   r}   r   s      r   Úis_managed_tool_gateway_readyr‡   Ç   s4   € õ (ØØ'Ø!Ð;Õ%;ðñ ô ð ð	ð r   Útoolc                ó   — d| › �S )zABase path for a managed vendor's REST routes on the gateway host.z/api/r   ©r   s    r   Úmanaged_vendor_base_pathr‹   î   s   € à�6ÐÐÐr   c                ó   — d| › �S )z=Media upload endpoint for a managed vendor, on the same host.z/api/uploads/r   rŠ   s    r   Úmanaged_vendor_upload_pathr�   ó   s   € à#˜6Ð#Ð#Ð#r   c                óÐ   — |pt           }	  |t          ¦  «                             d¦  «        }n# t          $ r Y dS w xY w|sdS ||› t	          | ¦  «        › �t          | ¦  «        dœS )uD  Absolute URLs for a managed vendor, or ``None`` when none resolves.

    Address resolution only: entitlement is deliberately not consulted here.
    What an account may spend on a managed vendor is the gateway's own
    decision, stated in its refusals, and re-deciding it on the client can only
    ever disagree with the server. A caller that wants to hide its tools from
    users who could not call them at all does that in its ``check_fn``.

    ``None`` means no origin could be resolved â€” a misconfigured
    ``TOOL_GATEWAY_SCHEME`` â€” so there is nothing to call.
    rr   N)ÚoriginÚbase_urlÚupload_path)r|   Ú_MANAGED_GATEWAY_VENDORrv   r=   r‹   r�   )r   r}   Úbuilderr�   s       r   Úmanaged_vendor_endpointsr”   ø   s™   € ð Ð9Õ!9€GðØ�Õ0Ñ1Ô1×8Ò8¸Ñ=Ô=ˆˆøÝð ð ð Øˆtˆtðøøøàð Øˆtð ØÐAÕ7¸Ñ?Ô?ÐAÐAÝ1°&Ñ9Ô9ðð ð s   ‹#/ ¯
=¼=Úurlc                óp  — t          | t          ¦  «        r|                      ¦   «         sdS |pt          }	 t	           |t
          ¦  «        ¦  «        }t	          |                      ¦   «         ¦  «        }n# t          $ r Y dS w xY wt          |j        ¦  «        o|j        |j	        f|j        |j	        fk    S )u  True when ``url`` is on the Nous tool-gateway origin this client builds.

    Anything granting a URL extra trust â€” our bearer, reading files off disk to
    upload â€” must gate on this rather than on a name, so an arbitrary URL can
    never inherit that trust.
    F)
r,   r   r:   r|   r	   r’   r=   r   rl   Únetloc)r•   r}   r“   ÚexpectedÚactuals        r   Úis_managed_nous_gateway_urlrš     s»   € õ �c�3ÑÔð  s§y¢y¡{¤{ð ØˆuàÐ9Õ!9€GðÝ˜G˜GÕ$;Ñ<Ô<Ñ=Ô=ˆÝ˜#Ÿ)š)™+œ+Ñ&Ô&ˆˆøÝð ð ð Øˆuˆuðøøøõ �”ÑÔÐg F¤M°6´=Ð#AÀhÄoÐW_ÔWfÐEgÒ#gÐgs   ¶>A5 Á5
BÂBr-   c                óB  — t          | |¦  «        si S |pt          }	  |¦   «         }n5# t          $ r(}t                               d| |¦  «         i cY d}~S d}~ww xY wt          |t          ¦  «        r|                     ¦   «         si S dd|                     ¦   «         › �iS )a‰  Live auth headers for a managed gateway URL, or ``{}`` when not managed.

    Read fresh on every call rather than cached: a Nous access token expires
    within the hour, and a long session would otherwise keep presenting a dead
    bearer. Returns ``{}`` rather than raising when no token is available, so a
    caller can report "sign in" instead of sending an unauthenticated request.
    z,Managed gateway token read failed for %s: %sNÚAuthorizationzBearer )rš   re   r.   r`   ra   r,   r   r:   )r•   r}   r   r„   Útokenrd   s         r   Úmanaged_gateway_auth_headersrž   -  sÅ   € õ ' s¨OÑ<Ô<ð Øˆ	à(ÐBÕ,BÐðØ%Ð%Ñ'Ô'ˆˆøÝð ð ð Ý�ŠÐCÀSÈ#ÑNÔNÐNØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøõ �e�SÑ!Ô!ð ¨¯ª©¬ð Øˆ	àÐ6 u§{¢{¡}¤}Ð6Ð6Ð7Ð7s   �
( ¨
A²AÁAÁAg      .@g      N@g     Àr@c                ó0  — 	 |                       ¦   «         }|                     di ¦  «                             d¦  «        }t          |t          ¦  «        r(|                     ¦   «         r|                     ¦   «         S n# t
          $ r Y nw xY wd| j        › d�S )a
  A model-actionable reason from a gateway refusal, or a generic one.

    The gateway's 4xx bodies carry deliberate guidance (rate-limit waits, size
    caps, "you could not submit anyway"), so surface `error.message` verbatim
    rather than a bare status code.
    ÚerrorÚmessagez%the gateway refused the upload (HTTP ú))r(   r+   r,   r   r:   r.   Ústatus_code)ÚresponseÚpayloadr¡   s      r   Ú_describe_media_upload_refusalr¦   ]  s™   € ðØ—-’-‘/”/ˆØ—+’+˜g rÑ*Ô*×.Ò.¨yÑ9Ô9ˆÝ�g�sÑ#Ô#ð 	#¨¯ª©¬ð 	#Ø—=’=‘?”?Ð"øøÝð ð ð ØˆðøøøàJ°8Ô3GÐJÐJÐJÐJs   ‚A9A= Á=
B
Â	B
Ú
server_urlr‘   úOptional[Callable]c                ó&  ‡ ‡‡‡— t          ‰ ‰¦  «        sdS t          |t          ¦  «        r|                     d¦  «        sdS t	          t          ‰ ¦  «                             ¦   «         ¦  «        }|j        › d|j        › �}|› |› �Šd
ˆˆˆ ˆfd	„}|S )u×  Async ``(data, mime) -> argument value`` uploader for one managed vendor.

    Returns ``None`` when there is no usable upload endpoint (not a managed
    Nous URL, or no ``upload_path``); callers then refuse local paths with a
    clear message instead of silently forwarding them.

    The three steps of the protocol:

    1. POST ``origin + upload_path`` with the declared content type and exact
       byte length, using the same live auth headers as the vendor calls.
       The gateway answers with a presigned single-object PUT URL (short
       expiry; type and length are signed into it) and an upload token.
    2. PUT the bytes to that URL. This goes directly to storage â€” never
       through the gateway â€” which is what removes the request-size ceiling.
    3. Return ``nous-upload:<token>`` for the tool argument. The token is
       bound to this Nous principal and is redeemable only through the
       gateway, so it is inert anywhere else it might end up.
    Nrr   rt   r0   ÚbytesÚmimer   r!   c           	   “  ó‚  •K  — dd l }ddlm} t          ‰‰‰¦  «        }|st	          d¦  «        ‚|                     t          ¦  «        }|                     |¬¦  «        4 ƒd {V —†}|                     ‰||t          | ¦  «        dœ¬¦  «        ƒ d {V —†}d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |j
        dk    rt	          t          |¦  «        ¦  «        ‚	 |                     ¦   «         }n# t          $ r d }Y nw xY wt          |t          ¦  «        r|                     d¦  «        nd }	t          |t          ¦  «        r|                     d	¦  «        nd }
t          |	t"          ¦  «        r|	rt          |
t"          ¦  «        r|
st	          d
¦  «        ‚|                     t          t$          t&          ¬¦  «        } ||¬¦  «        4 ƒd {V —†}|                     |	| d|i¬¦  «        ƒ d {V —†}d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   |j
        dk    rt	          d|j
        › d�¦  «        ‚d|
› �S )Nr   )Úcreate_ssrf_safe_async_clientz.no Nous credential is available for the upload)Útimeout)ÚcontentTypeÚcontentLength)Úheadersr(   éÈ   Ú	uploadUrlr�   z+the gateway's upload response was malformed)ÚreadÚwritezContent-Type)Úcontentr±   z!storage refused the upload (HTTP r¢   znous-upload:)ÚhttpxÚtools.url_safetyr­   rž   ÚRuntimeErrorÚTimeoutÚ%_MEDIA_UPLOAD_PRESIGN_TIMEOUT_SECONDSÚAsyncClientÚpostÚlenr£   r¦   r(   r.   r,   r-   r+   r   Ú&_MEDIA_UPLOAD_PUT_READ_TIMEOUT_SECONDSÚ'_MEDIA_UPLOAD_PUT_WRITE_TIMEOUT_SECONDSÚput)r0   r«   r·   r­   r±   Úpresign_timeoutÚclientÚpresignr¥   Ú
upload_urlr�   Úput_timeoutrÁ   r}   Úpresign_urlr§   r   s                €€€€r   Úuploadz,build_managed_media_uploader.<locals>.upload�  sÎ  øè è € ØˆˆˆàBÐBÐBÐBÐBÐBå.¨z¸?ÈLÑYÔYˆØð 	QÝÐOÑPÔPÐPð  Ÿ-š-Õ(MÑNÔNˆØ×$Ò$¨_Ð$Ñ=Ô=ð 	ð 	ð 	ð 	ð 	ð 	ð 	ÀØ"ŸKšKØØØ%)½CÀ¹I¼IÐFÐFð (ñ ô ð ð ð ð ð ð ˆGð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð Ô #Ò%Ð%ÝÕ=¸gÑFÔFÑGÔGÐGð	Ø—l’l‘n”nˆGˆGøÝð 	ð 	ð 	ØˆGˆGˆGð	øøøå1;¸GÅTÑ1JÔ1JÐT�W—[’[ Ñ-Ô-Ð-ÐPTˆ
Ý(2°7½DÑ(AÔ(AÐK�—’˜GÑ$Ô$Ð$ÀtˆÝ˜:¥sÑ+Ô+ð 	N°
ð 	N½zÈ%ÕQTÑ?UÔ?Uð 	NÐZ_ð 	NÝÐLÑMÔMÐMà—m’mÝ1Ý7Ý9ð $ñ 
ô 
ˆð
 1Ð0¸ÐEÑEÔEð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]Èð Ÿ
š
 :°tÀnÐVZÐE[˜
Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\ˆCð	]ð 	]ð 	]ñ 	]ô 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]ð 	]øøøð 	]ð 	]ð 	]ð 	]ð Œ?˜cÒ!Ð!ÝÐUÀ3Ä?ÐUÐUÐUÑVÔVÐVà%˜eÐ%Ð%Ð%s6   Á&/B'Â'
B1Â4B1Ã C5 Ã5DÄDÇ!HÈ
HÈH)r0   rª   r«   r   r!   r   )rš   r,   r   Ú
startswithr	   r:   rl   r—   )r§   r‘   r}   r   Úpartsr�   rÈ   rÇ   s   ` ``   @r   Úbuild_managed_media_uploaderrË   n  sÆ   øøøø€ õ0 ' z°?ÑCÔCð ØˆtÝ�k¥3Ñ'Ô'ð ¨{×/EÒ/EÀcÑ/JÔ/Jð Øˆtå•S˜‘_”_×*Ò*Ñ,Ô,Ñ-Ô-€EØ”Ð/Ð/ ¤Ð/Ð/€FØÐ*˜[Ð*Ð*€Kð2&ð 2&ð 2&ð 2&ð 2&ð 2&ð 2&ð 2&ð 2&ðh €Mr   )r!   r"   )r3   r4   r!   r5   )rD   r4   rE   rF   r!   r   )r!   rN   )r!   r   )r   r   r!   r   )NN)r   r   r}   r~   r   r€   r!   r�   )r   r   r}   r~   r   r€   r!   r   )N)r   r   r}   r~   r!   r"   )r•   r4   r}   r~   r!   r   )r•   r4   r}   r~   r   r€   r!   r-   )
r§   r4   r‘   r4   r}   r~   r   r€   r!   r¨   )0Ú__doc__Ú
__future__r   r(   ÚloggingrT   r   r   Údataclassesr   Útypingr   r   Úurllib.parser	   Ú	getLoggerr   r`   Úhermes_constantsr   Útools.tool_backend_helpersr   rw   rk   r^   r   r    r2   rC   rM   rW   rZ   re   rm   r|   r…   r‡   r’   r‹   r�   r”   rš   rž   r»   r¿   rÀ   r¦   rË   r   r   r   ú<module>rÕ      s  ðØ OÐ Oà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø !Ð !Ð !Ð !Ð !Ð !Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø !Ð !Ð !Ð !Ð !Ð !à	ˆÔ	˜8Ñ	$Ô	$€à ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø AÐ AÐ AÐ AÐ AÐ Aà1Ð Ø&Ð Ø*-Ð 'ð €�$ÐÑÔðð ð ð ð ñ ô ñ Ôðð+ð +ð +ð
ð ð ð ð"+ð +ð +ð +ð2ð 2ð 2ð 2ðð ð ð ð,ð ð ð ð*ð ð ð ð8	Fð 	Fð 	Fð 	FðPð Pð Pð Pð" 7;Ø:>ðð ð ð ð ð6 7;Ø:>ðð ð ð ð ðJ !Ð ðð ð ð ð
$ð $ð $ð $ð 7;ðð ð ð ð ð@ 7;ðhð hð hð hð hð2 7;Ø:>ð8ð 8ð 8ð 8ð 8ðR )-Ð %ð *.Ð &Ø*/Ð 'ðKð Kð Kð Kð( 7;Ø:>ð	Uð Uð Uð Uð Uð Uð Ur   