§
    t�’jm  ã                  ól   — d dl mZ d dlZd dlmZ ddlmZ  ej        d¦  «        Z G d„ d¦  «        Z	dS )	é    )ÚannotationsN)ÚAnyé   )ÚDesktopAutomationErrorzdscons.desktop_automation.mcpc                  ó@   — e Zd ZdZdd„Z	 ddd„Z	 	 ddd„Z	 ddd„ZdS )ÚDesktopMcpClientMixinzLMCP UI automation client calls for window focusing and coordinate targeting.Ú	tool_nameÚstrÚ	argumentsúdict[str, Any]Úreturnc              ƒ  ó@  K  — t          | j        ¦  «        dz  dz  }|                     ¦   «         st          d|› �¦  «        ‚t                               | j        t          |¦  «        |t           	                    |d¬¦  «        t          j
        j        t          j
        j        | j        t          t          | j        ¦  «        dz  ¦  «        | j        dt          t          | j        ¦  «        dz  d	z  ¦  «        t          t          | j        ¦  «        dz  d
z  ¦  «        dœ¬¦  «        ƒ d{V —†}|                     ¦   «         ƒ d{V —†\  }}|j        dk    rDt          d|› d|j        › d|                     dd¬¦  «                             ¦   «         › �¦  «        ‚	 t                               |                     d¦  «        ¦  «        }n*# t          j        $ r}t          d|› �¦  «        |‚d}~ww xY wt'          |t(          ¦  «        st          d|› d�¦  «        ‚|S )zCExecute a local helper script that calls MCP server tools directly.Úscriptszinvoke_tool.pyzMCP invoke script not found: F)Úensure_asciiÚsrcÚZaloÚ	artifactsÚscreenshotsÚlogs)Ú
PYTHONPATHÚDSCONS_PROJECT_ROOTÚZALO_APP_NAMEÚSCREENSHOT_DIRÚDESKTOP_AUTOMATION_LOG_DIR)ÚstdoutÚstderrÚcwdÚenvNr   z	MCP tool z failed with exit code z: zutf-8Úreplace)ÚerrorszInvalid MCP JSON output for z returned non-object payload)ÚPathÚmcp_workspaceÚexistsr   ÚasyncioÚcreate_subprocess_execÚ
python_binr
   ÚjsonÚdumpsÚ
subprocessÚPIPEÚproject_rootÚcommunicateÚ
returncodeÚdecodeÚstripÚloadsÚJSONDecodeErrorÚ
isinstanceÚdict)	Úselfr	   r   Úscript_pathÚprocessr   r   ÚresultÚexcs	            ú@C:\Projects\DSCons\app\services\desktop_automation\mcp_client.pyÚ_run_mcp_server_toolz*DesktopMcpClientMixin._run_mcp_server_tool   sŽ  è è € õ ˜4Ô-Ñ.Ô.°Ñ:Ð=MÑMˆØ×!Ò!Ñ#Ô#ð 	XÝ(Ð)VÈÐ)VÐ)VÑWÔWÐWå×6Ò6ØŒOÝ�ÑÔØÝ�JŠJ�y¨uˆJÑ5Ô5ÝÔ%Ô*ÝÔ%Ô*ØÔ"å!¥$ tÔ'9Ñ":Ô":¸UÑ"BÑCÔCØ'+Ô'8Ø!'Ý"%Ý˜Ô+Ñ,Ô,¨{Ñ:¸]ÑJñ#ô #õ /2Ý˜Ô+Ñ,Ô,¨{Ñ:¸VÑCñ/ô /ð
ð 
ð 7ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð(  '×2Ò2Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4‰ˆ�àÔ Ò"Ð"Ý(ð G˜Ið  Gð  G¸gÔ>Pð  Gð  GÐTZ×TaÒTaÐbiÐr{ÐTaÑT|ÔT|÷  UCò  UCñ  UEô  UEð  Gð  Gñô ð ð	Ý—Z’Z §¢¨gÑ 6Ô 6Ñ7Ô7ˆFˆFøÝÔ#ð 	ð 	ð 	Ý(Ø:¨yÐ:Ð:ñô àðøøøøð	øøøõ
 ˜&¥$Ñ'Ô'ð 	Ý(ØC˜IÐCÐCÐCñô ð ð ˆs   Æ-G ÇG3ÇG.Ç.G3NÚapp_nameÚ	bundle_idú
str | Nonec           
   ƒ  ó$  K  — 	 |                       dd|i¦  «        ƒ d{V —†}|                     di ¦  «         ||d         d<   d|d         d<   |S # t          $ r5}dd	t          ¦   «         ||d
ddœi dt	          |¦  «        i dœdœcY d}~S d}~ww xY w)zFocus an application window.Úapp_activater;   NÚdatar<   Úlocal_mcp_directÚbackendFÚ	focus_appÚlocal_placeholder)r;   r<   rB   ÚimplementedÚfocus_app_failed©ÚcodeÚmessageÚdetails©ÚokÚactionÚ	timestampr@   r   Úerror©r:   Ú
setdefaultÚ	ExceptionÚ_utc_timestampr
   )r4   r;   r<   r7   r8   s        r9   rC   zDesktopMcpClientMixin.focus_app?   s  è è € ð	Ø×4Ò4Ø ¨XÐ 6ñô ð ð ð ð ð ð ˆFð ×Ò˜f bÑ)Ô)Ð)Ø*3ˆF�6ŒN˜;Ñ'Ø(:ˆF�6ŒN˜9Ñ%ØˆMøÝð 	ð 	ð 	àØ%Ý+Ñ-Ô-à (Ø!*Ø2Ø#(ð	ð ð  à.Ý" 3™xœxØ!ðð ðð ð ð ð ð ð ð øøøøð	øøøs   „AA Á
BÁ*B
ÂBÂ
BÚcontainsÚtextÚregionúdict[str, int] | NoneÚ
match_modec           	   ƒ  óB   K  — ddt          ¦   «         |||ddœi ddi dœdœS )	z;Find visible UI text on screen and return candidate bounds.FÚfind_text_targetÚunsupported)rU   rV   rX   rB   Úunsupported_operationzIScreen OCR/text search is not part of the current DSCons desktop backend.rG   rK   )rS   )r4   rU   rV   rX   s       r9   rZ   z&DesktopMcpClientMixin.find_text_target^   sT   è è € ð Ø(Ý'Ñ)Ô)àØ Ø(Ø(ð	ð ð à/ØfØðð ð
ð 
ð 	
ó    c           
   ƒ  ó  K  — 	 |                       di ¦  «        ƒ d{V —†}|                     di ¦  «         ||d         d<   d|d         d<   |S # t          $ r3}ddt          ¦   «         |d	d
œi dt	          |¦  «        i dœdœcY d}~S d}~ww xY w)z-Capture a screenshot for verification or OCR.Údesktop_screenshotNr@   rV   rA   rB   FÚcapture_screenshotÚ	mcp_error)rV   rB   Úcapture_screenshot_failedrG   rK   rP   )r4   rV   r7   r8   s       r9   r`   z(DesktopMcpClientMixin.capture_screenshotw   sî   è è € ð
	Ø×4Ò4Ð5IÈ2ÑNÔNÐNÐNÐNÐNÐNÐNˆFØ×Ò˜f bÑ)Ô)Ð)Ø'-ˆF�6ŒN˜8Ñ$Ø(:ˆF�6ŒN˜9Ñ%ØˆMøÝð 	ð 	ð 	àØ.Ý+Ñ-Ô-à$Ø*ðð ð  à7Ý" 3™xœxØ!ðð ðð ð ð ð ð ð ð øøøøð	øøøs   „A	A Á
BÁ(BÂ BÂB)r	   r
   r   r   r   r   )N)r;   r
   r<   r=   r   r   )NrT   )rU   r
   rV   rW   rX   r
   r   r   )rV   rW   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r:   rC   rZ   r`   © r]   r9   r   r      s�   € € € € € ØVÐVð/ð /ð /ð /ðd 6:ðð ð ð ð ðD )-Ø$ð	
ð 
ð 
ð 
ð 
ð6 )-ðð ð ð ð ð ð r]   r   )
Ú
__future__r   ÚloggingÚtypingr   Úcommonr   Ú	getLoggerÚloggerr   rg   r]   r9   ú<module>rn      s“   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *à	ˆÔ	Ð:Ñ	;Ô	;€ðFð Fð Fð Fð Fñ Fô Fð Fð Fð Fr]   