Ë
    ãß²j˜M  ã                   óÒ  — U d 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	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm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&  ejN                  d«      Z(da)ee*   e+d<   de*de,fd„Z-dee*   ddfd„Z.dee*   fd„Z/dZ0dZ1dZ2dZ3dZ4dddddddg fd d!g fd"i fd#d$g fd%d&d'd(d)d*fZ5d+dg fd,d-d!g fd.d"i fd/d0d1d$g fd2d3d4d5fZ6d6e
e*e	f   de7fd7„Z8d6e
e*e	f   de7fd8„Z9d9e
e*e	f   de7fd:„Z:d;e*de,fd<„Z;d=e<dz  de
e*e	f   fd>„Z=d?e
e*e	f   de>e*e*f   fd@„Z?dA„ Z@dB„ ZAdC„ ZBdD„ dEdF„ fdG„ dEdH„ fdI„ dJdK„ fdLœZCdM„ ZD ejŠ                  eDdN«      ZF ejŠ                  eDdO«      ZG ejŠ                  eDdP«      ZHdJdQœdR„ZIdS„ ZJe@eAeFeBeGeHeIdTœZK	 	 	 dudUe*dVe*dWe*dXeLdYe7dZe7d[e7d\e*d]ee*   d^e,fd_„ZMd6e
e*e	f   de,fd`„ZNd6e
e*e	f   dee,   fda„ZOd6e
e*e	f   de,fdb„ZPd6e
e*e	f   de,fdc„ZQi ddde„ dfdgfidddh„ didfidjePieOdkdlœdjeNidmeQidnœZRe
e*e
e*e	f   f   e+do<   dpdqdrœZSdUe*d6e
e*e	f   de,fds„ZTd6e
e*e	f   de,fdt„ZUeRD � ci c]  } |  ejŠ                  eT| «      “Œ c} ZVeVdP   ZWyc c} w )va  Execution-environment backends for the terminal tool: per-backend builders, config-to-kwargs
shapers, and requirement checkers, routed by dispatch/spec tables. Split out of ``tools/terminal_tool.py``;
the terminal tool imports the builders/checkers it uses from here.é    N)ÚAnyÚDictÚOptional)ÚDockerEnvironment)ÚLocalEnvironment)ÚManagedModalEnvironment)ÚModalEnvironment)ÚSingularityEnvironment)ÚSSHEnvironment)Úis_managed_tool_gateway_ready)Ú_get_plugin_env_provider)Úhas_direct_modal_credentialsÚmanaged_nous_tools_enabledÚ%nous_tool_gateway_unavailable_messageÚresolve_modal_backend_stateztools.terminal_toolÚ_last_unavailable_reasonÚreasonÚreturnc                 ó2   — | a t        j                  | «       y)zWLog *reason*, remember it for the user-facing notice, and return False for the checker.F)r   ÚloggerÚerror©r   s    úA/home/ubuntu/.hermes/hermes-agent/tools/terminal_tool_backends.pyÚ_rejectr   !   s   € ð  &ÐÜ
‡L�L�ÔØó    c                 ó   — | a y)z^Store (or clear) the last failure reason without logging; used by check_terminal_requirements.N©r   r   s    r   Ú_record_unavailable_reasonr   )   s
   € ð  &Ñr   c                  ó   — t         S )zUWhy the last terminal requirements check failed, in plain words; None when it passed.r   © r   r   Ú#terminal_backend_unavailable_reasonr!   /   s   € ä#Ð#r   z/vercel/sandbox)Únode24Únode22z
python3.13z?local, docker, singularity, modal, daytona, vercel_sandbox, ssh))ÚhostÚssh_hostÚ )ÚuserÚssh_userr&   )ÚportÚssh_porté   )ÚkeyÚssh_keyr&   )Ú
persistentÚssh_persistentF))ÚcpuÚcontainer_cpué   )ÚmemoryÚcontainer_memoryé   )ÚdiskÚcontainer_diské È  )Úpersistent_filesystemÚcontainer_persistentT)r1   r2   )r4   r5   )r7   r8   )r:   T)Ú
modal_modeÚauto)Úvercel_runtimer&   Údocker_volumes)Údocker_mount_cwd_to_workspaceFÚdocker_forward_envÚ
docker_env)Údocker_run_as_host_userFÚdocker_extra_args)Údocker_shm_sizeÚ1g)Údocker_networkT)Údocker_persist_across_processesT)Údocker_shared_container_keyr&   )Údocker_orphan_reaperT)Údocker_snap_compatFÚvolumes)Úauto_mount_cwdr?   FÚforward_envÚenv)Úrun_as_host_userrB   F)ÚnetworkrF   TÚ
extra_args)Úpersist_across_processesrG   T)Úshared_container_keyrH   r&   )Úshm_sizerD   rE   )Úsnap_compatrJ   FÚconfigc           
      ój   — t         D ���ci c]  \  }}}|| j                  ||«      “Œ c}}}S c c}}}w )zZ``ssh_config`` for :func:`_create_environment` (shared with the lazy ``ensure_task_env``).)Ú	_SSH_KEYSÚget)rV   Úoutr,   Údefaults       r   Ú_ssh_config_from_configr\   P   s0   € äCL×MÐMÑ.?¨c°3¸ˆC�—‘˜C Ó)Ñ)ÔMÐMùÔMó   ‹.c           	      ób   — t         D ��ci c]  \  }}|| j                  ||«      “Œ c}}S c c}}w )z```container_config`` for :func:`_create_environment` (shared with the lazy ``ensure_task_env``).)Ú_CONTAINER_KEYSrY   )rV   ÚkÚds      r   Ú_container_config_from_configrb   U   s*   € ä,;×<¡D A qˆAˆv�z‰z˜!˜QÓÑÓ<Ð<ùÓ<s   Š+Úccc           
      ój   — t         D ���ci c]  \  }}}|| j                  ||«      “Œ c}}}S c c}}}w )zICommon sandbox resource kwargs (cpu/memory in MB/disk in MB/persistence).)Ú_RESOURCE_KEYSrY   )rc   rZ   r,   r[   s       r   Ú
_resourcesrf   Z   s0   € ä?M×NÐNÑ*;¨#¨s°GˆC�—‘˜˜WÓ%Ñ%ÔNÐNùÔNr]   Úruntimec                 ó   — |  xs | t         v S ©N)Ú_SUPPORTED_VERCEL_RUNTIMES)rg   s    r   Ú_is_supported_vercel_runtimerk   _   s   € Øˆ;Ò?˜'Ô%?Ð?Ð?r   r;   c                 ó@   — t        | t        «       t        d«      ¬«      S )z2Resolve direct vs managed Modal backend selection.Úmodal)Ú
has_directÚmanaged_ready)r   r   r   )r;   s    r   Ú_get_modal_backend_staterp   c   s"   € ä& zÔ>ZÓ>\Ü5RÐSZÓ5[ô]ð ]r   Úmodal_statec                 óØ   — t        d«      }| d   s| d   dk(  r| d   rd|› d�nd|› �}d|› �d	|› �fS t        «       }| d   d
k(  rd|rdnd› d�dfS |rdnd}|rdnd}d|› d|› d�d|› d�fS )z™(log message, ValueError message) for a modal_state with no selected backend.
    Single decision shared by the requirements checker and the env builder.zmanaged Modal executionÚmanaged_mode_blockedÚmodeÚmanagedzgNous Tool Gateway access is not currently available and no direct Modal credentials/config were found. zH Choose TERMINAL_MODAL_MODE=direct/auto to use direct Modal credentials.z)the managed tool gateway is unavailable. z=Modal backend selected with TERMINAL_MODAL_MODE=managed, but z2Modal backend is configured for managed mode, but Údirectz™Modal backend selected with TERMINAL_MODAL_MODE=direct, but no direct Modal credentials/config were found. Configure Modal or choose TERMINAL_MODAL_MODE=zmanaged/autor<   ú.z_Modal backend is configured for direct mode, but no direct Modal credentials/config were found.z!or managed tool gateway was foundz	was foundz , set up the managed gateway, orz orz>Modal backend selected but no direct Modal credentials/config z. Configure Modalz! choose a different TERMINAL_ENV.)r   r   )rq   ÚgatewayÚtailru   ÚfoundÚfixs         r   Ú_modal_unavailable_reasonr|   i   sÿ   € ô 4Ð4MÓN€GØÐ)Ò*¨k¸&Ñ.AÀYÒ.Nð Ð5Ò6ð Ø '˜yÐ(pñrà>gÐhoÐgpÐ<qð 	ð PÐPTÈvÐVØDÀTÀFÐKðMð 	Mä(Ó*€GØ�6Ñ˜hÒ&ðMÙ_fÉ^ÐlrÐLsÐstðvàqðsð 	sñ 4;Ñ/À€EÙ07Ñ
,¸U€CØLÈUÈGð TØ!˜UÐ"CðEàLÈUÈGÐSTÐUðWð Wr   c                 ó   — t        | |¬«      S )N)ÚcwdÚtimeout)Ú_LocalEnvironment)r~   r   Ú_s      r   Ú_build_local_envr‚   �   s   € Ü ¨gÔ6Ð6r   c           
      ó@  — ddl m}m}m}	  |	|«        |«       xr |dk7  xr	  ||«       }
t        D ���ci c]  \  }}}||j                  ||«      “Œ }}}}|
rd|d<   t        d| ||||dœt        |«      ¤|¤Ž}|
r
	 d|_        |S |S c c}}}w # t        $ r Y |S w xY w)	Nr   )Ú!_docker_session_isolation_enabledÚ_has_isolation_overridesÚ_maybe_reap_docker_orphansr[   FrR   )Úimager~   r   Útask_idÚhost_cwdTr    )
Útools.terminal_toolr„   r…   r†   Ú_DOCKER_KWARGSrY   Ú_DockerEnvironmentrf   Ú_session_scopedÚAttributeError)r‡   r~   r   rc   rˆ   r‰   r�   r„   r…   r†   Úsession_scopedrZ   r,   r[   ÚkwargsÚdocker_env_objs                   r   Ú_build_docker_envr’   …   sð   € ÷Añ Añ ˜rÔ"ñ 8Ó9ò @¸gÈÑ>Rò @Ù6°wÓ?Ð?ð äAO×PÐPÑ,=¨C°°gˆc�2—6‘6˜#˜wÓ'Ñ'ÐP€FÒPÙØ-2ˆÐ)Ñ*Ü'ð D¨e¸ÀgÐW^Ðiqñ DÜ*4°R«.ðDØ<BñD€Nñ ð	Ø-1ˆNÔ*ð Ðˆ>Ðùô Qøô ò 	ØØÐð	ús   ¶B	Á>B Â	BÂBc                 óÄ  — t        |«      }dD �ci c]  }||   dkD  sŒ|||   “Œ }}|d   dkD  rB	 dd l}	dt        j                  |	j                  j
                  «      j                  v r|d   |d<   t        |j                  d«      «      }
|
d   }|dvrt        t        |
«      d   «      ‚|d	k(  rt        nt        } || ||||d
   |¬«      S c c}w # t        $ r Y Œlw xY w)N)r0   r3   r   r6   Úephemeral_diskr;   Úselected_backend)ru   rv   r2   ru   r9   )r‡   r~   r   Úmodal_sandbox_kwargsr9   rˆ   )rf   rm   ÚinspectÚ	signatureÚSandboxÚcreateÚ
parametersÚ	Exceptionrp   rY   Ú
ValueErrorr|   Ú_ManagedModalEnvironmentÚ_ModalEnvironment)r‡   r~   r   rc   rˆ   r�   Úresr`   Úsandbox_kwargsrm   rq   ÚselectedÚclss                r   Ú_build_modal_envr¤   Ÿ   s   € Ü
�R‹.€CØ):ÖI A¸cÀ!¹fÀq»j�a˜˜Q™‘iÐI€NÐIØ
ˆ6�{�Q‚ð	ÛØ¤7×#4Ñ#4°U·]±]×5IÑ5IÓ#J×#UÑ#UÑUØ36°v±;�Ð/Ñ0ô +¨2¯6©6°,Ó+?Ó@€KØÐ-Ñ.€HØÐ,Ñ,ÜÔ2°;Ó?ÀÑBÓCÐCØ&.°)Ò&;Õ
"ÔAR€CÙ�U ¨WÈ>Ø%(Ð)@Ñ%AÈ7ôTð Tùò Jøô ò 	Ùð	ús   �CžC±AC Ã	CÃCc                  ó   — t         S ri   )Ú_SingularityEnvironmentr    r   r   ú<lambda>r§   µ   s   € Ô3€ r   Tc                 ó   — i S ri   r    ©rc   Úkws     r   r§   r§   µ   s   € È"€ r   c                  ó@   — t        j                  d«      j                  S )Nztools.environments.daytona)Ú	importlibÚimport_moduleÚDaytonaEnvironmentr    r   r   r§   r§   ¶   s   € œ	×/Ñ/Ð0LÓM×`Ñ`€ r   c                 ó"   — dt        |d   «      iS )Nr0   )Úintr©   s     r   r§   r§   ·   s   €  ¤s¨2¨e©9£~Ð6€ r   c                  ó@   — t        j                  d«      j                  S )Nz!tools.environments.vercel_sandbox)r¬   r­   ÚVercelSandboxEnvironmentr    r   r   r§   r§   ¸   s   € œy×6Ñ6Ð7ZÓ[×tÑt€ r   Fc                 ó0   — d| j                  d«      xs d iS )Nrg   r=   )rY   r©   s     r   r§   r§   ¹   s   € ¨i¸¿¹Ð@PÓ9QÒ9YÐUYÐ-Z€ r   )ÚsingularityÚdaytonaÚvercel_sandboxc                ó¦   — t         |    \  }}}	t        d|||dœt        |«      ¤|rd|ini ¤Ž}
|
j                   |	||
«      «         |«       di |
¤ŽS )N)r~   r   rˆ   r‡   r    )Ú_SANDBOX_ROWSÚdictrf   Úupdate)Úenv_typer‡   r~   r   rc   rˆ   r�   r£   Ú
with_imageÚextrar�   s              r   Ú_build_sandbox_envr¾   ½   sg   € Ü*¨8Ñ4Ñ€Cˆ�UÜð >�c 7°Gñ >¼zÈ"»~ð >Ù)3�g˜uÑ%¸ñ>€Fà
‡M�M‘%˜˜FÓ#Ô$Ø‰3‹5‰?�6‰?Ðr   r´   rµ   r¶   )Ú
probe_onlyc           	      óÐ   — |r"|j                  d«      r|j                  d«      st        d«      ‚t        |d   |d   |j                  dd«      |j                  dd«      | ||¬«      S )	Nr$   r'   z?SSH environment requires ssh_host and ssh_user to be configuredr)   r+   r,   r&   )r$   r'   r)   Úkey_pathr~   r   r¿   )rY   r�   Ú_SSHEnvironment)r~   r   Ú
ssh_configr¿   r�   s        r   Ú_build_ssh_envrÄ   Ê   sl   € Ù˜ZŸ^™^¨FÔ3¸:¿>¹>È&Ô;QÜÐZÓ[Ð[Ü 
¨6Ñ 2¸ÀFÑ9KÐR\×R`ÑR`ÐagÐikÓRlØ$.§N¡N°5¸"Ó$=À3ÐPWÐdnôpð pr   c                 ó–  — t        | «      }|�F|j                  |||||¬«      }	 |j                  j                  «       j	                  «       |_        |S 	 ddlm}	  |	«       }
dj                  d„ t        j                  d«      t        |
«      z   D «       «      }t        d| › d|› �«      ‚# t        $ r Y |S w xY w# t        $ r g }
Y Œew xY w)N)r~   r   rˆ   r‡   Úcontainer_configr   )Úplugin_backend_namesú, c              3   ó(   K  — | ]
  }d |› d �–— Œ y­w)ú'Nr    )Ú.0Úns     r   ú	<genexpr>z$_build_plugin_env.<locals>.<genexpr>â   s   è ø€ Ò[ 1˜˜!˜˜A”hÑ[ùs   ‚zUnknown environment type: z. Use )r   Úcreate_environmentÚnameÚstripÚlowerÚ_hermes_backend_namerŽ   Úagent.terminal_env_registryrÇ   rœ   ÚjoinÚ_BUILTIN_BACKENDSÚsplitÚlistr�   )r»   r‡   r~   r   rc   rˆ   r�   ÚproviderÚenv_objrÇ   Úplugin_namesÚknowns               r   Ú_build_plugin_envrÜ   Ñ   sâ   € Ü'¨Ó1€HØÐØ×-Ñ-°#¸wÐPWÐ_dØ?Að .ó Cˆð	Ø+3¯=©=×+>Ñ+>Ó+@×+FÑ+FÓ+HˆGÔ(ð ˆðÝDÙ+Ó-ˆð �I‰IÑ[Ô(9×(?Ñ(?ÀÓ(EÌÈ\ÓHZÑ(ZÔ[Ó[€EÜ
Ð1°(°¸6À%ÀÐIÓ
JÐJøô ò 	ØØˆð	ûô ò ØŠðús#   ¥-B* ÁB: Â*	B7Â6B7Â:CÃC)ÚlocalÚdockerr´   rm   rµ   r¶   Ússhr»   r‡   r~   r   rÃ   rÆ   Úlocal_configrˆ   r‰   r¿   c
           
      ó¾   — t         j                  | «      }
t        ||||xs i ||||	¬«      }|
�	 |
di |¤Ž}nt        dd| i|¤Ž}	 | |_        |S # t
        $ r Y |S w xY w)a«  Create an execution environment (instance with ``execute()``) for *env_type*. ``image`` is ignored
    for local/ssh/vercel; ``container_config`` carries the container_*/docker_* resource keys; ``host_cwd`` is
    the host dir bound into Docker when cwd mounting is enabled. ``probe_only`` asks ssh for a throwaway
    connection with no remote setup/sync (the prompt-time probe). Unknown types fall through to plugin backends.)r‡   r~   r   rc   rˆ   rÃ   r‰   r¿   r»   r    )Ú_ENV_BUILDERSrY   r¹   rÜ   r»   rœ   )r»   r‡   r~   r   rÃ   rÆ   rà   rˆ   r‰   r¿   Úbuilderr�   rN   s                r   Ú_create_environmenträ   ì   s‰   € ô ×Ñ Ó)€GÜ˜ 3°Ð<LÒ<RÐPRÐ\cØ'°(ÀzôS€FàÐÙÑ˜Ñ‰äÑ<¨Ð<°VÑ<ˆðØˆŒð €Jøô ò ØØ€Jðús   ÁA Á	AÁAc                 óþ  — | j                  d«      xs dj                  «       }| j                  dd«      }t        |«      s%t        d|›ddj	                  t
        «      › d�«      S |d	vrt        d
|› d�«      S t        j                  j                  d«      €t        d«      S ddl	m
}  |d«      rydD �cg c]  }t         ||«      «      ‘Œ }}t        |«      ryt        |«      rdnd}t        d|› d�«      S c c}w )zZRuntime -> disk -> SDK -> auth (OIDC token, else the full TOKEN/PROJECT_ID/TEAM_ID tuple).r=   r&   r7   r8   zVercel Sandbox runtime z: is not supported. Set TERMINAL_VERCEL_RUNTIME to one of: rÈ   rw   >   r   r8   z?Vercel Sandbox does not support custom TERMINAL_CONTAINER_DISK=z,. Use the default shared setting (51200 MB).ÚvercelzNvercel is required for the Vercel Sandbox terminal backend: pip install vercelr   ©Ú
get_secretÚVERCEL_OIDC_TOKENT)ÚVERCEL_TOKENÚVERCEL_PROJECT_IDÚVERCEL_TEAM_IDzkselected with token auth, but VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_ID must all be set together.zselected but no supported auth configuration was found. Set VERCEL_TOKEN, VERCEL_PROJECT_ID, and VERCEL_TEAM_ID for normal use.zVercel Sandbox backend zC VERCEL_OIDC_TOKEN is supported for one-off local development only.)rY   rÐ   rk   r   rÔ   rj   r¬   ÚutilÚ	find_specÚagent.secret_scoperè   ÚboolÚallÚany)rV   rg   r6   rè   r`   ÚpresentÚheads          r   Ú_check_vercelrõ     s   € à�z‰zÐ*Ó+Ò1¨r×8Ñ8Ó:€GØ�:‰:Ð&¨Ó.€DÜ'¨Ô0ÜÐ0°°Ð;uØŸ)™)Ô$>Ó?Ð@ÀðCó Dð 	Dà�:ÑÜÐXÐY]ÐX^ð _Dð Dó Eð 	Eä‡~�~×Ñ Ó)Ð1ÜÐgÓhÐhÝ-ÙÐ%Ô&ØØ,cÖd qŒt‘J˜q“MÕ"Ðd€GÐdÜ
ˆ7„|Øä" 7œ|ñð1ð 	ô Ð,¨T¨FÐ2uÐvÓwÐwùò es   Â6C:c                 óˆ   — t        | j                  d«      «      }|d   dk(  ry|d   dk7  rt        t        |«      d   «      S y )Nr;   r•   ru   Trv   r   )rp   rY   r   r|   )rV   rq   s     r   Ú
_modal_prer÷   !  sM   € Ü*¨6¯:©:°lÓ+CÓD€KØÐ%Ñ&¨)Ò3ØØÐ%Ñ&¨(Ò2ÜÔ0°Ó=¸aÑ@ÓAÐAØr   c                 ó^   — | j                  d«      r| j                  d«      ryt        d«      S )Nr%   r(   Tz—the SSH host and user are not configured (TERMINAL_SSH_HOST / TERMINAL_SSH_USER); run `hermes setup terminal` to enter them or pick the 'local' backend)rY   r   )rV   s    r   Ú_ssh_prerù   *  s1   € Ø‡z�z�*Ô &§*¡*¨ZÔ"8ØÜð [ó \ð \r   c                 ó.   — ddl m} ddlm}  |d«      d uS )Nr   )ÚDaytonarç   ÚDAYTONA_API_KEY)rµ   rû   rï   rè   )rV   rû   rè   s      r   Ú_daytona_postrý   1  s   € ÝÝ-ÙÐ'Ó(°Ð4Ð4r   Úbinaryc                  óH   — t        j                  d«      j                  «       S )Nztools.environments.docker)r¬   r­   Úfind_dockerr    r   r   r§   r§   9  s   € ¤)×"9Ñ"9Ð:UÓ"V×"bÑ"bÓ"d€ r   ÚversionuW   Docker is not installed â€” no docker executable in PATH or the usual install locationsc                  óZ   — t        j                  d«      xs t        j                  d«      S )NÚ	apptainerr´   )ÚshutilÚwhichr    r   r   r§   r§   ;  s   € ¤v§|¡|°KÓ'@Ò'_ÄFÇLÁLÐQ^ÓD_€ r   z	--versionÚpre)rm   zFmodal is required for direct modal terminal backend: pip install modal)r  ÚmoduleÚpost)rÝ   rÞ   r´   rß   rm   r¶   rµ   Ú_BACKEND_SPECSz8Docker is installed but the Docker daemon is not runningzVApptainer/Singularity is installed but `--version` failed, so the install looks broken)rÞ   r´   c           
      ó  — t        d «       t        |    }d|v r |d   |«      nd }|�|S d|v r†|d   \  }}} |«       }|st        |xs d| ›d�«      S t        j                  ||gddt        j
                  ¬«      }|j                  dk7  r(t        t        |    › d	|› d
|› d|j                  › d�«      S yd|v r6t        j                  j                  |d   d   «      €t        |d   d   «      S d|v r |d   |«      st        d| ›d�«      S y)Nr  rþ   úthe z# backend's executable was not foundTé   )Úcapture_outputr   Ústdinr   z (`Ú z` exited with code ú)r  r2   r  z& backend is missing its API key or SDK)r   r	  r   Ú
subprocessÚrunÚDEVNULLÚ
returncodeÚ_PROBE_FAILED_REASONSr¬   rí   rî   )	r»   rV   ÚspecÚverdictÚfinderÚargÚmissing_msgÚ
executableÚprobes	            r   Ú_check_requirementsr  J  s>  € Ü˜tÔ$Ü˜(Ñ#€DØ%*¨d¡]ˆkˆd�5‰k˜&Ô!¸€GØÐØˆØ�4ÑØ#'¨¡>Ñ ˆ��[Ù“Xˆ
ÙÜ˜;Ò`¨D°°Ð<_Ð*`ÓaÐaÜ—‘ 
¨CÐ0ÀÈqÔXb×XjÑXjÔkˆØ×Ñ˜qÒ ÜÔ3°HÑ=Ð>¸cÀ*ÀÈQÈsÈeÐSfÐgl×gwÑgwÐfxÐxyÐzÓ{Ð{ØØ�4ÑœIŸN™N×4Ñ4°T¸(±^ÀAÑ5FÓGÐOÜ�t˜H‘~ aÑ(Ó)Ð)Ø��~˜l˜d 6™l¨6Ô2Ü˜˜h˜\Ð)OÐPÓQÐQØr   c                 óÂ   — t        d «       | d   }t        |«      }|�-t        |j                  | «      «      }|xs t	        d|›d�«      S t	        d|› dt
        › d�«      S )Nr»   r  z5 plugin backend reported its requirements are not metzUnknown TERMINAL_ENV 'z'. Use one of: z!, or a plugin-registered backend.)r   r   rð   Úcheck_requirementsr   rÕ   )rV   r»   rØ   Úoks       r   Ú_check_plugin_requirementsr!  `  sq   € Ü˜tÔ$Ø�jÑ!€HÜ'¨Ó1€HØÐÜ�(×-Ñ-¨fÓ5Ó6ˆØÒf”W˜t H <Ð/dÐeÓfÐfÜÐ+¨H¨:°_ÔEVÐDWÐWxÐyÓzÐzr   )NNNr[   NF)XÚ__doc__Ú	functoolsÚimportlib.utilr¬   r—   Úloggingr  r  Útypingr   r   r   Útools.environments.dockerr   rŒ   Útools.environments.localr   r€   Ú tools.environments.managed_modalr   rž   Útools.environments.modalr	   rŸ   Útools.environments.singularityr
   r¦   Útools.environments.sshr   rÂ   Útools.managed_tool_gatewayr   Útools.terminal_tool_configr   Útools.tool_backend_helpersr   r   r   r   Ú	getLoggerr   r   ÚstrÚ__annotations__rð   r   r   r!   Ú_VERCEL_SANDBOX_DEFAULT_CWDrj   rÕ   rX   re   r_   r‹   r¹   r\   rb   rf   rk   Úobjectrp   Útupler|   r‚   r’   r¤   r¸   r¾   ÚpartialÚ_build_singularity_envÚ_build_daytona_envÚ_build_vercel_envrÄ   rÜ   râ   r°   rä   rõ   r÷   rù   rý   r	  r  r  r!  Ú_REQUIREMENT_CHECKERSÚ"_check_vercel_sandbox_requirements)rÏ   s   0r   ú<module>r<     sº  ðòFó Û Û Û Û Û ß &Ñ &å MÝ JÝ `Ý JÝ \Ý DÝ DÝ ?÷ló lð 
ˆ×	Ñ	Ð0Ó	1€ð
 +/Ð ˜( 3™-Ó .ð�Cð ˜Dó ð& x°¡}ð &¸ó &ð$¨X°c©]ó $ð
 0Ð Ø?Ð ØUÐ ðN€	ðn€ð Ð4Ð6OØ"Ð$:Ð<RØ�rÐÐDÐG[Ð]_ÐF`Ø�2ÐÐ:Ð=PÐRTÐ<UØÐ7Ð9bØ'Ð)GÐIfð€ð Ð  "Ð%Ð'aØÐ(¨"Ð-°°|ÀRÐ/HØ:Ð<_ØÐ&¨Ð+Ð-rØ?ÐAfØ0ð€ðN D¨¨c¨¡Nð N°tó Nð
=¨$¨s°C¨x©.ð =¸Tó =ð
O�4˜˜S˜‘>ð O dó Oð
@¨#ð @°$ó @ð]¨°$©ð ]¸4ÀÀSÀ¹>ó ]ðW¨4°°S°©>ð W¸eÀCÈÀH¹oó Wò07òò4Tñ, 4°TÑ;LÐMÙ`ÐbfÙ6ð8átØÑZð\ñ	€òð +˜×*Ñ*Ð+=¸}ÓMÐ Ø&�Y×&Ñ&Ð'9¸9ÓEÐ Ø%�I×%Ñ%Ð&8Ð:JÓKÐ ð <Aô pòKð, +Ð6GÐXnØ*Ð7IÐ]nØ&ñ(€ð KOØBKØKPñ #ð ¨cð ¸ð Àcð Ø$(ðØCGðà&*ðà<?ðð #+¨3¡-ðð EIóð8x˜$˜s C˜x™.ð x¨Tó xð2�t˜C ˜H‘~ð ¨(°4©.ó ð\�T˜#˜s˜(‘^ð \¨ó \ð5˜$˜s C˜x™.ð 5¨Tó 5ð ØÑdÐfoØsðuð vàÑ_ÐalÐnrÐsÐtØ�8ÐØØkñmà˜mÐ,Ø˜Ð&ñ
-€��S˜$˜s C˜x™.Ð(Ñ)ó 
ð IØkñÐ ð #ð ¨t°C¸°H©~ð À$ó ð,{ t¨C°¨H¡~ð {¸$ó {ð YgÖgÐPT˜Ð0˜y×0Ñ0Ð1DÀdÓKÑKÒgÐ Ø%:Ð;KÑ%LÑ "ùò hs   É I$