
    6j                       d Z ddlmZ ddlZddlZddlZddlZddlZddl	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mZmZmZmZmZmZmZmZmZ ddlmZ dd	l m!Z!m"Z"  ej#        e$          Z%d
dddd eD             ddddddd e& ej'        dg                     ddddddddd e& ej'        dg                     ddddd d!ddg d"d#d$d%d&gd'd(ddg d"d)	d*dd'ddg d"d+d,d-d.d/d e& ej'        d0g                     d1dd2d3d4d5d e& ej'        d6g                     d1dd7d8d9d:d e& ej'        d;g                     d1dd<d=d>d?d e& ej'        d@g                     d1ddAdBdCdDd e& ej'        dEg                     d1ddFdGdHdId e& ej'        dJg                     d1ddKdLdMdNd e& ej'        dOg           p ej'        dPg                     d1ddQZ(ddRddSd"dTdUdSd1dVdWdSgZ)dXZ*dd[Z+dd^Z,ddaZ-dddZ.ddhZ/ddjZ0dkZ1dlZ2dmZ3 G dn doej4        j5                  Z6ej4        7                     e6                      Z8de2fddtZ9ddvZ:ddwZ;ddxZ<dd{Z=dd}Z>ddZ?ddZ@ddZAddZBddZCddZDdS )z.Hermes Web UI -- first-run onboarding helpers.    )annotationsN)Path)urlparse)is_auth_enabled)DEFAULT_MODELDEFAULT_WORKSPACE_FALLBACK_MODELS_HERMES_FOUND_PROVIDER_DISPLAY_PROVIDER_MODELS_get_config_pathget_available_models
get_configload_settingsreload_configsave_settingsverify_hermes_imports)_write_env_file)get_last_workspaceload_workspaces
OpenRouterOPENROUTER_API_KEYzanthropic/claude-sonnet-4.6Fc                0    g | ]}|d          |d         dS )idlabelr   r    ).0models     $/root/hermes-webui/api/onboarding.py
<listcomp>r!   +   s5     
 
 
=B5;w88
 
 
    
easy_startT)r   env_vardefault_modelrequires_base_urlmodelscategoryquick	AnthropicANTHROPIC_API_KEYzclaude-sonnet-4.6	anthropiczClaude Code OAuth)r   r$   r%   r&   r'   r(   oauth_provideroauth_labelOpenAIOPENAI_API_KEYzgpt-4ozhttps://api.openai.com/v1openai)r   r$   r%   default_base_urlr&   r'   r(   OllamaOLLAMA_API_KEYz	qwen3:32bzhttp://localhost:11434/v1self_hosted)r   r$   r%   r2   r&   key_optionalr'   r(   z	LM Studio
LM_API_KEYLMSTUDIO_API_KEYzgpt-4o-minizhttp://localhost:1234/v1)	r   r$   env_var_aliasesr%   r2   r&   r6   r'   r(   zCustom OpenAI-compatible)r   r$   r%   r&   r6   r'   r(   zGoogle GeminiGOOGLE_API_KEYzgemini-3.1-pro-previewz7https://generativelanguage.googleapis.com/v1beta/openaigooglespecializedDeepSeekDEEPSEEK_API_KEYzdeepseek-v4-flashzhttps://api.deepseek.comdeepseekzXiaomi MiMoXIAOMI_API_KEYzmimo-v2.5-prozhttps://api.xiaomimimo.com/v1xiaomiu   Z.AI / GLM (智谱)GLM_API_KEYzglm-5.1z$https://open.bigmodel.cn/api/paas/v4zaiz
NVIDIA NIMNVIDIA_API_KEYz(nvidia/llama-3.3-nemotron-super-49b-v1.5z#https://integrate.api.nvidia.com/v1nvidiaMistralMISTRAL_API_KEYzmistral-large-latestzhttps://api.mistral.ai/v1	mistralaiz
xAI (Grok)XAI_API_KEYz	grok-4.20zhttps://api.x.ai/v1xaix-ai)
openrouterr,   r1   ollamalmstudiocustomgeminir?   rA   rC   rE   rH   rK   z
Easy start)r   r   orderzOpen / self-hosted   Specialized   zAdvanced provider flows such as Nous Portal and GitHub Copilot are still terminal-first. OpenAI Codex and Anthropic Claude Code can be authenticated in this onboarding flow when your Hermes config selects the corresponding provider.returnr   c                 p    	 ddl m}   |             S # t          $ r t          j                    dz  cY S w xY w)Nr   get_active_hermes_homez.hermes)api.profilesrX   ImportErrorr   homerW   s    r    _get_active_hermes_homer\      sZ    '777777%%''' ' ' 'y{{Y&&&&'s     55env_pathdict[str, str]c                   i }|                                  s|S 	 |                     d                                          D ]}|                                }|r|                    d          sd|vr2|                    dd          \  }}|                                                    d                              d          ||                                <   n# t          $ r i cY S w xY w|S )Nutf-8encoding#=rR   "')exists	read_text
splitlinesstrip
startswithsplit	Exception)r]   valuesrawlinekeyvalues         r    _load_env_filers      s   F?? %%w%77BBDD 	F 	FC99;;D 4??3// 3d??C++JC"'++--"5"5c":":"@"@"E"EF399;;	F    			Ms   CC C-,C-config_pathdictc                   	 dd l }n# t          $ r i cY S w xY w|                                 si S 	 |                    |                     d                    }t          |t                    r|ni S # t          $ r i cY S w xY w)Nr   r`   ra   )yamlrZ   rg   	safe_loadrh   
isinstanceru   rm   )rt   _yamlloadeds      r    _load_yaml_configr|      s       			  	!6!6!6!H!HII#FD119vvr9   			s    AA2 2B BconfigNonec                    	 dd l }n"# t          $ r}t          d          |d }~ww xY w| j                            dd           |                     |                    |dd          d           d S )	Nr   z.PyYAML is required to write Hermes config.yamlT)parentsexist_okF)	sort_keysallow_unicoder`   ra   )rw   rZ   RuntimeErrorparentmkdir
write_text	safe_dump)rt   r}   rz   excs       r    _save_yaml_configr      s    V V V VKLLRUUV TD999%tDD      s    
&!&providerstrr   c                    |pd                                 }|sdS | dv r4|                    | dz             r|                    dd          d         S |S )N >   r1   r,   /rR   )rj   rk   rl   )r   r   cleans      r    _normalize_model_for_providerr     se    [b!!E r***u/?/?3/O/O*{{3""1%%Lr"   base_urlc                T    | pd                                                     d          S )Nr   r   )rj   rstrip)r   s    r    _normalize_base_urlr     s&    N!!##**3///r"   )invalid_urldnsconnect_refusedtimeouthttp_4xxhttp_5xxparseunreachableg      @i   c                      e Zd ZdZd ZdS )_NoRedirectHandleruO  Refuse to follow HTTP redirects on the probe path.

    `urllib.request.urlopen` follows redirects by default — without this
    handler, a probe at `http://example.com/v1/models` could be redirected
    to `http://internal-service:8080/admin`, surfacing internal HTTP services
    to whatever the probe targets next.  The probe is already gated behind
    WebUI auth and the local-network check, so the threat model is
    "authenticated user enumerating internal services" — same as `curl`
    from their browser DevTools.  Disabling redirects tightens defaults
    without breaking any legitimate use case (a self-hosted /models endpoint
    that 3xx-redirects is itself misconfigured).  Redirects surface to the
    caller as `unreachable` (mapped from `HTTPError(3xx)` in the probe).
    Reviewer-flagged in PR #1501 (#1499 + #1500).
    c                    d S )Nr   )selfreqfpcodemsgheadersnewurls          r    redirect_requestz#_NoRedirectHandler.redirect_request6  s    tr"   N)__name__
__module____qualname____doc__r   r   r"   r    r   r   &  s-             r"   r   api_key
str | Noner   floatc                H
   t          |          }|sddddS t          |          }|j        dvrddddS |j        sddddS | d}d	d
d}|rd| |d<   t          j                            ||d          }	 t                              ||          5 }|j	        }	|
                    t          dz             }
ddd           n# 1 swxY w Y   n# t          j        j        $ r}d|j        cxk    rdk     r!n nd}d|j         d}d|||j        dcY d}~S d|j        cxk    rdk     rn ndnd}	 |
                    d                              dd                                          }n# t"          $ r d }Y nw xY wd|j         }|r)|                                d!         dd"         }| d#| }d|||j        dcY d}~S d}~wt          j        j        $ r}|j        }t+          |t,          j                  s#d$t1          |                                          v rdd%d&|d'd(dcY d}~S t+          |t,          j                  rdd)d*|j         d+dcY d}~S t+          |t6                    s#d,t1          |                                          v r,|j        p|j        d-k    rd.nd/}dd0d1|j         d2| dcY d}~S ddt1          |          dd"         dcY d}~S d}~wt:          t,          j        f$ r dd%d&|d'd(dcY S t"          $ rA}t<                              d3d45           ddt1          |          dd"         dcY d}~S d}~ww xY wtA          |
          t          k    rdd6d7t          d8z   d9dS 	 tC          j"        |
                    dd                    }n2# tF          tH          f$ r}dd6d:|j%        j&         d;dcY d}~S d}~ww xY wt+          |tN                    r1t+          |(                    d<          tR                    r	|d<         }nt+          |tR                    r|}ndd6d=dS g }|D ]}t+          |tN                    rW|(                    d>          rBt1          |d>                                                   }|r|*                    ||d?           nt+          |t0                    rP|                                r<|*                    |                                |                                d?           d4||	d@S )Au  Probe `<base_url>/models` for a self-hosted OpenAI-compatible provider.

    Used by the onboarding wizard to validate the user's configured base URL
    before persisting (#1499).  Distinguishes failure modes so the frontend
    can render a precise inline error instead of a generic "could not save."

    Returns one of:

      {"ok": True, "models": [{"id": "...", "label": "..."}, ...]}
      {"ok": False, "error": "<code>", "detail": "<human string>"}

    Where ``<code>`` is one of ``PROBE_ERROR_CODES``.

    The probe is a single HTTP GET — no retries.  The timeout is short by
    design: the wizard runs the probe synchronously on the user's submit
    click, and we'd rather report "timeout" quickly than block the UI for
    the kernel default ~75s.

    The probe response is NOT persisted.  This function returns model IDs
    so the wizard can populate its dropdown, but ``apply_onboarding_setup``
    only writes the user's typed selection — never auto-pinning a stale
    list of models to ``config.yaml``.

    SSRF: ``base_url`` is whatever the user typed in the onboarding form.
    The wizard is gated behind authentication (post-onboarding, the user
    has already authenticated to the WebUI), and the legitimate target is
    a local LM Studio / Ollama / vLLM server, so we deliberately do not
    block private-IP ranges — that would make the feature useless.  The
    risk surface is "authenticated user crafts a probe to enumerate
    internal HTTP services," which is a different threat model from
    unauthenticated SSRF.
    Fr   zbase_url is required)okerrordetail>   httphttps,base_url must start with http:// or https://zbase_url has no hostz/modelszapplication/jsonzhermes-webui-onboarding-probe)Acceptz
User-AgentzBearer AuthorizationGET)r   method)r   rR   Ni,  i  r   zHTTP uo    — endpoint returned a redirect (probe does not follow redirects).  Point base_url at the final URL directly.)r   r   r   statusi  r   r   i   r`   replace)errorsr   r      z: z	timed outr   zconnection timed out after gsr   zcould not resolve host 'rf   refusedr   44380r   zconnection refused at :z(probe_provider_endpoint unexpected errorTexc_infor   zresponse exceeded i   z KB capzresponse is not JSON ()datazKresponse is not in OpenAI /models shape (expected {'data': [...]} or [...])r   r   )r   r'   r   )+r   r   schemehostnameurllibrequestRequest_PROBE_OPENERopenr   readPROBE_MAX_BYTESr   	HTTPErrorr   decoderj   rm   ri   URLErrorreasonry   socketr   r   lowergaierrorConnectionRefusedErrorportTimeoutErrorloggerdebuglenjsonloads
ValueErrorUnicodeDecodeError	__class__r   ru   getlistappend)r   r   r   r   parsed	probe_urlr   r   respr   bodyr   r   r   err_body	err_firstr   	port_hintpayloadentriesr'   entrymids                          r    probe_provider_endpointr   =  s7   L #8,,H Wm?UVVVhF}---"D
 
 	

 ? Wm?UVVV $$$I %5 G  7#6W#6#6 
.
 
 GE
 
J
JC4OW55 	2[F99_q011D	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 <! R R R #(    S      D' ' ' ' 
  $&CHUUUUUUUU CH2222s22222zz
	xx~~,,WY,GGMMOOHH 	 	 	HHH	### 	. ++--a0#6I--)--FdfQQQQQQQQ<  R R Rffn-- 	kF@Q@Q@S@S1S1S)?i]d?i?i?i?ijjjjjjjjffo.. 	GV_GGG       
 f455 	c&kkFWFWFYFY9Y9YT'1I1ItI*P6?PPYPP       
 ms6{{4C4?PQQQQQQQQ&.) g g gi;eY`;e;e;e;efffff O O O?$OOOms3xx~NNNNNNNNO 4yy?""K?d+BKKK
 
 	

*T[[[CCDD*+ 
 
 
Hs}/EHHH
 
 	
 	
 	
 	
 	
 	

 '4   	
ZF0C0CT%J%J 	
&/	GT	"	" 
 c
 
 	
 F I IeT"" 	Iuyy 	IeDk""((**C 9S377888s## 	I 	IMMGGHHH&F;;;s   :C %C;C CC CC M(-G
MG
5<E21G
2F>G
 FAG
M
M"AK(0M6(K(M$AK(MK("M($M	M6MMM)N0 0OOOOcfgc                    |                      di           }t          |t                    rLt          |                     d          pd                                                                          }|r|S dS )Nr   r   r   )r   ry   ru   r   rj   r   )r   	model_cfgr   s      r    _extract_current_providerr     so    $$I)T"" y}}Z006B77==??EEGG 	O2r"   c                   |                      di           }t          |t                    r|                                S t          |t                    r6t          |                     d          pd                                          S dS )Nr   defaultr   )r   ry   r   rj   ru   r   r   s     r    _extract_current_modelr     sy    $$I)S!! !   )T"" ;9==++1r2288:::2r"   c                    |                      di           }t          |t                    r1t          t	          |                     d          pd                    S dS )Nr   r   r   )r   ry   ru   r   r   r   s     r    _extract_current_base_urlr     sT    $$I)T"" I"3y}}Z'@'@'FB#G#GHHH2r"   
env_valuesboolc                   | pd                                                                 } | sdS t                              | i                               d          }|r|                    |          rdS t                              | i                               dg           pg D ]}|r|                    |          r dS |                    di           }t	          |t
                    r8t          |                    d          pd                                           rdS |                    di           }t	          |t
                    r|                    | i           }t	          |t
                    r8t          |                    d          pd                                           rdS | d	k    rc|                    d	i           }t	          |t
                    r8t          |                    d          pd                                           rdS h d
}	| t          vrS| |	vrO	 ddlm}
  |
|           }t	          |t
                    r|                    d          rdS n# t          $ r Y nw xY wdS )Nr   Fr$   Tr9   r   r   	providersrO   >   nouscopilotr,   
qwen-oauthcopilot-acpopenai-codexr   )get_auth_status	logged_in)
rj   r   _SUPPORTED_PROVIDER_SETUPSr   ry   ru   r   hermes_cli.authr  rm   )r   r   r   r$   aliasr   providers_cfgprovider_cfg
custom_cfg_known_oauth_gasr   s               r    _provider_api_key_presentr    s    B%%''--//H u(,,Xr::>>yIIG :>>'** t ,//"==AABSUWXX^\^   	Z^^E** 	44$$I)T"" s9==+C+C+Ir'J'J'P'P'R'R tGGK,,M-&& $((266|T**	L$$Y//5266<<>>	 4x&**8R88J:t,,
y117R88>>@@ t a``L111hl6R6R	??????T(^^F&$'' FJJ{,C,C t 	 	 	D	 5s   .;I, ,
I98I9r   c                *   t          | t                    sdS | t          |                     d          t                    r|                     d          ni f}|D ]6t          t                    st          fddD                       r dS 7dS )z>Return True if an auth payload contains usable token material.Ftokensc              3     K   | ]:}t                              |          pd                                           V  ;dS )r   N)r   r   rj   )r   rq   	candidates     r    	<genexpr>z+_oauth_payload_has_token.<locals>.<genexpr>B  s\       
 
 	c""(b))//11
 
 
 
 
 
r"   )access_tokenrefresh_tokenr   T)ry   ru   r   any)r   token_fieldsr  s     @r    _oauth_payload_has_tokenr  6  s    gt$$ u 	!+GKK,A,A4!H!HPHbL "  	)T** 	 
 
 
 
C
 
 
 
 
 	 44		
 5r"   hermes_home'Path'c                n   | pd                                                                 } ddd                    | |           } | sdS h d}| |vrdS 	 ddl}|dz  }|                                sdS |                    |                    d	
                    }|                    d          }t          |t                    r&|                    |           }t          |          rdS |                    d          }t          |t                    r|                    |           }	t          |	t                    rg|	D ]d}
t          |
          r dS | dk    rJt          |
t                    r5|
                    d          dk    r|
                    d          dk    r dS edS # t          $ r Y dS w xY w)a[  Return True if the provider has valid OAuth credentials.

    Reads the profile-scoped auth.json directly so onboarding respects the
    requested Hermes home. Known OAuth providers may store auth either in the
    legacy providers[provider_id] singleton state or in credential_pool entries
    used by current Hermes runtime auth resolution.
    r   r,   )claudezclaude-codeF>   r  r  r,   r  r  r  r   Nz	auth.jsonr`   ra   r   Tcredential_pool	auth_typeoauthsourceclaude_code_linked)rj   r   r   r   rg   r   rh   ry   ru   r  r   rm   )r   r  _known_oauth_providers_j	auth_pathstoreproviders_storestate
pool_storer   r   s              r    _provider_oauth_authenticatedr+  K  s    B%%''--//H%kBBFFxQYZZH ujjj---u+-	!! 	5,,g,>>??))K00ot,, 	#''11E'.. tYY011
j$'' 	$ nnX..G'4(( 
$$ 	$ 	$E/66 $#tt K//&ud33 0!IIk22g==!IIh//3GGG#ttu   uus-   F& 0A7F& )A(F& AF& #F& &
F43F4
imports_okc                v   t          |           }t          |           }t          |           }t          t	                      dz            }t          |o|          }d}|r)t                              |i           }|t          v r|                    d          r(|                    d          rt          |          }nd}n|                    d          r!t          |ot          || |                    }nt          || |          }|sQ|                    d          r<t          t          |                    d                    t	                                }n-t          || |          pt          |t	                                }t          t          o|o|          }	t          r|sd}
d}n\|	r4d	}
t          j        ||r|                                nd
          }d| d}n&|r d}
|dk    r|sd}n|t          vrd| d}nd}nd}
d}|||	|
||pd |pd |pd t          t	                      dz            d	S )N.envFr6   r&   Tr-   agent_unavailablez~Hermes is not fully importable from the Web UI yet. Finish bootstrap or fix the agent install before provider setup will work.readyHermesz5Hermes is minimally configured and ready to chat via .provider_incompleterO   zfHermes has a saved provider/model selection but still needs the base URL and API key required to chat.z
Provider 'z' is configured but not yet authenticated. Run 'hermes auth' or 'hermes model' in a terminal to complete setup, then reload the Web UI.zYHermes has a saved provider/model selection but still needs the API key required to chat.needs_providerzZHermes is installed, but you still need to choose a provider and save working credentials.)	provider_configuredprovider_ready
chat_readysetup_stateprovider_notecurrent_providercurrent_modelcurrent_base_urlr]   )r   r   r   rs   r\   r   r  r   r  r+  r   r
   r   title)r   r,  r   r   r   r   r5  r6  metar7  r)  noteprovider_names                r    _status_from_runtimerA  ~  s   (--H"3''E(--H 7 9 9F BCCJx1E22N %)--h;;111 xx'' 88/00 *%)(^^NN%)NN
 88/00 Z%)  Q5hZPP& &NN
 &?xj%Y%YN% $((3C*D*D %BDHH%566779P9R9R& &N *(CDD V0;R;T;TUU 
 mE
E~FFJ !l
 !l#= 	 
 l)-(@hnn&&&
 
 X}WWW	 l%x9 D 7771X 1 1 1 D, D
 !k  3( $,$$,/11F:;;
 
 
r"   c                x  	
 t          |           pd}t          |           }t          |           }g }t                                          D ]\  }}|                    ||d         |d         |d         |                    d          pdt          |                    d                    t          |                    d                    t          |                    d	g                     |                    d
d          |                    dd          |                    d          pd|                    d          pdd           d t          D             
|
                    
fd           g }t          t          d           D ]3	|                    	d         	d         	fd|D             d           4|t          vot          |          pt          |t                                }||t          |||p.t                              |i                               dd          |ddS )NrL   r   r$   r%   r2   r   r&   r6   r'   r(   r#   r)   Fr-   r.   )r   r   r$   r%   r2   r&   r6   r'   r(   r)   r-   r.   c                ,    i | ]}|d          |d         S )r   rQ   r   )r   cs     r    
<dictcomp>z(_build_setup_catalog.<locals>.<dictcomp>  s"    CCC4!G*CCCr"   c                L                         | d         d          | d         fS )Nr(   c   r   )r   )p	cat_orders    r    <lambda>z&_build_setup_catalog.<locals>.<lambda>  s"    )--*r"B"BAgJ!O r"   )rq   c                    | d         S )NrQ   r   )rD  s    r    rJ  z&_build_setup_catalog.<locals>.<lambda>  s
    !G* r"   r   c                D    g | ]}|d          d         k    |d         S )r(   r   r   )r   rH  cats     r    r!   z(_build_setup_catalog.<locals>.<listcomp>  s/    SSSa*T8R8R!D'8R8R8Rr"   )r   r   r   )r   r   r   )r   
categoriesunsupported_notecurrent_is_oauthcurrent)r   r   r   r  itemsr   r   r   r   _PROVIDER_CATEGORIESsortsortedr+  r\   _UNSUPPORTED_PROVIDER_NOTE)r   r:  r;  r<  r   provider_idr>  rN  rP  rM  rI  s            @@r    _build_setup_catalogrX    s   055E*3//M055I7==?? 
 
T!g	?!%o!6$(HH-?$@$@$FB%)$((3F*G*G%H%H !%TXXn%=%= > >txx"5566 HHZ>>'511"&((+;"<"<"B#xx66<" 	
 	
 	
 	
* DC.BCCCINNOOOONPPP J*0D0DEEE  d)\SSSS9SSS
 
 	 	 	 	 	 ::UtDT?U?UT	&'79P9R9R	S	S 
  6,(" )--.>CCGG  )
 
  r"   c                 @   t                      } t                      }t                      \  }}}t          ||          }t	                      }t                      }t                      }t          j        	                    dd          
                                }	|	dv }
|
}t          t                                                                }t          t          |	                    d          t                     r,|	                    di           pi 	                    dd          nd          
                                                                }t%          |o|t&          v          }|oEt%          |	                    d                    p#|o!t%          |	                    d                    }|rY| 	                    d          sD	 t)          dd	i           d	| d<   n,# t*          $ r t,                              d
d	           Y nw xY wt%          | 	                    d                    p|p|| 	                    d          pt0          | 	                    d          pt          t2                    t5                      | 	                    d          pddt%          t6                    t%          |          ||t          t                                t          t                                                                d|t9          |          ||d|dS )NHERMES_WEBUI_SKIP_ONBOARDINGr   >   1yestruer   r   r7  r5  onboarding_completedTz&Failed to persist onboarding_completedr   r%   default_workspacebot_namer1  )r%   r_  password_enabledr`  )hermes_foundr,  missing_modulesimport_errorsrt   config_exists)rR  last)	completedsettingssystemsetup
workspacesr'   )r   r   r   rA  r   r   r   osenvironr   rj   r   r   rg   r   ry   ru   r   r   r  r   rm   r   r   r   r   r   r
   rX  )rh  r   r,  missingr   runtimerk  last_workspaceavailable_modelsskip_envskip_requestedauto_completedre  _current_provider_is_non_wizard_providerconfig_auto_completeds                   r    get_onboarding_statusrx    s    H
,,C"7"9"9J"3
33G ""J'))N+-- z~~<bAAGGIIH!55N#N )++,,3355M <FswwwGWGWY]<^<^ 	"			#((R888  eggeegg  #Q/7QQ  * W[[&&'' 	R#PW[[9N-O-O(P(P "  RX\\2H%I%I R	R148999/3H+,, 	R 	R 	RLLADLQQQQQ	R (,,'=>>??j>jUj%\\/::Km!).A!B!B "&$%% / 1 1 Z00<H
 
 !//z**&#/1122!"2"4"455<<>>
 
 
 &c**"
 
 #/  s   G$ $&HHr   c                   t           j                            dd                                          }|dv rt	          ddi           t                      S t          |                     d          pd                                                                          }t          |                     d          pd                                          }t          |                     d          pd                                          }t          t          |                     d	          pd                    }|t          vrt	          ddi           t                      S |st          d
          t          |         }|                    d          r8|st          d          t          |          }|j        dvrt          d          t                      }t          |                                          r|                     d          sddddS t!          |          }	t#                      dz  }
t%          |
          }|st'          ||	|          st)          |                    d                    o;t+          t          |                    d                    t#                                }|                    d          s|st          |d          d          |	                    di           }t-          |t.                    si }||d<   t1          ||          |d<   |                    d          r||d	<   n7|                    d          r|d         |d	<   n|                    d	d            ||	d<   t5          ||	           |rt7          |
|d         |i           	 ddlm}  |t#                                 n*# t<          $ r t>                               d           Y nw xY w|r|t           j        |d         <   	 ddl!m"}  |             n*# t<          $ r t>                               d           Y nw xY wtG                       t                      S )NrZ  r   >   r[  r\  r]  r^  Tr   r   r   r   zmodel is requiredr&   z)base_url is required for custom endpoints>   r   r   r   confirm_overwritere  z_Hermes is already configured (config.yaml exists). Pass confirm_overwrite=true to overwrite it.)r   messagerequires_confirmr.  r-   r6   r$   z is requiredr   r2   r   )_reload_dotenvzFailed to reload dotenv)reloadz"Failed to reload hermes_cli config)$rl  rm  r   rj   r   rx  r   r   r   r  r   r   r   r   r   rg   r|   r\   rs   r  r   r+  ry   ru   r   popr   r   rY   r}  rm   r   r   hermes_cli.configr~  r   )r   rr  r   r   r   r   provider_metar   rt   r   r]   r   oauth_readyr   r}  _cli_reloads                   r    apply_onboarding_setupr  |  s    z~~<bAAGGIIH'''-t4555$&&&488J''-2..4466<<>>H!!'R((..00E$((9%%+,,2244G"3txx
';';'Ar#B#BCCH111 	-t4555$&&& .,---.x8M,-- M 	JHIII(##= 111KLLL"$$K K!! 
$((3F*G*G 
$? !%
 
 	
 K
(
(C&((61H))J 
H4XsJOO 
H =,,-=>>?? 
Da!!"233446M6O6OE
 E
   00 	H 	Hi 8FFFGGG$$Ii&& 	$Ij85IIIi,-- ( (	*			-	.	. ( -.@ A	*j$'''CLk3''' G=#;W"EFFF0//////.001111 0 0 0./////0  7/6
=+,;;;;;;; ; ; ;9:::::; OOO """s$   .O $O32O3P $QQc                 @    t          ddi           t                      S )Nr^  T)r   rx  r   r"   r    complete_onboardingr    s"    )40111 """r"   )rU   r   )r]   r   rU   r^   )rt   r   rU   ru   )rt   r   r}   ru   rU   r~   )r   r   r   r   rU   r   )r   r   rU   r   )
r   r   r   r   r   r   r   r   rU   ru   )r   ru   rU   r   )r   r   r   ru   r   r^   rU   r   )r   ru   rU   r   )r   r   r  r  rU   r   )r   ru   r,  r   rU   ru   )r   ru   rU   ru   )rU   ru   )r   ru   rU   ru   )Er   
__future__r   r   loggingrl  r   urllib.errorr   urllib.requestpathlibr   urllib.parser   api.authr   
api.configr   r   r	   r
   r   r   r   r   r   r   r   r   r   api.providersr   api.workspacer   r   	getLoggerr   r   r   r   r  rS  rV  r\   rs   r|   r   r   r   PROBE_ERROR_CODESPROBE_TIMEOUT_SECONDSr   r   HTTPRedirectHandlerr   build_openerr   r   r   r   r   r  r  r+  rA  rX  rx  r  r  r   r"   r    <module>r     s   4 4 " " " " " "   				                ! ! ! ! ! ! $ $ $ $ $ $                              * ) ) ) ) ) = = = = = = = =		8	$	$ '6"
 
FV
 
 
 !
 
 &,"$+'+K<<== %*	 	 #!7"$+'+Hb99::   #$7! !     //&6!
 !/ 4 ,#&!
 !  !#1U" $+'+Hb99::!  %,6"$+'+J;;<<!  #(;"$+'+Hb99::!  ' "B"$+'+E26677!  #CA"$+'+Hb99::!  $/7"$+'+K<<==!	 	  $1" $+'+E266Z:N:J:NvWY:Z:Z[[!
 
_Z Z z ,;;#7!DD=1== B ' ' ' '   "   
 
 
 
   0 0 0 0	        ;   ( ++,>,>,@,@AA *	b< b< b< b< b<J         7 7 7 7v   *0 0 0 0f_ _ _ _D< < < <~Z Z Z Zzi# i# i# i#X# # # # # #r"   