+
    lHàjÓ&  ã                  óê  € 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Ht ^ RIHtHtHtHtHt ]P&                  ! R4      tRtRtR.tR.tRR	R
0R0 R/mRR	0/t]P4                  ! R4      tR tR R ltR R ltR R ltR R lt R R lt!R0R R llt"R R lt#R R lt$]3R R  llt%]PL                  ! ^R!7      R" R# l4       t'R$R%/R& R' llt(R( R) lt)R0R* R+ llt*R$R/R, R- llt+R# )1zµPM-backed cua-driver selection, MCP discovery and the runtime contract gate.
Config-derived policy (``_cua_no_overlay``, ``_run_driver`` ...) is looked up lazily through the facade.)ÚannotationsN)ÚPureWindowsPath)ÚAnyÚDictÚListÚOptionalÚTupleztools.computer_use.cua_backendÚHERMES_CUA_DRIVER_CMDú
cua-driverÚmcpú--socketz--grantÚserveÚstopz v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?c                 ó   € ^ RI Hp  V # )zRFacade module (config/policy helpers), looked up lazily to avoid the import cycle.©Úcua_backend)Útools.computer_user   r   s    ÚJ/home/ubuntu/.hermes/hermes-agent/tools/computer_use/cua_backend_driver.pyÚ_cbr       s   € å.ØÐó    c               ó(   € V ^8„  d   QhRRRRRRRR/# )é   Ú
driver_cmdÚstrÚargsÚtimeoutÚfloatÚreturnúOptional[dict[str, Any]]© )Úformats   "r   Ú__annotate__r!   %   s/   € ÷ Zñ Z˜Sð Z¨ð Z°uð ZÐAYñ Zr   c               óò   € \        4       P                  ! V .VO5RVR\        / pVe%   VP                  ;'       g    RP	                  4       MRpVe   V'       d   VP
                  ^ 8w  d   R# \        V4      # )z¹Run a driver verb and parse its stdout as a JSON object; None on spawn failure, empty stdout (older drivers
print usage to stderr), unparseable or non-object output, or a non-zero exit.r   ÚswallowNÚ )r   Ú_run_driverÚ	ExceptionÚstdoutÚstripÚ
returncodeÚ_json_object)r   r   r   ÚprocÚouts   &$*  r   Ú_driver_jsonr-   %   sh   € ô ‹5×Ò˜ZÐS¨$ÒS¸ÐSÌÑS€DØ)-Ò)9ˆ4�;‰;×Ð˜"×
#Ñ
#Ô
%¸r€CØ’<§s¨d¯o©oÀÔ.Bˆ4ÐYÌÐUXÓHYÐYr   c               ó    € V ^8„  d   QhRRRR/# )r   Útextr   r   r   r   )r    s   "r   r!   r!   ,   s   € ÷ 4ñ 4�sð 4Ð7ñ 4r   c                ó”   €  \         P                  ! V 4      p\	        T\
        4      '       d   T# R#   \        \        3 d     R# i ; i)zE``json.loads`` that yields a dict or None (unparseable / non-object).N)ÚjsonÚloadsÚ
ValueErrorÚ	TypeErrorÚ
isinstanceÚdict)r/   Údatas   & r   r*   r*   ,   sG   € ðÜ�zŠz˜$Óˆô ˜d¤D×)Ò)ˆ4Ð3¨tÐ3øô œ	Ð"ô Úðús   ‚2 ²AÁAc               ó    € V ^8„  d   QhRRRR/# )r   Ú
invocationr   r   zOptional[list[str]]r   )r    s   "r   r!   r!   4   s   € ÷ ^ñ ^ ð ^Ð(;ñ ^r   c                óü   € \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       d=   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       d   V# R# )zQ``mcp_invocation.args`` when it is a list of strings (possibly empty), else None.r   Nc              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5i©N)r5   r   )Ú.0Úas   & r   Ú	<genexpr>Ú"_valid_mcp_args.<locals>.<genexpr>7   s   é € Ð1SÉdÈ´*¸QÄ×2DÐ2DËdùs   ‚FT)r5   r6   ÚgetÚlistÚall)r9   r   s   & r   Ú_valid_mcp_argsrD   4   sV   € ä%/°
¼D×%AÒ%Aˆ:�>‰>˜&Ô!Àt€DÜ˜d¤D×)Ò)¯c«cÑ1SÉdÓ1S¯c¯cªcÑ1SÉdÓ1S×.SÒ.Sˆ4Ð]ÐY]Ð]r   c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer   r   Úboolr   )r    s   "r   r!   r!   9   s   € ÷ Mñ M˜sð M tñ Mr   c                ó’   € \         P                  V 9   ;'       g.    \         P                  R J;'       d    \         P                  V 9   # r<   )ÚosÚsepÚaltsep)rF   s   &r   Ú_has_path_separatorrL   9   s2   € Ü�6‰6�U‰?×LÐLœrŸy™y°Ð4×KÐK¼¿¹ÀeÑ9KÐLr   c               ó    € V ^8„  d   QhRRRR/# )r   Úpathr   r   r   )r    s   "r   r!   r!   <   s   € ÷ Pñ P Sð P¨Sñ Pr   c                ón  € \         P                  ! RV 4      '       g   V #  ^ RIHp V! 4       p\        V 4      pVP                  ;'       g    RP                  R4      P                  4       pV'       d/   V'       d'   RP                  RV.VP                  R,          O4      # T #   \         d    Rp L…i ; i)	zýTranslate a Windows absolute manifest command to its DrvFS ``/mnt/<drive>/...`` form when Hermes runs in WSL
(a Windows cua-driver manifest can report ``C:\...`` while Hermes spawns via POSIX). Non-Windows paths and
non-WSL hosts are returned unchanged.z^[A-Za-z]:[\\/])Úis_wslFr$   Ú:Ú/z/mnt:é   NN)ÚreÚmatchÚhermes_constantsrP   r&   r   ÚdriveÚrstripÚlowerÚjoinÚparts)rN   rP   ÚwslÚwinrW   s   &    r   Ú_wsl_windows_path_to_posixr^   <   s™   € ô �8Š8Ð&¨×-Ò-ØˆðÝ+Ù‹hˆô ˜$Ó
€CØ�Y‰Y�_ˆ_˜"×$Ñ$ SÓ)×/Ñ/Ó1€Eß8;Çˆ3�8‰8�V˜UÐ3 S§Y¡Y¨r¥]Ð3Ó4ÐOÈ4ÐOøô	 ô ØŠðús   ¡B$ Â$B4Â3B4c               ó    € V ^8„  d   QhRRRR/# )r   ÚoverrideúOptional[str]r   r   )r    s   "r   r!   r!   K   s   € ÷ 
Mñ 
M ]ð 
M¸mñ 
Mr   c                ó¤  € V e   T M#\         P                  P                  \        R4      P	                  4       pV'       dS   \         P
                  P                  V4      p\        P                  ! V4      pV'       d   \        V4      '       d   V# T# ^ RI
Hp V! R4      pV'       d(   VP                  '       d   \        VP                  4      # R# )zQRead PM's selected binary without installing; never replace an explicit override.Nr$   )Úinstalled_packager
   )rI   ÚenvironrA   Ú_CUA_DRIVER_CMD_ENVr(   rN   Ú
expanduserÚshutilÚwhichrL   Úpmrc   Úbinaryr   )r`   Ú
configuredÚexpandedÚresolvedrc   Ú	installeds   &     r   Úresolve_cua_driver_cmdro   K   s•   € à&Ò2‘(¼¿
¹
¿¹ÔGZÐ\^Ó8_×fÑfÓh€JßÜ—7‘7×%Ñ% jÓ1ˆÜ—<’< Ó)ˆß#Ô(;¸H×(EÒ(EˆxÐSÈ8ÐSÝ$á! ,Ó/€Iß$-°)×2B×2BÐ2BŒ3ˆy×ÑÓ ÐLÈÐLr   c               ó   € V ^8„  d   QhRR/# )r   r   rG   r   )r    s   "r   r!   r!   W   s   € ÷ 0ñ 0 Tñ 0r   c                 ó   € \        4       RJ# )z:True if PM or an explicit override selects a local driver.N)ro   r   r   r   Úcua_driver_binary_availablerr   W   s   € ä!Ó#¨4Ð/Ð/r   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r    s   "r   r!   r!   [   s   € ÷ fñ f ñ fr   c                 ó   € R # )z±cua-driver is not installed. Install the pinned driver with:
  hermes computer-use install
Or run `hermes tools` and enable the Computer Use toolset to install it automatically.r   r   r   r   Úcua_driver_install_hintru   [   s   € ñer   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   z	list[str]r   r   r   r   )r    s   "r   r!   r!   _   s"   € ÷ 9ñ 9 ið 9¸Sð 9Ð_hñ 9r   c                óŠ   € \        4       P                  4       ;'       d    \        V4      pV'       d   . V ORN# \        V 4      # )zKReturn *args* with ``--no-overlay`` appended when configured and supported.ú--no-overlay)r   Ú_cua_no_overlayÚ_cua_driver_supports_no_overlayrB   )r   r   Úons   && r   Ú_mcp_args_with_overlay_flagr|   _   s<   € ä	‹×	Ñ	Ó	 ×	PÐ	PÔ%DÀZÓ%P€Bß&(Ð"ˆTÐ"�>Ð"Ð8¬d°4«jÐ8r   )Úmaxsizec               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   rG   r   )r    s   "r   r!   r!   e   s   € ÷ ñ °ð ¸ñ r   c                óÈ   €  \        4       P                  V RRR7      pRVP                  ;'       g    RVP                  ;'       g    R,           9   #   \         d     R# i ; i)z‰True if ``<driver> --help`` mentions ``--no-overlay`` (probed once); older drivers reject unknown flags, which
would crash the MCP spawn.z--helpg      @©r   rx   r$   F)r   r%   r'   Ústderrr&   )r   r+   s   & r   rz   rz   d   sZ   € ðÜ‹u× Ñ  ¨X¸sÐ ÓCˆØ $§+¡+×"3Ð"3°¸¿¹×8IÐ8IÀrÕ!JÑJÐJøÜô Úðús   ‚/A ²A Á
A ÁA!Á A!r   g      @c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   r   r   r   ztuple[str, list[str]]r   )r    s   "r   r!   r!   n   s'   € ÷ Jñ J¨ð J¸ð JÐI^ñ Jr   c               óš  € \        V RVR7      ;'       g    / pVP                  R4      p\        V4      pVe(   \        V\        4      '       d   VP                  R4      MRpVf   \        \        4      MTp\        V\        4      '       d   V'       d   \        V4      MRpV'       d   \        V4      '       d   TMT pV\        WER7      3# )u<  ``(command, args)`` that spawn cua-driver's stdio MCP server, asked of the driver itself via ``cua-driver
manifest`` (``mcp_invocation``) so a subcommand rename keeps working. Falls back to ``(driver_cmd, ["mcp"])``
on older drivers or any discovery failure â€” the wrapper must not refuse to start over a failed discovery hop.
``--no-overlay`` appended when allowed.

Surface 8 of NousResearch/hermes-agent#47072: instead of hardcoding ``["mcp"]`` we ask the driver itself
via ``cua-driver manifest`` (trycua/cua#1961). The manifest carries a stable ``mcp_invocation`` pointer
with both ``command`` and ``args``, so a future cua-driver that renames or relocates the subcommand
keeps working without a Hermes patch.
When ``computer_use.no_overlay`` is enabled (or auto-detected â€” macOS, headless/WSL2/X11 Linux),
``--no-overlay`` is appended to suppress the cursor overlay rendering loop that can consume CPU
indefinitely when idle (#28152, #47032). Older drivers that don't recognise the flag will reject it;
callers should fall back to the no-overlay invocation on spawn failure.
Úmanifestr€   Úmcp_invocationNÚcommandr$   )r   )r-   rA   rD   r5   r6   rB   Ú_CUA_DRIVER_ARGSr   r^   rL   r|   )r   r   r„   r9   r   r†   s   &$    r   Ú_resolve_mcp_invocationrˆ   n   s¬   € ô ˜J¨
¸GÔD×JÐJÈ€HØ—‘Ð.Ó/€JÜ˜:Ó&€DØ+/Ò+;Ä
È:ÔW[×@\Ò@\ˆj�n‰n˜YÔ'Ðbf€GØ%)¢\Œ4Ô Ô!°t€Dô
 6@ÀÌ×5MÒ5M×RYÔ(¨Ô1Ð_a€Gß Ô%8¸×%AÒ%A‰gÀz€GØÔ/°ÔIÐIÐIr   c               ó    € V ^8„  d   QhRRRR/# )r   r„   r   r   r   r   )r    s   "r   r!   r!   Š   s   € ÷ Rñ RÐ(@ð RÀSñ Rr   c                ó~  € V f   R# \         P                  \        V P                  R4      ;'       g    R4      P	                  4       4      pV'       g   R# \
        ;QJ d"    . R VP                  4        4       F  NK  	  5M! R VP                  4        4       4      \        8  d   R# \        V P                  R4      4      '       g   R# V P                  R	4      ;'       g    .  UUu/ uF»  p\        V\        4      '       g   K  \        VP                  R
4      \        4      '       g   KB  VR
,          VP                  R4      ;'       g    .  Uu0 uFK  p\        V\        4      '       g   K  \        VP                  R
4      \        4      '       g   KB  VR
,          kKM  	  upbK½  	  ppp\        P                  4        UUUu. uF<  w  r%\        WTP                  V\        4       4      ,
          4       F
  pV RV 2NK  	  K>  	  ppppV'       d   RRP                  V4      ,           # R# u upi u uppi u upppi )z²Why a parsed manifest fails the 0.20 contract, or ``""`` when it passes (version floor, MCP launch
command, then the ``"<verb> <flag>"`` entries the advertised subcommands lack).z%driver manifest is missing or invalidÚbinary_versionr$   z2driver manifest does not report a semantic versionc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir<   )Úint)r=   Úparts   & r   r?   Ú,_manifest_contract_reason.<locals>.<genexpr>’   s   é € Ð2¡>˜4ŒS��YˆY£>ùs   ‚z7Hermes computer use requires cua-driver 0.20.0 or newerr…   z6driver manifest does not provide an MCP launch commandÚsubcommandsÚnamer   Ú zdriver manifest is missing: z, )Ú
_SEMVER_REÚ	fullmatchr   rA   r(   ÚtupleÚgroupsÚ _CUA_DRIVER_RUNTIME_CONTRACT_MINrD   r5   r6   Ú!_CUA_DRIVER_RUNTIME_CONTRACT_ARGSÚitemsÚsortedÚsetrZ   )r„   rU   r†   ÚargÚ
advertisedÚrequiredÚmissings   &      r   Ú_manifest_contract_reasonr    Š   sØ  € ð ÒÙ6Ü× Ñ ¤ X§\¡\Ð2BÓ%C×%IÐ%IÀrÓ!J×!PÑ!PÓ!RÓS€EßÙCß„uÑ2 5§<¡<¤>Ó2‡u�uÑ2 5§<¡<¤>Ó2Ó2Ô5UÔUÙHÜ˜8Ÿ<™<Ð(8Ó9×:Ò:ÙGð  —|‘| MÓ2×8Ð8°bÐ8ô'ñ 9ˆGÜ�gœt×$ô	Yô *4°G·K±KÀÓ4GÌ×)Mô	Yˆ��°·±¸VÓ1D×1JÐ1JÈÐ1Jó YÑ1J¨#Ü'¨¬T×2ô &Ü7AÀ#Ç'Á'È&Ã/ÔSV×7Wô &˜#˜fŸ+˜+Ñ1Jñ Yò 	Yá8ð ñ 'ô <]×;bÑ;bÔ;dõ MÑ;dÑ&7 gÜ  ¯N©N¸7ÄCÃEÓ,JÕ!JÖK�3ð �˜!˜C˜5Ó!ÙKñ "Ñ;d€Gò MçBIÐ)¨D¯I©I°gÓ,>Õ>ÐQÈrÐQùòYùó'ùôMs=   Ã)H2Ä"H2Ä-H2ÅH2ÅH-Å/"H-ÆH-Æ#H2ÇAH8È-H2c               ó    € V ^8„  d   QhRRRR/# )r   rj   ra   r   zdict[str, Any]r   )r    s   "r   r!   r!       s   € ÷ [ñ [¨}ð [Èñ [r   c                óÜ  € T ;'       g    \        4       pRpRpV'       Ed    \        4       P                  TR\        P                  R8X  d   RMRR7      pVeg   VP                  ^ 8w  dV   RVP                  ;'       g    VP                  ;'       g    R	P                  4       P                  4       R,          R
,          r4Vem   \        VP                  ;'       g    R4      p\        V4      pVe=   \        VP!                  R4      ;'       g    R4      P                  4       ;'       g    RMRpRV'       * RVRVRV/#   \
        \        P                  3 d   pRRT 2r4 Rp?ELRp?ii ; i)z@Report whether a local driver can host Hermes' 0.20 integration.Nzcua-driver is not installedr„   Úwin32g      .@g      @r€   zmanifest check failed: zmanifest command failed:NéÈ   Nr$   r‹   Úreadyrj   ÚversionÚreasonéÿÿÿÿ)ro   r   r%   ÚsysÚplatformÚOSErrorÚ
subprocessÚSubprocessErrorr)   r�   r'   r(   Ú
splitlinesr*   r    r   rA   )rj   rm   r¦   r§   ÚresultÚexcr„   s   &      r   Ú"cua_driver_runtime_contract_statusr±       sG  € à×1Ð1Ô/Ó1€HØ!€GØ*€Fß€xð	CÜ“U×&Ñ& x°ÌSÏ\É\Ð]dÔMdÁTÐjmÐ&ÓnˆFð Ò &×"3Ñ"3°qÔ"8Ø! F§M¡M×$_Ð$_°V·]±]×$_Ð$_ÐF_×#fÑ#fÓ#h×#sÑ#sÓ#uÐvxÕ#yÐz~Õ#�FØÒÜ# F§M¡M×$7Ð$7°RÓ8ˆHÜ.¨xÓ8ˆFØS[ÒSg”c˜(Ÿ,™,Ð'7Ó8×>Ð>¸BÓ?×EÑEÓG×OÐOÈ4øÐmqˆGØ˜”Z ¨8°YÀÈÐSYÐZÐZøô œ×3Ñ3Ð4ô 	CØ!Ð%<¸S¸EÐ#B–Fûð	Cús   £3D? Ä?E+ÅE&Å&E+c               ó    € V ^8„  d   QhRRRR/# )r   r   zOptional[float]r   r   r   )r    s   "r   r!   r!   ²   s   € ÷ ñ ¨ð ÐC[ñ r   c                ó   € R# )zHHistorical import: upstream release polling is retired; PM owns the pin.Nr   r€   s   $r   Úcua_driver_update_checkr´   ²   s   € ár   )é    é   rµ   >   r   ú
--embeddedú--permission-modeú--capability-manifestú--approve-capability-manifestr<   ),Ú__doc__Ú
__future__r   Ú	functoolsr1   ÚloggingrI   rT   rg   r¬   r©   Úpathlibr   Útypingr   r   r   r   r   Ú	getLoggerÚloggerre   Ú_CUA_DRIVER_DEFAULT_CMDr‡   r—   r˜   Úcompiler“   r   r-   r*   rD   rL   r^   ro   rr   ru   r|   Ú	lru_cacherz   rˆ   r    r±   r´   r   r   r   Ú<module>rÆ      s  ðñlõ #ã Û Û Û 	Û 	Û Û Û 
Ý #ß 3Õ 3à	×	Ò	Ð;Ó	<€ð .Ð Ø&Ð Ø�7Ð Ø#-Ð  à	ˆJ˜	Ð"ØÒvØ
ˆZˆLð%Ð !ð
 �ZŠZÐ;Ó<€
òõ
Zõ4õ^õ
MõP÷
Mõ0õfð D[÷ 9ð
 ×Ò˜QÔôó  ððJÀ÷ Jõ8R÷,[ð$¸$÷ ñ r   