§
    Ìi˜  ã                   óT   — d Z ddlZddlmZmZ ddlmZ ddlmZ  G d„ d¦  «        ZdS )z|
Search Object - High-level Operation

This module searches for an object on the page based on description using vision AI.
é    N)ÚAnyÚDict)ÚManagedPage)Úllmc                   ó<   — e Zd ZdZd„ Zdededeeef         fd„Z	dS )ÚSearchObjecta¯  
    Search for an object on the page based on a description.

    State Management:
        This operation does NOT handle page state management.
        The caller (typically BrowserNavigator) is responsible for:
        - Setting page to BUSY before calling
        - Setting page to IDLE/ERROR after completion

    Usage:
        searcher = SearchObject()
        result = await searcher.search(managed_page, description)
    c                 ó$   — t          d¦  «         dS )z&Initialize the SearchObject operation.u   ðŸ” SearchObject initializedN)Úprint)Úselfs    ú@/home/byschii/byschiidev/penelope/lib/highlevel/search_object.pyÚ__init__zSearchObject.__init__    s   € åÐ-Ñ.Ô.Ð.Ð.Ð.ó    Úmanaged_pageÚdescriptionÚreturnc           	   ƒ   ó€  K  — t          d|› ¦  «         	 t          d¦  «         |j                             ¦   «         ƒ d{V —†}t          j        |¦  «                             d¦  «        }t          d¦  «         t          j        ||¬¦  «        }t          d|j        › d|j	        › ¦  «         d	||j
        |j	        |j        d
         |j        d         |                     ¦   «         |                     ¦   «         dœS # t          $ r5}t          d|› ¦  «         d||j
        t          |¦  «        dœcY d}~S d}~ww xY w)aÛ  
        Search for an object on the page based on the description.

        Args:
            managed_page (ManagedPage): Managed page to use (caller handles state)
            description (str): Description of the object to search for

        Returns:
            Dict containing search result with bounding box, center coordinates, and token/cost info
            
        Note:
            Caller must handle page state management (set_busy/set_idle/set_error).
        u   ðŸ” Searching for object: u   ðŸ“¸ Taking screenshotNzutf-8u   ðŸ¤– Calling Gemini vision API)Úobject_descriptionÚimage_base64u   âœ… Object found at center: z, bounding box: TÚxÚy)Úsuccessr   Úpage_idÚbounding_boxÚcenter_xÚcenter_yÚtokens_usedÚ	costs_usdu   âŒ Object search failed: F)r   r   r   Úerror)r
   ÚpageÚ
screenshotÚbase64Ú	b64encodeÚdecoder   Údetect_bounding_boxesÚcenterr   r   Útoken_totalÚ
cost_totalÚ	ExceptionÚstr)r   r   r   Úscreenshot_bytesÚscreenshot_base64ÚresultÚes          r   ÚsearchzSearchObject.search$   s—  è è € õ 	Ð9¨KÐ9Ð9Ñ:Ô:Ð:ð"	åÐ*Ñ+Ô+Ð+Ø%1Ô%6×%AÒ%AÑ%CÔ%CÐCÐCÐCÐCÐCÐCÐÝ &Ô 0Ð1AÑ BÔ B× IÒ IÈ'Ñ RÔ RÐõ Ð2Ñ3Ô3Ð3ÝÔ.Ø#.Ø.ðñ ô ˆFõ Ðe°´ÐeÐeÐPVÔPcÐeÐeÑfÔfÐfàØ*Ø'Ô/Ø &Ô 3Ø"œM¨#Ô.Ø"œM¨#Ô.Ø%×1Ò1Ñ3Ô3Ø#×.Ò.Ñ0Ô0ð	ð 	ð 	øõ ð 	ð 	ð 	åÐ2¨qÐ2Ð2Ñ3Ô3Ð3à Ø*Ø'Ô/Ý˜Q™œð	ð ð ð ð ð ð ð øøøøð	øøøs   –C'C> Ã>
D=Ä*D8Ä2D=Ä8D=N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r)   r   r   r.   © r   r   r   r      sa   € € € € € ðð ð/ð /ð /ð2¨ð 2À3ð 2È4ÐPSÐUXÐPXÌ>ð 2ð 2ð 2ð 2ð 2ð 2r   r   )	r2   r!   Útypingr   r   Úlib.page_managementr   r   r   r3   r   r   ú<module>r6      s’   ððð ð €€€Ø Ð Ð Ð Ð Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ð Ð ðEð Eð Eð Eð Eñ Eô Eð Eð Eð Er   