+
    iHàj,H  ã                  óê  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RIHtHtHtHt ^ RIHtHtHtHtHtHt ^ RIHtHtHtHtH t H!t"H#t#H$t$H%t% ]PL                  ! ]'4      t(^t)]*]+]+]+3,          t,Rt-Rt.^t/R	t0R
 R lt1]! ]-]1R7      t2R]3R&   ]2Ph                  t5]2Pl                  t7]7Pp                  t9R6R R llt:]Pv                  R73]Px                  R83]Pz                  R93]P|                  R:33t?R R lt@RR/R R lltARR/R R lltBR R ltCR R ltDRR/R R  lltERR/R! R" lltFR#RR$R%R&R'R(R)RRR*RR+^ /R, R- lltGR. R/ ltHR;R0 R1 lltI ! R2 R3]4      tJR6R4 R5 lltK]KtLR# )<aK  Bitwarden Secrets Manager (`bws` CLI) integration.

Pulls API keys from BSM at startup so they need not live in ``~/.hermes/.env``.
``bws`` is auto-installed into the PM tool store (one pinned version,
SHA-256-verified against the published checksum). The one bootstrap secret is
the access token in ``.env``; every other key can live in BSM. One
``bws secret list <project_id>`` call per fetch, cached in-process and on disk
for ``cache_ttl_seconds``. Failures NEVER block startup. Subprocess-driven on
purpose: one cross-platform binary beats the ``bitwarden-sdk-secrets`` Rust wheel.
)ÚannotationsN)ÚPath)ÚDictÚListÚOptionalÚTuple)ÚCachedFetchÚSecretCacheÚatomic_write_jsonÚentry_from_payloadÚfingerprintÚresolve_cache_home)	Ú	ErrorKindÚFetchResultÚSecretSourceÚclassify_cli_errorÚcoerce_floatÚis_valid_env_nameÚget_source_environmentÚrun_cliÚsource_child_envzbws_cache.jsonzbws_cache.enc.jsons   hermes-bws-encrypted-cache-v1c               ó    € V ^8„  d   QhRRRR/# )é   Ú	cache_keyÚ	_CacheKeyÚreturnÚstr© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/agent/secret_sources/bitwarden.pyÚ__annotate__r    .   s   € ÷ ñ ˜ið ¨Cñ ó    c                ó$   € R P                  V 4      # )Ú|)Újoin)r   s   &r   Ú_cache_key_strr%   .   s   € Ø�8‰8�IÓÐr!   )Úkey_serializerzSecretCache[_CacheKey]Ú_STOREc               ó    € V ^8„  d   QhRRRR/# )r   Ú	home_pathúOptional[Path]r   r   r   )r   s   "r   r    r    9   s   € ÷ Oñ O¨.ð OÀDñ Or!   c                ó<   € \        V 4      R ,          \        ,          # )Úcache)r   Ú_ENCRYPTED_CACHE_BASENAME©r)   s   &r   Ú_encrypted_disk_cache_pathr/   9   s   € Ü˜iÓ(¨7Õ2Ô5NÕNÐNr!   c               ó    € V ^8„  d   QhRRRR/# )r   Úmessager   r   r   r   )r   s   "r   r    r    I   s   € ÷ 9ñ 9 ð 9¨ñ 9r!   c                ó"   € \        V \        4      # ©N)r   Ú_BWS_ERROR_RULES)r1   s   &r   Ú_classify_bws_errorr5   I   s   € Ü˜gÔ'7Ó8Ð8r!   Úinstall_if_missingFc               ó    € V ^8„  d   QhRRRR/# )r   r6   Úboolr   r*   r   )r   s   "r   r    r    P   s   € ÷ ñ  Dð °^ñ r!   c                ój  € \         P                  ! R4      ;p'       d   \        V4      # ^ RIpVP	                  R4      pVe   VP
                  # V '       d.    VP                  R4       VP	                  R4      P
                  # R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)zJExternal tools do not require PM platform support; acquire only on a miss.ÚbwsNzbws auto-install failed: %s)
ÚshutilÚwhichr   ÚpmÚinstalled_packageÚbinaryÚensureÚ	ExceptionÚloggerÚwarning)r6   Úsystemr=   ÚselectedÚexcs   $    r   Úfind_bwsrG   P   sš   € ä—’˜eÓ$Ð$€vÖ$Ü�F‹|ÐÛà×#Ñ# EÓ*€HØÒØ�‰Ðßð	?Ø�I‰I�eÔØ×'Ñ'¨Ó.×5Ñ5Ð5ñ øô ô 	?Ü�N‰NÐ8¸#×>Ð>Ùûð	?ús   Á+B ÂB2ÂB-Â-B2Úforcec               ó    € V ^8„  d   QhRRRR/# )r   rH   r8   r   r   r   )r   s   "r   r    r    b   s   € ÷ .ñ .˜$ð .¨4ñ .r!   c                óf   € ^ RI pVP                  RRR7       VP                  R4      P                  # )zJExplicit setup/repair; PM re-verifies even a warm entry (including force).Nr:   T)Úexplicit)r=   r@   r>   r?   )rH   r=   s   $ r   Úinstall_bwsrL   b   s,   € ãà‡I�Iˆe˜d€IÔ#Ø×Ñ Ó&×-Ñ-Ð-r!   c               ó    € V ^8„  d   QhRRRR/# )r   ÚrawÚbytesr   r   r   )r   s   "r   r    r    m   s   € ÷ 1ñ 1ˆuð 1˜ñ 1r!   c                óL   € \         P                  ! V 4      P                  R 4      # )Úascii)Úbase64Ú	b64encodeÚdecode)rN   s   &r   Ú_b64erU   m   s   € Ü×Ò˜CÓ ×'Ñ'¨Ó0Ð0r!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úaccess_tokenr   ÚsaltrO   r   r   )r   s   "r   r    r    q   s&   € ÷ 	Qñ 	Q¨cð 	Q¸ð 	QÀ5ñ 	Qr!   c                ó’   € ^ RI Hp ^ RIHp V! VP	                  4       ^ V\
        R7      P                  V P                  R4      4      # )z¡HKDF the local cache key from the bootstrap BWS token. cryptography is imported
lazily: eagerly mapping ``_rust.pyd`` on Windows blocks the updater replacing it.)Úhashes)ÚHKDF)Ú	algorithmÚlengthrX   Úinfoúutf-8)Úcryptography.hazmat.primitivesrZ   Ú'cryptography.hazmat.primitives.kdf.hkdfr[   ÚSHA256Ú_ENCRYPTED_CACHE_INFOÚderiveÚencode)rW   rX   rZ   r[   s   &&  r   Ú_derive_encrypted_cache_keyrf   q   s<   € õ
 6Ý<á˜&Ÿ-™-›/°"¸4Ü*ô,ß,2©F°<×3FÑ3FÀwÓ3OÓ,PðQr!   r)   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r   r   rW   r   ÚentryÚ_CachedFetchr)   r*   r   ÚNoner   )r   s   "r   r    r    }   s2   € ÷ ñ ¨ið Àsð ÐS_ð Ø+9ðØEIñr!   c                óF  €  ^ RI Hp \        P                  ! ^4      p\        P                  ! ^4      p\	        V 4      p\        W4      p\        P                  ! RVP                  RVP                  /RR7      P                  R4      p	V! V4      P                  WiVP                  R4      4      p
R\        RVR\        V4      R	\        V4      R
\        V
4      /p\        \        V4      V4       \         P"                  P%                  V4       R#   \&         d     R# i ; i)z¡Persist an AES-GCM encrypted last-good entry atomically (best-effort). The raw
token only derives the key; a successful write removes the legacy plaintext cache.©ÚAESGCMÚsecretsÚ
fetched_at)Ú
separatorsr_   ÚversionÚkeyrX   ÚnonceÚ
ciphertextN)Ú,Ú:)Ú+cryptography.hazmat.primitives.ciphers.aeadrm   ÚosÚurandomr%   rf   ÚjsonÚdumpsrn   ro   re   ÚencryptÚ_ENCRYPTED_CACHE_VERSIONrU   r
   r/   r'   ÚdiskÚclearrA   )r   rW   rh   r)   rm   rX   rs   Úserialized_keyrr   Ú	plaintextrt   Úpayloads   $$$$        r   Ú_write_encrypted_disk_cacherƒ   }   sð   € ðÝFä�zŠz˜"‹~ˆÜ—
’
˜2“ˆÜ'¨	Ó2ˆÜ)¨,Ó=ˆÜ—J’JØ˜Ÿ™ |°U×5EÑ5EÐFÐS]ô
ç
‰&�‹/ð 	ñ ˜C“[×(Ñ(¨¸>×;PÑ;PÐQXÓ;YÓZˆ
ØÔ6¸¸~Øœ5 ›;¨´°u³¸|ÌUÐS]ÓM^ð`ˆäÔ4°YÓ?ÀÔIÜ�‰×Ñ˜)Ö$øÜô Úðús   ‚DD ÄD ÄD c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r   r   rW   r   Úmax_age_secondsÚfloatr)   r*   r   úOptional[_CachedFetch]r   )r   s   "r   r    r    ”   s2   € ÷ ñ ¨Yð Àcð Ð\að Ø*8ðØDZñr!   c                ó   a€ V^ 8:  d   R#  ^ RI Hp \        P                  ! \	        V4      P                  RR7      4      o\        V 4      p\        S\        4      '       d1   SP                  R4      \        8w  g   SP                  R4      V8w  d   R# V3R lR	 4       w  rgp\        W4      p	\        \        P                  ! V! V	4      P                  WxVP                  R4      4      P                  R4      4      4      p
V
f   R# \         P                   ! 4       V
P"                  ,
          pV^ 8  g   W²8”  d   R# T
#   \$         d     R# i ; i)
zMDecrypted encrypted-cache entry if it matches ``cache_key`` and is in-window.Nrl   z	utf-8-sig)Úencodingrq   rr   c           	   3  ó¤   <"  € T FE  p\         P                  ! \        SP                  VR 4      4      P	                  R4      RR7      x € KG  	  R# 5i)Ú rQ   T)ÚvalidateN)rR   Ú	b64decoder   Úgetre   )Ú.0Úkr‚   s   & €r   Ú	<genexpr>Ú-_read_encrypted_disk_cache.<locals>.<genexpr>¢   sF   øé € ð #MÙ,K qô $*×#3Ò#3´C¸¿¹ÀAÀrÓ8JÓ4K×4RÑ4RÐSZÓ4[Ðfj×#kÑ#kÛ,Kùs   ƒAAr_   )rX   rs   rt   )rw   rm   rz   Úloadsr/   Ú	read_textr%   Ú
isinstanceÚdictrŽ   r}   rf   r   Údecryptre   rT   Útimero   rA   )r   rW   r…   r)   rm   r€   rX   rs   rt   rr   rh   Ú	entry_ager‚   s   $$$$        @r   Ú_read_encrypted_disk_cacherš   ”   s   ø€ ð ˜!ÔÙðÝFä—*’*Ô7¸	ÓB×LÑLÐVaÐLÓbÓcˆÜ'¨	Ó2ˆÜ˜7¤D×)Ò)Ø—;‘;˜yÓ)Ô-EÔEØ—;‘;˜uÓ%¨Ô7Ùô#MÙ,Kó#MÑˆ�Zä)¨,Ó=ˆÜ"¤4§:¢:Ù�3‹K×Ñ °>×3HÑ3HÈÓ3QÓR×YÑYÐZaÓbó$
ó ˆð Š=ÙÜ—I’I“K %×"2Ñ"2Õ2ˆ	Ø  1”}¨	Ô(CˆtÐNÈÐNøÜô Úðús%   ŒBD> ÂA1D> Ä4D> Ä<D> Ä>EÅEr?   Úcache_ttl_secondsé,  Ú	use_cacheTÚ
server_urlr‹   Úencrypted_cache_enabledÚ!encrypted_cache_max_stale_secondsc               ó@   € V ^8„  d   QhRRRRRRRRRR	R
RRRRR	RRRR/
# )r   rW   r   Ú
project_idr?   r*   r›   r†   r�   r8   rž   r)   rŸ   r    r   ú tuple[dict[str, str], list[str]]r   )r   s   "r   r    r    ³   sr   € ÷ Kñ KØðKØ&)ðKØ3AðKàðKà/3ðKàHKðKð ðKð @DðKð (-ð	Kð
 &ñKr!   c        	   
     ó®  a aaaa€ S '       g   \        R4      hV'       g   \        R4      h\        S 4      Y;'       g    R3oR V VV3R lloV'       dB   S^ 8”  d;   \        P                  SSSV'       d   VV3R lMRR7      p	V	e   V	P                  . 3# T;'       g    \        R	R
7      p
V
f   \        R4      h \        V
S W4      w  r¼\)        T\         P                   ! 4       R7      pT'       dW   S^ 8”  d   T\        P$                  S&   T'       d   \+        SS TSR7       Y¼3# \        P                  P-                  STSS4       Y¼3#   \          dý   pT'       dï   \        \        T4      4      \        P                  \        P                  39   d¸   R;rïT'       d   S! T4      pRpM3S^ 8”  d-   \        P                  P                  S\        R4      S4      pRpTek   \        R\         P                   ! 4       TP"                  ,
          4      pT\        P$                  S&   TP                  RT RT R\'        T4       R2.3u Rp?# h Rp?ii ; i)uQ  Pull the secrets for ``project_id`` from BSM â†’ ``(secrets, warnings)``.

``server_url``: region / self-hosted instance (empty = US Cloud). With
``encrypted_cache_enabled`` fresh entries are written AES-GCM encrypted and a
last-good entry may be served after NETWORK/TIMEOUT failures for up to
``encrypted_cache_max_stale_seconds`` â€” independent of the fresh TTL, so
``cache_ttl_seconds: 0`` can coexist with a break-glass offline cache.
Raises ``RuntimeError`` on fatal conditions (missing binary, auth failure,
unparseable output); env_loader catches, the setup wizard lets it propagate.
zBitwarden access token is emptyzBitwarden project_id is emptyr‹   c               ó    € V ^8„  d   QhRRRR/# )r   Úmax_ager†   r   r‡   r   )r   s   "r   r    Ú-fetch_bitwarden_secrets.<locals>.__annotate__Ê   s   € ÷ Xñ X ð XÐ+Añ Xr!   c                ó"   <€ \        SSV SR 7      # ))r   rW   r…   r)   )rš   )r¦   rW   r   r)   s   &€€€r   Ú_read_encryptedÚ0fetch_bitwarden_secrets.<locals>._read_encryptedÊ   s   ø€ Ü)°IÈLØ:AÈYôXð 	Xr!   c                 ó   <€ S ! S4      # r3   r   )r©   r›   s   €€r   Ú<lambda>Ú)fetch_bitwarden_secrets.<locals>.<lambda>Ò   s   ø€ ™Ð/@ÔAr!   N)Ú	read_diskT©r6   uº   bws binary not available â€” auto-install failed and `bws` is not on PATH.  Install manually from https://github.com/bitwarden/sdk-sm/releases or re-run `hermes secrets bitwarden setup`.zstale ENCRYPTED disk cacheÚinfzstale disk cacheç        zbws live fetch failed (z); falling back to z (zs old))rn   ro   )r   rW   rh   r)   )ÚRuntimeErrorÚ_token_fingerprintr'   Úlookuprn   rG   Ú_run_bws_listr5   r   r   ÚNETWORKÚTIMEOUTr~   Úreadr†   Úmaxr˜   ro   ÚmemoryÚintri   rƒ   Úwrite)rW   r¢   r?   r›   r�   rž   r)   rŸ   r    Úcachedr:   rn   ÚwarningsrF   ÚstaleÚlabelÚagerh   r©   r   s   d$$d$$d$$         @@r   Úfetch_bitwarden_secretsrÂ   ³   s(  ü€ ÷  ÜÐ<Ó=Ð=ßÜÐ:Ó;Ð;ä# LÓ1°:×?OÐ?OÈRÐP€I÷Xò X÷ Ð&¨Ô*ä—‘ØÐ(¨)ßF]ÖAÐcgð ó 
ˆð ÒØ—>‘> 2Ð%Ð%à
×
5Ð
5”H°Ô5€CØ
‚{Üð ?ó @ð 	@ð
Ü)¨#¨|¸ZÓTÑˆô,  ´T·Y²Y³[ÔA€EßØ˜qÔ Ø',ŒF�M‰M˜)Ñ$ß"Ü'°)È,Ø.3¸yõJð ÐÐô �K‰K×Ñ˜i¨Ð0AÀ9ÔMØÐÐøô= ô ÷ Ô,¬S°«XÓ6¼9×;LÑ;LÌi×N_ÑN_Ð:`Ô`Ø Ð ˆEß&Ù'Ð(IÓJ�Ø4‘Ø" QÔ&ÜŸ™×(Ñ(¨´E¸%³LÀ)ÓL�Ø*�ØÒ Ü˜#œtŸyšy›{¨U×-=Ñ-=Õ=Ó>�Ø+0”—‘˜iÑ(Ø—}‘}Ø-¨c¨UÐ2EÀeÀWÈBÌsÐSVËxÈjÐX^Ð_ð'ð õ ð 	ûð)ús%   Â=E ÅIÅC0IÉIÉIÉIc               ó    € V ^8„  d   QhRRRR/# )r   rN   r   r   r   )r   s   "r   r    r      s   € ÷ 1ñ 1˜sð 1 sñ 1r!   c                ót  € V P                  RR4      P                  4       p. pVP                  4        Fh  pVP                  4       pVP                  R4      '       d    M@VR9  g   K5  \        P
                  ! RRV4      ;p'       g   KW  VP                  V4       Kj  	  V'       d   RP                  V4      # T# )z˜Reduce a bws (color-eyre) error dump to its numbered cause lines joined with
``; `` (dropping ``Location:``/``Backtrace`` on); raw text if unrecognized.Úr‹   z^\d+:\s*z; )z	Location:zBacktrace omittedz	Run with )r‹   zError:)ÚreplaceÚstripÚ
splitlinesÚ
startswithÚreÚsubÚappendr$   )rN   ÚtextÚcausesÚlineÚstrippedÚcauses   &     r   Ú_summarize_bws_stderrrÒ     sš   € ð �;‰;�v˜rÓ"×(Ñ(Ó*€DØ€FØ—‘Ö!ˆØ—:‘:“<ˆØ×ÑÐN×OÒOÙØ˜>Ö)¼¿º¸{ÈBÐPXÓ8YÐ/Y¨u×/YÐ/YØ�M‰M˜%Ö ñ "÷ !'ˆ4�9‰9�VÓÐ0¨DÐ0r!   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r:   r   rW   r   r¢   rž   r   r£   r   )r   s   "r   r    r      s0   € ÷ %ñ %�tð %¨3ð %¸Cð %ÈSð %ÐZzñ %r!   c           	     ó  € \        V 4      R RVRR.p\        4       pWR&   VP                  RR4       V'       d   W5R&   \        WE\        RR	\         R
2R7      pVP
                  ^ 8w  dV   \        VP                  ;'       g    VP                  ;'       g    R4      p\        RVP
                   RVR,           24      hVP                  P                  4       pV'       g   / R.3#  \        P                  ! V4      p	\        T	\        4      '       g"   \        R\!        T	4      P"                   24      h/ p. pT	 Fš  p\        T\$        4      '       d#   TP'                  R4      TP'                  R4      3MRw  rï\        T\         4      '       d   \        T\         4      '       g   Km  \)        T4      '       d   YûT&   K„  TP+                  RT: R24       Kœ  	  Y¼3#   \        P                   d   p
\        RT
 24      T
hRp
?
ii ; i)ÚsecretÚlistz--outputrz   ÚBWS_ACCESS_TOKENÚNO_COLORÚ1ÚBWS_SERVER_URLr:   zbws timed out after zs fetching secrets)ÚenvÚtimeoutrÀ   Útimeout_messager‹   zbws exited z: :NéÈ   Nz'bws returned no output (empty project?)zbws returned non-JSON output: Nzbws returned unexpected shape: rr   ÚvaluezSkipping secret z: not a valid env-var name)NN)r   r   Ú
setdefaultr   Ú_BWS_RUN_TIMEOUTÚ
returncoderÒ   ÚstderrÚstdoutr²   rÇ   rz   r“   ÚJSONDecodeErrorr•   rÖ   ÚtypeÚ__name__r–   rŽ   Ú_is_valid_env_namerÌ   )r:   rW   r¢   rž   ÚcmdrÛ   ÚprocÚerrrN   r‚   rF   rn   r¾   Úitemrr   rß   s   &&&&            r   rµ   rµ     sÚ  € Üˆs‹8�X˜v z°:¸vÐ
F€Cô Ó
€CØ*ÐÑØ‡N�N�:˜sÔ#ßØ *ÐÑä�3Ô)9ÀØ%9Ô:JÐ9KÐK]Ð#^ô`€Dð ‡�˜!ÔÜ# D§K¡K×$DÐ$D°4·;±;×$DÐ$DÀ"ÓEˆÜ˜[¨¯©Ð(9¸¸CÀ½I¸;ÐGÓHÐHà
�+‰+×
Ñ
Ó
€CßØÐ=Ð>Ð>Ð>ðLÜ—*’*˜S“/ˆô �gœt×$Ò$ÜÐ<¼TÀ'»]×=SÑ=SÐ<TÐUÓVÐVà €GØ€HÛˆÜ=GÈÌd×=SÒ=S�d—h‘h˜u“o t§x¡x°Ó'8Ñ9ÐYe‰
ˆÜ˜#œs×#Ò#¬:°e¼S×+AÒ+AÙÜ˜c×"Ò"Ø �C‹Là�O‰OÐ.¨s©gÐ5OÐPÖQñ ð ÐÐøô ×Ñô LÜÐ;¸C¸5ÐAÓBÈÐKûðLús   Ã'G ÇHÇ0G?Ç?Hc                  ó†   € ] tR tRtRtRtRtRtRtRt	Rt
R	tR
t]P                  ]]P                  ]/tR R ltR R ltRtR# )ÚBitwardenSourcei7  zˆBitwarden Secrets Manager as a registered **bulk** source (injects every
secret in the project, so explicit mapped bindings outrank it).Ú	bitwardenzBitwarden Secrets ManagerÚbulkr:   Úaccess_token_envr×   Tuò   Run `hermes secrets bitwarden token` to paste a fresh access token (create one in the Bitwarden web app: Secrets Manager â†’ Machine accounts â†’ Access tokens).  Wrong region?  Re-run `hermes secrets bitwarden setup` and pick EU/self-hosted.c               ó   € V ^8„  d   QhRR/# )r   r   r–   r   )r   s   "r   r    ÚBitwardenSource.__annotate__L  s   € ÷ 
ñ 
˜tñ 
r!   c                	ón   € R RRRR/RRRRR/RRR	RR
/RRRRR/RRRRR RR^ //RRRRR/RRRRR/RRRRR
//# )ÚenabledÚdescriptionzMaster switchÚdefaultFrñ   z0Env var holding the machine-account access tokenr×   r¢   zBSM project UUIDr‹   r›   z9Fresh disk+memory cache TTL; 0 disables fresh-cache reuserœ   Úencrypted_cachez6Encrypted last-good cache for network/timeout fallbackÚmax_stale_secondsÚoverride_existingz&BSM values overwrite .env/shell valuesTÚauto_installz#Auto-download the pinned bws binaryrž   z0Region / self-hosted endpoint (empty = US Cloud)r   )Úselfs   &r   Úconfig_schemaÚBitwardenSource.config_schemaL  s    € à˜ ¸	À5ÐIØ Ð0bØ!*Ð,>ð!@à˜=Ð*<¸iÈÐLØ -Ð1lØ"+¨Sð"2à Ð/gØ )¨I°uÐ>QÐSTÐ+Uð Wà -Ð1YÐ[dÐfjÐ!kØ˜]Ð,QÐS\Ð^bÐcØ˜=Ð*\Ð^gÐikÐlð
ð 	
r!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úcfgr–   r)   r   r   r   r   )r   s   "r   r    ró   [  s!   € ÷ (ñ (˜ð (¨$ð (°;ñ (r!   c                	ó  € \        V\        4      '       d   TM/ p\        4       pV P                  V4      p\	        4       P                  VR 4      P                  4       pV'       g%   VP                  RV R2\        P                  4      # \        VP                  R4      ;'       g    R 4      pV'       g!   VP                  R\        P                  4      # \        \        VP                  RR4      4      R7      pWsn        Vf!   VP                  R	\        P                  4      # VP                  R
4      p\        V\        4      '       d   TM/ p \        YVT\!        VP                  RR4      R4      \        VP                  RR 4      ;'       g    R 4      P                  4       V\        VP                  RR4      4      \!        VP                  R^ 4      R4      R7      w  ršY“n        TP.                  P1                  T
4       T#   \"         dq   pTP                  \        T4      \%        \        T4      4      4       TP&                  \        P(                  8X  d   RT RTP*                   R2Tn        Tu Rp?# Rp?ii ; i)r‹   z&secrets.bitwarden.enabled is true but z3 is not set.  Run `hermes secrets bitwarden setup`.r¢   zMsecrets.bitwarden.project_id is empty.  Run `hermes secrets bitwarden setup`.rû   Tr¯   Nzhbws binary not available and auto-install is disabled.  Run `hermes secrets bitwarden setup` to install.rø   r›   rœ   g     Àr@rž   rõ   Frù   r±   )rW   r¢   r?   r›   rž   r)   rŸ   r    z5Bitwarden rejected the machine-account access token (uF   ) â€” it was likely revoked, expired, or belongs to another region.  (Ú))r•   r–   r   Ú	token_envr   rŽ   rÇ   Úfailr   ÚNOT_CONFIGUREDr   rG   r8   Úbinary_pathÚBINARY_MISSINGrÂ   r   r²   r5   Ú
error_kindÚAUTH_FAILEDÚerrorrn   r¾   Úextend)rü   r   r)   Úresultrñ   rW   r¢   r?   Úencrypted_cfgrn   r¾   rF   s   &&&         r   ÚfetchÚBitwardenSource.fetch[  s7  € Ü ¤T×*Ò*‰c°ˆÜ“ˆàŸ>™>¨#Ó.ÐÜ-Ó/×3Ñ3Ð4DÀbÓI×OÑOÓQˆßØ—;‘;Ð!GÐHXÐGYð ZQð  QÜR[×RjÑRjólð lä˜Ÿ™ Ó.×4Ð4°"Ó5ˆ
ßØ—;‘;ÐnÜ(×7Ñ7ó9ð 9ä¬T°#·'±'¸.È$Ó2OÓ-PÔQˆØ#ÔØŠ>Ø—;‘;ð  RÜS\×SkÑSkómð mð Ÿ™Ð 1Ó2ˆÜ)3°MÄ4×)HÒ)H™Èbˆð	Ü 7Ø)ÈÜ".¨s¯w©wÐ7JÈCÓ/PÐRWÓ"XÜ˜sŸw™w |°RÓ8×>Ð>¸BÓ?×EÑEÓGÐS\Ü(,¨]×->Ñ->¸yÈ%Ó-PÓ(QÜ2>¸}×?PÑ?PÐQdÐfgÓ?hÐjmÓ2nô!ÑˆGð !ŒØ�‰×Ñ˜xÔ(Øˆøô ô 	Ø�K‰Kœ˜C›Ô"5´c¸#³hÓ"?Ô@Ø× Ñ ¤I×$9Ñ$9Ô9ð!$Ø$4Ð#5ð 6CØCIÇ<Á<À.ÐPQð!S�”ð �Mûð	ús    ÅBH ÈJÈA%I<É6JÉ<Jr   N)rç   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚnamerÀ   ÚshapeÚschemeÚtoken_env_keyÚdefault_token_envÚoverride_existing_defaultÚ
_AUTH_HINTr   r	  ÚAUTH_EXPIREDÚremediation_hintsrý   r  Ú__static_attributes__r   r!   r   rî   rî   7  si   † ñGð €DØ'€EØ€EØ€FØ&€MØ*Ðð !%Ðð	Dð ð #×.Ñ.°
¸I×<RÑ<RÐT^Ð_Ðõ
÷(ñ (r!   rî   c               ó    € V ^8„  d   QhRRRR/# )r   r)   r*   r   rj   r   )r   s   "r   r    r    †  s   € ÷ ñ ˜Nð °dñ r!   c                ó”   € \         P                  V 4        \        V 4      P                  4        R#   \        \
        3 d     R# i ; i)zWDrop in-process AND disk caches (plaintext and encrypted), e.g. after a token rotation.N)r'   r   r/   ÚunlinkÚFileNotFoundErrorÚOSErrorr.   s   &r   Úclear_cachesr#  †  s;   € ä
‡L�L�ÔðÜ" 9Ó-×4Ñ4Ö6øÜœwÐ'ô Úðús   —2 ²AÁAr3   )z	timed out)zbinary not availablezfailed to invoke)Úunauthorizedzinvalid tokenzaccess tokenÚ401Ú403Úinvalid_clientÚinvalid_grantz400 bad request)ÚnetworkÚ
connectionÚresolveÚdownloadÚdns)r‹   )MÚ__conditional_annotations__r  Ú
__future__r   rR   rz   Úloggingrx   rÊ   r;   r˜   Úpathlibr   Útypingr   r   r   r   Úagent.secret_sources._cacher   ri   r	   r
   r   r   r³   r   Úagent.secret_sources.baser   r   r   r   r   r   rè   r   r   r   Ú	getLoggerrç   rB   rá   Útupler   r   Ú_DISK_CACHE_BASENAMEr-   r}   rc   r%   r'   Ú__annotations__rº   Ú_CACHEr~   Ú_DISK_CACHEÚpathÚ_disk_cache_pathr/   r·   r  r	  r¶   r4   r5   rG   rL   rU   rf   rƒ   rš   rÂ   rÒ   rµ   rî   r#  Ú_reset_cache_for_tests)r.  s   @r   Ú<module>r>     sÊ  øðô	õ #ã Û Û Û 	Û 	Û Û Ý ß .Ó .÷÷ ÷÷ õ ð
 
×	Ò	˜8Ó	$€àÐ ð �#�s˜C�-Õ €	Ø'Ð Ø0Ð ØÐ Ø8Ð õñ "-Ð-AÐR`Ô!a€ÐÓ aà	�‰€Ø�k‰k€Ø×#Ñ#Ð ÷Oð ×Ñ˜Ð'Ø×ÑÐKÐLØ×Ñð Sð Tà×ÑÐOÐPðÐ õ9ð¨5÷ ð$. ÷ .õ1õ	QðØ<@÷ð.Ø;?÷ð>KØDHðKà"ðKà6:ðKàNPðKð !%ðKð GLðKð 01÷	Kõ\1÷%ôPL�lô L÷^ð &Ò r!   