+
    lHàj@  ã                   óŠ  a € R t!0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHt ]P                  ! R4      t
]P                  ! 4       R8H  tRtRtR R lt]! 0 Rm4      t]! 0 Rm4      tRR]! 4       3R ltR R	 lt^ t/ t] ^ k / t] ^k ]! 4       t] ^k R
 R ltRR/R R lltR R ltR R ltR R ltR R ltRR R llt R# ) a5  Child-process environment for execute_code: env scrubbing, interpreter and cwd resolution.

Both the per-call remote path and the local session kernel build their child
env through ``_build_child_env`` so the security rules (secret scrubbing,
PYTHONPATH hygiene, UTF-8 forcing, TZ) cannot drift between them.
N)ÚDictztools.code_execution_toolÚWindowsc                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚnameÚreturn©ÚstrÚbool)Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/tools/code_execution_env.pyÚ__annotate__r   !   s   € ÷ >ñ >œSð >¤Tñ >ó    c                óˆ   a € \         ;QJ d#    V 3R l\         4       F  '       g   K   R# 	  R# ! V 3R l\         4       4      # )zlThe credential-name policy, shared with a local session's client environment (``agent.session_client_env``).c              3   óH   <"  € T F  qSP                  4       9   x € K  	  R # 5i©N)Úupper)Ú.0Úsr   s   & €r   Ú	<genexpr>Ú%is_secret_env_name.<locals>.<genexpr>#   s   øé € Ð=Ñ*< Q�D—J‘J“LÖ Ó*<ùs   ƒ"TF)ÚanyÚ_SECRET_SUBSTRINGS)r   s   fr   Úis_secret_env_namer   !   s.   ø€ ç‹3Ô=Õ*<Ó=�3Œ3Ð=Š3Ð=ˆ3Ô=Õ*<Ó=Ó=Ð=r   c           	     óä  aa€  ^ RI HpHpHp Sf   VoVf   \
        p/ p. pV P                  4        Få  w  op	S! S4      '       d   V! SV	4      p
V
e   W§S&   K'  \        S4      '       d   K:  \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       g4   SV9   g-   S\        9   g"   V'       d    SP                  4       \        9   d   W—S&   K»  SP                  R4      '       g   KÔ  VP                  S4       Kç  	  VP                  V3R	 lV! V4      P                  4        4       4       V'       d9   \         P#                  R
\%        V4      RP'                  \)        V4      4      4       ^ RIHpHp V! V 4      pVP1                  V4      '       d   VRR3 F  pWí9   g   K  WÞ,          W~&   K  	  V! V4      #   \         d    R pR pR p ELài ; i)uÅ  Produce the scrubbed child-process env for execute_code.

Rules, in order: (1) passthrough vars (skill/config-declared) resolve
through the active profile secret scope â€” an absent scoped value is
omitted; (2) secret-substring names are blocked; (3) safe prefixes pass,
as do a local session's client ``toolchain`` names (NVM_DIR, GOPATH...);
(4) operational HERMES_* pass by exact name; (5) on Windows the
OS-essential allowlist passes by exact name.
)Úis_env_passthroughÚresolve_passthrough_valueÚscoped_passthrough_additionsc                 ó   € R # )F© )Ú_s   &r   Ú<lambda>Ú"_scrub_child_env.<locals>.<lambda>F   s   € ¡ur   c                 ó   € R # r   r   )Ú_nameÚ	_fallbacks   &&r   r!   r"   G   s   € ¹Tr   c                 ó   € / # r   r   )Ú_presents   &r   r!   r"   H   s   € ¹r   c              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir   )Ú
startswith)r   ÚpÚks   & €r   r   Ú#_scrub_child_env.<locals>.<genexpr>Y   s   øé € Ð<Ñ); A�—‘˜Q—�Ó);ùs   ƒ!TFÚHERMES_c              3   óN   <"  € T F  w  rS! V4      '       g   K  W3x € K  	  R # 5ir   r   )r   r+   ÚvÚis_passthroughs   &  €r   r   r,   a   s"   øé € ÐkÑ'U™t˜qÑYgÐhi×Yj”F�Q•FÓ'Uùs   ƒ%š%a  execute_code: dropped %d non-allowlisted HERMES_* var(s) from the sandbox child env (%s). This is intentional hardening (#27303); if a sandbox script legitimately needs one, declare it via env_passthrough in the skill/config so it passes by explicit opt-in.z, )ÚDELEGATED_CHILD_ENV_MARKERÚdelegated_child_subprocess_envÚHERMES_KANBAN_DBÚHERMES_KANBAN_BOARD)Útools.env_passthroughr   r   r   Ú	ExceptionÚ_IS_WINDOWSÚitemsr   r   Ú_SAFE_ENV_PREFIXESÚ_HERMES_CHILD_ALLOWEDr   Ú_WINDOWS_ESSENTIAL_ENV_VARSr)   ÚappendÚupdateÚloggerÚdebugÚlenÚjoinÚsortedÚagent.delegation_contextr1   r2   Úget)Ú
source_envr0   Ú
is_windowsÚ	toolchainr   r   r   ÚscrubbedÚ_dropped_hermesr/   Úresolvedr1   r2   ÚscopedÚkeyr+   s   &f&&           @r   Ú_scrub_child_envrM   9   s­  ù€ ð;ßuÑuð
 ÒØ+ˆØÒÜ ˆ
Ø€Hð €OØ× Ñ Ö"‰ˆˆ1Ù˜!×ÒÙ0°°AÓ6ˆHØÒ#Ø&˜‘ÙÜ˜a× Ò Ùß‹CÔ<Õ);Ó<�C�CŠCÔ<Õ);Ó<×<Ò<ÀÀYÄØÔ-Ô-ß 1§7¡7£9Ô0KÔ#KØ�Q‹KØ�\‰\˜)×$Ô$Ø×"Ñ" 1Ö%ñ #ð  ‡O�OÔkÑ'CÀHÓ'M×'SÑ'SÔ'UÓkÔkßÜ�‰ðSô �Ó  $§)¡)¬F°?Ó,CÓ"Dô	
÷ñ ,¨JÓ7€Fð ‡z�zÐ,×-Ò-Ø.Ð0BÐDYÓZˆCØŽ}Ø &¥�“ñ [ñ *¨(Ó3Ð3øôe ô ;Ù,ÐÙ$AÐ!Ù':Ó$ð;ús   „
G ÇG/Ç.G/c                óv   € V ^8„  d   QhR\         R\         R\         R\         R\        \         \         3,          /# )r   Úrpc_endpointÚ	rpc_tokenÚtmpdirÚchild_pythonr   )r	   Údict)r   s   "r   r   r   z   s@   € ÷ Iñ I¤cð I´cð IÄ3ð IÜ#&ðIÜ+/´´S°­>ñIr   c           	     óh  aaa€ ^ RI HpHpHp ^ RIHpHp \        V! 4       \        V! 4       4      R7      p	W	R&   WR&   RV	R&   RV	R	&   RV	R
&   ^ RI	H
p
 V
! 4       pV'       d   \        '       g   W¹R&   V	P                  RR4       V! V	4       V! 4       pV'       d   WÉR&   V! V	4       ^ RIHpHpHo RpV\"        P$                  8X  dÊ   V! V	4      pVe¾   ^ RIHo ^ RIHp V! V4      o\.        ;QJ dN    VVV3R lV	P1                  RR4      P3                  \4        P6                  4       4       F  '       g   K   RMC	  RM?! VVV3R lV	P1                  RR4      P3                  \4        P6                  4       4       4      '       d   \9        S4      pV! V	4       V	P1                  RR4      pV.pVe   VP;                  V4       \=        V4      '       dn   VP;                  \4        P>                  PA                  \4        P>                  PA                  \4        P>                  PC                  \D        4      4      4      4       M6V\F        9  d,   \F        PI                  V4       \J        PM                  RV4       V'       d   VP;                  V4       \4        P6                  PO                  V4      V	R&   V	# )z@Build the scrubbed child environment both execution paths share.)Úapply_scratch_tmp_envÚapply_subprocess_home_envÚget_hermes_home_override)Útool_envÚtoolchain_environ)rG   ÚHERMES_RPC_SOCKETÚHERMES_RPC_TOKENÚ1ÚPYTHONDONTWRITEBYTECODEzutf-8ÚPYTHONIOENCODINGÚ
PYTHONUTF8)Úget_timezone_nameÚTZÚHERMES_TIMEZONENÚHERMES_HOME)Ú_strip_hermes_owned_pythonpathÚ_validated_runtime_venvÚ
_same_path)ÚPath)Úsite_packagesc              3   óT   <"  € T F  q'       g   K  S! S! V4      S4      x € K  	  R # 5ir   r   )r   Úentryrg   rf   Ú	candidates   & €€€r   r   Ú#_build_child_env.<locals>.<genexpr>±   s,   øé € ð \Ù Q�uÓUZô 6‘:™d 5›k¨9×5Ð5Û Qùs   ƒ	(‘(Ú
PYTHONPATHÚ TFziexecute_code: child interpreter %s is outside the Hermes environment; hermes root omitted from PYTHONPATH)(Úhermes_constantsrU   rV   rW   Úagent.session_client_envrX   rY   rM   Ú	frozensetÚhermes_timer`   r7   ÚpopÚ#tools.environments.local_pythonpathrd   re   rf   ÚsysÚ
executableÚpathlibrg   Úpm.environmentsrh   r   rD   ÚsplitÚosÚpathsepr	   r<   Ú_uses_hermes_python_environmentÚpathÚdirnameÚabspathÚ__file__Ú_external_env_loggedÚaddr>   ÚinforA   )rO   rP   rQ   rR   rU   rV   rW   rX   rY   Ú	child_envr`   Ú_tz_nameÚ_home_overriderd   re   Ú_runtime_pathÚruntime_venvrh   Ú_existing_ppÚ	_pp_partsrg   rf   rk   s   $$$$                @@@r   Ú_build_child_envr‹   z   s,  ú€ ÷ lÑkßDô !Ñ!2Ó!4Ä	É(Ë*Ó@UÔV€IØ%1Ð!Ñ"Ø$-Ð Ñ!Ø+.€IÐ'Ñ(ð %,€IÐ Ñ!Ø!€IˆlÑõ .á Ó"€H÷ Ÿ›Ø"�$‰Ø‡M�MÐ# TÔ*Ù˜iÔ(ñ .Ó/€NßØ#1�-Ñ Ù˜iÔ(÷ñ ð €MØ”s—~‘~Ô%Ù.¨yÓ9ˆØÒ#Ý$Ý5Ù% lÓ3ˆI÷ ‹sö \Ø )§¡¨l¸BÓ ?× EÑ EÄbÇjÁjÔ Qó\�s�sŠsö \Ø )§¡¨l¸BÓ ?× EÑ EÄbÇjÁjÔ Qó\÷ \ò \ä # I£�Ù" 9Ô-Ø—=‘= ¨rÓ2€LØ�€IØÒ Ø×Ñ˜Ô'Ü& |×4Ò4Ø×ÑœŸ™Ÿ™¬¯©¯©¼¿¹¿¹ÌÓ9RÓ)SÓTÕUØ	Ô1Ô	1ä× Ñ  Ô.Ü�‰ð GØHTô	VçØ×Ñ˜Ô&Ü Ÿj™jŸo™o¨iÓ8€IˆlÑØÐr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   ÚcacherL   )rS   r	   )r   s   "r   r   r   Ð   s   € ÷ ñ œtð ¬#ñ r   c                ó|   € \        V 4      \        8¼  d$   V P                  \        \	        V 4      4      4       W V&   R# )z<Insert into a bounded probe cache, FIFO-evicting at the cap.N)r@   Ú_PROBE_CACHE_MAXrs   ÚnextÚiter)r�   rL   Úvalues   &&&r   Ú_cache_probe_resultr“   Ð   s+   € ä
ˆ5ƒzÔ%Ô%Ø�	‰	”$”t˜E“{Ó#Ô$Øˆ#ƒJr   ÚtextFc                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   Úpython_pathÚcoder”   r   )r   s   "r   r   r   ×   s!   € ÷ ñ œsð ¬#ð ¼ñ r   c               ó  €  ^ RI Hp \        P                  ! V RV.^RT\        '       d   \        P
                  M^ \        P                  V! 4       RR7      #   \        \        P                  \        P                  3 d     R# i ; i)zRRun ``python_path -c code``; None if missing, unspawnable, or past the 5s timeout.)r2   z-cTF)ÚtimeoutÚcapture_outputr”   ÚcreationflagsÚstdinÚenvÚcheckN)
rC   r2   Ú
subprocessÚrunr7   ÚCREATE_NO_WINDOWÚDEVNULLÚOSErrorÚTimeoutExpiredÚSubprocessError)r–   r—   r”   r2   s   &&$ r   Ú_probe_pythonr¦   ×   ss   € ð	ÝKÜ�~Š~Ø˜$ Ð%¨qÀÈDß9D»œ*×5Ò5È!Ü×$Ñ$Ñ*HÓ*JØô	
ð 	
øô ”Z×.Ñ.´
×0JÑ0JÐKô Úðús   ‚(A «,A Á*BÂBc                ó0   € V ^8„  d   QhR\         R\        /# ©r   r–   r   r   )r   s   "r   r   r   å   s   € ÷ 
ñ 
¤3ð 
¬4ñ 
r   c                óž   € \         P                  V 4      pVe   V# \        V R4      pVf   R# VP                  ^ 8H  p\	        \         W4       V# )zbWhether the interpreter is Python 3.8+ (what the RPC stubs need); success cached, failure retried.z<import sys; sys.exit(0 if sys.version_info >= (3, 8) else 1)F)Ú_usable_python_cacherD   r¦   Ú
returncoder“   )r–   ÚcachedÚresultÚusables   &   r   Ú_is_usable_pythonr¯   å   sR   € ä!×%Ñ% kÓ2€FØÒØˆÜ˜;Ð(fÓg€FØ‚~ÙØ×Ñ !Ñ#€FÜÔ,¨kÔBØ€Mr   c                ó0   € V ^8„  d   QhR\         R\         /# r¨   ©r	   )r   s   "r   r   r   ò   s   € ÷ 
ñ 
¬Cð 
´Cñ 
r   c                óT  € \         P                  V 4      pVe   V# \        V RRR7      pVe{   VP                  ^ 8X  dj   VP                  P                  4       '       dJ   \        P                  P                  VP                  P                  4       4      p\        \         W4       V# R# )z[Resolved ``sys.prefix`` reported by *python_path* ("" on failure; failures are not cached).zimport sys; print(sys.prefix)T)r”   rn   )
Ú_python_prefix_cacherD   r¦   r«   ÚstdoutÚstriprz   r}   Úrealpathr“   )r–   r¬   r­   Úprefixs   &   r   Ú_python_environment_prefixr¸   ò   s…   € ä!×%Ñ% kÓ2€FØÒØˆÜ˜;Ð(GÈdÔS€FØÒ˜f×/Ñ/°1Ô4¸¿¹×9LÑ9L×9NÒ9NÜ—‘×!Ñ! &§-¡-×"5Ñ"5Ó"7Ó8ˆÜÔ0°+ÔFØˆÙr   c                ó0   € V ^8„  d   QhR\         R\        /# r¨   r   )r   s   "r   r   r   ÿ   s   € ÷ Sñ S´ð S¼ñ Sr   c                ó@  € V \         P                  8X  gP   \        P                  P	                  V 4      \        P                  P	                  \         P                  4      8X  d   R# \        V 4      \        P                  P	                  \         P                  4      8H  # )u  Whether *python_path* belongs to Hermes's active Python environment. Short-circuits when
it IS the running interpreter (by path or realpath â€” covers ``uv run`` venvs) so no probe
runs on the default strict path and a flaky probe can never drop the hermes root.T)ru   rv   rz   r}   r¶   r¸   r·   )r–   s   &r   r|   r|   ÿ   sb   € ð ”c—n‘nÔ$¬¯©×(8Ñ(8¸Ó(EÌÏÉ×IYÑIYÔZ]×ZhÑZhÓIiÔ(iÙÜ% kÓ2´b·g±g×6FÑ6FÄsÇzÁzÓ6RÑRÐRr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Úmoder   r±   )r   s   "r   r   r     s   € ÷ ñ ¤ð ¬ñ r   c                óh  € V R8w  d   \         P                  # ^ RIHp V! 4       p\        '       d   RMRw  r4R Fç  pVP                  VR4      P                  4       pV'       d   TMR F´  p\        P                  P                  WcV4      p\        P                  P                  V4      '       d,   \        P                  ! V\        P                  4      '       g   Ku  \        V4      '       d   Vu u # \        P                  RWX4       \         P                  u u # 	  Ké  	  \         P                  # )	z±Child interpreter: ``sys.executable`` in strict mode; in project mode the active
VIRTUAL_ENV/CONDA_PREFIX python if it exists and passes the 3.8+ probe, else ``sys.executable``.Úproject)rY   rn   z\execute_code: skipping %s=%s (Python version < 3.8 or broken). Using sys.executable instead.)ÚScripts)z
python.exezpython3.exe)Úbin)ÚpythonÚpython3)ÚVIRTUAL_ENVÚCONDA_PREFIXr   )ru   rv   rp   rY   r7   rD   rµ   rz   r}   rA   ÚisfileÚaccessÚX_OKr¯   r>   rƒ   )	r¼   rY   ÚenvironÚsubdirÚ	exe_namesÚvarÚrootÚexerk   s	   &        r   Ú_resolve_child_pythonrÎ     sß   € ð ˆyÔÜ�~‰~ÐÝ:ÙÓ!€GßFQÃkÑBÐWuÑ€FÛ.ˆØ�{‰{˜3 Ó#×)Ñ)Ó+ˆß $‘9¨"Ò,ˆCÜŸ™Ÿ™ T°3Ó7ˆIÜ—G‘G—N‘N 9×-Ò-´"·)²)¸IÄrÇwÁw×2OÒ2OÙÜ  ×+Ò+Ø Ô Ü�K‰Kð 8Ø9<ôIä—>‘>Ô!ó -ñ /ô �>‰>Ðr   c                óH   € V ^8„  d   QhR\         R\         R\         R\         /# )r   r¼   Ústaging_dirÚtask_idr   r±   )r   s   "r   r   r     s(   € ÷ ñ œSð ¬sð ¼Sð Ì#ñ r   c                ó”  € V R8w  d   V# V'       d}    ^ RI Hp V! V4      pV'       d(   \        P                  P                  V4      '       d   V#  ^ RIHp V! V4      pV'       d(   \        P                  P                  V4      '       d   V# ^ RIH	p V! 4       P                  4       pV'       d    \        P                  P                  V4      MR\        P                  ! 4       3 F6  p	V	'       g   K  \        P                  P                  V	4      '       g   K4  V	u # 	  V#   \         d    Rp ELi ; i  \         d    Rp Lçi ; i)u  Child cwd. Strict: the staging dir. Project mirrors the terminal/file-tool ladder so every
file-writing path agrees: session cwd record (`cd` state) â†’ registered ``session.cwd.set``
override â†’ TERMINAL_CWD â†’ os.getcwd() â†’ staging dir (never Popen on a missing cwd).

(#56047)
r¾   )Úget_session_cwdN)Ú_registered_task_cwd_override)Úscope_terminal_cwdrn   )Útools.terminal_toolrÓ   r6   rz   r}   ÚisdirÚtools.file_tools_pathsrÔ   Úagent.runtime_cwdrÕ   rµ   Ú
expanduserÚgetcwd)
r¼   rÐ   rÑ   rÓ   ÚrecordedrÔ   Úsession_cwdrÕ   Úrawrk   s
   &&&       r   Ú_resolve_child_cwdrß     sÿ   € ð ˆyÔØÐßð	Ý;Ù& wÓ/ˆH÷ œŸ™Ÿ™ h×/Ò/ØˆOð	ÝLÙ7¸Ó@ˆK÷ œ2Ÿ7™7Ÿ=™=¨×5Ò5ØÐÝ4Ù
Ó
×
$Ñ
$Ó
&€Cß14”b—g‘g×(Ñ(¨Ô-¸"¼b¿iºi»kÓJˆ	ß‰9œŸ™Ÿ™ y×1Ô1ØÒñ Kð Ðøô! ô 	Ø‹Hð	ûô ô 	ØŠKð	ús#   “D# ÁD7 Ä#D4Ä3D4Ä7EÅEc                ó�   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   ^\         9   d
   \        ;R&   ^\         9   d
   \        ;R&   # )r   rª   r³   r�   )Ú__conditional_annotations__rS   Úset)r   s   "r   r   r      sH   € ÷ ñ ÷P  Ò ”dÑ ñQ÷R  Ò ”dÑ ñS÷X "Ò !”cÑ !òYr   )ÚPATHÚHOMEÚUSERÚLANGÚLC_ÚTERMÚTMPDIRÚTMPÚTEMPÚSHELLÚLOGNAMEÚXDG_rm   rÃ   ÚCONDA)ÚKEYÚTOKENÚSECRETÚPASSWORDÚ
CREDENTIALÚPASSWDÚAUTHÚDSNÚWEBHOOKÚCREDSÚBEARERÚAPIKEYÚCOOKIE>   Ú
HERMES_ENVrc   ÚHERMES_CONFIGÚHERMES_PROFILEÚHERMES_DELEGATED_CHILD_CONTEXT>   ÚOSÚPUBLICÚWINDIRÚAPPDATAÚCOMSPECÚPATHEXTÚHOMEPATHÚUSERNAMEÚ	HOMEDRIVEÚ
SYSTEMROOTÚ
USERDOMAINÚPROGRAMDATAÚSYSTEMDRIVEÚUSERPROFILEÚCOMPUTERNAMEÚLOCALAPPDATAÚPROGRAMFILESÚPROGRAMW6432ÚALLUSERSPROFILEÚNUMBER_OF_PROCESSORSÚPROCESSOR_ARCHITECTUREúPROGRAMFILES(X86))rn   )"rá   Ú__doc__Úloggingrz   ÚplatformrŸ   ru   Útypingr   Ú	getLoggerr>   Úsystemr7   r9   r   r   rq   r:   r;   rM   r‹   r�   rª   r³   râ   r�   r“   r¦   r¯   r¸   r|   rÎ   rß   r   )rá   s   @r   Ú<module>r     sï   øðöó Û 	Û Û Û 
Ý ð 
×	Ò	Ð6Ó	7€à�oŠoÓ 9Ñ,€ðOÐ ðHÐ õ>ñ "ò #ó Ð ñ (ò )ó Ð ð 15ÀÑQZÓQ\ô >4õBIð\ Ð ØÐ Ó ØÐ Ó ñ  ›EÐ Ó !õð¸u÷ õ
õ
õSõ÷,ñ r   