+
    iHàjG-  ã                  óÎ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
HtHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIHtHtHtHtHtHtHtHt ^tR	tR
tR] R&   ]! RRR7      t!R R lt"R R lt#R R lt$R R lt% ! R R]&]4      t']](]']]&,          3,          ,          t)R R lt*R R lt+] ! R R4      4       t,]'PZ                  R]'P\                  R ]'P^                  R!]'P`                  R"]'Pb                  R#]'Pd                  R$/t3 ! R% R&]4      t4]Pj                  ! R'4      t6]Pj                  ! R(4      t7R) R* lt8R+ R, lt9R-]Pt                  /R. R/ llt;R0R5R1RR2]/R3 R4 llt<R# )6a7  Secret-source contract: the ABC every secret backend implements.

A *secret source* resolves credentials from an external secret manager into
env-var-shaped values at process startup, AFTER ``~/.hermes/.env`` has loaded
and BEFORE the rest of Hermes reads ``os.environ``. The contract is deliberately
narrow: read-only; startup-time and synchronous (one ``fetch()`` per process per
HERMES_HOME, under a registry-enforced wall-clock timeout, no background
refreshers); never raises, never prompts (errors go in ``FetchResult.error``
with an :class:`ErrorKind`; interactive auth belongs in the CLI ``setup`` flow);
sources fetch, the orchestrator (``registry.apply_all``) applies.

``SECRET_SOURCE_API_VERSION`` gates plugin compatibility: additive optional
hooks with defaults do NOT bump it; required-signature changes do.
)ÚannotationsN)ÚABCÚabstractmethod)Ú
ContextVarÚToken)Ú	dataclassÚfield)ÚEnum)ÚPath)ÚAnyÚDictÚ	FrozenSetÚListÚMutableMappingÚOptionalÚSequenceÚTupleg      ^@g      >@z.ContextVar[Optional[MutableMapping[str, str]]]Ú_SOURCE_ENVIRONMENTÚ hermes_secret_source_environment)Údefaultc               ó    € V ^8„  d   QhRRRR/# )é   ÚenvironúMutableMapping[str, str]Úreturnr   © )Úformats   "Ú>/home/ubuntu/.hermes/hermes-agent/agent/secret_sources/base.pyÚ__annotate__r   &   s   € ÷ ,ñ ,Ð$<ð ,Àñ ,ó    c                ó,   € \         P                  V 4      # )zEInstall a per-fetch environment view without changing ``os.environ``.)r   Úset©r   s   &r   Úset_source_environmentr#   &   s   € ä×"Ñ" 7Ó+Ð+r   c               ó    € V ^8„  d   QhRRRR/# )r   Útokenr   r   ÚNoner   )r   s   "r   r   r   +   s   € ÷ %ñ % Eð %¨dñ %r   c                ó0   € \         P                  V 4       R # ©N)r   Úreset)r%   s   &r   Úreset_source_environmentr*   +   s   € Ü×Ñ˜eÖ$r   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   /   s   € ÷ :ñ :Ð 8ñ :r   c                 óV   € \         P                  4       p V e   V # \        P                  # )zDReturn the active per-fetch environment, or the process environment.)r   ÚgetÚosr   r"   s    r   Úget_source_environmentr/   /   s$   € ä!×%Ñ%Ó'€GØÒ)ˆ7Ð9¬r¯z©zÐ9r   c               ó   € V ^8„  d   QhRR/# )r   r   údict[str, str]r   )r   s   "r   r   r   5   s   € ÷ 	ñ 	˜.ñ 	r   c                 ót   € \        4       p V \        P                  J d   ^ RIHp V! RRR7      # \        V 4      # )zâEnvironment for a helper child that legitimately needs the caller's env:
full process env (minus the terminal blocklist) in single-profile startup;
ONLY the per-fetch view under multiplex, so no sibling profile's secrets leak.)Úbuild_subprocess_envF)Úscrub_secretsÚinherit_profile_home)r/   r.   r   Útools.environments.localr3   Údict)Ú
source_envr3   s     r   Úsource_child_envr9   5   s3   € ô (Ó)€JØ”R—Z‘ZÓÝAá#°%ÈeÔTÐTÜ�
ÓÐr   c                  ó>   € ] tR t^AtRtRtRtRtRtRt	Rt
RtR	tR
tRtR# )Ú	ErrorKindz¥Failure taxonomy for :class:`FetchResult.error`; lets the orchestrator apply
kind-dependent policy once (stale-cache fallback on NETWORK/TIMEOUT, never AUTH_FAILED).Únot_configuredÚbinary_missingÚauth_failedÚauth_expiredÚref_invalidÚnetworkÚempty_valueÚtimeoutÚinternalr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚNOT_CONFIGUREDÚBINARY_MISSINGÚAUTH_FAILEDÚAUTH_EXPIREDÚREF_INVALIDÚNETWORKÚEMPTY_VALUEÚTIMEOUTÚINTERNALÚ__static_attributes__r   r   r   r;   r;   A   s7   † ñ`ð &€NØ%€NØ€KØ!€LØ€KØ€GØ€KØ€GØ„Hr   r;   c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚmessageÚstrÚrulesÚ
ErrorRulesr   r;   r   )r   s   "r   r   r   U   s!   € ÷ ñ  ð ¨Jð ¸9ñ r   c                óâ   a€ V P                  4       oV FI  w  r#\        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g   KG  Vu # 	  \        P                  # )zABest-effort mapping of helper-CLI failure text onto the taxonomy.c              3  ó,   <"  € T F	  qS9   x € K  	  R # 5ir(   r   )Ú.0ÚtokÚlowereds   & €r   Ú	<genexpr>Ú%classify_cli_error.<locals>.<genexpr>Y   s   øé € Ð0© #�gŽ~«ùs   ƒTF)ÚlowerÚanyr;   rR   )rU   rW   ÚkindÚtokensr]   s   &&  @r   Úclassify_cli_errorrd   U   sN   ø€ à�m‰m‹o€GÛ‰ˆß‹3Ô0©Ó0�3�3Š3Ô0©Ó0×0Ô0ØŠKñ ô ×ÑÐr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úvaluer   r   Úfloatr   r   )r   s   "r   r   r   ^   s!   € ÷ ñ ˜ð  eð °ñ r   c                óL   €  \        V 4      #   \        \        3 d    Tu # i ; i)z>``float(value)`` with ``default`` for malformed config values.)rg   Ú	TypeErrorÚ
ValueError)rf   r   s   &&r   Úcoerce_floatrk   ^   s*   € ðÜ�U‹|ÐøÜ”zÐ"ô ØŠðús   ‚
 �#¢#c                  óØ   € ] tR t^ft$ Rt]! ]R7      tR]R&   ]! ]	R7      t
R]R&   ]! ]	R7      tR]R&   ]! ]	R7      tR]R&   R	tR
]R&   R	tR]R&   R	tR]R&   ]R R l4       tR R ltRtR	# )ÚFetchResultz¶Outcome of one source's fetch. ``secrets`` is what the source *would*
contribute; ``applied``/``skipped`` serve the legacy fetch-and-apply entry
points and stay empty in ``fetch()``.)Údefault_factoryr1   Úsecretsz	list[str]ÚappliedÚskippedÚwarningsNúOptional[str]ÚerrorúOptional[ErrorKind]Ú
error_kindzOptional[Path]Úbinary_pathc               ó   € V ^8„  d   QhRR/# )r   r   Úboolr   )r   s   "r   r   ÚFetchResult.__annotate__v   s   € ÷ "ñ "�Dñ "r   c                	ó   € V P                   R J # r(   )rt   ©Úselfs   &r   ÚokÚFetchResult.oku   s   € à�z‰z˜TÐ!Ð!r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rt   rV   rb   r;   r   rm   r   )r   s   "r   r   rz   y   s!   € ÷ ñ ˜#ð  Yð °;ñ r   c                	ó"   € WuV n         V n        V # r(   ©rt   rv   )r}   rt   rb   s   &&&r   ÚfailÚFetchResult.faily   s   € Ø&+Ð#ˆŒ
�D”OØˆr   r‚   )rE   rF   rG   rH   rI   r   r7   ro   Ú__annotations__Úlistrp   rq   rr   rt   rv   rw   Úpropertyr~   rƒ   rS   r   r   r   rm   rm   f   s€   ‡ ñ-ñ $°DÔ9€Gˆ^Ó9Ù¨tÔ4€GˆYÓ4Ù¨tÔ4€GˆYÓ4Ù°Ô5€HˆiÓ5Ø€Eˆ=ÓØ&*€JÐ#Ó*à"&€K�Ó&àô"ó ð"÷ñ r   rm   z:Run `hermes secrets {name} setup` to finish configuration.z<Run `hermes secrets {name} setup` to install the helper CLI.uN   Credentials rejected â€” run `hermes secrets {name} setup` to re-authenticate.uM   Credentials expired â€” run `hermes secrets {name} setup` to re-authenticate.uN   Network problem reaching the secrets backend â€” check connectivity and retry.uI   Backend was slow â€” raise secrets.{name}.timeout_seconds if this recurs.c                  ó  € ] tR t^ˆt$ Rt]tR]R&   RtR]R&   Rt	R]R&   Rt
R]R	&   R
tR]R&   R
tR]R&   RtR]R&   RtR]R&   / tR]R&   ]R R l4       tR R ltR R ltR R ltR R ltR R ltR  R! ltR" R# ltR$tR
# )%ÚSecretSourceaâ  One external secret backend. Subclasses set attributes + ``fetch``.

``name``: config-section key under ``secrets:`` (``[a-z0-9_]+``) and the
provenance label. ``shape``: ``"mapped"`` (user binds env-var names to refs)
or ``"bulk"`` (backend injects whole projects); mapped beats bulk because an
explicit binding is stronger intent. ``scheme``: URI scheme this source owns
for refs, unique across sources. ``token_env_key`` / ``default_token_env``:
config key naming the bootstrap-auth env var and its default; drives
:meth:`protected_env_vars` so a vault holding its own access token can't
clobber the credential used to reach it. ``remediation_hints``: per-kind
overrides of the generic remediation text (``{name}`` / ``{token_env}``).
ÚintÚapi_versionÚ rV   ÚnameÚlabelÚmappedÚshapeNrs   ÚschemeÚtoken_env_keyÚdefault_token_envFry   Úoverride_existing_defaultzdict[ErrorKind, str]Úremediation_hintsc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úcfgr7   Ú	home_pathr
   r   rm   r   )r   s   "r   r   ÚSecretSource.__annotate__¡   s&   € ÷ @ñ @˜ð @¨$ð @°;ñ @r   c                ó   € R# )z|Resolve this source's secrets. MUST NOT raise or prompt; ``cfg`` is the
raw ``secrets.<name>`` section and may be malformed.Nr   )r}   r—   r˜   s   &&&r   ÚfetchÚSecretSource.fetch    s   ‚ r   c               ó    € V ^8„  d   QhRRRR/# ©r   r—   r7   r   ry   r   )r   s   "r   r   r™   ¥   s   € ÷ Bñ B˜dð B tñ Br   c                	óf   € \        \        V\        4      ;'       d    VP                  R 4      4      # )Úenabled)ry   Ú
isinstancer7   r-   ©r}   r—   s   &&r   Ú
is_enabledÚSecretSource.is_enabled¥   s%   € Ü”J˜s¤DÓ)×@Ð@¨c¯g©g°iÓ.@ÓAÐAr   c               ó    € V ^8„  d   QhRRRR/# rž   r   )r   s   "r   r   r™   ¨   s   € ÷ Vñ V Tð V¨dñ Vr   c                ó|   € \        \        V\        4      ;'       d    VP                  RV P                  4      4      # )z›May this source overwrite vars .env / the shell already set? Never extends
to vars claimed by another source (a config error the orchestrator warns about).Úoverride_existing)ry   r¡   r7   r-   r”   r¢   s   &&r   r§   ÚSecretSource.override_existing¨   s=   € ô ”J˜s¤DÓ)÷ Uð UØŸ™Ð 3°T×5SÑ5SÓTóVð 	Vr   c               ó    € V ^8„  d   QhRRRR/# )r   r—   r7   r   rV   r   )r   s   "r   r   r™   ®   s   € ÷ &ñ &˜Tð & cñ &r   c                óÚ   € \        V\        4      '       dK   V P                  '       d9   \        VP	                  V P                  4      ;'       g    V P
                  4      # V P
                  # )z?Name of the env var holding this source's bootstrap credential.)r¡   r7   r’   rV   r-   r“   r¢   s   &&r   Ú	token_envÚSecretSource.token_env®   sN   € ä�cœ4× Ò  T×%7×%7Ð%7Ü�s—w‘w˜t×1Ñ1Ó2×LÐL°d×6LÑ6LÓMÐMØ×%Ñ%Ð%r   c               ó    € V ^8„  d   QhRRRR/# )r   r—   r7   r   zfrozenset[str]r   )r   s   "r   r   r™   ´   s   € ÷ Wñ W dð W¨~ñ Wr   c                óp   € V P                   '       d   \        V P                  V4      04      # \        4       # )z>Env vars the orchestrator must never let ANY source overwrite.)r’   Ú	frozensetr«   r¢   s   &&r   Úprotected_env_varsÚSecretSource.protected_env_vars´   s+   € à37×3E×3EÐ3EŒy˜$Ÿ.™.¨Ó-Ð.Ó/ÐVÌ9Ë;ÐVr   c               ó    € V ^8„  d   QhRRRR/# )r   r—   r7   r   rg   r   )r   s   "r   r   r™   ¸   s   € ÷ Añ A¨ð A°%ñ Ar   c                ó|   € \        T;'       g    / P                  R\        4      \        4      pV^ 8”  d   V# \        # )z;Wall-clock budget the orchestrator enforces around fetch().Útimeout_seconds)rk   r-   ÚDEFAULT_FETCH_TIMEOUT_SECONDS)r}   r—   Úvals   && r   Úfetch_timeout_secondsÚ"SecretSource.fetch_timeout_seconds¸   s6   € ä˜CŸI˜I 2Ÿ?™?Ð+<Ô>[Ó\Ü8ó:ˆà˜A”gˆsÐ@Ô#@Ð@r   c               ó   € V ^8„  d   QhRR/# )r   r   r7   r   )r   s   "r   r   r™   ¾   s   € ÷ ñ ˜tñ r   c                ó   € / # )zLInformational ``{key: {"description": str, "default": Any}}`` for setup UIs.r   r|   s   &r   Úconfig_schemaÚSecretSource.config_schema¾   s   € àˆ	r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rb   ru   r—   r7   r   rV   r   )r   s   "r   r   r™   Â   s'   € ÷ Nñ NÐ 3ð N¸$ð NÀ3ñ Nr   c                óØ   € Vf   R# V P                   P                  V4      ;'       g    \        P                  VR4      pVP                  V P                  V P                  V4      R7      # )zPOne-line actionable next step for a failed fetch (pure); "" suppresses the hint.rŒ   )r�   r«   )r•   r-   Ú_GENERIC_REMEDIATIONr   r�   r«   )r}   rb   r—   Útemplates   &&& r   ÚremediationÚSecretSource.remediationÂ   sX   € àŠ<ÙØ×)Ñ)×-Ñ-¨dÓ3×YÐYÔ7K×7OÑ7OÐPTÐVXÓ7YˆØ�‰ D§I¡I¸¿¹ÈÓ9LˆÓMÐMr   r   )rE   rF   rG   rH   rI   ÚSECRET_SOURCE_API_VERSIONr‹   r…   r�   rŽ   r�   r‘   r’   r“   r”   r•   r   r›   r£   r§   r«   r°   r·   r»   rÁ   rS   r   r   r   r‰   r‰   ˆ   s§   ‡ ñð 1€K�Ó0Ø€Dˆ#ƒNØ€Eˆ3ƒOØ€Eˆ3ÓØ €FˆMÓ Ø#'€M�=Ó'ØÐ�sÓØ&+Ð˜tÓ+Ø.0ÐÐ+Ó0àô@ó ð@õBõVõ&õWõAõ÷Nñ Nr   r‰   z^[A-Za-z_][A-Za-z0-9_]*$z<\x1b(?:\[[0-9;?]*[ -/]*[@-~]|\][^\x07\x1b]*(?:\x07|\x1b\\)?)c               ó    € V ^8„  d   QhRRRR/# )r   r�   rV   r   ry   r   )r   s   "r   r   r   Ô   s   € ÷ 9ñ 9˜Cð 9 Dñ 9r   c                ód   € \        V 4      ;'       d    \        \        P                  V 4      4      # )z8True when ``name`` is a legal environment-variable name.)ry   Ú_ENV_NAME_REÚmatch)r�   s   &r   Úis_valid_env_namerÈ   Ô   s$   € ä�‹:×8Ð8œ$œ|×1Ñ1°$Ó7Ó8Ð8r   c               ó    € V ^8„  d   QhRRRR/# )r   ÚtextrV   r   r   )r   s   "r   r   r   Ù   s   € ÷ (ñ (�Sð (˜Sñ (r   c                óB   € \         P                  RT ;'       g    R4      # )zDStrip ANSI escape sequences (whole CSI/OSC sequences, not just ESC).rŒ   )Ú_ANSI_REÚsub)rÊ   s   &r   Ú
scrub_ansirÎ   Ù   s   € ä�<‰<˜˜DŸJ˜J BÓ'Ð'r   Ústdinc               ó4   € V ^8„  d   QhRRRRRRRRR	RR
RRR/# )r   ÚargvúSequence[str]Úenvr1   rC   rg   rŽ   rV   Útimeout_messagerÏ   r   r   úsubprocess.CompletedProcessr   )r   s   "r   r   r   Þ   sJ   € ÷ Hñ H�-ð H¨ð HÀ%ð HÐPSð HØ ðHØ),ðHØFañHr   c               óä   €  \         P                  ! \        V 4      VRRRRW%RR7	      #   \         P                   d   p\	        T4      ThRp?i\
         d   p\	        RT RT 24      ThRp?ii ; i)	z ``subprocess.run`` an argv list (never a shell), capturing utf-8 text; timeout
and spawn failure become ``RuntimeError``. Callers own returncode interpretation.Tzutf-8ÚreplaceF)rÓ   Úcapture_outputrÊ   ÚencodingÚerrorsrC   rÏ   ÚcheckNzfailed to invoke z: )Ú
subprocessÚrunr†   ÚTimeoutExpiredÚRuntimeErrorÚOSError)rÑ   rÓ   rC   rŽ   rÔ   rÏ   Úexcs   &$$$$$ r   Úrun_clirâ   Þ   s|   € ð	HÜ�~Š~Ü�‹J˜C°¸4È'ÐZcØØô
ð 	
øô
 ×$Ñ$ô 5Ü˜?Ó+°Ð4ûÜô HÜÐ.¨u¨g°R¸°uÐ=Ó>ÀCÐGûðHús&   ‚&) ©A/¾A
Á
A/ÁA/ÁA*Á*A/Ú	allow_envÚ	extra_envrC   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   rÑ   rÒ   rã   rä   zOptional[dict[str, str]]rC   rg   r   rÕ   r   )r   s   "r   r   r   î   s2   € ÷ ñ ˜ð °mð ÐUmð Ø!ðØD_ñr   c          
     óÞ  € Rp. VOVO Uu/ uF1  qU\         P                  9   g   K  V\         P                  V,          bK3  	  ppV'       d   VP                  V4       VP                  RR4       \	        \        V ^ ,          4      4      P                  p\        WW7V RVR R2R7      pVP                  ;'       g    RVn        \        VP                  ;'       g    R4      Vn
        V# u upi )	a0  Run a secret-manager helper CLI with a minimal, allowlisted env (never the
full post-dotenv ``os.environ``): PATH/HOME/locale basics plus ``allow_env``
and ``extra_env``. ``NO_COLOR=1`` + ANSI-scrubbed stderr; stdin is /dev/null so
a prompting helper fails fast. Pass user refs AFTER a ``--`` terminator.ÚNO_COLORÚ1z timed out after z.0fÚs)rÓ   rC   rŽ   rÔ   rŒ   )
ÚPATHÚHOMEÚUSERPROFILEÚ
SYSTEMROOTÚTMPDIRÚTEMPÚLANGÚLC_ALLÚXDG_CONFIG_HOMEÚXDG_DATA_HOME)r.   r   ÚupdateÚ
setdefaultr
   rV   r�   râ   ÚstdoutrÎ   Ústderr)	rÑ   rã   rä   rC   Ú	base_keepÚkrÓ   r�   Úprocs	   &$$$     r   Úrun_secret_clirû   î   sÏ   € ðG€Ià%= yÐ%=°9Ñ%=Ó
QÑ%= ÄbÇjÁjÁÔˆ1Œb�j‰j˜�mÒÑ%=€CÐ
QßØ�
‰
�9ÔØ‡N�N�:˜sÔ#ä”�D˜•G“Ó×"Ñ"€DÜ�4¨'Ø&* VÐ+<¸WÀS¸MÈÐ#KôM€Dà—+‘+×#Ð# €D„KÜ˜TŸ[™[×.Ð.¨BÓ/€D„KØ€Kùò Rs
   ‹C*¦C*r   )=Ú__conditional_annotations__rI   Ú
__future__r   r.   ÚrerÜ   Úabcr   r   Úcontextvarsr   r   Údataclassesr   r   Úenumr	   Úpathlibr
   Útypingr   r   r   r   r   r   r   r   rÃ   rµ   ÚDEFAULT_CLI_TIMEOUT_SECONDSr…   r   r#   r*   r/   r9   rV   r;   ÚtuplerX   rd   rk   rm   rJ   rK   rL   rM   rO   rQ   r¿   r‰   ÚcompilerÆ   rÌ   rÈ   rÎ   ÚDEVNULLrâ   rû   )rü   s   @r   Ú<module>r	     s{  øðôõ #ã 	Û 	Û ß #ß )ß (Ý Ý ß X× XÓ XàÐ ð !&Ð Ø"Ð àCÓ CÙ Ð!CÈTÔRÐ õ,õ
%õ:õ	ô��Tô ð" �e˜I x°¥}Ð4Õ5Õ6€
õõð ÷ð ó ðð0 ×ÑÐZØ×ÑÐ\Ø×ÑÐkØ×ÑÐkØ×ÑÐgØ×ÑÐbðÐ ô?N�3ô ?NðH �zŠzÐ5Ó6€ð
 �:Š:ÐUÓV€õ9õ
(ð
HØ/9×/AÑ/A÷Hð Àbð Ðptð Ø$?÷ñ r   