Ë
    âß²jÃ#  ã                  ó|  — U d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
ZddlmZ erddlZn G d„ d«      Z e«       ZdZd	Zd
ZdZdZdZdZdZeZdZdZdZeZdZdZdddœZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'd Z(d!Z)d"Z*d#Z+d$Z,d%Z-d&Z.d'Z/d(Z0d)Z1d*Z2	 dd+l3m4Z5 d-e5› �Z7dZ8d.Z9e9› d/�Z:d0Z;d1Z<e9› d2�Z=d3Z>d4Z?d5Z@dZAd6ZBd7ZCd8ZDd9ZEd:ZFdZGd;ZHd<ZId=ZJd>ZKd?j™                  d@«      ZMdAdBiZNdCeOdD<   dEZPdFZQdGZR G dH„ dIeS«      ZTdRdJ„ZU eUdK«      ZV eUdL«      ZW eUdM«      ZX eUdA«      ZY eUdN«      ZZ eUdO«      Z[ eUdP«      Z\dSdQ„Z]y# e6$ r d,Z5Y Œ¨w xY w)TzûShared constants, the lazy ``httpx`` proxy and :class:`AuthError` for the auth package.

Pure leaf: imports nothing from ``hermes_cli.auth`` so the per-provider modules
(``auth_nous``, ``auth_codex``, ...) can import it at module scope without cycles.é    )ÚannotationsN)ÚAnyÚCallableÚDictÚOptional)ÚTYPE_CHECKINGc                  ó0   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zy)	Ú
_LazyHttpx)Ú_modc                ó2   — t         j                  | dd «       y )Nr   )ÚobjectÚ__setattr__)Úselfs    ú>/home/ubuntu/.hermes/hermes-agent/hermes_cli/auth_constants.pyÚ__init__z_LazyHttpx.__init__   s   € Ü×Ñ˜t V¨TÕ2ó    c                óŽ   — t         j                  | d«      }|€,t        j                  d«      }t         j	                  | d|«       |S )Nr   Úhttpx)r   Ú__getattribute__Ú
_importlibÚimport_moduler   )r   Úmods     r   Ú_resolvez_LazyHttpx._resolve   s@   € Ü×)Ñ)¨$°Ó7ˆCØˆ{Ü ×.Ñ.¨wÓ7�Ü×"Ñ" 4¨°Ô5ØˆJr   c                ó6   — t        | j                  «       |«      S ©N)Úgetattrr   ©r   Únames     r   Ú__getattr__z_LazyHttpx.__getattr__"   s   € Ü˜4Ÿ=™=›?¨DÓ1Ð1r   c                ó:   — t        | j                  «       ||«       y r   )Úsetattrr   )r   r   Úvalues      r   r   z_LazyHttpx.__setattr__'   s   € Ü�D—M‘M“O T¨5Õ1r   c                ó8   — t        | j                  «       |«       y r   )Údelattrr   r   s     r   Ú__delattr__z_LazyHttpx.__delattr__*   s   € Ü�D—M‘M“O TÕ*r   N)ÚreturnÚNone)	Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r   r%   © r   r   r
   r
      s    „ Øˆ	ó	3ò	ò	2ò
	2ó	+r   r
   é   g      .@zhttps://portal.nousresearch.comz)https://inference-api.nousresearch.com/v1z'https://welcome-api.nousresearch.com/v1z
hermes-clizinference:invokezbilling:manageÚdevice_codeÚ
invoke_jwtéx   z,urn:ietf:params:oauth:grant-type:device_codez!application/x-www-form-urlencodedzapplication/json)zContent-TypeÚAcceptz%https://chatgpt.com/backend-api/codexzhttps://api.x.ai/v1z$78257093-7e40-4613-99e0-527b14b39113z!group_id profile model.completionz*urn:ietf:params:oauth:grant-type:user_codezhttps://api.minimax.iozhttps://api.minimaxi.comz https://api.minimax.io/anthropicz"https://api.minimaxi.com/anthropicé<   zhttps://portal.qwen.ai/v1zhttps://api.githubcopilot.comzacp://copilotzhttps://ollama.com/v1zhttps://api.actual.inc/v1zhttp://127.0.0.1:8080/v1z#https://api.stepfun.ai/step_plan/v1z$https://api.stepfun.com/step_plan/v1Úapp_EMoamEEZ73f0CkXaXp7hrannz#https://auth.openai.com/oauth/token)Ú__version__Úunknownzhermes-cli/zhttps://auth.x.aiz!/.well-known/openid-configurationz$b1a00492-073a-47ea-816f-4c329264a828z>openid profile email offline_access grok-cli:access api:accessz/oauth2/device/codei  Ú f0304373b74a44d2b584a3fb70ca9e56z(https://chat.qwen.ai/api/v1/oauth2/tokenzhttps://accounts.spotify.comzhttps://api.spotify.com/v1z'http://127.0.0.1:43827/spotify/callbackzFhttps://hermes-agent.nousresearch.com/docs/user-guide/features/spotifyz'https://developer.spotify.com/dashboardzhttps://openrouter.ai/authz&https://openrouter.ai/api/v1/auth/keysz5https://openrouter.ai/docs/guides/overview/auth/oauthz@https://hermes-agent.nousresearch.com/docs/guides/oauth-over-sshú )
zuser-modify-playback-statezuser-read-playback-statezuser-read-currently-playingzuser-read-recently-playedzplaylist-read-privatezplaylist-read-collaborativezplaylist-modify-publiczplaylist-modify-privatezuser-library-readzuser-library-modifyÚspotifyÚSpotifyzDict[str, str]ÚSERVICE_PROVIDER_NAMESzdummy-lm-api-keyzdummy-actual-local-api-keyÚcodex_rate_limitedc                  óL   ‡ — e Zd ZdZddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )Ú	AuthErrorz,Structured auth error with UX mapping hints.Ú NF)ÚproviderÚcodeÚrelogin_requiredÚretry_afterÚ	retryablec               ój   •— t         ‰| �  |«       || _        || _        || _        || _        || _        y r   )Úsuperr   r?   r@   rA   rB   rC   )r   Úmessager?   r@   rA   rB   rC   Ú	__class__s          €r   r   zAuthError.__init__�   s9   ø€ ô 	‰Ñ˜Ô!Ø ˆŒØˆŒ	Ø 0ˆÔð 'ˆÔØ"ˆ�r   )rF   Ústrr?   rH   r@   úOptional[str]rA   ÚboolrB   zOptional[float]rC   zOptional[bool]r&   r'   )r(   r)   r*   Ú__doc__r   Ú__classcell__)rG   s   @r   r=   r=   Š   sY   ø„ Ù6ð 02ÈÐhmØ'+Èñ#Øð#Ø),ð#Ø9Fð#Øaeð#à$ð#à8Fð#ð 
÷#ñ #r   r=   c                ó   ‡ — dddœdˆ fd„}|S )NF)Úreloginc               ó"   •— t        | ‰||¬«      S )N)r?   r@   rA   )r=   )rF   r@   rN   r?   s      €r   Úfactoryz(_provider_error_factory.<locals>.factory�   s   ø€ Ü˜¨8¸$ÐQXÔYÐYr   r   )rF   rH   r@   rI   rN   rJ   r&   r=   r,   )r?   rP   s   ` r   Ú_provider_error_factoryrQ   œ   s   ø€ ðZÈU÷ Zð €Nr   Únousz	xai-oauthzopenai-codexz
qwen-oauthzminimax-oauthÚ
openrouterc                ó†  — t        | t        «      r| j                  d«      dk7  ri S | j                  d«      d   }|ddt	        |«      dz  z
  dz  z  z  }	 t        j                  |j                  d«      «      }t        j                  |j                  d«      «      }t        |t        «      r|S i S # t        $ r i cY S w xY w)Nú.é   r-   ú=é   zutf-8)Ú
isinstancerH   ÚcountÚsplitÚlenÚbase64Úurlsafe_b64decodeÚencodeÚjsonÚloadsÚdecodeÚ	ExceptionÚdict)ÚtokenÚpayloadÚrawÚclaimss       r   Ú_decode_jwt_claimsri   ­   s·   € Ü�eœSÔ! U§[¡[°Ó%5¸Ò%:Øˆ	Ø�k‰k˜#Ó˜qÑ!€GØˆs�qœ3˜w›<¨!Ñ+Ñ+¨qÑ0Ñ1Ñ1€GðÜ×&Ñ& w§~¡~°gÓ'>Ó?ˆÜ—‘˜CŸJ™J wÓ/Ó0ˆô   ¬Ô-ˆ6Ð5°2Ð5øô ò ØŠ	ðús   ÁAB2 Â2C Â?C )r?   rH   r&   zCallable[..., AuthError])re   r   r&   zDict[str, Any])^rK   Ú
__future__r   r]   r`   Útypingr   r   r   r   Ú	importlibr   r   r   r
   ÚAUTH_STORE_VERSIONÚAUTH_LOCK_TIMEOUT_SECONDSÚDEFAULT_NOUS_PORTAL_URLÚDEFAULT_NOUS_INFERENCE_URLÚDEFAULT_NOUS_WELCOME_URLÚDEFAULT_NOUS_CLIENT_IDÚNOUS_INFERENCE_INVOKE_SCOPEÚNOUS_BILLING_MANAGE_SCOPEÚDEFAULT_NOUS_SCOPEÚNOUS_DEVICE_CODE_SOURCEÚNOUS_AUTH_PATH_INVOKE_JWTÚ!ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚNOUS_INVOKE_JWT_MIN_TTL_SECONDSÚ%DEVICE_AUTH_POLL_INTERVAL_CAP_SECONDSÚDEVICE_CODE_GRANT_TYPEÚ_FORM_JSON_HEADERSÚDEFAULT_CODEX_BASE_URLÚDEFAULT_XAI_OAUTH_BASE_URLÚMINIMAX_OAUTH_CLIENT_IDÚMINIMAX_OAUTH_SCOPEÚMINIMAX_OAUTH_GRANT_TYPEÚMINIMAX_OAUTH_GLOBAL_BASEÚMINIMAX_OAUTH_CN_BASEÚMINIMAX_OAUTH_GLOBAL_INFERENCEÚMINIMAX_OAUTH_CN_INFERENCEÚ"MINIMAX_OAUTH_REFRESH_SKEW_SECONDSÚDEFAULT_QWEN_BASE_URLÚDEFAULT_GITHUB_MODELS_BASE_URLÚDEFAULT_COPILOT_ACP_BASE_URLÚDEFAULT_OLLAMA_CLOUD_BASE_URLÚDEFAULT_ACTUAL_BASE_URLÚDEFAULT_ACTUAL_LOCAL_BASE_URLÚSTEPFUN_STEP_PLAN_INTL_BASE_URLÚSTEPFUN_STEP_PLAN_CN_BASE_URLÚCODEX_OAUTH_CLIENT_IDÚCODEX_OAUTH_TOKEN_URLÚ
hermes_clir4   Ú_HERMES_CLI_VERSIONrc   ÚCODEX_OAUTH_USER_AGENTÚ'CODEX_ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚXAI_OAUTH_ISSUERÚXAI_OAUTH_DISCOVERY_URLÚXAI_OAUTH_CLIENT_IDÚXAI_OAUTH_SCOPEÚXAI_OAUTH_DEVICE_CODE_URLÚ%XAI_ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚQWEN_OAUTH_CLIENT_IDÚQWEN_OAUTH_TOKEN_URLÚ&QWEN_ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚ!DEFAULT_SPOTIFY_ACCOUNTS_BASE_URLÚDEFAULT_SPOTIFY_API_BASE_URLÚDEFAULT_SPOTIFY_REDIRECT_URIÚSPOTIFY_DOCS_URLÚSPOTIFY_DASHBOARD_URLÚ)SPOTIFY_ACCESS_TOKEN_REFRESH_SKEW_SECONDSÚOPENROUTER_AUTH_URLÚOPENROUTER_AUTH_KEYS_URLÚOPENROUTER_OAUTH_DOCS_URLÚOAUTH_OVER_SSH_DOCS_URLÚjoinÚDEFAULT_SPOTIFY_SCOPEr:   Ú__annotations__ÚLMSTUDIO_NOAUTH_PLACEHOLDERÚACTUAL_LOCAL_NOAUTH_PLACEHOLDERÚCODEX_RATE_LIMITED_CODEÚRuntimeErrorr=   rQ   Ú	_nous_errÚ_xai_errÚ
_codex_errÚ_spotify_errÚ	_qwen_errÚ_minimax_errÚ_openrouter_errri   r,   r   r   ú<module>r¶      sz  ðòVõ
 #ã Û ß 0Ó 0ó
 Ý  áÜ÷+ñ +ñ0 ‹L€Eð Ð Ø Ð ð <Ð ØHÐ ð EÐ Ø%Ð Ø0Ð Ø,Ð Ø0Ð Ø'Ð Ø(Ð Ø$'Ð !Ø"CÐ Ø()Ð %ØGÐ Ø&IÐUgÑhÐ Ø@Ð Ø2Ð Ø@Ð Ø9Ð ØGÐ Ø4Ð Ø2Ð Ø!CÐ ØAÐ Ø%'Ð "Ø3Ð Ø!@Ð Ø.Ð Ø 7Ð Ø5Ð Ø :Ð Ø"GÐ Ø FÐ Ø6Ð Ø=Ð ð$Ý=ð 'Ð':Ð&;Ð<Ð Ø*-Ð 'Ø&Ð Ø-Ð.Ð.OÐPÐ Ø<Ð ØR€Ø/Ð0Ð0CÐDÐ ð )-Ð %Ø9Ð ØAÐ Ø),Ð &Ø$BÐ !Ø;Ð ØHÐ Ø[Ð ØAÐ Ø,/Ð )ð 3Ð ØCÐ ØSÐ à\Ð ØŸ™ð "ó Ð ð
 +4°YÐ)?Ð ˜Ó ?ð 1Ð Ø">Ð ð /Ð ô#�ô #ó$ñ $ FÓ+€	Ù" ;Ó/€Ù$ ^Ó4€
Ù& yÓ1€Ù# LÓ1€	Ù& Ó7€Ù)¨,Ó7€ô
6øðc ò $Ø#Òð$ús   ÂD1 Ä1D;Ä:D;