+
    lHàjdü  ã            "      ó¦  a€ 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RI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 ^ RIHt ^ RIH t  ^ R	I!H"t"H#t#H$t$H%t% ]	PL                  ! ]'4      t(Rs)R
 R lt*]+! 0 R×m4      ]+! 0 RØm4      ]+! 0 RÙm4      ]+! 0 RÚm4      ]+! 0 RÛm4      ]+! RR04      ]+! 0 RÜm4      ]+! 0 RÝm4      ]+! RR04      0	t,RRRRRRRRRRRRRRRR/t-RÞ U u. uF  p ]P]                  V ]P^                  4      NK!  	  up t0R R lt1R R lt2R R lt3]Ph                  ! 4       t5Rs6R ]7R!&   / t8R"]7R#&   / t9R$]7R%&   / t:R&]7R'&   / t;R&]7R(&   ]Ph                  ! 4       t<]=! 4       t>R)]7R*&   ]Ph                  ! 4       t?/ t@R+]7R,&   ^tAR- R. ltBRßR/ R0 lltCR1 R2 ltDR3 R4 ltER5 R6 ltFR7 R8 ltGR9 R: ltHR; R< ltIR= R> ltJRàR? R@ lltK]P˜                  RàRA RB ll4       tMRC RD ltN]Pž                  RE RF l4       tPRG RH ltQRIR/RJ RK lltR ! RL RM]$4      tSRN RO ltTRP RQ ltURR RS ltVRT RU ltWRV RW ltXRáRX ltYRY tZRZ t[R[ R3R\ lt\R] t]R^ R_ lt^]! R`RaRbRbRc 3Rd7      t_]! ]_ReReRf7      t`Rg]`! ]Y]^Rh7      Ri]`! ]! ]Y^Rj7      ]^Rh7      Rk]`! ]! ]YRlRm7      ]^Rh7      Rn]`! ]! ]YRoRm7      ]^Rh7      Rp]`! ]ZRq Rh7      Rr]`! ][Rs Rh7      Rt]`! Ru Rv Rh7      Rw]`! Rx Ry Rh7      Rz]`! R{ 4      R|]_! R} ReR~ R7      R€]_! ]\4      R�]_! R‚ 4      Rƒ]_! ]! ]]R„R…7      4      R†]_! ]! ]]RR…7      4      /taR‡]7Rˆ&   ]+! R‰ ]aPÅ                  4        4       4      tcRŠRwR‹RwRŒRwR�RwRŽRwR�RtR�RtR‘R€R’R€R“RgR”Rg/tdR• R3R– R— llteR˜ R™ ltfRš R› ltgRœ R� lthRž RŸ lti^dtj^tk^xtl^;tmtnR  R¡ ltoR¢ R£ ltpR¤ R¥ ltqRâR¦ R§ lltrR¨ R© ltsRª ttR« tuR¬ R­ ltvR® R¯ ltwRßR° R± lltxR² R³ lty]jR3R´ Rµ lltzR¶ R3R· R¸ llt{R¹ Rº lt|R» R¼ lt}RãR½ R¾ llt~R¿ RÀ ltRÁ RÂ lt€RÃ RÄ lt�RÅt‚]‚3RÆ RÇ lltƒRÈ RÉ lt„RÊ RË lt…RÌt†RÍRRÎ^ RÏRRÐR/RÑ RÒ llt‡RÓ RÔ ltˆRÕ RÖ lt‰R# u up i )äak  `computer_use` tool entry point: any-model desktop control (macOS/Windows/Linux) via cua-driver.
Return contract: text-only results are a JSON string; captures / `capture_after=True` return
``{"_multimodal": True, "content": [text, image_url], "text_summary": <fallback>}`` (run_agent.py /
the Anthropic adapter turn it into provider-specific image tool content).)ÚannotationsN)Ú
namedtuple)Úpartial)ÚSimpleNamespace)ÚAnyÚCallableÚDictÚIteratorÚListÚOptionalÚTuple)Úmake_user_dir)Úimage_dimensions_from_bytes)ÚActionResultÚCaptureResultÚComputerUseBackendÚ	UIElementc               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚNone© )Úformats   "Ú</home/ubuntu/.hermes/hermes-agent/tools/computer_use/tool.pyÚ__annotate__r   %   s   € ÷ ñ  ñ ó    c                ó
   € V s R # ©N)Ú_approval_callback)Úcbs   &r   Úset_approval_callbackr!   %   s   € àÒr   ÚcmdÚoptionÚctrlÚwinÚlÚf4ÚcommandÚcontrolÚaltu   âŒ˜u   âŒ¥ÚwindowsÚsuperÚmetac               ó    € V ^8„  d   QhRRRR/# )r   ÚkeysÚstrr   Ú	frozensetr   )r   s   "r   r   r   8   s   € ÷ wñ w˜3ð w 9ñ wr   c                ó^   € \        R  R \        P                  ! RV 4       4        4       4      # )c              3  ó^   "  € T F#  q'       g   K  \         P                  W4      x € K%  	  R # 5ir   )Ú_KEY_ALIASESÚget)Ú.0Úps   & r   Ú	<genexpr>Ú#_canon_key_combo.<locals>.<genexpr>:   s&   é € ÐvÑ5p°ÓtuÔ+”\×%Ñ% a×+Ð+Ó5pùs   ‚	-�-c              3  ó\   "  € T F"  qP                  4       P                  4       x € K$  	  R # 5ir   )ÚstripÚlower)r6   Úqs   & r   r8   r9   :   s    é € Ð5pÑQoÈA·g±g³i·o±o×6GÐ6GÓQoùs   ‚*,z\s*[+\-]\s*)r1   ÚreÚsplit)r/   s   &r   Ú_canon_key_combor@   8   s)   € äÑvÑ5pÔQS×QYÒQYÐZhÐjnÔQoÔ5pÓvÓvÐvr   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úactionr0   Úargsúdict[str, Any]r   úOptional[str]r   )r   s   "r   r   r   <   s!   € ÷ ñ ˜3ð  nð ¸ñ r   c                ó¼  a€ V R8X  dA   \        V3R l\         4       R4      ;p'       d   \        P                  ! RRV: 2RR/4      # V R8X  dF   \        V3R	 l\         4       R4      ;p e'   \        P                  ! RR
\        V4       2RR/4      # SP                  R4      '       d1   SP                  R4      R8w  d   \        P                  ! RRRR/4      # R# )zNJSON error for hard-blocked input, else None. Runs BEFORE the approval prompt.Útypec              3  óŒ   <"  € T F9  qP                  SP                  R R4      4      '       g   K+  VP                  x € K;  	  R# 5i)ÚtextÚ N)Úsearchr5   Úpattern)r6   r7   rD   s   & €r   r8   Ú!_reject_unsafe.<locals>.<genexpr>>   s4   øé € Ð)vÑ=S¸×W_ÑW_Ð`d×`hÑ`hÐioÐqsÓ`t×Wu¬)¨!¯)®)Ó=Sùs
   ƒ(A°ANÚerrorzblocked pattern in type text: Úhintz:Dangerous shell patterns cannot be typed via computer_use.Úkeyc           	   3  óŒ   <"  € T F9  pVP                  \        SP                  R R4      4      4      '       g   K5  Vx € K;  	  R# 5i)r/   rK   N)Úissubsetr@   r5   )r6   ÚbrD   s   & €r   r8   rN   A   s:   øé € ð -dÑ8K°1Ø01·
±
Ô;KÈDÏHÉHÐU[Ð]_ÓL`Ó;a×0b÷ ./ªQÓ8Kùs
   ƒ2Aº
Azblocked key combo: z.Destructive system shortcuts are hard-blocked.Úbring_to_frontÚdelivery_modeÚ
foregroundz2bring_to_front requires delivery_mode='foreground'ÚcodeÚ"bring_to_front_requires_foreground)ÚnextÚ_BLOCKED_TYPE_PATTERNSÚjsonÚdumpsÚ_BLOCKED_KEY_COMBOSÚsortedr5   )rC   rD   ÚpatÚblockeds   &f  r   Ú_reject_unsaferb   <   sû   ø€ à�Ô¤DÔ)vÕ=SÓ)vÐx|Ó$}Ð}˜SÖ}Ü�zŠz˜7Ð&DÀSÁGÐ$LØ!Ð#_ðaó bð 	bà�„¤tô -dÕ8Kó -dØeió(kð k˜GØswòxä�zŠz˜7Ð&9¼&À»/Ð9JÐ$KÈVð  VFð  Gó  Hð  	HØ‡x�xÐ ×!Ò! d§h¡h¨Ó&?À<Ô&OÜ�zŠz˜7Ð$XØ!Ð#GðIó Jð 	Jár   c               ó    € V ^8„  d   QhRRRR/# )r   Úrequested_appr0   r   rF   r   )r   s   "r   r   r   I   s   € ÷ eñ e°3ð e¸=ñ er   c                óæ   € \        V RR4      pT;'       g    RP                  4       P                  4       VP                  4       P                  4       rCV'       d   V'       d   WC9   g   W49   d   R# T# )zÙCurrent sticky-target app when it provably differs from *requested_app*: both known and neither a substring
of the other ('Google-chrome' vs 'chrome'). Unknown target -> None (fail open; the verify ladder catches it).Ú	_last_appNrK   )Úgetattrr;   r<   )Úbackendrd   Úlast_appÚcurrentÚwanteds   &&   r   Ú_input_target_mismatchrl   I   s]   € ô �w ¨TÓ2€HØ—~�~ 2×,Ñ,Ó.×4Ñ4Ó6¸×8KÑ8KÓ8M×8SÑ8SÓ8UˆVß§f°Ô0AÀWÔEVˆ4ÐdÐ\dÐdr   zOptional[ComputerUseBackend]Ú_backendzdict[str, ComputerUseBackend]Ú	_backendszdict[str, threading.RLock]Ú_backend_call_lockszdict[str, str]Ú_backend_permission_modesÚ_backend_displaysÚsetÚ_escalation_warnedzdict[str, dict[str, Any]]Ú_last_screenshot_statec               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú
session_idr0   ÚdigestÚtargetútuple[str, str]r   Úboolr   )r   s   "r   r   r   i   s)   € ÷ ñ ¨ð °Sð À/ð ÐVZñ r   c                ó®  € \         ;_uu_ 4        \        P                  V 4      pVe�   VP                  R4      V8X  dk   VP                  R4      V8X  dU   \        VP                  R^ 4      4      \        8  d1   \        VP                  R^ 4      4      ^,           VR&    RRR4       R# RVRVR^ /\        V &    RRR4       R#   + '       g   i     R# ; i)aI  True when this capture should be delivered WITHOUT its image: the previous frame for this session had identical
bytes for the same target and the omission streak is below _SCREENSHOT_DEDUP_MAX_STREAK. Any miss (new pixels,
new target, streak exhausted, first capture) resets the stored state to this digest so the image goes out.Nrw   rx   ÚstreakTF)Ú_screenshot_dedup_lockrt   r5   ÚintÚ_SCREENSHOT_DEDUP_MAX_STREAK)rv   rw   rx   Ústates   &&& r   Ú_screenshot_dedup_checkr�   i   s±   € ÷ 
 Ö	Ü&×*Ñ*¨:Ó6ˆØÒ %§)¡)¨HÓ"5¸Ô"?ÀEÇIÁIÈhÓDWÐ[aÔDaÜ˜Ÿ	™	 (¨AÓ.Ó/Ô2NÔNÜ! %§)¡)¨H°aÓ"8Ó9¸AÕ=ˆE�(‰OØ÷ 
 Ñ	ð /7¸ÀÈ&ÐRZÐ\]Ð-^Ô˜zÑ*Ø÷ 
 ×	×	Ò	ús   �BCÂ)CÃC	c               ó    € V ^8„  d   QhRRRR/# )r   rv   rF   r   r   r   )r   s   "r   r   r   v   s   € ÷ 9ñ 9¨ð 9Àñ 9r   c                óº   € \         ;_uu_ 4        V f   \        P                  4        M\        P                  V R4       RRR4       R#   + '       g   i     R# ; i)z5Forget dedup state (all sessions, or one scoped key).N)r}   rt   ÚclearÚpop©rv   s   &r   Ú_reset_screenshot_dedupr‡   v   s9   € ç	Ö	ØÒÜ"×(Ñ(Õ*ä"×&Ñ& z°4Ô8÷	 
 ×	×	Ò	ús   �0A	Á	A	c               ó    € V ^8„  d   QhRRRR/# )r   rv   r0   r   r   r   )r   s   "r   r   r   ~   s   € ÷ 5ñ 5 sð 5¨tñ 5r   c                ó.   € \        \        V 4      4       R# )zÂCompaction boundary hook (mirrors ``reset_file_dedup``): the summary may have dropped the frame an
"unchanged" note would point at, so the next capture of this session must deliver pixels again.N)r‡   Ú_scoped_sidr†   s   &r   Úreset_screenshot_dedupr‹   ~   s   € ô œK¨
Ó3Ö4r   c               ó    € V ^8„  d   QhRRRR/# ©r   rv   r0   r   r   )r   s   "r   r   r   ƒ   s   € ÷ ñ  Sð ¨Sñ r   c           	     ó®  € Rp\         P                  ! \        4      ;_uu_ 4        ^ RIHp V! 4       pRRR4       \         P                  ! \        4      ;_uu_ 4        ^ RIHp ^ RIHp V! V 4      '       g)   \        V! RR7      ;p4      '       d‚   V! V4      '       dt   \        ;_uu_ 4        \        T ;'       g    R4      ;p\        9  p\        P                  V4       RRR4       X'       d   \        P                  RW4        RRR4       R	# RRR4       V#   + '       g   i     Lò; i  + '       g   i     LV; i  + '       g   i     T# ; i)
a¶  Map Hermes's approval bypass onto Cua's immutable mode; fails closed. Both identity namespaces are consulted
(DB ``session_id`` and gateway ``session_key`` contextvar) or a gateway ``/yolo`` would be invisible here.
Warns once per session that ``-z``/``--yolo`` swapped the driver onto a private ``unrestricted`` daemon, dropping
the configured ceiling: deliberate (``unrestricted`` is not a config value) but easy to trigger by accident.Ústandard)Ú_cua_configured_permission_modeN)Ú%is_approval_bypass_active_for_session)Úget_current_session_keyrK   )Údefaultaj  computer_use: approval bypass (--yolo / -z) escalated the cua-driver permission mode from the configured '%s' to 'unrestricted' for this session. Runtime approval prompts are disabled and the driver's residual ceilings no longer apply. Drop the bypass flag to keep '%s', or declare a version-3 computer_use.capability_manifest to keep a ceiling on bypassed runs.Úunrestricted)Ú
contextlibÚsuppressÚ	ExceptionÚtools.computer_use.cua_backendr�   Útools.approvalr‘   Útools.approval_contextr’   rz   Ú_approval_lockr0   rs   ÚaddÚloggerÚwarning)rv   Ú
configuredr�   r‘   r’   rQ   Úwarns   &      r   Ú_cua_permission_moder¡   ƒ   sþ   € ð €JÜ	×	Ò	œY×	'Õ	'ÝRÙ4Ó6ˆ
÷ 
(ô 
×	Ò	œY×	'Õ	'ÝHÝBÙ0°×<Ò<ÜÑ3¸BÔ?Ð?�S×@Ò@ÑEjÐkn×EoÒEoß–Ü" :×#3Ð#3°Ó4Ð4˜Ô=OÑO�Ü"×&Ñ& sÔ+÷  ÷ Ü—‘ðeð gqô	~ð
 "÷ 
(×	'Ñ	'ð Ð÷% 
(×	'ú÷  —ú÷ 
(Ö	'ð Ðús<   ¥DÁAEÂ EÂ.4D0	Ã"EÃ2EÄD-	Ä0E Ä;EÅE	c               ó    € V ^8„  d   QhRRRR/# )r   Úpermission_moder0   r   r   r   )r   s   "r   r   r   Ÿ   s   € ÷ Qñ Q #ð QÐ*<ñ Qr   c                ó<   € ^ RI Hp V! 4       P                  V R7      # )é    ©Úget_active_provider)r£   )Úplugins.computer_user§   Úcreate_backend)r£   r§   s   & r   Ú_new_backendrª   Ÿ   s   € Ý8ÙÓ ×/Ñ/ÀÐ/ÓPÐPr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úsidr0   rh   r   r£   r   r   )r   s   "r   r   r   £   s*   € ÷ 	ñ 	˜#ð 	Ð(:ð 	ÈSð 	ÐUgñ 	r   c                ó¬   € ^ RI Hp Wu\        V &   \        V &   V! 4       \        V &   \
        P                  ! 4       \        V &   V R8X  d   VsV# \        sV# )z†Record a backend in the session caches (the empty session also mirrors it onto the ``_backend`` hook).
Caller holds ``_backend_lock``.)Údesktop_identityrK   )	r˜   r®   rn   rp   rq   Ú	threadingÚRLockro   rm   )r¬   rh   r£   r®   s   &&& r   Ú_install_backendr±   £   sX   € õ @Ø5<Ð2„Iˆc�NÔ-¨cÑ2Ù-Ó/Ô�cÑÜ(ŸšÓ0Ô˜ÑØ œ)ˆw€HØ€Nô *2€HØ€Nr   c               ó    € V ^8„  d   QhRRRR/# )r   r¬   r0   r   z>tuple[Optional[ComputerUseBackend], Optional[threading.RLock]]r   )r   s   "r   r   r   ®   s   € ÷ 	ñ 	˜ð 	Ð ^ñ 	r   c                ó   € \         P                  V R4      \        P                  V R4      3 \        P                  V R4      \        P                  V R4      r!V R8X  d   Vf   \
        MTp\
        VJ d   RM\
        sW3# )z¼Remove one session's cache entries, plus the ``_backend`` injection hook when it aliases the empty session
(older callers/tests may populate only the hook). Caller holds ``_backend_lock``.NrK   )rp   r…   rq   rn   ro   rm   )r¬   rh   Ú	call_locks   &  r   Ú_detach_lockedrµ   ®   sq   € ô ×!Ñ! # tÓ,Ô.?×.CÑ.CÀCÈÓ.NÑNÜ"Ÿ™ s¨DÓ1Ô3F×3JÑ3JÈ3ÐPTÓ3UˆYØ
ˆb„yØ%šo•(°7ˆÜ# wÓ.‘4´HˆØÐÐr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rh   r   r´   zOptional[threading.RLock]Úon_errorzCallable[[Exception], None]r   r   r   )r   s   "r   r   r   ¹   s0   € ÷ ñ Ð-ð Ð:Sð Ð_zð ð  @Dñ r   c                óê   €  Ve   TM\         P                  ! 4       ;_uu_ 4        V P                  4        RRR4       R#   + '       g   i     R# ; i  \         d   pT! T4        Rp?R# Rp?ii ; i)zÆStop under the session call lock (if any) so an in-flight action finishes first. Never called under
``_backend_lock`` (unrelated sessions stay free). ``on_error`` absorbs the failure (never raises).N)r•   ÚnullcontextÚstopr—   )rh   r´   r·   Úes   &&& r   Ú_stop_backendr¼   ¹   sQ   € ðØ#Ò/‰Y´Z×5KÒ5KÓ5M×MÑMØ�L‰LŒN÷ N×M×MÒMûäô Ù��Šûðús3   ‚#A ¥A ¶A Á A	ÁA ÁA ÁA2ÁA-Á-A2c               ó    € V ^8„  d   QhRRRR/# r�   r   )r   s   "r   r   r   Â   s   € ÷ Wñ W˜Cð W Cñ Wr   c                ój   € ^ RI HpHp \        T ;'       g    R4      pV! 4       f   V# V RV! 4        2# )u‚  Cache key for one Hermes session's backend. Outside a served-profile scope it is the bare id
(legacy keys byte-identical); under a multiplexed turn the routed profile's home key is appended
so two profiles that share a session id (or a DISPLAY) never share one cua-driver (#110032).
Every cache path â€” lookup, install, release â€” goes through this, so release finds what lookup made.)Úget_hermes_home_overrideÚhermes_home_keyrK   Ú@)Úhermes_constantsr¿   rÀ   r0   )rv   r¿   rÀ   r¬   s   &   r   rŠ   rŠ   Â   s<   € ÷
 KÜ
ˆj×Ð˜BÓ
€CÙ*Ó,Ò4ˆ3ÐV¸S¸EÀÁ?ÓCTÐBUÐ:VÐVr   c               ó    € V ^8„  d   QhRRRR/# )r   rv   r0   r   r   r   )r   s   "r   r   r   Ë   s   € ÷ :ñ :˜Sð :Ð*<ñ :r   c                ó€  € \        T ;'       g    R 4      \        V 4      r! \        ;_uu_ 4        \        V4      pVR 8X  d%   \        e   V\
        9  d   \        V\        V4       \
        P                  V4      ;pf2   \        V4      pVP                  4        \        W%V4      uuRRR4       # ^ RI
HpHp \        P                  VR4      V8X  d5   V! \        P                  VR 4      V! 4       4      '       g   VuuRRR4       # \        V4      w  r‰RRR4       \!        XX	R 4       EK    + '       g   i     L!; i)rK   N©Úbackend_display_staler®   r�   c                ó   € R # r   r   ©r»   s   &r   Ú<lambda>Ú_get_backend.<locals>.<lambda>Þ   s   € ±Dr   )r0   rŠ   Ú_backend_lockr¡   rm   rn   r±   r5   rª   Ústartr˜   rÆ   r®   rp   rq   rµ   r¼   )
rv   Úbare_sidr¬   r£   Úcachedrh   rÆ   r®   Ú_Ú
stale_locks
   &         r   Ú_get_backendrÑ   Ë   sñ   € Ü˜
×(Ð( bÓ)¬;°zÓ+BˆcØ
ßŽ]ä2°8Ó<ˆOØ�bŒyœXÒ1°cÄÔ6JÜ  ¤h°Ô@Ü#Ÿ-™-¨Ó,Ð,�Ò5Ü& Ó7�Ø—‘”Ü'¨°oÓF÷ Š]÷ _Ü)×-Ñ-¨c°:Ó>À/ÔQÙ1Ô2C×2GÑ2GÈÈRÓ2PÑRbÓRd×eÒeØ÷ Š]ô +¨3Ó/‰MˆA÷ ô  	�f˜j©.×9÷! �]ús   ¯A6D-Â0A
D-Ã;D-ÄD-Ä-D=	c               ó    € V ^8„  d   QhRRRR/# )r   rv   r0   r   zIterator[ComputerUseBackend]r   )r   s   "r   r   r   á   s   € ÷ ñ  #ð Ð/Kñ r   c              #  ó"  "  € ^ RI HpHp \        V 4      p \	        V R7      p\
        ;_uu_ 4        \        P                  V4      VJd    RRR4       K@  \        V,          pRRR4       X;_uu_ 4        \
        ;_uu_ 4        \        P                  V4      VJg   \        P                  V4      VJd    RRR4       RRR4       K´  \        P                  V4      \        \        T ;'       g    R4      4      8w  g)   V! \        P                  VR4      V! 4       4      '       d    RRR4       RRR4       EK&   RRR4       Vx €  RRR4       R#   + '       g   i     Lù; i  + '       g   i     L2; i  + '       g   i     EKv  ; i5i)a1  Hold a live backend through dispatch, retrying admission but never an action.

A display/mode change or release can retire a backend before lock lookup or
while a caller waits. Revalidate AFTER acquiring its profile-scoped call
lock; teardown needs that same lock. Never wait under the global cache lock.
rÅ   r†   NrK   )r˜   rÆ   r®   rŠ   rÑ   rË   rn   r5   ro   rp   r¡   r0   rq   )rv   rÆ   r®   r¬   rh   r´   s   &     r   Ú_backend_for_callrÔ   à   s  é € ÷ Wä
�jÓ
!€CØ
Ü¨*Ô5ˆßŽ]Ü�}‰}˜SÓ!¨Ó0Ø÷ ‰]ô ,¨CÕ0ˆI÷ ÷ ŠYß–Ü—M‘M #Ó&¨gÓ5Ü.×2Ñ2°3Ó7¸yÓHØ÷ ÷ ‰Yô .×1Ñ1°#Ó6Ô:NÌsÐS]×ScÐScÐacÓOdÓ:eÔeÙ0Ô1B×1FÑ1FÀsÈBÓ1OÑQaÓQc×dÒdØ÷ ÷ ŠYð e÷ ð ŠMØ÷ ‰Y÷	 �]ú÷
 —ú÷ �Y‰Yüs‚   ‚/F±EÁ
FÁEÁ#FÁ5E:Â4E'	Â8E:Ã 
FÃ
&E'	Ã16E'	Ä(E'	Ä)E:Ä1FÄ=E:Å

FÅE$	ÅFÅ'E7Å2E:Å:F	Æ
Fc               ó    € V ^8„  d   QhRRRR/# )r   rv   r0   r   rz   r   )r   s   "r   r   r   ÿ   s   € ÷ ñ ¨Sð °Tñ r   c                óÐ   a€ \        V 4      o\        S4       \        ;_uu_ 4        \        S4      w  rRRR4       Xf   R# \	        VXV3R l4       R#   + '       g   i     L); i)aF  Release one session-owned backend (lifecycle seam for hosts/plugins); idempotent, True iff one was released.
Cache entries are removed BEFORE stopping so new lookups cannot retain the stale target/ref namespace. Approval
grants are not touched here: they live in the shared store and die with ``tools.approval.clear_session``.NFc                ó4   <€ \         P                  R SRR7      # )z2computer_use backend release failed for session %sT)Úexc_info©r�   Údebug)r»   r¬   s   &€r   rÉ   Ú.release_computer_use_session.<locals>.<lambda>
  s   ø€ œFŸL™LÐ)]Ð_bÐmq˜LÔrr   T)rŠ   r‡   rË   rµ   r¼   )rv   rh   r´   r¬   s   &  @r   Úrelease_computer_use_sessionrÜ   ÿ   sQ   ø€ ô �jÓ
!€CÜ˜CÔ ß	ŽÜ+¨CÓ0Ñˆ÷ 
à‚ÙÜ�'˜9Ürôtá÷ 
�ús   ¦AÁA%	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r     s   € ÷ nñ n $ñ nr   c                 óÚ  € \         ;_uu_ 4        \        P                  4        U Uu/ uF&  w  r\        V4      V\        P                  V 4      3bK(  	  pp p\        e9   VP                  \        \        4      \        \        P                  R4      34       Rs\        P                  4       \        P                  4       \        P                  4       \        P                  4       3 RRR4       \        ;_uu_ 4        \        P                  4        RRR4       XP                  4        F  w  r4\        W4R 4       K  	  R# u upp i   + '       g   i     Li; i  + '       g   i     LQ; i)aG  Stop all cached backends so cua-driver subprocesses don't outlive us. atexit only, no signal handlers: a
``SystemExit`` from a prompt_toolkit key binding corrupts its coroutine state and makes the process unkillable.
Never raises. Drops the global lock before stop(): teardown budgets 5s and must not block spawns.

Each session backend holds a long-lived ``cua-driver`` subprocess, so without this a driver can survive
the Hermes process that spawned it (#28152 item 3). #69903 kept the orphan from burning a core by
disabling the cursor overlay; the process itself still lingered.
NrK   c                ó.   € \         P                  R V 4      # )z%cua-driver atexit teardown failed: %srÙ   rÈ   s   &r   rÉ   Ú*_shutdown_backend_atexit.<locals>.<lambda>!  s   € ´F·L±LÐAhÐjkÔ4lr   )rË   rn   ÚitemsÚidro   r5   rm   Ú
setdefaultr„   rp   rq   r›   rs   Úvaluesr¼   )r¬   rT   Úuniquerh   r´   s        r   Ú_shutdown_backend_atexitræ     sô   € ÷ 
ŽÜIRÏÉÔIZÔ[ÑIZ¹v¸s”"�Q“%˜!Ô0×4Ñ4°SÓ9Ð:Ò:ÑIZˆÑ[ÜÒØ×Ñœb¤›l¬XÔ7J×7NÑ7NÈrÓ7RÐ,SÔTØˆÜ�‰ÓÔ.×4Ñ4Ó6Ô8Q×8WÑ8WÓ8YÔ[l×[rÑ[rÓ[tÑt÷ 
÷ 
ŽÜ× Ñ Ô"÷ 
à$Ÿm™mžoÑˆÜ�gÑ*lÖmó .ùó \÷ 
�ú÷ 
�ús)   �E§,E
ÁBEÃ<EÅEÅE	ÅE*	c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   #  s   € ÷ ñ  ñ r   c                 ó.   € \        4        \        4        R # r   )ræ   r‡   r   r   r   Úreset_backend_for_testsré   #  s   € ÜÔÜÖr   Úresultc               ó$   € V ^8„  d   QhRRRRRR/# )r   Únamer0   Úparamsrê   r   r   )r   s   "r   r   r   '  s!   € ÷ ñ �Sð  3ð °ñ r   c               ó   a aa€ V VV3R  lpV# )c           
     óò   <€ V P                   P                  S/ \        P                  S4      C\        \	        SV4      4      CVC;p34       \        S4      '       d	   S! V4      # Sf   \        RSR7      # S# )NT)ÚokrC   )ÚcallsÚappendÚdictÚfromkeysÚzipÚcallabler   )ÚselfÚposÚkwÚcallrì   rí   rê   s   &*, €€€r   ÚmethodÚ_noop_stub.<locals>.method*  ss   ø€ Ø�
‰
×Ñ˜4Ð)b¬D¯M©M¸&Ó,AÐ)bÄTÌ#ÈfÐVYÓJZÓE[Ð)bÐ_aÐ)bÐ!b ÐcÔdÜ'¨×/Ò/‰v�d‹|ÐuÐ[aÒ[i´\ÀTÐRVÔ5WÐuÐouÐur   r   )rì   rê   rí   rû   s   fdj r   Ú
_noop_stubrý   '  s   ú€ ÷vð €Mr   c            	      ó  € ] tR tRtRtR R ltR ;ttR R lt]	! RR	R
RRR R7      t
]	! R4      ]	! R4      ]	! R4      uttt]	! RR4      ]	! RR4      ]	! RRR4      uttt]	! R. R7      ]	! R. R7      utt]	! RR
R4      tRtR# )Ú_NoopBackendi/  zqTest stub (tests patch ``_new_backend`` to return it). Records ``(name, kwargs)`` calls; returns trivial results.c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   Ú_NoopBackend.__annotate__2  s   € ×QÑQ˜$ÑQr   c                	ó   € . V n         R # r   ©rñ   ©r÷   s   &r   Ú__init__Ú_NoopBackend.__init__2  s   € Èr ¦
r   c                	ó   € R # r   r   r  s   &r   rÉ   Ú_NoopBackend.<lambda>3  s   € ¡r   c               ó   € V ^8„  d   QhRR/# ©r   r   rz   r   )r   s   "r   r   r  4  s   € ×/Ñ/˜dÑ/r   c                	ó   € R # )Tr   r  s   &r   Úis_availableÚ_NoopBackend.is_available4  s   € ©4r   ÚcaptureÚmodeÚappÚpidÚ	window_idc           
     	ój   € \        V R ,          ;'       g    RRRR. V R,          ;'       g    RRR7      # )r  Úsomi   i   Nr  rK   )r  ÚwidthÚheightÚpng_b64Úelementsr  Úwindow_title)r   )rù   s   &r   rÉ   r  6  s9   € ÔYfØ��Z× Ð ˜5¨°SÀ$ÐQSÐY[Ð\aÕYb×YhÐYhÐfhÐwyõZ{r   )rê   ÚclickÚdragÚscrollrH   rJ   rQ   r/   Ú	set_valueÚvalueÚelementÚ	list_appsÚlist_windowsÚ	focus_appÚraise_windowr  N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r  rÌ   rº   r  rý   r  r  r  r  Ú	type_textrQ   r  r   r!  r"  Ú__static_attributes__r   r   r   rÿ   rÿ   /  s¬   † Ù{åQÙ$Ð$€EˆDÝ/á˜ F¨E°5¸+ñ O{ô |€Gá$ WÓ-©z¸&Ó/AÁ:ÈhÓCWÐ€Eˆ4�Ù *¨6°6Ó :¹JÀuÈfÓ<UÑWaÐbmÐovð  yBó  XCÐ€Iˆs�IÙ(¨¸RÔ@Á*È^ÐdfÔBgÐ€Iˆ|Ù˜;¨¨~Ó>„Ir   rÿ   c               ó    € V ^8„  d   QhRRRR/# )r   rD   rE   r   r   r   )r   s   "r   r   r   >  s   € ÷ >>ñ >>˜nð >>¸3ñ >>r   c           
     óê  aaa€ V P                  R4      ;'       g    RP                  4       P                  4       oS'       g   \        P                  ! RR/4      # \        VP                  R4      ;'       g    R4      p^ RIHo ^ RIH	p R V3R	 llp SP                  4       oT! 4        \        ST 4      ;pe   T# S\        9   d!   \        S,          P                  '       d   S.M. T P                  R4      '       g   SR8X  d   T P                  R4      '       d   R.M. ,           pT F  p\        Y€4      ;pf   K  Tu # 	  \         P"                  ! 4       p	 T	P%                  \'        T4      4      p
 T	;_uu_ 4         SP                  4        R TT3R llpT! 4        \1        T
SYT;'       g    R
R7      pT! 4        TuuR
R
R
4       #   SP                   d   pT! T4      u R
p?# R
p?ii ; i  \(         dB   p^ RIHpHp T! 4       T8X  d   RR/M/ p\        P                  ! RRT 2/TC4      u R
p?# R
p?ii ; i  SP                   d   pT! T4      u R
p?uuR
R
R
4       # R
p?ii ; i  + '       g   i     R
# ; i  SP                   d   pT! T4      u R
p?# R
p?i\(         d>   p\2        P5                  RS4       \        P                  ! RS RT 2/4      u R
p?# R
p?ii ; i)u=  Main entry point (tools.registry): a JSON string (text-only) or a dict marked `_multimodal`. Order: hard
blocks (_reject_unsafe) -> approval scopes (destructive action, then 'bring_to_front' â€” persistent focus is a
separate visible side effect with its own scope) -> backend -> dispatch under the session call lock.rC   rK   rO   zmissing `action`rv   )Úlease)Úensure_started_for_toolc               ó    € V ^8„  d   QhRRRR/# )r   r»   r—   r   r0   r   )r   s   "r   r   Ú)handle_computer_use.<locals>.__annotate__I  s   € ÷ iñ i�Ið i #ñ ir   c                óR   <€ \         P                  ! R RRSRRR\        V 4      /4      # )rð   FrC   rX   Úhuman_has_controlrO   )r\   r]   r0   )r»   rC   s   &€r   Ú_refusedÚ%handle_computer_use.<locals>._refusedI  s,   ø€ Ü�zŠz˜4 ¨°&¸&ÐBUÐW^Ô`cÐdeÓ`fÐgÓhÐhr   NrU   r"  r#  )ÚDEFAULT_BACKENDÚconfigured_backend_namerP   z›If the cua-driver binary is missing, run `hermes computer-use install`. If a Python dependency is missing, the error above shows the exact install command.z"computer_use backend unavailable: c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r0  l  s   € ÷ [ñ [˜Dñ [r   c                 ó|   <€ S P                  4       P                  SP                  8w  d   S P                  R 4      hR# )zŽA human took over this desktop while the action ran; its result was discarded. Tell the user what you need and re-capture once they hand back.N)r5   ÚepochÚHumanHasControl)Ú	_bd_leaseÚadmitteds   €€r   Ú_fenceÚ#handle_computer_use.<locals>._fencel  s=   ø€ ð —=‘=“?×(Ñ(¨H¯N©NÔ:Ø#×3Ñ3ðZó[ð [ñ ;r   ©Úfencerv   zcomputer_use %s failedz	 failed: )r5   r;   r<   r\   r]   r0   Útools.bot_desktopr-  Útools.bot_desktop.runtimer.  Úassert_agent_may_actr:  rb   Ú_ACTIONSÚdestructiveÚ_request_approvalr•   Ú	ExitStackÚenter_contextrÔ   r—   r¨   r5  r6  Ú	_dispatchr�   Ú	exception)rD   Úkwargsrv   Ú_bd_ensure_startedr3  r»   ÚerrÚscopesÚscoperú   rh   r5  r6  rP   r=  rê   r;  rC   r<  s   &,              @@@r   Úhandle_computer_userP  >  s¬  ú€ ð �h‰h�xÓ ×&Ð& B×-Ñ-Ó/×5Ñ5Ó7€FßÜ�zŠz˜7Ð$6Ð7Ó8Ð8Ü�V—Z‘Z Ó-×3Ð3°Ó4€Jå4ÝW÷ið iðØ×1Ñ1Ó3ˆñ ÔÜ˜f dÓ+Ð+ˆÒ8Øˆ
Ø ¤HÔ,´¸&Õ1A×1M×1MÐ1Mˆv‰hÐSUØ"Ÿh™hÐ'7×8Ò8¸VÀ{Ô=RÐW[×W_ÑW_Ð`n×WoÒWoÐ	ÑÐvxõz€FãˆÜ$ UÓ1Ð1ˆCÔ>ØŠJñ ô
 ×ÒÓ!€DðWØ×$Ñ$Ô%6°zÓ%BÓCˆð>ßŠTð#Ø×.Ñ.Ô0÷[ñ [ñ ŒHÜ˜w¨°Èz×OaÐOaÐ]aÔbˆFÙŒHØ÷) ŠTøð- ×$Ñ$ô Ù˜‹{Õûðûô ô WßQñ +Ó,°Ô?ð ð cñ dàEGð 	ô �zŠz˜7Ð&HÈÈÐ$LÐUÐPTÐUÓVÕVûðWûð ×,Ñ,ô #Ù “{Ô"÷ ŠTûð#ú÷ �TˆTûð* ×$Ñ$ô Ù˜‹{ÕûÜô >Ü×ÑÐ1°6Ô:Ü�zŠz˜7 v h¨i¸°sÐ$;Ð<Ó=Õ=ûð>úsÌ   ÂG ÅG6 Å7
J	 ÆI5ÆIÆ!I5Æ5I5Ç
J	 ÇG3Ç!G.Ç(G3Ç.G3Ç6IÈ6H=È7IÈ=IÉI2ÉI-ÉI2ÉI5É"
J	 É-I2É2I5É5J	Ê J	 ÊJ	 Ê	K2ÊJ'Ê!K2Ê'K2Ê4K2Ê52K-Ë'K2Ë-K2c               ó$   € V ^8„  d   QhRRRRRR/# rB   r   )r   s   "r   r   r   ~  s&   € ÷ ^ñ ^˜cð ^¨ð ^¸Mñ ^r   c                óF  € ^ RI Hp VP                  R4      R8X  d   RMRpRV  R2pV! RV  RV 2VR	\        W4       2\        R
V  R2RRRRRV  R2R7
      pVP                  R4      '       d   R# \
        P                  ! RVP                  R4      ;'       g    RRV /4      # )a±  None if approved, else a JSON error string. The decision (yolo bypass, session/permanent grants, CLI prompt,
gateway pending, cron/unattended policy, fail-closed with nobody to ask) is ``tools.approval``'s shared gate,
so a computer_use grant is one store entry like any terminal pattern. Scope key ``cua:<action>:<mode>``:
foreground delivery is a visible focus change, so a background ``session`` grant must NOT cover it (#67052).
)Ú_run_approval_gaterV   rW   Ú
backgroundzAllow computer_use to perform `z`?zcua:Ú:zcomputer_use: zcomputer_use `z` requires approvalzdesktop actionsz=Find an alternative approach that avoids driving the desktop.z:computer_use action in non-interactive non-gateway contextTzBLOCKED: computer_use `zP` requires approval but no interactive user or gateway is present to approve it.)
Úpattern_keyÚdescriptionÚdisplay_targetÚapproval_callbackÚsubjectÚnounÚadviceÚautoapprove_log_prefixÚfail_closed_when_no_humanÚno_human_block_messageÚapprovedNrO   Úmessagezdenied by userrC   )r™   rS  r5   Ú_summarize_actionr   r\   r]   )rC   rD   rS  r  rW  rê   s   &&    r   rF  rF  ~  sÈ   € õ 2àŸ8™8 OÓ4¸ÔD‰<È,€DØ3°F°8¸2Ð>€KÙØ˜6˜( ! D 6Ð*¸Ø'Ô(9¸&Ó(GÐ'HÐIÔ]oØ   Ð(;Ð<ÐCTØNØ[Ø"&Ø"9¸&¸ð BDð !Dô	€Fð ‡z�z�*×ÒÙÜ�:Š:�w §
¡
¨9Ó 5× IÐ IÐ9IÈ8ÐU[Ð\Ó]Ð]r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rC   r0   rD   rE   r   r   )r   s   "r   r   r   –  s&   € ÷ Oñ O˜cð O¨ð O¸Cñ Or   c                ó”   € VP                  R 4      R8X  d   RMRp\        P                  V \        R4      4      P                  WV4      # )rV   rW   u;    [FOREGROUND â€” briefly raises the window / changes focus]rK   N)r5   rD  Ú_ActionSpecÚ	summarize)rC   rD   Úfgs   && r   rb  rb  –  s@   € ØJNÏ(É(ÐSbÓJcÐgsÔJsÑ	FÐy{€BÜ�<‰<˜¤¨DÓ 1Ó2×<Ñ<¸VÈ2ÓNÐNr   c               ó    € V ^8„  d   QhRRRR/# ©r   rD   rE   r   r   )r   s   "r   r   r   �  s   € ÷ @ñ @ˆnð @ ñ @r   c                óš   € V P                  R4      ;p'       d'   V^ ,          e   \        V^ ,          V^,          R7      # \        RRR7      # )zVClick semantics: a coordinate only counts when its x is set (a bare y is not a point).Ú
coordinateN©ÚxÚy©r5   ró   ©rD   Úcoords   & r   Ú_xyrr  �  sE   € à59·X±X¸lÓ5KÐ,K¨EÖ,KÐQVÐWXÕQYÒQeŒ4�%˜•(˜e A�hÔ'ÐÔkoÐrvÐz~ÔkÐr   c               ó    € V ^8„  d   QhRRRR/# ri  r   )r   s   "r   r   r   ¡  s   € ÷ Hñ H�^ð H¨ñ Hr   c                óÌ   € V P                  R4      ;'       g    Rp\        V'       d   V^ ,          e
   V^ ,          MRV'       d   V^,          e   V^,          R7      # RR7      # )ud   Scroll semantics: axes are independent â€” ``coordinate=[null, 100]`` scrolls at y=100 with x unset.rk  Nrl  ©NNro  rp  s   & r   Ú
_scroll_xyrv  ¡  s[   € à�H‰H�\Ó"×2Ð2 l€EÜŸe¨¨a­Ò(<�%˜–(À$ß#¨¨a­Ò(<�%˜•(ôHð HØBFôHð Hr   c                óÒ   € V P                   ! RR VP                  R 4      /\        V4      BRT;'       g    VP                  R4      ;'       g    RRVRVP                  R4      /BVB # )r  ÚbuttonÚleftÚclick_countÚ	modifiersr   )r  r5   rr  )rh   rC   rD   rx  ÚcountÚdeliverys   &&&&&,r   Ú	_do_clickr~  §  s|   € Ø�=Š=ñ Y §¡¨)Ó!4ð Y¼¸D»	ñ YÈ&×JpÐJpÐTX×T\ÑT\Ð]eÓTf×JpÐJpÐjpð YØ%*ðYØ6:·h±h¸{Ó6KñYØOWñYð Yr   c                óâ  € VP                  R 4      VP                  R4      rTVP                  R4      e   VP                  R4      f)   V'       d	   V'       g   \        P                  ! RR/4      # V P                  ! RRVP                  R4      RVP                  R4      RV'       d   \	        V4      MRRV'       d   \	        V4      MRR	VP                  R	R
4      RVP                  R4      /VB # )Úfrom_coordinateÚto_coordinateÚfrom_elementNÚ
to_elementrO   zFdrag requires from_coordinate/to_coordinate or from_element/to_elementÚfrom_xyÚto_xyrx  ry  r{  r   )r5   r\   r]   r  Útuple)rh   rC   rD   r}  ÚsrcÚdsts   &&&,  r   Ú_do_dragr‰  «  sÜ   € Ø�x‰xÐ)Ó*¨D¯H©H°_Ó,EˆØ�‰�Ó Ò(¨D¯H©H°\Ó,BÒ,J×UX×]`Ü�zŠz˜7Ð$lÐmÓnÐnØ�<Š<ñ h T§X¡X¨nÓ%=ð hÈ$Ï(É(ÐS_ÓJ`ð hß.1¤ c¤
°tðhßQTÄ5ÈÄ:ÐZ^ðhà#Ÿx™x¨°&Ó9ðhàEIÇXÁXÈkÓEZðhà^fñhð hr   c                óÞ   € V P                   ! RR VP                  R R4      R\        VP                  R^4      4      RVP                  R4      /\        V4      BRVP                  R4      /BVB # )Ú	directionÚdownÚamountr  r{  r   )r  r5   r~   rv  ©rh   rC   rD   r}  s   &&&,r   Ú
_do_scrollr�  ³  s€   € Ø�>Š>ñ x D§H¡H¨[¸&Ó$Að xÌ#ÈdÏhÉhÐW_ÐabÓNcÓJdð xØ"&§(¡(¨9Ó"5ðxÜ9CÀDÓ9IñxØUY×U]ÑU]Ð^iÓUjñxØnvñxð xr   c                 ó   € R # r   r   r   r   r   rÉ   rÉ   ·  s   € ±Tr   c           
     óP  € \        VP                  R R4      4      ;pR9  d   \        P                  ! RRV: R2/4      # V P                  ! RR VRVP                  R4      /R	 Uu/ uF   qrP                  V4      f   K  WrV,          bK"  	  upB pV! 4        \        W„R7      # u upi )
r  r  rO   z	bad mode z; use som|vision|axr  r†   >   Úaxr  Úvisionr   ©r  r  )r0   r5   r\   r]   r  Ú_capture_response)	rh   rC   rD   r@  rv   rÏ   r  ÚkÚcaps	   &&&&&,   r   Ú_do_capturer˜  ·  s¯   € Ü�D—H‘H˜V UÓ+Ó,Ð,ˆÐ5LÔLÜ�zŠz˜7 i°©xÐ7JÐ$KÐLÓMÐMà
�/Š/ñ  C˜tð  C¨¯©°%«ð  CÑQeó  =BÑQeÈA×iqÑiqÐrsÓit¼Z¸QÀQÅºZÑQeñ  =Bñ  C€CÙ	„GÜ˜SÔ8Ð8ùò =Bs   Á%B#Á>B#c                óh   € \         P                  ! V\        W4      ! 4       ;pR \        V4      /4      # ©r|  )r\   r]   rg   Úlen)rh   rC   rD   rQ   rÏ   rá   s   &&&&, r   Ú_do_listingrœ  ¿  s,   € Ü�:Š:�s¤g¨gÔ&>Ó&@Ð@˜UÀ7ÌCÐPUËJÐWÓXÐXr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rC   r0   rD   rE   rg  r   r   )r   s   "r   r   r   Â  s(   € ÷ "ñ "˜Sð "¨ð "¸Cð "ÀCñ "r   c                ó¬   € VP                  R 4      e   RVR ,           2M-VP                  R4      '       d   R\        VR,          4       2MRpV  V V 2# )r  z
 element #rk  z at rK   )r5   r†  )rC   rD   rg  Úwheres   &&& r   Ú_summarize_clickr   Â  s]   € Ø/3¯x©x¸	Ó/BÒ/Nˆz˜$˜y�/Ð*Ñ+Ø8<¿¹À×8NÒ8N�Dœ˜t LÕ1Ó2Ð3Ñ4ÐTVð 
àˆX�e�W˜R˜DÐ!Ð!r   re  z#handler input destructive summarizeFc                ó   € W,           # r   r   ©ÚarD   rg  s   &&&r   rÉ   rÉ   Ë  s   € ÀQÆVr   )ÚdefaultsT)ÚinputrE  r  )rf  Údouble_clickrš  Úright_clickÚright)rx  Úmiddle_clickÚmiddler  c                ó¶   € R VP                  R4      ;'       g    VP                  R4       RVP                  R4      ;'       g    VP                  R4       V 2# )zdrag r‚  r€  u    â†’ rƒ  r�  ©r5   r¢  s   &&&r   rÉ   rÉ   Ó  s^   € ¸eÀDÇHÁHÈ^ÓD\×D{ÐD{Ð`d×`hÑ`hÐizÓ`{ÐC|ð  }BØ@DÇÁÈÓ@V×@sÐ@sÐZ^×ZbÑZbÐcrÓZsÐ?tÐuwÐtxñ=zr   r  c                óV   € R VP                  RR4       RVP                  R^4       V 2# )zscroll r‹  Ú?z xr�  r¬  r¢  s   &&&r   rÉ   rÉ   Õ  sC   € ÀÈÏÉÐR]Ð_bÓIcÐHdÐdfÐgk×goÑgoÐpxÐz{Óg|Ðf}ð  Að  ~Bñ  @Cr   rH   c                óH   € V P                   ! VP                  R R4      3/ VB # )rJ   rK   )r)  r5   rŽ  s   &&&,r   rÉ   rÉ   Ö  s"   € ¸W×=NÒ=NÈtÏxÉxÐX^Ð`bÓOcÑ=pÐgoÒ=pr   c                ó¶   € R VP                  RR4      R,          : 2\        VP                  RR4      4      ^<8”  d   R,           V,           # R,           V,           # )ztype rJ   rK   ºNé<   Nz...)r5   r›  r¢  s   &&&r   rÉ   rÉ   ×  sr   € °5¸¿¹À&È"Ó9MÈcÕ9RÑ8UÐ1VÔcfÐgk×goÑgoÐpvÐxzÓg{Óc|ð  @Bô  dBÐZ_õ  2Kð  NPö  2Pð  HJõ  2Kð  NPö  2Pr   rQ   c                óH   € V P                   ! VP                  R R4      3/ VB # )r/   rK   )rQ   r5   rŽ  s   &&&,r   rÉ   rÉ   Ø  s    € ¸G¿KºKÈÏÉÐQWÐY[ÓH\Ñ<iÐ`hÒ<ir   c                ó2   € R VP                  RR4      : V 2# )zkey r/   rK   r¬  r¢  s   &&&r   rÉ   rÉ   Ù  s   € °$°t·x±xÀÈÓ7KÑ6NÈrÈdÑ0Sr   r  c                ó¼   € VP                  R 4      f   \        P                  ! RR/4      # V P                  \	        VR ,          4      VP                  R4      R7      # )r  rO   zset_value requires `value`r  )r  r  )r5   r\   r]   r  r0   ©rh   rC   rD   rÏ   s   &&&,r   rÉ   rÉ   Ú  sS   € Ø?C¿x¹xÈÓ?PÒ?XŒ�
Š
�GÐ9Ð:Ó;ð 	VØ×Ñ¤S¨¨g­Ó%7ÀÇÁÈ)ÓATÐÓUð	Vr   r"  c                óÄ   € VP                  R 4      '       g   \        P                  ! RR/4      # V P                  VR ,          \	        VP                  R4      4      R7      # )r  rO   zfocus_app requires `app`r#  )r#  )r5   r\   r]   r"  rz   r¶  s   &&&,r   rÉ   rÉ   Ý  sQ   € ØAEÇÁÈ%ÇÂŒ�
Š
�GÐ7Ð8Ó9ð 	YØ×Ñ˜t E�{¼¸d¿h¹hÀ~Ó>VÓ9WÐÓXð	Yr   c                óz   € R VP                  RR4      : 2VP                  R4      '       d	   R,           # R,           # )zfocus r  rK   r#  z (raise)r¬  r¢  s   &&&r   rÉ   rÉ   à  s4   € ¨¨t¯x©x¸¸rÓ/BÑ.EÐ&FÐX\×X`ÑX`Ðao×XpÒXpÈ*Ö&yÐvxÖ&yr   )rE  rf  r  Úwaitc           
     óh   € \        V P                  \        VP                  R R4      4      4      4      # )Úsecondsç      ð?)Ú_text_responser¹  Úfloatr5   r¶  s   &&&,r   rÉ   rÉ   â  s(   € ¼>È'Ï,É,ÔW\Ð]a×]eÑ]eÐfoÐqtÓ]uÓWvÓJwÔ;xr   r   Úapps©rQ   r!  zdict[str, _ActionSpec]rD  c              #  óR   "  € T F  w  rVP                   '       g   K  Vx € K  	  R # 5ir   )r¥  )r6   r£  Úss   &  r   r8   r8   ç  s   é € ÐEÑ)9¡ ¸Q¿W½WŸ1š1Ó)9ùs   ‚'�
'ÚhotkeyÚ	press_keyÚkeypressÚ	key_comboÚshortcutr)  Ú
input_textÚ
screenshotÚget_window_stateÚ
left_clickÚmouse_clickc                 ó   € R # r   r   r   r   r   rÉ   rÉ   ï  s   € Ñrvr   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r   rh   r   rC   r0   rD   rE   r@  úCallable[[], None]rv   rF   r   r   r   )r   s   "r   r   r   ï  sB   € ÷ `ñ `Ð)ð `°3ð `¸nð `ÐUgð `Ø'ð`Ø36ñ`r   c                óŠ  € \         P                  V4      pVf\   \        P                  ! RRV: 2\        P                  \        V4      4      ;p'       d   RV: R2,           /4      # R,           /4      # VP                  '       d–   \        VP                  R4      ;p\
        4      '       do   VP                  4       '       dY   \        W4      ;peJ   \        P                  ! RRR	VR
RRV RV: RVP                  4       : RVP                  4       : R2/4      # VP                  ! WV3/ VP                  '       d5   \        VP                  R4      \        VP                  R4      4      R7      M\        W4R7      B p	\        V	\
        \        34      '       d   V	# \        W	\        VP                  R4      4      VVR7      # )zç``fence`` raises when the screen lease moved since admission; capture paths call it as soon as the
frame is in hand, before anything derived from it leaves the process (including the screenshot dedup
cache keyed by ``session_id``).rO   zunknown action u    â€” did you mean z)? See the action enum in the tool schema.rK   r  rð   FrC   rX   Úinput_target_mismatchz  would go to the current target z, not ub    â€” input actions always hit the sticky target from the last capture/focus_app. Call capture(app=z!) or focus_app first, then retry.rV   rU   )rV   rU   r?  Úcapture_afterr†   )rD  r5   r\   r]   Ú_ACTION_SUGGESTIONSr0   r¥  Ú
isinstancer;   rl   Úhandlerró   rz   Ú_maybe_follow_capture)
rh   rC   rD   r@  rv   ÚspecrP   rd   ÚmismatchÚress
   &&&&&     r   rI  rI  ï  sá  € ô
 �<‰<˜Ó€DØ‚|Ü�zŠz˜7 o°f±ZÐ$@ÜM`×MdÑMdÔehÐioÓepÓMqÐEqÀTÖEqð GYÐY]ÑX`ð  aJð  EKõ %|ð }ó ~ð 	~Øxzõ%|ð }ó ~ð 	~ð 	�
�
ˆ
”z°4·8±8¸E³?Ð"B -ÄC×HÒHÈ]×M`ÑM`×MbÒMbÜ3°GÓKÐK�ÒXÜ�zŠz˜4 ¨°&¸&ÐBYÐ[bØˆhÐ6°x±lÀ&È×I\ÑI\ÓI^ÑHað b à -× 3Ñ 3Ó 5Ñ8Ð8Yð[ð]ó ^ð 	^ð �,Š,�w¨ñ oØ48·J·J°Jô 26ÀDÇHÁHÈ_ÓD]ÔnrÐsw×s{Ñs{ð  }Mó  tNó  oOõ  2PÜDHÈuÔDlño€Cä˜S¤3¬ +×.Ò.ˆ3ð `Ô4IÈ'ÔX\Ð]a×]eÑ]eÐfuÓ]vÓXwÐy~ØT^ô5`ð `r   c               ó    € V ^8„  d   QhRRRR/# ©r   rÙ  r   r   rE   r   )r   s   "r   r   r   	  s   € ÷ *qñ *q ð *q°.ñ *qr   c                óÜ  € V P                   R8X  g   V P                  RJ d   RR/# V P                   R8X  d   RRRR/# V P                   R	8X  g!   V P                  '       d   V P                  eû   \	        V P
                  \        4      '       d   V P
                  M/ pVP                  R
4      VP                  R4      r2V P                  R9   dT   V P                  R8X  dC   \	        V\        4      '       d-   \	        V\        4      '       d   V^ 8”  d   V^ 8:  d	   RRRRRR/# RR/\	        V P                  \        4      '       d   RV P                  P                  R4      /M/ CRR/C# RRRR/# )z™Next ladder step from semantic evidence, in precedence order. Escalation is advisory: it never overrides
a confirmed effect nor licenses repeating input.Ú	confirmedTÚdecisionÚdoneÚunverifiableÚverify_fresh_staterP   uš   Input was delivered but not confirmed. Re-capture and check the result BEFORE any retry â€” do not repeat the input on an escalation recommendation alone.Úsuspected_noopÚdelivered_charsÚrequested_charsÚtype_text_incompleteÚescalateÚrecommendedr  u>  0 characters landed: this input drops synthetic keystrokes, so no delivery rung will fix it. Climb to the set_value action on the field's element index instead â€” it is an action, not a delivery mode, and sets the value through the accessibility API, bypassing event filtering. Re-capture first if the index is stale.u'  The input likely did not land. Climb one rung following `recommended`: 'px' â†’ re-issue by coordinate; 'foreground' (or a failed pixel click) â†’ re-issue with delivery_mode='foreground' (separate approval). Do not predict the rung from the app being Electron/Chromium â€” react to this signal.zYTransport succeeded but the effect is unproven. Re-capture and confirm before continuing.)rH   r)  )ÚeffectÚverifiedrð   rX   rÔ  r-   ró   r5   rC   r~   Ú
escalation)rÙ  r-   Ú	deliveredÚ	requesteds   &   r   Ú_classify_action_resultrí  	  so  € ð ‡z�z�[Ô  C§L¡L°DÓ$8Ø˜FÐ#Ð#Ø
‡z�z�^Ô#ØÐ0°&ð <mð oð 	oà
‡z�zÐ%Ô%¨S¯V¯V¨V°s·x±xÒ7KÜ% c§h¡h´×5Ò5ˆs�xŠx¸2ˆØ#Ÿx™xÐ(9Ó:¸D¿H¹HÐEVÓ<W�9à�J‰JÐ/Ô/Ø—‘Ð2Ô2Ü˜9¤c×*Ò*Ü˜9¤c×*Ò*Ø˜A”Ø˜Q”ð ˜JØ˜{Øð>ð		ð 	ð ˜Jð gÜ.8¸¿¹Ì×.NÒ.Nð -:¸3¿>¹>×;MÑ;MÈmÓ;\Ñ+]ØTVðgØY_ðeñgð 	gð
 Ð,ØÐoðqð qr   c               ó    € V ^8„  d   QhRRRR/# )r   Úfieldsr   r   rE   r   )r   s   "r   r   r   5  s   € ÷ 2ñ 2�sð 2˜~ñ 2r   c                 ój   € V P                  4        UUu/ uF  w  rV'       g   K  WbK  	  upp# u uppi r   )rá   )rï  r–  Úvs   ,  r   Ú_presentrò  5  s(   € Ø#Ÿ\™\œ^Ô1™^‘T�Q¬qŒDˆAŠD™^Ò1Ð1ùÓ1s   ”/¥/c               ó    € V ^8„  d   QhRRRR/# rÛ  r   )r   s   "r   r   r   8  s   € ÷ 5ñ 5˜ð 5¨.ñ 5r   c                óø   € R V P                   RV P                  /\        V P                  R7      CR Uu/ uF  p\	        W4      ;pf   K  WbK  	  upC\        V P
                  R7      CR\        V 4      /C# u upi )rð   rC   )ra  )r-   Úverdict)ré  rè  rê  ÚpathÚdegradedrV   rX   )rð   rC   rò  ra  rg   r-   rí  )rÙ  r–  rñ  s   &  r   Ú_action_payloadrø  8  s‡   € ð �#—&‘&˜( C§J¡Jð 5´(À3Ç;Á;Ô2Oð 5Ùnó 6Ñn˜Ü ›Ð'�1ô ˆqŠtÑnñ 6ð5ä9AÀsÇxÁxÔ9Pð5ð Ô.¨sÓ3ñ5ð 5ùò6s   ´A7Á
A7c               ó    € V ^8„  d   QhRRRR/# )r   rÙ  r   r   r0   r   )r   s   "r   r   r   @  s   € ÷ ,ñ ,˜ð ,¨ñ ,r   c                ó@   € \         P                  ! \        V 4      4      # r   )r\   r]   rø  )rÙ  s   &r   r½  r½  @  s   € Ü�:Š:”o cÓ*Ó+Ð+r   c               ó    € V ^8„  d   QhRRRR/# )r   r—  r   r   ry   r   )r   s   "r   r   r   M  s   € ÷ Fñ F˜}ð F°ñ Fr   c                ó¾   € V P                   ;'       g0    V P                  ;'       g    R P                  R4      '       d   RMRpYP                  4       R8X  d   R3# R3# )rK   z/9j/z
image/jpegz	image/pngú.jpgz.png)Úimage_mime_typer  Ú
startswithr<   )r—  Úmimes   & r   Ú_capture_image_formatr  M  sU   € ð ×Ñ×kÐk°C·K±K×4EÐ4EÀ2×3QÑ3QÐRX×3YÒ3Y¡<Ð_j€DØŸJ™J›L¨LÔ8�&ÐEÐE¸fÐEÐEr   c               ó   € V ^8„  d   QhRR/# r
  r   )r   s   "r   r   r   S  s   € ÷ ñ ˜tñ r   c                óö   € \         P                  ! \        \        4      ;_uu_ 4        \        ;QJ d    R  V  4       F  '       d   K   RM	  RM! R  V  4       4      uuRRR4       #   + '       g   i     R# ; i)c              3  ó>   "  € T F  p\        V4      ^ 8H  x € K  	  R# 5i)r¥   N)r~   )r6   rñ  s   & r   r8   Ú"_bounds_unknown.<locals>.<genexpr>W  s   é € Ð/© 1”3�q“6˜Q–;«ùs   ‚FTN)r•   r–   Ú	TypeErrorÚ
ValueErrorÚall)Úboundss   &r   Ú_bounds_unknownr
  S  sG   € ô 
×	Ò	œY¬
×	3Õ	3ß‹sÑ/©Ó/�s�sŠsÑ/©Ó/Ó/÷ 
4×	3×	3Ñ	3áús   ¨A'ÁA'Á'A8	c               ó    € V ^8„  d   QhRRRR/# )r   r»   r   r   rE   r   )r   s   "r   r   r   Z  s   € ÷ ^ñ ^˜	ð ^ nñ ^r   c           
     ó"  € R V P                   RV P                  RV P                  R\         R\	        V P
                  4      '       d   RM\        V P
                  4      RV P                  /\        V P                  4      \        8”  d   RR/C# / C# )ÚindexÚroleÚlabelNr	  r  Úlabel_truncatedT)	r  r  r  Ú_MAX_ELEMENT_LABEL_CHARSr
  r	  Úlistr  r›  rÈ   s   &r   Ú_element_to_dictr  Z  s†   € à�Q—W‘W˜f a§f¡f¨g°q·w±wÐ?XÔ@XÐ7YØœo¨a¯h©h×7Ò7‘d¼TÀ!Ç(Á(»^ÈUÐTU×TYÑTYð^ä,/°·±«LÔ;SÔ,SÐ! 4Ð(ð^ð ^àY[ð^ð ^r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r  úlist[UIElement]Ú	max_linesr~   r   ú	list[str]r   )r   s   "r   r   r   `  s&   € ÷ Hñ H˜ð H¸3ð HÈ	ñ Hr   c                óæ  € V R V  Uu. uF¨  pRVP                    RVP                   RVP                  P                  \	        ^
4      R4      R,          : R2\        VP                  4      '       d   RMRVP                   2,           VP                  '       d   RVP                   R2MR,           NKª  	  ppT\        V 4      V8”  d   R	\        V 4      V,
           R
2.,           # . ,           # u upi )Nz  #Ú r±  z)@ bounds-unknown (click by element index)z@ z [Ú]rK   z  ... +z( more (call capture with app= to narrow))	r  r  r  ÚreplaceÚchrr
  r	  r  r›  )r  r  r»   Úouts   &&  r   Ú_format_elementsr  `  s  € ð 8@À
ÀÑ7KóMá7K°!ð �—‘�	˜˜1Ÿ6™6˜( ! A§G¡G§O¡O´C¸³G¸SÓ$AÀ#Õ$FÑ#IÈÐKÜ=LÈQÏXÉX×=VÒ=VÑ9Ð^`Ðab×aiÑaiÐ`jÐ\kõmà ŸuŸu˜u��1—5‘5�'˜‰m¨"÷.ð .á7Kð ð Mð ÔehÐiqÓerÐu~Ôe~�WœS ›]¨YÕ6Ð7Ð7_Ð`Ðaõ  Hð  Hð  EGõ  Hð  HùòMs   ˆBC.ÂC.c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r  r  Úimage_widthr~   Úimage_heightr   z%tuple[Optional[float], Optional[str]]r   )r   s   "r   r   r   f  s/   € ÷ Jñ J˜Oð J¸#ð JÈSð JÐUzñ Jr   c           	     óÊ  € V '       d   V^ 8:  g   V^ 8:  d   R# ^ ;r4V  F\  p VP                   w  rgr‰\        T\	        T4      \	        T4      ,           4      \        T\	        T4      \	        T	4      ,           4      rCK^  	  W1R,          8:  d   WBR,          8:  d   R# RV RV RV RV R2	p
\        \        W1,          WB,          4      ^4      V
3#   \        \        3 d     KÃ  i ; i)a�  (scale, note) when element bounds live in a different coordinate space than the screenshot, else (None, None).
On HiDPI displays AX bounds are native while the screenshot is downscaled, so coordinate= clicks read off the
screenshot miss by the scale factor. 5% slack: window chrome can hang a few px past the captured frame without
implying a different space. Scale heuristic: larger axis ratio wins.gÍÌÌÌÌÌð?z=element bounds are in native desktop coordinates (extend to ~rm  z), NOT screenshot pixels (u‡   ). coordinate= clicks expect the native space â€” derive click points from element bounds, or scale screenshot positions up accordinglyru  )r	  r  r  Úmaxr~   Úround)r  r   r!  Úmax_xÚmax_yr»   rm  rn  ÚwÚhÚnotes   &&&        r   Ú_bounds_hintsr*  f  sõ   € ÷
 �{ aÔ'¨<¸1Ô+<ØÐØÐ€EÛˆð	ØŸ™‰JˆA�!ô ˜5¤# a£&¬3¨q«6¥/Ó2´C¸¼sÀ1»vÌÈAË½Ó4OŠuñ ð ˜dÕ"Ô" u¸tÕ0CÔ'CØÐØKÈEÈ7ÐRSÐTYÐSZð [&Ø&1 ]°!°L°>ð Bnðn€Dô ”�UÕ(¨%Õ*>Ó?ÀÓCÀTÐIÐIøô œ:Ð&ô 	Úð	ús   ¢CÃC"Ã!C"c                ó(   € \        WV4      ^ ,          # )r¥   ©r*  ©r  r   r!  s   &&&r   rÉ   rÉ   {  s   € ¼MÈ(ÐamÓ<nÐopÖ<qr   c                ó(   € \        WV4      ^,          # )é   r,  r-  s   &&&r   rÉ   rÉ   |  s   € ÄÈxÐfrÓAsÐtuÖAvr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r—  r   Úmax_elementsr~   r   r   r   )r   s   "r   r   r   ~  s&   € ÷ Zñ Z�}ð Z°Cð Z¸Oñ Zr   c                óŠ  € V P                   RV Rr2\        P                  ! \        4      ;_uu_ 4        V P                  '       d,   \        \        P                  ! V P                  RR7      4      MRpRRR4       T;'       g    V P                  V P                  3w  rE\        W$V4      w  rg\        V P                   4      \        V4      8„  ;'       g5    \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      p\        V4      ;'       d    \        V4      \        8  p	\        V P                  4      ;'       d    V P                   R8g  ;'       d    V	'       * p
\        V P                   4      V P"                  u;8¬  ;'       d    ^ 8„  Mu p\%        Y\        V P                   4      YE\        V P                   4      \        V4      ,
          YgV'       d   V P"                  M^ V'       d   \'        V 4      MRV
'       d   \)        V 4      MRV	'       d   W:R7      # RV
R7      #   + '       g   i     ELÇ; i)z£One capture's derived facts, computed once for every response branch: ``visible`` is the capped element list,
``dims_omitted`` an image below the provider minimum.NF©Úvalidatec              3  óZ   "  € T F!  p\        VP                  4      \        8„  x € K#  	  R # 5ir   )r›  r  r  )r6   r»   s   & r   r8   Ú _capture_view.<locals>.<genexpr>‡  s!   é € Ð9sÑkrÐfg¼#¸a¿g¹g»,ÔIaÖ:aÓkrùs   ‚)+Tr’  )r—  ÚvisibleÚtotalr  r  Ú	truncatedÚbounds_scaleÚbounds_noteÚ	ax_cappedÚelements_fileÚscreenshot_pathÚdims_omittedÚ	has_image)r  r•   r–   r—   r  r   Úbase64Ú	b64decoder  r  r*  r›  Úanyrz   ÚminÚ_MIN_PROVIDER_IMAGE_DIMENSIONr  Úax_max_elementsr   Ú_spill_elements_to_fileÚ_persist_capture_image)r—  r1  r7  Údimsr  r  Úscaler)  Úlost_detailÚ	too_smallr@  r<  s   &&          r   Ú_capture_viewrM  ~  sª  € ð —L‘L  ,Ð/°ˆTÜ	×	Ò	œY×	'Õ	'Ø]`×]h×]hÐ]hÔ*¬6×+;Ò+;¸C¿K¹KÐRWÔ+XÔYÐnrˆ÷ 
(à×3Ð3˜SŸY™Y¨¯
©
Ð3�M€EÜ °Ó7�K€Eä�c—l‘lÓ#¤c¨'£lÑ2×sÐs·c³cÑ9sÑkrÓ9s·c·c²cÑ9sÑkrÓ9sÓ6s€KÜ�T“
×HÐHœs 4›yÔ+HÑH€IÜ�S—[‘[Ó!×HÐH c§h¡h°$Ñ&6×HÐH¸y¼=€Iô �C—L‘LÓ! S×%8Ñ%8×<Ô<¸1Ô<€IÜ˜s¼3¸s¿|¹|Ó;LÐTYÜ%(¨¯©Ó%6¼¸W»Õ%EÐTYß<E S×%8Ò%8È1ßITÔ)@ÀÔ)EÐZ^ßJSÔ+AÀ#Ô+FÐY]ß09¨ôZð Zð
 @DÈyôZð Z÷ 
(×	'Ð	'ús   ³A H1È1I	c               ó    € V ^8„  d   QhRRRR/# )r   rñ  r   r   r  r   )r   s   "r   r   r   ”  s   € ÷ ñ ˜oð °)ñ r   c           
     ó&  € V P                   ;'       dC    V P                   V P                  '       d   RV P                   RV P                   R2MR,           V P                  ;'       d    RV P                   2V P                  P                  V P
                  ;'       d'    V P                  '       d   RMR RV P
                   R2V P                  ;'       d    R	V P                   R
23pRV P                  P                   RV P                   RV P                   2V P                  P                  '       d   RV P                  P                   2MR,           V P                  P                  '       d   RV P                  P                  : 2MR,           V P                   R2.R V 4       O\        V P                  4      OV P                  '       d<   RV P                  ^ ,           RV P                  ^,           R\          R\          R2	.O# . O# )z–Human-readable capture summary; line ORDER is contract. Lists only what `elements` surfaces, otherwise the
summary names indices the model can't find.z; estimated scale ~zx (screenshot position x u    â‰ˆ native coordinate)rK   zshareable screenshot saved to zfull z.element tree with untruncated labels saved to uX    â€” read_file/search_files it if you need dropped label text or elements beyond the capzaccessibility walk capped at z elements; pass app= to narrowzcapture mode=r  rm  z app=z window=z interactable element(s):c              3  ó@   "  € T F  q'       g   K  R V R2x € K  	  R# 5i)z  (Ú)Nr   )r6   r)  s   & r   r8   Ú)_capture_summary_lines.<locals>.<genexpr>¥  s   é € Ð	2¡E˜D«TŒ-ˆC�ˆv�Q�-£Eùs   ‚	�z  (screenshot omitted: z is below the z provider minimum))r;  r:  r>  r—  r)  r=  r<  r  r  r  r  r  r8  r  r7  r?  rE  )rñ  Únotess   & r   Ú_capture_summary_linesrT  ”  s  € ð 	
�‰÷ 	qð 	q˜!Ÿ-™-ØYZ×Yg×YgÐYgð .AÀÇÁÐ@PÐPiØ./¯n©nÐ-=Ð=Tñ,VØmoõqà	×Ñ×RÐRÐ >¸q×?PÑ?PÐ>QÐRØ	�‰�
‰
Ø	�‰÷ 	@ð 	@ a§k§k k¡°wÐ?ð @)Ø)*¯©Ð(9ð :?ð?ð 	
�‰×eÐeÐ8¸¿¹¸ÐEcÐdð	€Eð ˜Ÿ™Ÿ
™
�| 1 Q§W¡W I¨Q¨q¯x©x¨jÐ9Ø"#§%¡%§)§) )ˆU�1—5‘5—9‘9�+Ñ°õ	5Ø]^×]bÑ]b×]o×]oÐ]o¸(À1Ç5Á5×CUÑCUÑBXÑ8YÐuwõ	yà�7‰7ˆ)Ð,Ð-ðñ 
3¡EÓ	2ð	ô
 
˜!Ÿ)™)Ó	$ðð ef×dr×drÐdrð % Q§^¡^°AÕ%6Ð$7°q¸¿¹ÈÕ9JÐ8KÈ>Ü+Ð,¨AÔ.KÐ-LÐL^ð`ð aðð ð y{ðð r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rñ  r   Úsummaryr0   ÚextrazOptional[dict[str, Any]]r   r   )r   s   "r   r   r   «  s*   € ÷ 	ñ 	˜_ð 	°sð 	ÐC[ð 	Ðgjñ 	r   c                óØ  € \         P                  ! RV P                  P                  RV P                  RV P
                  RV P                  P                  RV P                  P                  RV P                   Uu. uF  p\        V4      NK  	  upRV P                  RV/T;'       g    / C\        V P                  V P                  V P                  V P                  R	7      C4      # u upi )
z¢JSON text payload shared by the AX, vision-unavailable and aux-vision branches. Key order is contract:
fixed fields, ``extra`` branch markers, then set optionals.r  r  r  r  r  r  Útotal_elementsrV  )Útruncated_elementsr=  r>  r:  )r\   r]   r—  r  r  r  r  r  r7  r  r8  rò  r9  r=  r>  r:  )rñ  rV  rW  r»   s   &&& r   Ú_text_capture_payloadr[  «  sÃ   € ô �:Š:Ø�—‘—
‘
˜G Q§W¡W¨h¸¿¹À%ÈÏÉÏÉÐTbÐde×diÑdi×dvÑdvØ°!·)²)Ó<±)¨QÔ% aÖ(±)Ñ<Ð>NÐPQ×PWÑPWÐYbÐdkðð �;ˆ;�Bðô  a§k¡kÀÇÁÐbc×bsÑbsØ !§¡ô0ð	ó ð ùâ<s   Á:C'c               ó    € V ^8„  d   QhRRRR/# )r   r—  r   r   r0   r   )r   s   "r   r   r   ¶  s   € ÷ Wñ W˜ð W¨3ñ Wr   c                ó  € \         P                  ! \        V P                  ;'       g    R 4      R,           P	                  R4      V P
                  ;'       g    R P	                  RR4      ,           4      P                  4       # )rK   rU  úutf-8ÚasciiÚignore)ÚhashlibÚsha256r0   rþ  Úencoder  Ú	hexdigest©r—  s   &r   Ú_capture_digestrf  ¶  sc   € Ü�>Š>œ3˜s×2Ñ2×8Ð8°bÓ9¸CÕ?×GÑGÈÓPØ Ÿ[™[×.Ð.¨B×6Ñ6°wÀÓIõJó KßKTÉ9Ë;ðWr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r—  r   r1  r~   rv   rF   r   r   r   )r   s   "r   r   r   º  s*   € ÷ *=ñ *=˜=ð *=¸ð *=Ø"/ð*=Ø;>ñ*=r   c                ód  € \        W4      p\        V4      pR P                  V4      RreVP                  '       d�   V'       dy   \	        \        V4      \        V 4      \        V P                  ;'       g    R4      \        V P                  ;'       g    R4      34      '       d   VP                  R4       RR/pEMVP                  '       Ed   \        4       '       gŸ   RRRRR	R	V/RR
R
RR\        V 4      ^ ,           RV P                   2//.RVRRV P                  RVP                  RVP                   RVP"                  RV P$                  /\'        VP(                  VP*                  VP,                  R7      C/# \/        WVP0                  VP2                  VP*                  VP(                  R7      pVe   V# VP                  R4       RR/pVP2                  '       d6   VP                  R\5        VP0                  4       RVP"                   R24       \7        VR P                  V4      V4      # )Ú
NrK   uá     (screen unchanged since the previous capture â€” image omitted to save context; the previous capture's screenshot/analysis still shows the current state. Element indices below are fresh and remain the preferred way to act.)Úscreen_unchangedTÚ_multimodalÚcontentrH   rJ   Ú	image_urlÚurlzdata:z;base64,Útext_summaryr-   r  r  r  r  Ú	png_bytes)r>  r=  r:  )Úvisible_elementsrZ  r=  r>  u£     (vision unavailable: the auxiliary vision model could not be reached; screenshot omitted. Element-index actions still work â€” drive via the element list above.)Úvision_unavailablez  (response truncated to z of ui    elements; the full tree is in elements_file â€” read_file/search_files it, or pass app= to narrow scope))rM  rT  Újoinr@  r�   rŠ   rf  r0   r  r  rò   Ú _should_route_through_aux_visionr  r  r  r  r  r8  Úpng_bytes_lenrò  r>  r=  r:  Ú!_route_capture_through_aux_visionr7  r9  r›  r[  )r—  r1  rv   rñ  ÚlinesrV  rW  Úrouteds   &&&     r   r•  r•  º  s@  € ä�cÓ(€AÜ" 1Ó%€EØ—Y‘Y˜uÓ% tˆUØ‡{‡{€{—zÔ&=Ü˜
Ó#¤_°SÓ%9¼CÀÇÁÇÀÈ2Ó<NÔPSÐTW×TdÑTd×TjÐTjÐhjÓPkÐ;l÷'nò 'nð 	�‰ð =ô 	>ð $ TÐ*ŠØ	
��‰ô 0×1Ò1à˜tØ˜V V¨V°WÐ=Ø# [°+ÀÈÔOdÐehÓOiÐjkÕOlÐNmÐmuÐvy÷  wBñ  wBð  vCð  HDð  @Eð  FðGà Ø˜ §¡¨7°A·G±G¸XÀqÇxÁxÐQ[Ð]^×]dÑ]dÐfqÐsv÷  tEñ  tEð DÜ#°A×4EÑ4EÐUV×UdÑUdÐst÷  tBñ  tBô  CðDðð ô 3Ø¨1¯9©9ÈÏÉØŸ/™/¸1×;LÑ;LôNˆð ÒØˆMð 	�‰ð hô 	ià% tÐ,ˆØ‡{‡{€{Ø�‰Ð0´°Q·Y±Y³Ð0@ÀÀQÇWÁWÀIð Nbð bô 	cä   D§I¡I¨eÓ$4°eÓ<Ð<r   c                 ó   € R # r   r   r   r   r   rÉ   rÉ   ç  s   € ¹dr   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r   rh   r   rÙ  r   Ú
do_capturerz   r@  rÏ  rv   rF   r   r   r   )r   s   "r   r   r   æ  s;   € ÷ 7ñ 7Ð#5ð 7¸Lð 7ÐVZð 7Ø!3ð7ØP]ð7Øilñ7r   c           
     ó2  € V'       d   VP                   '       g   \        V4      #  R Uu/ uF)  qU\        V RR4      ;'       g    / P                  V4      bK+  	  ppV P                  ! RR\        4       /RVP                  4       9  d   TMR\        V RR4      /B pT! 4        \        YtR7      \        T4      r©\        T	\        4      '       d_   T	P                  R4      '       dH   \        P                  ! T
4      R	,           T	R
,          ,           ;T	R,          ^ ,          R&   T	R
&   Y©R&   T	# \        P                  ! / \        P                   ! T	4      CT
C4      # u upi   \         d,   p\        P                  RT4       \        T4      u Rp?# Rp?ii ; i)r  Ú_last_targetNr  r  rf   zfollow-up capture failed: %sr†   rk  z

ro  rl  rJ   Úaction_resultr”  r   )rð   r½  rg   r5   r  Ú_capture_after_moderä   r—   r�   rž   r•  rø  rÔ  ró   r\   r]   Úloads)rh   rÙ  r{  r@  rv   r–  Úexactr—  r»   ÚrespÚpayloads   &&&&&      r   rÖ  rÖ  æ  sn  € ÷ ˜SŸVŸV˜VÜ˜cÓ"Ð"ð#ñ ThÓhÑSgÈa”W˜W n°dÓ;×AÐA¸r×FÑFÀqÓIÒIÑSgˆÐhØ�oŠoñ pÔ#6Ó#8ð pÀdÐRW×R^ÑR^ÓR`ÔF`¹UØBGÌÐQXÐZeÐgkÓIlÐAmñpˆñ
 
„GÜ% cÔAÄ?ÐSVÓCWˆ'Ü�$œ×Ò $§(¡(¨=×"9Ò"9ä<@¿JºJÀwÓ<OÐRXÕ<XÐ[_Ð`nÕ[oÕ<oÐoˆˆY�˜Õ˜6Ñ" T¨.Ñ%9Ø 'ˆ_ÑØˆÜ�:Š:Ð5œŸš DÓ)Ð5¨WÐ5Ó6Ð6ùò iøô ô #Ü�‰Ð5°qÔ9Ü˜cÓ"Õ"ûð#ús5   §E  «EÁEÁAE  ÅE  Å FÅ+ FÆFÆFc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   þ  s   € ÷ #5ñ #5 Tñ #5r   c                ó´  €  Rp ^ RI Hp \        V! 4       4      pV'       d   V P	                  RRR7       R# \        V RRRR7        ^ RI Hp V! V 4       R#   \         d     LJi ; i  \         d"   p\        P                  R	T4        Rp?R# Rp?ii ; i  \         d5   p\        P                  R
Y4       T P	                  RRR7        Rp?R# Rp?ii ; i)u]  Create/reconcile a Hermes media-cache dir owner-only (0700), except managed.

A capture is as sensitive as the screen it came from â€” an open password
manager, a private chat, a bank tab. The umask-derived 0755 these dirs
used to get made every local account able to list (and read) those
frames whenever ``HERMES_HOME`` itself is traversable, which is exactly
what the documented ``HERMES_HOME_MODE=0701`` web-server escape hatch
arranges. Delegates to the same house policy as every Hermes secret dir â€”
``hermes_cli.config._secure_dir`` â€” with the mode passed to ``mkdir`` so
there is no window between mkdir and chmod; managed/NixOS installs keep
their group-share design (the mode is left to the configured umask/setgid
because these lazily-created dirs are not covered by the module's
``systemd.tmpfiles`` rules). Best-effort; never breaks a capture.
F)Ú
is_managedT)ÚparentsÚexist_okNiÀ  )r‡  rˆ  r  )Ú_secure_dirz)computer_use: cache dir chmod skipped: %sz2computer_use: cache dir creation failed for %s: %s)	Úhermes_cli.configr†  rz   r—   Úmkdirr   r‰  r�   rÚ   )Ú	cache_dirÚmanagedr†  r‰  Úexcs   &    r   Ú_secure_dir_policyr�  þ  sÁ   € ð5Øˆð	Ý4ä™:›<Ó(ˆG÷ Ø�O‰O D°4ˆOÔ8ÙÜ�i¨¸À5ÕIð	KÝ5á˜	Ö"øô ô 	Ùð	ûô ô 	KÜ�L‰LÐDÀc×JÒJûð	Kûäô 5Ü�‰ÐIÈ9ÔZØ�‰ ¨tˆ×4Ò4ûð5úsg   ‚B …A ›B £B ¸B ÁA) ÁA&Á#B Á%A&Á&B Á)BÁ4BÂ
B ÂBÂB ÂCÂ#)CÃCc               ó    € V ^8„  d   QhRRRR/# )r   ÚdataÚbytesr   r   r   )r   s   "r   r   r   $  s   € ÷ ñ  Uð ¨tñ r   c                óz  € ^ RI pVP                  VP                  ,          VP                  ,          p VP	                  \        V 4      VR4      pTP                  TR4      ;_uu_ 4       pTP                  T4       RRR4       R#   \         d    T P                  T4        R# i ; i  + '       g   i     R# ; i)a?  Write ``data`` to ``path`` with owner-only (0600) permissions.

``Path.write_bytes`` would land 0644 under a default umask. POSIX mode
bits are advisory on Windows (``os.chmod`` there only toggles the
read-only flag), so this is a best-effort narrowing that falls back to a
plain write rather than failing the capture.
Ni€  Úwb)
ÚosÚO_WRONLYÚO_CREATÚO_TRUNCÚopenr0   ÚOSErrorÚwrite_bytesÚfdopenÚwrite)rö  r‘  Ú_os_privÚflagsÚfdÚhandles   &&    r   Ú_write_private_bytesr¢  $  sš   € ó à×Ñ × 0Ñ 0Õ0°8×3CÑ3CÕC€EðØ�]‰]œ3˜t›9 e¨UÓ3ˆð 
�‰˜˜T×	"Ô	" fØ�‰�TÔ÷ 
#Ñ	"øô ô Ø×Ñ˜ÔÚðú÷ 
#×	"Ð	"ús   ´B Á*B)ÂB&Â%B&Â)B:	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   Úsubdirr0   Úlegacyrì   rM   r—  r~   r   )r   s   "r   r   r   8  s/   € ÷ ñ ˜ð  Sð °ð ¸cð ÈSñ r   c           
     óš  € ^ RI Hp V! W4      p\        V4       \        P                  ! \
        4      ;_uu_ 4        V'       d   \        VP                  V4      R R7      M. pVR\        ^ \        V4      V^,
          ,
          4        F  pVP                  RR7       K  	  RRR4       Wb,          #   + '       g   i     Yb,          # ; i)zÈPath for a new file under ``$HERMES_HOME/<subdir>`` (dir created owner-only, per #77579).
With ``pattern``/``cap``, first unlinks the oldest matching files so at most ``cap - 1`` remain
(best-effort).)Úget_hermes_dirc                ó6   € V P                  4       P                  # r   )ÚstatÚst_mtime)r7   s   &r   rÉ   Ú_cache_file.<locals>.<lambda>@  s   € ¸a¿f¹f»h×>OÒ>Or   rÀ  NT)Ú
missing_ok)rÂ   r§  r�  r•   r–   r—   r_   Úglobr#  r›  Úunlink)	r¤  r¥  rì   rM   r—  r§  rŒ  ÚfilesÚstales	   &&&&&    r   Ú_cache_filer±  8  s�   € õ 0Ù˜vÓ.€IÜ�yÔ!Ü	×	Ò	œY×	'Õ	'ßT[”�y—~‘~ gÓ.Ñ4OÕPÐacˆØÐ;œS ¤C¨£J°#¸µ'Õ$:Ó;Ó<ˆEØ�L‰L DˆLÖ)ñ =÷ 
(ð ÕÐ÷	 
(Ö	'ð ÕÐús   ¼A'B3Â3C
	c               ó8   € V ^8„  d   QhRRRRRRRRRRRRR	R
RR/# )r   Úwhatr0   r¤  r¥  rì   rM   r—  r~   r�  zCallable[[Any], None]r   rF   r   )r   s   "r   r   r   E  sG   € ÷ 	ñ 	˜Cð 	¨ð 	°cð 	Àð 	Èsð 	ÐY\ð 	Ø2ð	Ø7Dñ	r   c           	     ó¢   €  V! \        WW4V4      ;p4       \        V4      #   \         d"   p\        P	                  RY4        Rp?R# Rp?ii ; i)u·   Bounded cache write via ``write(path)``; the path, or None on any failure â€” an unwritable cache must never
break control (a capture keeps working without its spill/screenshot copy).zcomputer_use: %s failed: %sN)r±  r0   r—   r�   rÚ   )	r³  r¤  r¥  rì   rM   r—  r�  rö  rŽ  s	   &&&&&&&  r   Ú_write_cache_filerµ  E  sI   € ðÙ”k &°$ÀÓEÐEˆdÔFÜ�4‹yÐøÜô Ü�‰Ð2°DÔ>Ýûðús   ‚" ¢A­A	Á	Ac               ó    € V ^8„  d   QhRRRR/# ©r   r—  r   r   rF   r   )r   s   "r   r   r   P  s   € ÷ ñ  ð °-ñ r   c           
     óÂ   a € S P                   '       dL   \        RRRR\        P                  ! 4       P                   \        S 4      ^,           2R\        V 3R l4      # R# )ziCopy of the capture in Hermes' media cache so attachment surfaces can deliver it (None without an image).zscreenshot persistencezcache/imagesÚimage_cacheÚcomputer_use_zcomputer_use_*.*c                ó\   <€ \        V \        P                  ! SP                  R R7      4      # )Fr3  )r¢  rA  rB  r  )r7   r—  s   &€r   rÉ   Ú(_persist_capture_image.<locals>.<lambda>U  s   ø€ Ô& q¬&×*:Ò*:¸3¿;¹;ÐQVÔ*WÔXr   N)r  rµ  ÚuuidÚuuid4Úhexr  Ú_MAX_CAPTURE_FILESre  s   fr   rH  rH  P  so   ø€ ð 
��ˆô	 Ø  .°-À=ÔQU×Q[ÒQ[ÓQ]×QaÑQaÐPbÔcxÐy|Óc}Ð~õ  dAð  cBð  BCØÔ.ÜXóð ð ð	r   c               ó    € V ^8„  d   QhRRRR/# r·  r   )r   s   "r   r   r   X  s   € ÷ zñ z ð z°=ñ zr   c                ó¢  a€ RV P                   RV P                  R\        V P                  4      RV P                   Uu. uFJ  pRVP                  RVP
                  RVP                  R\        VP                  4      RVP                   /NKL  	  up/o\        R	R
RR\        P                  ! 4       P                   R2R\        V3R l4      # u upi )us   FULL element tree (untruncated labels) in a cache file â€” the read_file/search_files escape hatch for capped text.r  r  rY  r  r  r  r  r	  zelement spillzcache/computer_useÚcomputer_use_cacheÚ	elements_z.jsonzelements_*.jsonc                óX   <€ V P                  \        P                  ! SR ^R7      RR7      # )F)Úensure_asciiÚindentr^  )Úencoding)Ú
write_textr\   r]   )r7   rƒ  s   &€r   rÉ   Ú)_spill_elements_to_file.<locals>.<lambda>_  s"   ø€  q§|¡|´D·J²J¸wÐUZÐcdÔ4eÐpw |Ô'xr   )r  r  r›  r  r  r  r  r  r	  rµ  r½  r¾  r¿  Ú_MAX_SPILL_FILES)r—  r»   rƒ  s   & @r   rG  rG  X  sÍ   ø€ à�c—g‘g˜~¨s×/?Ñ/?ÐAQÔSVÐWZ×WcÑWcÓSdØØ%(§\¢\ó3Ù%1 ð % a§g¡g¨v°q·v±v¸wÈÏÉÐQYÔ[_Ð`a×`hÑ`hÓ[iÐkpÐrs×rwÑrwÓxÙ%1ñ3ð4€Gô ˜_Ð.BÐDXÐ\eÔfj×fpÒfpÓfr×fvÑfvÐewÐw|ÐZ}Ø.Ô0@Üxózð zùò3s   ¾ACi°  c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úrawr’  Úextr0   Úmax_dimr~   r   ztuple[bytes, Optional[str]]r   )r   s   "r   r   r   e  s)   € ÷ ñ  Eð °ð ¸cð ÐXsñ r   c                óN  €  ^ RI Hp ^ RIHp VP	                  V! V 4      4      p\        VP                  4      V8:  d   V R3# VP                  V! 4       uw  rgpVP                  W"34       VP                  w  ršTP                  Y�R8X  d   RMRR7       V	'       d	   Wi,          MRV
'       d	   Wz,          MRrËVR	 VR	 8X  d   R
VR	 R2M
RVR	 RVR	 R2pVP                  4       RV RV RV	 RV
 RV 2
3#   \         d%   p\        P                  RT4       T R3u Rp?# Rp?ii ; i)a  Downscale encoded image bytes so the longest side is <= max_dim -> ``(bytes, scale_note)``. note is None when
unchanged (fits, or Pillow unavailable/failed), else it tells the vision model the factor so reported
coordinates map back to the real screen instead of being silently wrong.)ÚBytesIO)ÚImageNrý  ÚJPEGÚPNG)r   r¼  z.2fz'multiply any coordinates you report by z  to map back to the real screen.z)multiply any x coordinates you report by z and any y coordinates by zScreenshot downscaled from rm  z to z for vision; z*computer_use: vision downscale skipped: %s)ÚiorÑ  ÚPILrÒ  r™  r#  ÚsizeÚ	thumbnailÚsaveÚgetvaluer—   r�   rÚ   )rÍ  rÎ  rÏ  rÑ  rÒ  ÚimgÚorig_wÚorig_hr  Únew_wÚnew_hÚfxÚfyÚfactor_clauserŽ  s   &&&            r   Ú_shrink_capture_for_visionrã  e  sO  € ðÝÝØ�j‰j™ ›Ó&ˆÜˆs�x‰x‹=˜GÔ#Ø˜�9ÐØ #§¡©'«)ÐÑˆ˜#Ø�‰�wÐ(Ô)Ø—x‘x‰ˆØ�‰�¨f¤}™V¸%ˆÔ@ß$)�&–.¨sÏ°f¶nÐSVˆBØrtÐuxÐqyð  BDð  EHð  AIô  pJÐBÀ2ÀcÀ(ÐJjÑkØ IÈ"ÈSÈÐQkÐlnÐorÐksð  tTð  Uð 	à�|‰|‹~Ð!<¸V¸HÀAÀfÀXÈTÐRWÐQXÐXYÐZ_ÐY`Ð`mÐn{Ðm|Ð}Ð}Ð}øÜô Ü�‰ÐAÀ3ÔGØ�DˆyÕûðús2   ‚A C5 ÁAC5 ÂC5 Â-AC5 Ã5D$Ä DÄD$ÄD$c               ó   € V ^8„  d   QhRR/# r
  r   )r   s   "r   r   r   {  s   € ÷ ñ ¨$ñ r   c                 óú   € Rp  ^ RI HpHp ^ RIHp ^ RIHp Rp V! 4       ;'       g    RV! 4       ;'       g    RreV! WVV! 4       4      '       * #   \         d"   p\        P                  RY4        Rp?R	# Rp?ii ; i)
a’  True when ``_capture_response`` should hand the PNG to aux vision. Any failure returns False (fail open) so a
broken config never silently drops the screenshot for vision-capable main models. Decided per capture (the
config read is the signature-cached ``load_config_readonly``), so ``/model``, a profile switch or an
``image_input_mode`` edit applies to the next screenshot instead of a stale verdict.Úimport)Ú_read_main_modelÚ_read_main_provider)Úload_config_readonly)Ú_native_tool_result_imagesrÞ  rK   z.computer_use: aux-vision routing %s failed: %sNF)
Úagent.auxiliary_clientrç  rè  rŠ  ré  Útools.vision_toolsrê  r—   r�   rÚ   )Ústagerç  rè  ré  rê  ÚproviderÚmodelrŽ  s           r   rt  rt  {  sr   € ð
 €EðßPÝ:ÝAØˆÙ-Ó/×5Ð5°2Ñ7GÓ7I×7OÐ7OÈR�%ñ .¨hÑ?SÓ?UÓVÔVÐVøÜô Ü�‰ÐEÀuÔRÝûðús!   „#A ¨A ¸A ÁA:ÁA5Á5A:c               ó   € V ^8„  d   QhRR/# )r   r   r0   r   )r   s   "r   r   r   Ž  s   € ÷ ñ ˜Sñ r   c                 ó|  € \         P                  ! \        4      ;_uu_ 4        ^ RIHp  \        V ! 4       ;'       g    / P                  R4      ;'       g    / P                  RR4      ;'       g    R4      pVP                  4       P                  4       ;pR9   d   TMRuuRRR4       #   + '       g   i     R# ; i)zDMode for ``capture_after`` follow-ups. Default ``som`` (screenshot).)Úload_configÚcomputer_useÚcapture_after_moder  N>   r’  r  r“  )	r•   r–   r—   rŠ  rò  r0   r5   r;   r<   )rò  r  s     r   r  r  Ž  s‹   € ä	×	Ò	œY×	'Õ	'Ý1Ü‘[“]×(Ð( b×-Ñ-¨nÓ=×CÐCÀ×HÑHÐI]Ð_dÓe×nÐnÐinÓoˆØ $§
¡
£× 2Ñ 2Ó 4Ð4˜Ð9PÔP‰tÐV[÷ 
(×	'×	'Ñ	'ñ ús   £2B*ÁB*Á0/B*Â*B;	ak  Describe what is visible in this desktop application screenshot in concise but specific terms. Mention the app name and window title if visible, the overall layout, any labelled buttons, menus or text fields, and any prominent text content the user would need to know about. Do not invent details that are not actually visible.

AX/SOM index for cross-reference:
rq  rZ  r=  r>  c               ó4   € V ^8„  d   QhRRRRRRRRR	R
RR
RR
/# )r   r—  r   rV  r0   rq  zOptional[list[UIElement]]rZ  r~   r=  rF   r>  r   r   )r   s   "r   r   r   ›  sK   € ÷ ,dñ ,d¨=ð ,dÀ3ð ,dÐ]vð ,dØ:=ð,dØR_ð,dà7Dð,dàP]ñ,dr   c               ó*  € V P                   '       g   R# RRrv ^ RIHp ^ RIHp	 Rp\
        P                  ! V P                   RR7      p
Rp\        V 4      ^,          p\        RR	R
\        P                  ! 4       P                   V 24      p\        W«4      w  r¬\        Wz4       \        V,           V'       d   RV 2MR,           pV! V	! \        V4      V4      4      p TeL   \(        P*                  ! \         4      ;_uu_ 4        \,        P.                  ! \        T4      4       RRR4       M \1        T\        4      '       d   TP3                  4       MRp\(        P*                  ! \4        \6        P8                  4      ;_uu_ 4        \6        P:                  ! T4      p\1        T\<        4      '       d3   \        TP?                  R4      ;'       g    R4      P3                  4       MRpRRR4       T'       g   R# \A        Yf   T PB                  MT\E        T PB                  4      T PF                  T PH                  TYERR7	      p\K        TTRTRR/4      #   \          d¥   pT'       d   \"        P%                  RYo4       M\"        P'                  RT4        Rp?Tea   \(        P*                  ! \         4      ;_uu_ 4        \,        P.                  ! \        T4      4       RRR4       R#   + '       g   i     R# ; iR# Rp?ii ; i  + '       g   i     ELé; i  Te_   \(        P*                  ! \         4      ;_uu_ 4        \,        P.                  ! \        T4      4       RRR4       i   + '       g   i     i ; ii ; i  + '       g   i     EL¢; i)zËPre-analyse the capture via ``vision_analyze_tool`` (temp file under ``$HERMES_HOME/cache/vision/``) and merge
the description with the AX/SOM summary into one text payload. JSON, or None on any failure.Nzaux-vision import failed)Ú
_run_async)Úvision_analyze_toolzfailed to decode capture base64Fr3  zcache/visionÚtemp_vision_imagesrº  z

Note: rK   zcomputer_use: %s: %szacomputer_use: auxiliary.vision pre-analysis failed (%s); returning to caller without aux analysisÚanalysis)	r—  r7  r8  r  r  r9  r=  r>  r:  Úvision_analysisÚvision_analysis_routed_viazauxiliary.vision)&r  Úmodel_toolsr÷  rì  rø  rA  rB  r  r±  r½  r¾  r¿  rã  r¢  Ú_VISION_PROMPTr0   r—   r�   rÚ   rž   r•   r–   r•  r®  rÔ  r;   r  r\   ÚJSONDecodeErrorr€  ró   r5   r   r  r›  r  r  r[  )r—  rV  rq  rZ  r=  r>  ÚproblemÚtemp_image_pathr÷  rø  rÍ  rÎ  Ú
scale_noteÚpromptÚresult_jsonrŽ  Úanalysis_textÚparsedÚviews   &&$$$$             r   rv  rv  ›  s´  € ð
 �;�;ˆ;ÙØ9¸4ˆ_ð0Ý*Ý:Ø3ˆÜ×Ò˜sŸ{™{°UÔ;ˆØˆÜ# CÓ(¨Õ+ˆÜ% nÐ6JÈmÔ\`×\fÒ\fÓ\h×\lÑ\lÐ[mÐnqÐmrÐLsÓtˆÜ4°SÓ>‰ˆÜ˜_Ô2Ü 'Õ)Ï*¨z¸*¸Ñ-FÐZ\Õ]ˆÙ Ñ!4´S¸Ó5IÈ6Ó!RÓS‰ð Ò&Ü×$Ò$¤Y×/Õ/Ü—	’	œ#˜oÓ.Ô/÷ 0Ð/ð 'ô ,6°kÄ3×+GÒ+G�K×%Ñ%Ô'ÈR€MÜ	×	Ò	œY¬×(<Ñ(<×	=Õ	=Ü—’˜MÓ*ˆÜEOÐPVÔX\×E]ÒE]œ˜FŸJ™J zÓ2×8Ð8°bÓ9×?Ñ?ÔAÐceˆ÷ 
>÷ Ùô ˜sÒ<T¨C¯LªLÐZjÜ!$ S§\¡\Ó!2¸#¿)¹)ÈCÏJÉJÐbtØ)6Ðfjôl€Dô !  wÐ1BÀMØ1MÐOað1có dð døô/ ô ßÜ�L‰LÐ/°Õ>ä�N‰Nð FØGJôLãàÒ&Ü×$Ò$¤Y×/Õ/Ü—	’	œ#˜oÓ.Ô/÷ 0×/×/Ò/úñ 'ûðú÷ 0×/Ð/ûð Ò&Ü×$Ò$¤Y×/Õ/Ü—	’	œ#˜oÓ.Ô/÷ 0×/×/Ð/úð 'ú÷
 
>×	=Ð	=úss   ™CI Ä LÆA	NÇNÉLÉ5K>ÊL ÊL Ê> K(Ë(K9	Ë>LÌL ÌL	Ì'M>Í M*	Í!	M>Í*M:Í5	M>ÎN	c               ó   € V ^8„  d   QhRR/# r
  r   )r   s   "r   r   r   Ê  s   € ÷ ñ ¨ñ r   c                 ó^   € ^ RI Hp   V ! 4       P                  4       #   \         d     R# i ; i)zÄThe selected ``computer_use.backend``'s ``is_available()``. An unregistered name stays True so the call
surfaces the "not registered (available: ...)" error instead of the tool silently vanishing.r¦   T)r¨   r§   r  ÚLookupErrorr¦   s    r   Úcheck_computer_use_requirementsr  Ê  s0   € õ 9ðÙ"Ó$×1Ñ1Ó3Ð3øÜô Úðús   ˆ �,«,c               ó   € V ^8„  d   QhRR/# )r   r   rE   r   )r   s   "r   r   r   Ó  s   € ÷ ñ  ñ r   c                 ó   € ^ RI Hp  V # )r¥   ©ÚCOMPUTER_USE_SCHEMA)Útools.computer_use.schemar  r  s    r   Úget_computer_use_schemar  Ó  s   € Ý=ØÐr   >   r"   ÚshiftÚ	backspace>   r"   r#   r  >   r=   r"   r$   >   r=   r"   r  >   r=   r"   r  r#   >   r$   Údeleter#   >   Údelr$   r#   )zcurl\s+[^|]*\|\s*bashzcurl\s+[^|]*\|\s*shzwget\s+[^|]*\|\s*bashz\bsudo\s+rm\s+-[rf]z\brm\s+-rf\s+/\s*$z:\s*\(\)\s*\{\s*:\|:\s*&\s*\}r   )rK   )Nr/  )é(   )rK   r¥   )ŠÚ__conditional_annotations__r(  Ú
__future__r   ÚatexitrA  r•   ra  r\   Úloggingr•  r>   Úsysr¯   r½  Úcollectionsr   Ú	functoolsr   Útypesr   Útypingr   r   r   r	   r
   r   r   Úhermes_dir_aclr   Úagent.image_eviction_policyr   Útools.computer_use.backendr   r   r   r   Ú	getLoggerr$  r�   r   r!   r1   r^   r4   ÚcompileÚ
IGNORECASEr[   r@   rb   rl   ÚLockrË   rm   Ú__annotations__rn   ro   rp   rq   r›   rr   rs   r}   rt   r   r�   r‡   r‹   r¡   rª   r±   rµ   r¼   rŠ   rÑ   ÚcontextmanagerrÔ   rÜ   Úregisterræ   ré   rý   rÿ   rP  rF  rb  rr  rv  r~  r‰  r�  r˜  rœ  r   re  Ú_inputrD  rá   Ú_INPUT_ACTIONSrÓ  rI  rí  rò  rø  r½  Ú_DEFAULT_MAX_ELEMENTSrE  r  rË  rÀ  r  r
  r  r  r*  Ú_bounds_scaleÚ_bounds_space_noterM  rT  r[  rf  r•  rÖ  r�  r¢  r±  rµ  rH  rG  Ú_MAX_VISION_DIMrã  rt  r  rþ  rv  r  r  )r7   r  s   0@r   Ú<module>r0     sL  øðôMõ
 #ã Û Û Û Û Û Û 	Û 	Û 
Û Û Ý "Ý Ý !ß G× GÑ GÝ (å Cß aÓ aà	×	Ò	˜8Ó	$€ð Ð õñ Ò+Ó,©iÒ8VÓ.WÙÒ"Ó#¡YÒ/DÓ%EÙÒ-Ó.±	¸5À#¸,Ó0GÙÒ*Ó+©YÒ7PÓ-QÑS\Ð^fÐhlÐ]mÓSnð	Ð ð ˜5 )¨V°U¸HÀeÈUÐTYÐ[cØ˜5 '¨5°&¸%ðA€ñAUó Vñ AU¸1˜"Ÿ*™* Q¨¯©Ö6ñ AUñ VÐ õwõõeð —’Ó €Ø)-€Ð
&Ó -Ø+-€	Ð(Ó -Ø24Ð Ð/Ó 4Ø,.Ð ˜>Ó .Ø$&Ð �>Ó &ð —’Ó!€Ù›%Ð �CÓ ð #ŸšÓ)Ð Ø46Ð Ð1Ó 6Ø Ð õ÷9õ5õ
õ8Qõ	õ	õõW÷:ð* ×Ñöó ðõ<ð ‡�ônó ðnõ*ð°d÷ ô?Ð%ô ?õ>>õ@^õ0Oõ@õHôYòhòxñ .:Àdô 9òYõ"ñ ˜Ð(MØ#(¨%Ñ1KÐ"LôN€á	� D°dÔ	;€ð ‰V�IÐ)9Ô:Ø‘F™7 9°AÔ6ÐBRÔSØ‘6™' )°GÔ<ÐHXÔYØ‘F™7 9°XÔ>ÐJZÔ[Ø
‰F�8ñ ({ô |à‰f�Zñ  ,Cô  DØ
‰FÑpñ PôQà	‰6ÑiÙSôUà‘ñ Wó Xð ‘ñ ZàgkÙyô{ð ‰{˜;Ó'Ø
‰KÑxÓyØ‘™W [°fÔ=Ó>Ø‘K¡¨¸Ô CÓDð-$€Ð
 ó ñ2 ÑE¨¯©Ô)9ÓEÓE€ð ˆe�[ %¨°U¸KÈÐPZÐ\aÐcnÐpvØ�&˜,¨	Ð3EÀyÐR^Ð`gÐivÐxðÐ ñ
 kwØ*.÷`õ4*qõX2õ5õ,ð Ð à !Ð ð Ð à(*Ð *Ð Ð%õFõõ^÷HõJñ* r€ÙvÐ õZõ,÷.	õWð ?TØ26÷*=ñZ 7CÐ`d÷7õ0#5õL÷(õ	õõzð €ð ET÷ õ,õ&ðM€ð
,dÐy}ð ,dØ@Að,dØbfð,dàGK÷,dõ^÷ùòVs   Ã8%Q