Ë
    áß²j+  ã                  ój   — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 dZ
dd„Ze
dœdd	„Zdd
„Zdd„Zy)a  Codex request identity helpers shared by agent client builders.

Leaf module with no dependency on the large auxiliary-client router, so a
long-lived process can import a newly added client builder without resolving a
new symbol from an older cached ``auxiliary_client`` module.
é    )ÚannotationsN)ÚAnyÚDict)Úurlparsez%https://chatgpt.com/backend-api/codexc                ó  — 	 t        | «      }|j                  j                  d«      }|j                  dk(  xr9 |j                  dk(  xr( |j
                  dv xr |dk(  xs |j                  d«      S # t        t        f$ r Y yw xY w)zAIdentify OpenAI's Codex endpoint without matching custom proxies.ú/Úhttpszchatgpt.com)Ni»  z/backend-api/codexz/backend-api/codex/F)	r   ÚpathÚrstripÚschemeÚhostnameÚportÚ
startswithÚ	TypeErrorÚ
ValueError)Úbase_urlÚparsedr
   s      ú8/home/ubuntu/.hermes/hermes-agent/agent/codex_headers.pyÚis_official_codex_base_urlr      s“   € ð
Ü˜(Ó#ˆØ�{‰{×!Ñ! #Ó&ˆà�M‰M˜WÑ$ò YØ—‘ =Ñ0òYà—‘˜{Ð*òYð Ð-Ñ-ÒW°·±ÐAVÓ1Wð		
øô ”zÐ"ò Ùðús   ‚A/A2 Á2BÂB©r   c               óx   — t        |«      rddlm} d|› �ddœ}ndddœ}|j                  t	        | «      «       |S )a^  Identity and account headers for chatgpt.com/backend-api/codex.

    OpenAI requires third-party harnesses to identify themselves: the official
    endpoint gets Hermes' originator and version, custom endpoints keep the
    codex_cli_rs compatibility identity. The account headers come from the
    OAuth JWT (see :func:`codex_account_headers`).
    r   )Ú__version__zHermesAgent/zhermes-agent)z
User-AgentÚ
originatorz!codex_cli_rs/0.0.0 (Hermes Agent)Úcodex_cli_rs)r   Ú
hermes_clir   ÚupdateÚcodex_account_headers)Úaccess_tokenr   r   Úheaderss       r   Úcodex_cloudflare_headersr    "   sB   € ô " (Ô+Ý*Ø#/°¨}Ð!=È^Ñ\‰à!DÐTbÑcˆØ‡N�NÔ(¨Ó6Ô7Ø€Nó    c                óV  — i }t        | t        «      r| j                  «       s|S 	 | j                  d«      }t	        |«      dk  r|S |d   dt	        |d   «       dz  z  z   }t        j                  t        j                  |«      «      j                  di «      }|j                  d«      }t        |t        «      r|r||d<   |j                  d	«      xs |j                  d
«      }t        |t        «      r#|j                  «       r|j                  «       |d<   |S # t        $ r Y |S w xY w)u  Workspace headers the Codex backend derives from the OAuth JWT.

    ``ChatGPT-Account-ID`` (canonical casing, from codex-rs ``auth.rs``) comes from
    ``chatgpt_account_id``; ``x-openai-internal-codex-residency`` from
    ``chatgpt_data_residency`` (fallback ``chatgpt_compute_residency``) â€” without
    it residency-enforced workspaces answer 401 "Workspace is not authorized in
    this region". A malformed token drops the headers rather than raising, so it
    surfaces as a 401 instead of a crash at client construction.
    ú.é   é   ú=é   zhttps://api.openai.com/authÚchatgpt_account_idzChatGPT-Account-IDÚchatgpt_data_residencyÚchatgpt_compute_residencyz!x-openai-internal-codex-residency)Ú
isinstanceÚstrÚstripÚsplitÚlenÚjsonÚloadsÚbase64Úurlsafe_b64decodeÚgetÚ	Exception)r   r   ÚpartsÚpayload_b64ÚauthÚacct_idÚ	residencys          r   r   r   3   s  € ð !€GÜ�l¤CÔ(°×0BÑ0BÔ0DØˆðØ×"Ñ" 3Ó'ˆÜˆu‹:˜Š>ØˆNØ˜A‘h ¬¨U°1©X«¨¸Ñ(:Ñ!;Ñ;ˆÜ�z‰zœ&×2Ñ2°;Ó?Ó@×DÑDÐEbÐdfÓgˆØ—(‘(Ð/Ó0ˆÜ�gœsÔ#©Ø,3ˆGÐ(Ñ)Ø—H‘HÐ5Ó6Ò_¸$¿(¹(ÐC^Ó:_ˆ	Ü�i¤Ô%¨)¯/©/Ô*;Ø;D¿?¹?Ó;LˆGÐ7Ñ8ð €Nøô ò ØØ€Nðús   ¦ D ÁCD Ä	D(Ä'D(c               ó>  — t        |«      syt        ||¬«      }|D �ch c]  }|j                  «       ’Œ }}| j                  d«      xs i }i |j	                  «       D ��ci c]$  \  }}t        |«      j                  «       |vsŒ"||“Œ& c}}¥|¥| d<   yc c}w c c}}w )zBKeep required Codex identity after user/provider header overrides.Nr   Údefault_headers)r   r    Úlowerr4   Úitemsr,   )Úclient_kwargsr   r   ÚrequiredÚnameÚrequired_namesÚexistingÚvalues           r   Úapply_required_codex_headersrE   Q   s�   € ä% hÔ/ØÜ'¨¸xÔH€HØ/7Ö8 t�d—j‘j•lÐ8€NÐ8Ø× Ñ Ð!2Ó3Ò9°r€Hð(Ø*2¯.©.Ó*:×
f™;˜4 ¼cÀ$»i¿o¹oÓ>OÐWeÒ>eˆ4�‰;Ó
fð(à
ð(€MÐ#Ò$ùò 9ùó gs   žBÁ #BÂB)r   r,   ÚreturnÚbool)r   r,   r   r,   rF   úDict[str, str])r   r,   rF   rH   )r?   zDict[str, Any]r   r,   r   r,   rF   ÚNone)Ú__doc__Ú
__future__r   r2   r0   Útypingr   r   Úurllib.parser   ÚCODEX_AUX_BASE_URLr   r    r   rE   © r!   r   ú<module>rP      s>   ðñõ #ã Û ß Ý !ð =Ð óð DVõ ó"ô<
r!   