
    PmjEU                       d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZmZ eee	eef         ge	eef         f         Zeegef         Zd#d	Zd$dZd%dZd&dZd'dZd&dZddd(dZe G d d                      Z G d  d!          Zd"S ))a  Session-scoped typed-browser routing for cua-driver.

The public model surface remains the single ``computer_use`` tool.  This
module owns the stateful adapter between its namespaced ``cua_browser_*``
actions and cua-driver's raw ``get_browser_state`` / ``browser_*`` tools.

The adapter is deliberately stricter than the transport:

* native binding must be exact before mutation;
* the driver session id is injected by the adapter, never accepted from the
  model;
* refs are usable only from the latest snapshot in this Hermes session;
* every mutation invalidates refs and requires a fresh state read; and
* changing from trusted input to ``dom_event`` is always explicit.

Browser preparation remains a separate approved action. Existing-profile
attachment is delegated to cua-driver's daemon authorization coordinator;
ordinary Hermes tool approval never substitutes for protected consent.
    )annotations)	dataclassfield)AnyCallableDictIterableOptionalSetvaluer   returnOptional[int]c                    t          | t                    rd S 	 t          |           }n# t          t          f$ r Y d S w xY w|dk    r|nd S )Nr   )
isinstanceboolint	TypeError
ValueError)r   parseds     F/home/thesage/.hermes/hermes-agent/tools/computer_use/browser_route.py_positive_intr      sd    % tUz"   ttaZZ66T)s   ) >>outDict[str, Any]c                   |                      d          }|                      d          }i }t          |t                    r|                    |           nt          |t                    r|r||d<   t          |t                    r|                    |           |                      d          du r|                    dd           |S )zAReturn the structured driver payload without discarding refusals.structuredContentdatamessageisErrorT)getr   dictupdatestr
setdefault)r   
structuredr   payloads       r   _tool_payloadr&   )   s    ,--J776??D G$ "t	D#		 "4 "!	*d## #z"""
wwyT!!9d+++N    r%   Dict[str, Set[str]]c                n   i }|                      d          }|                      d          }|s|                      d          }|*t          |t                    r|                     d          }t          |t                    r|                                }n$t          |t                    rd |D             }nd}|D ]t\  }}t          |t                    r-|                     d          p|}|                     d          }n|}d}t          |t
                    r|scd	 |pg D             ||<   u|S )
a  Normalize semantic-v2 action refs to ``ref -> actions``.

    cua-driver has emitted both mapping and list representations while the
    semantic snapshot contract evolved.  Accept both without weakening the
    capability rule: a ref with no declared action remains readable only.
    snapshotcontent_refsrefsNc              3     K   | ]}d |fV  	d S N ).0items     r   	<genexpr>z_ref_map.<locals>.<genexpr>M   s&      00DD$<000000r'   r/   refactionsc                <    h | ]}t          |t                    |S r/   )r   r"   )r0   actions     r   	<setcomp>z_ref_map.<locals>.<setcomp>Z   s7     
 
 
Jvs4K4K

 
 
r'   )r   r   r    itemslistr"   )	r%   
normalizedr*   rawentrieskeyr   r3   r4   s	            r   _ref_mapr>   9   s[    ')J{{:&&H ++n
%
%C "kk&!!
{z(D11{ll6""#t 7:yy{{	C		 00C000 
 

UeT"" 	))E"")cCii	**GGCG#s## 	3 	
 
")-R
 
 

3 r'   Optional[str]c                   |                      d          }t          |t                    r|r|S |                      d          }t          |t                    r.|                     d          }t          |t                    r|r|S d S )Ncontinuationr*   r   r   r"   r    )r%   directr*   nesteds       r   _continuationrE   `   s    [[((F&# 6 {{:&&H(D!! n--fc"" 	v 	M4r'   Set[str]c                .   t                      }|                     d          pg D ]n}t          |t                    s|                    d          p|                    d          }t          |t                    r|r|                    |           o|S )Ntabstab_idid)setr   r   r    r"   add)r%   resulttabrI   s       r   _tab_idsrO   l   s    uuF{{6""(b  #t$$ 	""3cggdmmfc"" 	v 	JJvMr'   c                   |                      d          }t          |t                    r|S |                      d          }t          |t                    r0t          |                     d          t                    r|d         S d S )NcoderefusalrB   )r%   rQ   rR   s      r   _refusal_coderS   w   sy    ;;vD$ kk)$$G'4   ZF0C0CS%I%I v4r'   Fnative_fallbackrQ   r"   r   rU   r   extrac               L    dd| |d}|rd|d<   |                     |           |S )NFrefused)okstatusrQ   r   Tnative_fallback_required)r!   )rQ   r   rU   rV   r%   s        r   _refusalr\      sH     	 G  3.2*+NN5Nr'   c                      e Zd ZU dZdZded<   dZded<   dZded<    ee	          Z
d	ed
<   dZded<   dZded<   dZded<    ee          Zded<   dZded<   dZded<   ddZddZdS )BrowserRouteStatez8Capabilities minted for one explicit cua-driver session.Nr   pid	window_idr?   	target_id)default_factoryrF   tab_idsrI   binding_qualityFr   mutation_allowedr(   r,   rA   verification_requiredr   Nonec                F    | j                                          d | _        d S r.   )r,   clearrA   selfs    r   
clear_refszBrowserRouteState.clear_refs   s"    	 r'   c                    d | _         d | _        d | _        | j                                         d | _        d | _        d| _        |                                  d| _	        d S )NF)
r_   r`   ra   rc   ri   rI   rd   re   rl   rf   rj   s    r   ri   zBrowserRouteState.clear   s`    # %%*"""r'   )r   rg   )__name__
__module____qualname____doc__r_   __annotations__r`   ra   r   rK   rc   rI   rd   re   r    r,   rA   rf   rl   ri   r/   r'   r   r^   r^      s
        BBC#I#####I####c222G2222 F    %)O))))""""" %d ; ; ;D;;;;"&L&&&&"'''''! ! ! !	+ 	+ 	+ 	+ 	+ 	+r'   r^   c                  |    e Zd ZdZd0d
Zd1dZd2dZddddddddd3dZddddd4d$Zdd%d5d)Z	d6d-Z
ddd.d7d/ZdS )8CuaTypedBrowserRoutez=Exact-bind typed-browser adapter for a single driver session.
session_idr"   	call_tool
ToolCallerhas_tool	ToolProber   rg   c               V    || _         || _        || _        t                      | _        d S r.   )_session_id
_call_tool	_has_toolr^   state)rk   ru   rv   rx   s       r   __init__zCuaTypedBrowserRoute.__init__   s+     &#!&((


r'   nameargsr   c                z    t          |          }| j        |d<   t          |                     ||                    S )Nsession)r    r{   r&   r|   )rk   r   r   r%   s       r   _callzCuaTypedBrowserRoute._call   s8    t** "-	T__T7;;<<<r'   Optional[Dict[str, Any]]c                \    |                      |          rd S t          dd| dd          S )Ntyped_browser_unavailablez,The connected cua-driver does not advertise z); use the native AX/PX/foreground ladder.TrT   )r}   r\   )rk   r   s     r   _require_toolz"CuaTypedBrowserRoute._require_tool   sF    >>$ 	4'j4jjj 
 
 
 	
r'   Nsemantic_v2)r_   r`   rI   snapshot_formatquery	scope_refrA   r_   r   r`   rI   r?   r   r   r   rA   c                  |                      d          }||S |dup|du}	|	rt          |          }
t          |          }| j                                         |
|t	          ddd          S |                     d|
|d          }|                    d          d	k    r7t          |          }|                    d	d
           d|d<   |dk    rd|d<   |S |                    d          }|                    d          }|                    d          du }t          |t                    r|st	          ddd          S |
| j        _        || j        _        || j        _        t          |          | j        _        t          |t                    r|nd| j        _        || j        _        d| j        _        |dk    |d<   |dk    s|sd|d<   |S | j        j        }|r| j        j        dk    rt	          ddd          S |p| j        j        }t          |t                    r|st	          dd          S || j        j        vrt	          dd          S | || j        j        k    rt	          dd          S ||| j        j        vrt	          dd          S |||d }|r||d!<   |r||d"<   |r||d#<   |du}|s| j                                         |                     d|          }|                    d          d$vs|                    d%          du r=| j                                         d| j        _        |                    d	d
           |S t/          |          }|r | j        j                            |           n|| j        _        t3          |          | j        _        || j        _        d
| j        _        d|d&<   t5          | j        j                  |d'<   |S )(z4Bind an exact native window or snapshot a bound tab.get_browser_stateNbrowser_exact_target_requiredzHTyped browser binding requires an exact positive pid and window_id pair.TrT   )r_   r`   rZ   rY   Fnative_fallback_availablebrowser_requires_setupsetup_requiredra   rd   re   browser_binding_unprovenzFBrowser bind returned no opaque target capability; use native control.exactexact_bindingr[   browser_exact_binding_requiredzABind the exact native pid/window_id before reading a browser tab.browser_tab_requiredz3Choose an opaque tab_id returned by the exact bind.browser_tab_unboundAThe requested tab_id was not minted by this session's exact bind.browser_continuation_stalezLThe continuation is not current for this session/tab; take a fresh snapshot.browser_ref_stalez@scope_ref must come from this session's latest browser snapshot.)ra   rI   r   r   r   rA   NrY   r   fresh_staterefs_current)r   r   r~   ri   r\   r   r   rS   r#   r   r"   r_   r`   ra   rO   rc   rd   re   rf   rI   rA   r,   rl   r>   r!   rE   len)rk   r_   r`   rI   r   r   r   rA   missingbinding_request	exact_pidexact_windowr%   rQ   ra   qualityre   selected_tabr   
continuing
discovereds                        r   observezCuaTypedBrowserRoute.observe   s    $$%899NT/BYd-B ,	%c**I(33LJ L$83^$(   
 jj#!== G {{8$$,,$W--""4///7;3433304G,-K00Ikk"344G&{{+=>>$Fi-- Y .\$(    'DJN#/DJ #,DJ !)'!2!2DJ4>w4L4L)VRVDJ&*:DJ' 04DJ,'.''9GO$'!!)9!6:23NJ(	 	DJ6'AA0S $   
 2!2,,, 	L 	&E   tz111%S   #
8O(O(O,^    Ydjo%E%E#R   #". 
  

  	"!DM 	* )D 	0#/D !-
 	$ J!!###**0$77;;x  44I8N8NRV8V8VJ!!###/3DJ,tU+++Ng&&
 	)JO"":....(DJO"/"8"8
(
+0
(!%"%djo"6"6r'   F)r`   profile_nameallow_launchprofile_moder   r   r   c               |   |                      d          }||S t          |          }|t          dd          S |dk    rVt          |          }|t          dd          S | j                                         |                     d||ddid	          S |d
vrt          dd          S |st          dd          S d|i}	|dk    r,t          |t                    r|st          dd          S ||	d<   |d|	d}
t          |          }|||
d<   | j                                         |                     d|
          S )z@Run explicit setup through the driver's authoritative mode gate.browser_prepareNbrowser_pid_requiredz(browser_prepare requires a positive pid.existing_profiler   zNExisting-profile attachment requires an exact positive pid and window_id pair.kind)r_   r`   strategy>   isolated_newisolated_namedbrowser_profile_mode_invalidz6Use isolated_new, isolated_named, or existing_profile.browser_launch_not_approvedz@Driver-owned isolated setup requires explicit allow_launch=true.moder   browser_profile_name_requiredz1isolated_named requires a non-empty profile name.r   T)r_   r   profiler`   )r   r   r\   r~   ri   r   r   r"   )rk   r_   r`   r   r   r   r   r   r   r   r   s              r   preparezCuaTypedBrowserRoute.prepareR  s    $$%677N!#&&	&(R   ---(33L#3d   J::!$!-!'); <    AAA.H    	-R   $*<"8+++lC00  3G   +GFO  
  

 %Y//# ,D 	
zz+T222r'   )allow_without_snapshottoolr   .tuple[Optional[str], Optional[Dict[str, Any]]]c                  |                      |          }|d |fS | j        j        r| j        j        dk    s| j        j        sd t          ddd          fS |p| j        j        }t          |t                    r|sd t          dd          fS || j        j	        vrd t          dd	          fS | j        j
        r|sd t          d
d          fS |d fS )Nr   browser_mutation_unprovenzzTyped browser mutation requires status=ok, binding_quality=exact, and mutation_allowed=true; use native control otherwise.TrT   r   zChoose a bound tab_id first.r   r   browser_verification_requiredzHTake a fresh cua_browser_state snapshot before another browser mutation.)r   r~   ra   rd   re   r\   rI   r   r"   rc   rf   )rk   r   rI   r   r   r   s         r   _require_mutationz&CuaTypedBrowserRoute._require_mutation  s:    $$T**= 
$		z)W44:. 5 + M $    
 2!2,,, 	L 	&(F    tz111%S    :+ 	4J 	/Z    T!!r'   r3   r4   rF   c                   t          |t                    r|| j        j        vrt	          dd          S | j        j        |         }|r%|                    |          st	          dd          S d S )Nr   z=Use a current ref from the latest cua_browser_state snapshot.browser_action_unavailablez>The current ref does not declare the requested browser action.)r   r"   r~   r,   r\   intersection)rk   r3   r4   declareds       r   _require_refz!CuaTypedBrowserRoute._require_ref  s     #s## 	s$*/'A'A#O   :?3' 	80099 	,P   tr'   )rI   r   c               *   t          |pi           }|dk    o|                    d          dk    }|                     |||          \  }}||S || j        j        J |                    d          }|dv }	|                    d          }
|
|	st          d	| d
          S |
pd}|dvrt          dd          S |dk    r|st          dd          S t                      }|dk    r|rddh}nK|dk    rh d}n@|dk    r%|r#|                    d          }|dk    rddhndh}n|dk    rh d}n
|dk    rddh}|r|                     ||          }||S |                    d          }||                     |h d          }||S | j        j        |d <   ||d!<   |s1|| j        _        | j        	                                 d"| j        _
        |                     ||          }t          |          }|                    d#          d"u p|                    d$          d%vp|du}|	r||d&<   |dk    rd"|d'<   |rBd"|d(<   |r)|d)v r%| j        	                                 d"| j        _
        |d*k    r
d"|d+<   d"|d(<   |S |rd"|d,<   |S d"|d-<   d.|d/<   |S )0z;Invoke one typed browser tool against current capabilities.browser_dialogr6   inspect)r   rI   r   Nr3   >   browser_clickbrowser_pointerinput_routebrowser_input_route_unsupportedz= does not expose a trust-route choice in the live 0.9 schema.trusted>   r   	dom_eventbrowser_input_route_invalidz8Use input_route=trusted or explicitly request dom_event.r   browser_dom_event_ref_requiredz:The dom_event trust class requires a current semantic ref.r   clickpointerbrowser_type>   edittypeinputr   scrollbrowser_set_input_files>   filesuploadset_input_filesbrowser_downloaddownload)r4   destination_ref>   dragdropr   ra   rI   Tr   rZ   r   input_trusttrust_downgrade_explicitr   >   r   browser_binding_ambiguousbrowser_input_trust_unavailable%trust_change_requires_explicit_choicefresh_dialog_staterf   fresh_browser_state	next_step)r    r   r   r~   ra   r\   rK   r   rI   rl   rf   r   rS   )rk   r   rI   r   	call_argsdialog_inspectr   rR   r3   supports_trust_choicerequested_routerouterequired_actionspointer_actioninvalid_refr   invalid_destinationr%   rQ   rX   s                       r   mutatezCuaTypedBrowserRoute.mutate  s    $$	$$Mx)@)@I)M 	 !% 6 6#1 !7 !
 !
g
 N'DJ,@,L,LLmmE"" $(L L#--66&/D&1VVV    ,9000-J   K0L  
 &)UU?""s" '3^##888&&&3&&]]844N)78)C)C9%%)  ...EEE''' *G4 	#++C9I+JJK&""#--(9::&"&"3"3)D)D)D #4 # # #.**!%!5	+*	( 	4 !-DJJ!!###/3DJ,**T9--W%%KK	""d*  {{8$$L8 4 	
 ! 	;%*GM"##6:23 	37G/0 8$ + # # 
%%'''37
0888CG?@7;34N 	,0G()N
 ,0'(4r'   )ru   r"   rv   rw   rx   ry   r   rg   )r   r"   r   r   r   r   )r   r"   r   r   )r_   r   r`   r   rI   r?   r   r"   r   r?   r   r?   rA   r?   r   r   )r_   r   r`   r   r   r"   r   r?   r   r   r   r   )r   r"   rI   r?   r   r   r   r   )r3   r   r4   rF   r   r   )r   r"   rI   r?   r   r   r   r   )rn   ro   rp   rq   r   r   r   r   r   r   r   r   r/   r'   r   rt   rt      s(       GG
) 
) 
) 
)= = = =
 
 
 
  $,##'&*~ ~ ~ ~ ~ ~H &*"B3 B3 B3 B3 B3 B3R (-#" #" #" #" #" #"J   . !%)-o o o o o o o or'   rt   N)r   r   r   r   )r   r   r   r   )r%   r   r   r(   )r%   r   r   r?   )r%   r   r   rF   )
rQ   r"   r   r"   rU   r   rV   r   r   r   )rq   
__future__r   dataclassesr   r   typingr   r   r   r	   r
   r   r"   rw   r   ry   r   r&   r>   rE   rO   rS   r\   r^   rt   r/   r'   r   <module>r      s   ( # " " " " " ( ( ( ( ( ( ( ( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sDcN+T#s(^;<
cUD[!	* * * *    $ $ $ $N	 	 	 	       "	     & + + + + + + + +<J J J J J J J J J Jr'   