+
    *Qj                      a  0 t $ R t^ RIHt R4R R llt]! RRRRR	R
R//R.4      ]! RRRRR	R
R//R.4      ]! RRRRR	R
R//R.4      ]! RR/ 4      ]! RRRRR	R. R5OR
R//. 4      ]! RRRRR	R
R//R.4      ]! RR R!RR	R
R"//R!.4      ]! R#R$R%RR&R
R'/R(RR	R
R)//R%.4      ]! R*R+/ 4      .	tR,]R-&   ]! R. ] 4       4      tR/]R0&   RRRRRR1RRRRRRRRR#R#R*R*/	t	R2]R3&   R# )6u  Device-tool schemas — the tools the brain CALLS but the PHONE EXECUTES.

These are exposed to the LLM exactly like the server-side tools in ``tools.py``,
but they don't run in the gateway: when the brain calls one, the gateway resolves
any saved state it needs (a place for ``navigate``, a contact number for
``call_contact``), emits a WS ``action`` frame to the connected phone, and waits
for the matching ``action_result`` (see ``main.Session`` — the bridge — and
APP_PLAN.md §3b for the wire protocol). The result string is fed back into the
brain's tool loop.

This module holds ONLY the schemas + the name set; the executor/bridge lives on
``main.Session`` because it needs the live WebSocket and the phone store. Keeping
the schemas here lets ``main`` build the brain's toolset as
``tools.TOOL_SPECS + device_tools.DEVICE_TOOL_SPECS`` without a circular import.

The ``action`` name each tool maps to on the wire (what the phone switches on):
    navigate       -> "navigate"      call_contact   -> "call"
    play_music     -> "play_music"    take_screenshot -> "take_screenshot"
    open_camera    -> "open_camera"   open_app       -> "open_app"
    open_url       -> "open_url"      set_timer      -> "set_timer"
    get_location   -> "get_location"
)annotationsNc          
     ,    V ^8  d   QhRRRRRRRRRR/# )	   namestrdescription
propertiesdictrequiredzlist[str] | Nonereturn )formats   "device_tools.py__annotate__r      s1      c   ".2    c                :    R RRRT RTRR RRTRT;'       g    . ///# )typefunctionr   r   
parametersobjectr   r
   r   )r   r   r   r
   s   &&&&r   _fnr      sB     	
D;jHNN
 r   navigateu   Start turn-by-turn navigation on Ahmed's phone. Give a saved place label (I'll resolve the address) or a raw destination. Use for 'take me to…', 'navigate to the office'.destinationr   stringr   z1A saved place label, an address, or a place name.
play_musicuA   Play music on Ahmed's phone. Use for 'play…', 'put on some…'.queryz(Song / artist / playlist / mood to play.call_contactu   Place a phone call to a SAVED contact by name (I resolve the number privately — you never see or say it). Use for 'call my father', 'ring Sara'. If no number is saved, say so and offer to save one.r   zThe saved contact's name.take_screenshotzWCapture a screenshot on Ahmed's phone. Use for 'take a screenshot', 'grab this screen'.open_cameraz_Open the camera on Ahmed's phone. Use for 'open the camera', 'take a selfie', 'record a video'.modeenumzCamera mode (default photo).open_appzHOpen an app on Ahmed's phone. Use for 'open WhatsApp', 'launch Spotify'.targetzApp name or package to open.open_urluK   Open a web link on Ahmed's phone. Use for 'open…', 'pull up the website'.urlzThe URL to open.	set_timerud   Set a countdown timer on Ahmed's phone. Resolve durations yourself ('five minutes' → 300 seconds).secondsintegerzDuration in seconds.labelzOptional label, e.g. 'pasta'.get_locationzUGet Ahmed's current location from his phone. Use when you need where he is right now.z
list[dict]DEVICE_TOOL_SPECSc              #  @   "   T F  qR ,          R,          x  K  	  R# 5i)r   r   Nr   ).0specs   & r   	<genexpr>r.   b   s      .<):V):s   zfrozenset[str]DEVICE_TOOL_NAMEScallzdict[str, str]TOOL_TO_ACTION)N)photovideoselfie)
__conditional_annotations____doc__
__future__r   r   r*   __annotations__	frozensetr/   r1   )r5   s   @r   <module>r:      s  . #" 
	, 
& )67 	8 
 K	68 "LN 	O			
 	F 
&(M3NOP	 	
 	%	&(F,H!?A 	B
 
		FH!#AC 	D	
 
		=2DEF		
 	,	VY"$:<	68 "AC	D 
 	
c5! : 5n %. .<):.< %< > < 
,F(=

N
" 
r   