
    `gjm                        d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZmZ  ej                  e      Zdd	d
dddZ e	d      ZddZdd	 	 	 	 	 ddZddZddZ	 d	 	 	 	 	 	 	 	 	 ddZy)z?ACP permission bridging for Hermes dangerous-command approvals.    )annotationsN)TimeoutError)count)Callable)AllowedOutcomePermissionOptiononcesessionalwaysdeny)
allow_onceallow_sessionallow_alwaysr   deny_always   c                @    	 t        d| d       y# t        $ r Y yw xY w)zFReturn whether the installed ACP SDK accepts a permission option kind.	__probe__probe	option_idkindnameFT)r   	Exception)r   s    J/root/.hermes/venv/lib/python3.12/site-packages/acp_adapter/permissions.py _permission_option_supports_kindr       s,    ;TH   s    	F)smart_deniedc                2   t        ddd      g}|s|j                  t        ddd             | r|s|j                  t        ddd             |j                  t        dd	d
             |s(t        d      r|j                  t        ddd             |S )z8Return ACP options that match Hermes approval semantics.r   z
Allow oncer   r   r   zAllow for sessionzAllow alwaysr   reject_onceDenyreject_alwaysr   zDeny always)r   appendr   )allow_permanentr   optionss      r   _build_permission_optionsr$   )   s      \ G '%  $
 	 |(##	
 NN#f=vVW<_M'$"	
 N    c                    ddl }dt        t               }|r| d|  n| }|r| d|  nd|  }|j                  ||dd|j	                  |j                  |            g| |d	
      S )u+  Return the ACP tool-call update attached to a permission request.

    ``request_permission`` expects a ``ToolCallUpdate`` payload — produced
    by ``_acp.update_tool_call`` — not a ``ToolCallStart``. Each request
    gets a unique ``perm-check-N`` id so concurrent requests don't collide.
    r   Nzperm-check-z: z
$ z$ executepending)commanddescription)titler   statuscontent	raw_input)acpnext_PERMISSION_REQUEST_IDSupdate_tool_calltool_content
text_block)r)   r*   _acptool_call_idr+   content_texts         r   _build_permission_tool_callr8   L   s      &=!> ?@L+6{m2gY'GE4?k]$wi0r'^L  ""4??<#@AB%kB !  r%   c                   t        | t              sy| j                  }||vrt        j	                  d|       yt
        j                  |d      S )z;Map an ACP permission outcome into Hermes approval strings.r   z1Permission request returned unknown option_id: %s)
isinstancer   r   loggerwarning_OPTION_ID_TO_HERMESget)outcomeallowed_option_idsr   s      r   _map_outcome_to_hermesrA   b   sH    g~.!!I**JIV##Iv66r%   c                >     ddd	 	 	 	 	 	 	 	 	 	 	 d fd}|S )a  
    Return a Hermes-compatible approval callback that bridges to ACP.

    The callback accepts ``command`` and ``description`` plus optional
    keyword arguments such as ``allow_permanent`` used by
    ``tools.approval.prompt_dangerous_approval()``.

    Args:
        request_permission_fn: The ACP connection's ``request_permission`` coroutine.
        loop: The event loop on which the ACP connection lives.
        session_id: Current ACP session id.
        timeout: Seconds to wait for a response before auto-denying.
    TFr"   r   c                  ddl m} t        ||      }t        | |      } ||      } ||t        d      }	|	y	 |	j                        }
|
y|D ch c]  }|j                   }}t        |
j                  |
      S # t        t        f$ r0}|	j                          t        j                  d	|       Y d }~yd }~ww xY wc c}w )Nr   )safe_schedule_threadsaferC   )
session_id	tool_callr#   z.Permission request: failed to schedule on loop)r;   log_messager   )timeoutz*Permission request timed out or failed: %s)r@   )agent.async_utilsrE   r$   r8   r;   resultFutureTimeoutr   cancelr<   r   rA   r?   )r)   r*   r"   r   _rE   r#   rG   corofutureresponseexcoptionr@   looprequest_permission_fnrF   rI   s                 r   	_callbackz)make_approval_callback.<locals>._callback   s     	?++%

 0E	$!

 *$H

 >	}}W}5H =DE6f..EE%1
 	
 y) 	MMONNGM	 Fs    B CC&B??C)r)   strr*   rW   r"   boolr   rX   rN   objectreturnrW    )rU   rT   rF   rI   rV   s   ```` r   make_approval_callbackr\   n   sV    0 !%"+
+
+
 	+

 +
 +
 
+
 +
Z r%   )r   rW   rZ   rX   )r"   rX   r   rX   rZ   zlist[PermissionOption])r)   rW   r*   rW   )r?   rY   r@   zset[str]rZ   rW   )g      N@)
rU   r   rT   zasyncio.AbstractEventLooprF   rW   rI   floatrZ   zCallable[..., str])__doc__
__future__r   asynciologgingconcurrent.futuresr   rL   	itertoolsr   typingr   
acp.schemar   r   	getLogger__name__r;   r=   r1   r   r$   r8   rA   r\   r[   r%   r   <module>rh      s    E "   <  
 
		8	$    (  49  ,0  F,	7  	A#A
#A A 	A
 Ar%   