§
    øžyjuF  ã                   ód  — U d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
  ej        e¦  «        ZdZeed<   dZeed<   d„ Z ej        d	¦  «        Z ej        d
¦  «        Z eh d£¦  «        Zd?dedeeef         fd„Z	 	 d@dedee         dee         deeef         fd„Z	 	 d@dee         dee         deeef         fd„Zdedeeef         fd„Z	 	 d@dee         deeeef                  deeef         fd„Zdedededeeef         fd„Z	 	 d@dededee         deeeef                  deeef         f
d„Zd„ Z de!defd„Z"de!defd„Z#de!defd „Z$dAdee         deeef         fd!„Z%de!defd"„Z&de'fd#„Z(d$d%d&d'd(d)œd'd*d)œd+œg d,œd-œZ)d.d/d&dd'd0d)œidgd,œd-œZ*d1d2d&dd'd3d)œig d,œd-œZ+d4d5d&d'd6d)œd'd7d)œd'd8d)œd'd9d)œd:œddgd,œd-œZ,dd;l-m.Z.m/Z/  e.j0        d$d<e)e"e(d=¬>¦  «          e.j0        d.d<e*e#e(d=¬>¦  «          e.j0        d1d<e+e&e(d=¬>¦  «          e.j0        d4d<e,e$e(d=¬>¦  «         dS )Ba(  Home Assistant tool for controlling smart home devices via REST API.

Registers four LLM-callable tools:
- ``ha_list_entities`` -- list/filter entities by domain or area
- ``ha_get_state`` -- get detailed state of a single entity
- ``ha_list_services`` -- list available services (actions) per domain
- ``ha_call_service`` -- call a HA service (turn_on, turn_off, set_temperature, etc.)

Authentication uses a Long-Lived Access Token via ``HASS_TOKEN`` env var.
The HA instance URL is read from ``HASS_URL`` (default: http://homeassistant.local:8123).
é    N)ÚAnyÚDictÚOptional)Ú
get_secretÚ Ú	_HASS_URLÚ_HASS_TOKENc                  óŒ   — t           pt          dd¦  «        pd                     d¦  «        t          pt          dd¦  «        pdfS )z9Return the active profile's Home Assistant URL and token.ÚHASS_URLzhttp://homeassistant.local:8123r   ú/Ú
HASS_TOKEN)r   r   Úrstripr	   © ó    ú>/home/ragecks/.hermes/hermes-agent/tools/homeassistant_tool.pyÚ_get_configr       sM   € õ 
Ð	U•j Ð-NÑOÔOÐ	UÐSU×]Ò]Ð^aÑbÔbÝÐ9•z ,°Ñ3Ô3Ð9°rðð r   z^[a-z_][a-z0-9_]*\.[a-z0-9_]+$z^[a-z][a-z0-9_]*$>   ÚhassioÚpyscriptÚcommand_lineÚrest_commandÚpython_scriptÚshell_commandÚtokenÚreturnc                 ó8   — | st          ¦   «         \  }} d| › �ddœS )z-Return authorization headers for HA REST API.úBearer úapplication/json©ÚAuthorizationzContent-Type)r   )r   Ú_s     r   Ú_get_headersr!   @   s4   € àð !Ý‘=”=‰ˆˆ5à* 5Ð*Ð*Ø*ðð ð r   ÚstatesÚdomainÚareac           	      ó:  ‡‡— ‰rˆfd„| D ¦   «         } |r"|                      ¦   «         Šˆfd„| D ¦   «         } g }| D ]O}|                     |d         |d         |                     di ¦  «                             dd¦  «        dœ¦  «         ŒPt          |¦  «        |d	œS )
zAFilter raw HA states by domain/area and return a compact summary.c                 ól   •— g | ]0}|                      d d¦  «                             ‰› d�¦  «        ¯.|‘Œ1S )Ú	entity_idr   ú.)ÚgetÚ
startswith©Ú.0Úsr#   s     €r   ú
<listcomp>z)_filter_and_summarize.<locals>.<listcomp>U   s@   ø€ ÐWÐWÐW˜ q§u¢u¨[¸"Ñ'=Ô'=×'HÒ'HÈFÈÈÈÑ'VÔ'VÐW�!ÐWÐWÐWr   c                 ó  •— g | ]„}‰|                      d i ¦  «                              dd¦  «        pd                     ¦   «         v s@‰|                      d i ¦  «                              dd¦  «        pd                     ¦   «         v ¯‚|‘Œ…S )Ú
attributesÚfriendly_namer   r$   )r)   Úlower)r,   r-   Ú
area_lowers     €r   r.   z)_filter_and_summarize.<locals>.<listcomp>Y   s˜   ø€ ð 
ð 
ð 
ØØ˜aŸeše L°"Ñ5Ô5×9Ò9¸/È2ÑNÔNÐTÐRT×[Ò[Ñ]Ô]Ð]Ð]Ø˜aŸeše L°"Ñ5Ô5×9Ò9¸&À"ÑEÔEÐKÈ×RÒRÑTÔTÐTÐTð àTÐTÐTr   r'   Ústater0   r1   r   )r'   r4   r1   )ÚcountÚentities)r2   Úappendr)   Úlen)r"   r#   r$   r6   r-   r3   s    `   @r   Ú_filter_and_summarizer9   N   så   øø€ ð ð XØWÐWÐWÐW˜VÐWÑWÔWˆàð 
Ø—Z’Z‘\”\ˆ
ð
ð 
ð 
ð 
Øð
ñ 
ô 
ˆð €HØð ð ˆØ�ŠØ˜;œØ�w”ZØŸUšU <°Ñ4Ô4×8Ò8¸È"ÑMÔMð
ð 
ñ 	ô 	ð 	ð 	õ ˜‘]”]°Ð9Ð9Ð9r   c              ƒ   óú  K  — ddl }t          ¦   «         \  }}|› d�}|                     ¦   «         4 ƒd{V —†}|                     |t	          |¦  «        |                     d¬¦  «        ¬¦  «        4 ƒd{V —†}|                     ¦   «          |                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   t          || |¦  «        S )zAFetch entity states from HA and optionally filter by domain/area.r   Nz/api/statesé   ©Útotal©ÚheadersÚtimeout)	Úaiohttpr   ÚClientSessionr)   r!   ÚClientTimeoutÚraise_for_statusÚjsonr9   )	r#   r$   rA   Úhass_urlÚ
hass_tokenÚurlÚsessionÚrespr"   s	            r   Ú_async_list_entitiesrK   j   s  è è € ð
 €N€N€Nå&™=œ=Ñ€HˆjØÐ
"Ð
"Ð
"€CØ×$Ò$Ñ&Ô&ð 'ð 'ð 'ð 'ð 'ð 'ð '¨'Ø—;’;˜s­L¸Ñ,DÔ,DÈg×NcÒNcÐjlÐNcÑNmÔNm�;ÑnÔnð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ÐrvØ×!Ò!Ñ#Ô#Ð#ØŸ9š9™;œ;Ð&Ð&Ð&Ð&Ð&Ð&ˆFð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'õ
 ! ¨°Ñ6Ô6Ð6s6   ·A CÁ7/B8Â&CÂ8
C	ÃCÃC	ÃCÃ
C%Ã(C%r'   c              ƒ   óx  K  — ddl }t          ¦   «         \  }}|› d| › �}|                     ¦   «         4 ƒd{V —†}|                     |t	          |¦  «        |                     d¬¦  «        ¬¦  «        4 ƒd{V —†}|                     ¦   «          |                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |d         |d         |                     d	i ¦  «        |                     d
¦  «        |                     d¦  «        dœS )z(Fetch detailed state of a single entity.r   Nz/api/states/é
   r<   r>   r'   r4   r0   Úlast_changedÚlast_updated)r'   r4   r0   rN   rO   )rA   r   rB   r)   r!   rC   rD   rE   )r'   rA   rF   rG   rH   rI   rJ   Údatas           r   Ú_async_get_staterQ   {   sM  è è € à€N€N€Nå&™=œ=Ñ€HˆjØÐ
.Ð
. 9Ð
.Ð
.€CØ×$Ò$Ñ&Ô&ð %ð %ð %ð %ð %ð %ð %¨'Ø—;’;˜s­L¸Ñ,DÔ,DÈg×NcÒNcÐjlÐNcÑNmÔNm�;ÑnÔnð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ÐrvØ×!Ò!Ñ#Ô#Ð#ØŸš™œÐ$Ð$Ð$Ð$Ð$Ð$ˆDð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð%ð %ð %ñ %ô %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %ð %øøøð %ð %ð %ð %ð ˜+Ô&Ø�g”Ø—h’h˜|¨RÑ0Ô0ØŸš Ñ0Ô0ØŸš Ñ0Ô0ðð ð s6   ¹A CÁ9/B:Â(CÂ:
C	ÃCÃC	ÃCÃ
C'Ã*C'rP   c                 óF   — i }|r|                      |¦  «         | r| |d<   |S )z-Build the JSON payload for a HA service call.r'   )Úupdate)r'   rP   Úpayloads      r   Ú_build_service_payloadrU   �   s:   € ð
 !€GØð Ø�Š�tÑÔÐàð )Ø(ˆ�ÑØ€Nr   ÚserviceÚresultc                 óÐ   — g }t          |t          ¦  «        rE|D ]B}|                     |                     dd¦  «        |                     dd¦  «        dœ¦  «         ŒCd| › d|› �|dœS )z8Parse HA service call response into a structured result.r'   r   r4   )r'   r4   Tr(   )ÚsuccessrV   Úaffected_entities)Ú
isinstanceÚlistr7   r)   )r#   rV   rW   Úaffectedr-   s        r   Ú_parse_service_responser^   �   s™   € ð €HÝ�&�$ÑÔð Øð 	ð 	ˆAØ�OŠOØŸUšU ;°Ñ3Ô3ØŸš˜w¨Ñ+Ô+ðð ñ ô ð ð ð ØÐ(Ð(˜wÐ(Ð(Ø%ðð ð r   c           	   ƒ   ó(  K  — ddl }t          ¦   «         \  }}|› d| › d|› �}t          ||¦  «        }|                     ¦   «         4 ƒd{V —†}	|	                     |t          |¦  «        ||                     d¬¦  «        ¬¦  «        4 ƒd{V —†	 }
|
                     ¦   «          |
                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   t          | ||¦  «        S )zCall a Home Assistant service.r   Nz/api/services/r   r;   r<   )r?   rE   r@   )
rA   r   rU   rB   Úpostr!   rC   rD   rE   r^   )r#   rV   r'   rP   rA   rF   rG   rH   rT   rI   rJ   rW   s               r   Ú_async_call_servicera   ²   s>  è è € ð €N€N€Nå&™=œ=Ñ€HˆjØÐ
7Ð
7 VÐ
7Ð
7¨gÐ
7Ð
7€CÝ$ Y°Ñ5Ô5€Gà×$Ò$Ñ&Ô&ð 'ð 'ð 'ð 'ð 'ð 'ð '¨'Ø—<’<ØÝ  Ñ,Ô,ØØ×)Ò)°Ð)Ñ3Ô3ð	  ñ 
ô 
ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð
 Ø×!Ò!Ñ#Ô#Ð#ØŸ9š9™;œ;Ð&Ð&Ð&Ð&Ð&Ð&ˆFð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð'ð 'ð 'ñ 'ô 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'øøøð 'ð 'ð 'ð 'õ # 6¨7°FÑ;Ô;Ð;s7   ÁAC2Â/CÂ=C2Ã
C	ÃC2ÃC	ÃC2Ã2
C<Ã?C<c                 ó‚  — 	 t          j        ¦   «         }n# t          $ r d}Y nw xY w|rƒ|                     ¦   «         roddl}|j                             d¬¦  «        5 }|                     t           j        | ¦  «        }| 	                    d¬¦  «        cddd¦  «         S # 1 swxY w Y   dS t          j        | ¦  «        S )z+Run an async coroutine from a sync handler.Nr   é   )Úmax_workersé   )r@   )
ÚasyncioÚget_running_loopÚRuntimeErrorÚ
is_runningÚconcurrent.futuresÚfuturesÚThreadPoolExecutorÚsubmitÚrunrW   )ÚcoroÚloopÚ
concurrentÚpoolÚfutures        r   Ú
_run_asyncrt   Ð   s  € ðÝÔ'Ñ)Ô)ˆˆøÝð ð ð Øˆˆˆðøøøð ð !�—’Ñ!Ô!ð !à!Ð!Ð!Ð!ØÔ×2Ò2¸qÐ2ÑAÔAð 	-ÀTØ—[’[¥¤¨dÑ3Ô3ˆFØ—=’=¨�=Ñ,Ô,ð	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-õ Œ{˜4Ñ Ô Ð s   ‚ –%¤%Á6B Â B$Â'B$Úargsc                 óH  — |                       d¦  «        }|                       d¦  «        }	 t          t          ||¬¦  «        ¦  «        }t          j        d|i¦  «        S # t
          $ r7}t                               d|¦  «         t          d|› �¦  «        cY d}~S d}~ww xY w)z"Handler for ha_list_entities tool.r#   r$   ©r#   r$   rW   zha_list_entities error: %szFailed to list entities: N)	r)   rt   rK   rE   ÚdumpsÚ	ExceptionÚloggerÚerrorÚ
tool_error)ru   Úkwr#   r$   rW   Úes         r   Ú_handle_list_entitiesr   á   s³   € à�XŠX�hÑÔ€FØ�8Š8�FÑÔ€Dð;ÝÕ0¸ÀTÐJÑJÔJÑKÔKˆÝŒz˜8 VÐ,Ñ-Ô-Ð-øÝð ;ð ;ð ;Ý�ŠÐ1°1Ñ5Ô5Ð5ÝÐ9°aÐ9Ð9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð;øøøs   ¬3A  Á 
B!Á*,BÂB!ÂB!c                 óœ  — |                       dd¦  «        }|st          d¦  «        S t                               |¦  «        st          d|› �¦  «        S 	 t	          t          |¦  «        ¦  «        }t          j        d|i¦  «        S # t          $ r:}t           
                    d|¦  «         t          d|› d|› �¦  «        cY d	}~S d	}~ww xY w)
zHandler for ha_get_state tool.r'   r   z%Missing required parameter: entity_idúInvalid entity_id format: rW   zha_get_state error: %szFailed to get state for ú: N)r)   r|   Ú_ENTITY_ID_REÚmatchrt   rQ   rE   rx   ry   rz   r{   )ru   r}   r'   rW   r~   s        r   Ú_handle_get_stater…   í   sò   € à—’˜ bÑ)Ô)€IØð CÝÐAÑBÔBÐBÝ×Ò˜yÑ)Ô)ð DÝÐB°yÐBÐBÑCÔCÐCðGÝÕ,¨YÑ7Ô7Ñ8Ô8ˆÝŒz˜8 VÐ,Ñ-Ô-Ð-øÝð Gð Gð GÝ�ŠÐ-¨qÑ1Ô1Ð1ÝÐE°YÐEÐEÀ!ÐEÐEÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøs   Á1B Â
CÂ/CÃ CÃCc           
      óD  — |                       dd¦  «        }|                       dd¦  «        }|r|st          d¦  «        S t                               |¦  «        st          d|›�¦  «        S t                               |¦  «        st          d|›�¦  «        S |t          v r:t          d|› dd	                     t          t          ¦  «        ¦  «        › �¦  «        S |                       d
¦  «        }|r,t                               |¦  «        st          d|› �¦  «        S |                       d¦  «        }t          |t          ¦  «        rZ	 | 
                    ¦   «         rt          j        |¦  «        nd}n.# t          j        $ r}t          d|› �¦  «        cY d}~S d}~ww xY w	 t          t          ||||¦  «        ¦  «        }t          j        d|i¦  «        S # t"          $ r=}t$                               d|¦  «         t          d|› d|› d|› �¦  «        cY d}~S d}~ww xY w)z!Handler for ha_call_service tool.r#   r   rV   z/Missing required parameters: domain and servicezInvalid domain format: zInvalid service format: zService domain 'z,' is blocked for security. Blocked domains: z, r'   r�   rP   Nz)Invalid JSON string in 'data' parameter: rW   zha_call_service error: %szFailed to call r(   r‚   )r)   r|   Ú_SERVICE_NAME_REr„   Ú_BLOCKED_DOMAINSÚjoinÚsortedrƒ   r[   ÚstrÚstriprE   ÚloadsÚJSONDecodeErrorrt   ra   rx   ry   rz   r{   )ru   r}   r#   rV   r'   rP   r~   rW   s           r   Ú_handle_call_servicer�   ü   sƒ  € à�XŠX�h Ñ#Ô#€FØ�hŠh�y "Ñ%Ô%€GØð M˜ð MÝÐKÑLÔLÐLõ
 ×!Ò! &Ñ)Ô)ð @ÝÐ>°FÐ>Ð>Ñ?Ô?Ð?Ý×!Ò! 'Ñ*Ô*ð BÝÐ@°WÐ@Ð@ÑAÔAÐAàÕ!Ð!Ð!ÝðF˜vð Fð FØ $§	¢	­&Õ1AÑ*BÔ*BÑ CÔ CðFð Fñ
ô 
ð 	
ð
 —’˜Ñ%Ô%€IØð D�×,Ò,¨YÑ7Ô7ð DÝÐB°yÐBÐBÑCÔCÐCà�8Š8�FÑÔ€DÝ�$�ÑÔð Oð	OØ'+§z¢z¡|¤|Ð=•4”:˜dÑ#Ô#Ð#¸ˆDˆDøÝÔ#ð 	Oð 	Oð 	OÝÐMÈ!ÐMÐMÑNÔNÐNÐNÐNÐNÐNÐNøøøøð	OøøøðEÝÕ/°¸ÀÈDÑQÔQÑRÔRˆÝŒz˜8 VÐ,Ñ-Ô-Ð-øÝð Eð Eð EÝ�ŠÐ0°!Ñ4Ô4Ð4ÝÐC¨FÐCÐC°WÐCÐCÀÐCÐCÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøs<   Å	*E4 Å4FÆFÆFÆFÆ#4G Ç
HÇ"2HÈHÈHc              ƒ   óŠ  ‡ K  — ddl }t          ¦   «         \  }}|› d�}d|› �ddœ}|                     ¦   «         4 ƒd{V —†}|                     |||                     d¬¦  «        ¬	¦  «        4 ƒd{V —†}|                     ¦   «          |                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ‰ rˆ fd
„|D ¦   «         }g }	|D ]¶}
|
                     dd¦  «        }i }|
                     di ¦  «                             ¦   «         D ][\  }}d|                     dd¦  «        i}|                     di ¦  «        }|r!d„ |                     ¦   «         D ¦   «         |d<   |||<   Œ\|	                     ||dœ¦  «         Œ·t          |	¦  «        |	dœS )zAFetch available services from HA and optionally filter by domain.r   Nz/api/servicesr   r   r   r;   r<   r>   c                 óF   •— g | ]}|                      d ¦  «        ‰k    ¯|‘ŒS ©r#   )r)   r+   s     €r   r.   z(_async_list_services.<locals>.<listcomp>5  s-   ø€ ÐEÐEÐE˜!¨1¯5ª5°©?¬?¸fÒ+DÐ+D�AÐ+DÐ+DÐ+Dr   r#   r   ÚservicesÚdescriptionÚfieldsc                 ól   — i | ]1\  }}t          |t          ¦  «        ¯||                     d d¦  «        “Œ2S )r”   r   )r[   Údictr)   )r,   ÚkÚvs      r   ú
<dictcomp>z(_async_list_services.<locals>.<dictcomp>@  sL   € ð 'ð 'ð 'Ù48°A°qÝ! !¥TÑ*Ô*ð'Ø�q—u’u˜]¨BÑ/Ô/ð'ð 'ð 'r   )r#   r“   )r5   Údomains)
rA   r   rB   r)   rC   rD   rE   Úitemsr7   r8   )r#   rA   rF   rG   rH   r?   rI   rJ   r“   rW   Ú
svc_domainÚdÚdomain_servicesÚsvc_nameÚsvc_infoÚ	svc_entryr•   s   `                r   Ú_async_list_servicesr£   (  s)  øè è € à€N€N€Nå&™=œ=Ñ€HˆjØÐ
$Ð
$Ð
$€CØ 6¨*Ð 6Ð 6ÐHZÐ[Ð[€GØ×$Ò$Ñ&Ô&ð )ð )ð )ð )ð )ð )ð )¨'Ø—;’;˜s¨G¸W×=RÒ=RÐY[Ð=RÑ=\Ô=\�;Ñ]Ô]ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ÐaeØ×!Ò!Ñ#Ô#Ð#Ø!ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(ˆHð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð
 ð FØEÐEÐEÐE˜xÐEÑEÔEˆð €FØð Bð Bˆ
Ø�NŠN˜8 RÑ(Ô(ˆØˆØ",§.¢.°¸RÑ"@Ô"@×"FÒ"FÑ"HÔ"Hð 	2ð 	2ÑˆH�hØ)6¸¿ºÀ]ÐTVÑ8WÔ8WÐ(XˆIØ—\’\ (¨BÑ/Ô/ˆFØð ð'ð 'Ø<B¿LºL¹N¼Nð'ñ 'ô '�	˜(Ñ#ð )2ˆO˜HÑ%Ð%Ø�Š °Ð@Ð@ÑAÔAÐAÐAå˜‘[”[¨VÐ4Ð4Ð4s6   Á 3CÁ3/B4Â"CÂ4
B>	Â>CÃB>	ÃCÃ
C!Ã$C!c                 ó  — |                       d¦  «        }	 t          t          |¬¦  «        ¦  «        }t          j        d|i¦  «        S # t
          $ r7}t                               d|¦  «         t          d|› �¦  «        cY d}~S d}~ww xY w)z"Handler for ha_list_services tool.r#   r’   rW   zha_list_services error: %szFailed to list services: N)	r)   rt   r£   rE   rx   ry   rz   r{   r|   )ru   r}   r#   rW   r~   s        r   Ú_handle_list_servicesr¥   J  s    € à�XŠX�hÑÔ€Fð;ÝÕ0¸Ð?Ñ?Ô?Ñ@Ô@ˆÝŒz˜8 VÐ,Ñ-Ô-Ð-øÝð ;ð ;ð ;Ý�ŠÐ1°1Ñ5Ô5Ð5ÝÐ9°aÐ9Ð9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð;øøøs   —2A
 Á

BÁ,BÂ BÂBc                  ó:   — t          t          d¦  «        ¦  «        S )z.Tool is only available when HASS_TOKEN is set.r   )Úboolr   r   r   r   Ú_check_ha_availabler¨   Y  s   € å•
˜<Ñ(Ô(Ñ)Ô)Ð)r   Úha_list_entitiesz²List Home Assistant entities. Optionally filter by domain (light, switch, climate, sensor, binary_sensor, cover, fan, etc.) or by area name (living room, kitchen, bedroom, etc.).ÚobjectÚstringz•Entity domain to filter by (e.g. 'light', 'switch', 'climate', 'sensor', 'binary_sensor', 'cover', 'fan', 'media_player'). Omit to list all entities.)Útyper”   zuArea/room name to filter by (e.g. 'living room', 'kitchen'). Matches against entity friendly names. Omit to list all.rw   )r¬   Ú
propertiesÚrequired)Únamer”   Ú
parametersÚha_get_statez”Get the detailed state of a single Home Assistant entity, including all attributes (brightness, color, temperature setpoint, sensor readings, etc.).z^The entity ID to query (e.g. 'light.living_room', 'climate.thermostat', 'sensor.temperature').Úha_list_serviceszåList available Home Assistant services (actions) for device control. Shows what actions can be performed on each device type and what parameters they accept. Use this to discover how to control devices found via ha_list_entities.z\Filter by domain (e.g. 'light', 'climate', 'switch'). Omit to list services for all domains.Úha_call_servicezŒCall a Home Assistant service to control a device. Use ha_list_services to discover available services and their parameters for each domain.zfService domain (e.g. 'light', 'switch', 'climate', 'cover', 'media_player', 'fan', 'scene', 'script').z‰Service name (e.g. 'turn_on', 'turn_off', 'toggle', 'set_temperature', 'set_hvac_mode', 'open_cover', 'close_cover', 'set_volume_level').zbTarget entity ID (e.g. 'light.living_room'). Some services (like scene.turn_on) may not need this.zÈAdditional service data as a JSON string. Examples: {"brightness": 255, "color_name": "blue"} for lights, {"temperature": 22, "hvac_mode": "heat"} for climate, {"volume_level": 0.5} for media players.)r#   rV   r'   rP   )Úregistryr|   Úhomeassistantu   ðŸ� )r¯   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚemoji)r   )NN)N)1Ú__doc__rf   rE   ÚloggingÚreÚtypingr   r   r   Úagent.secret_scoper   Ú	getLoggerÚ__name__rz   r   r‹   Ú__annotations__r	   r   Úcompilerƒ   r‡   Ú	frozensetrˆ   r!   r\   r9   rK   rQ   rU   r^   ra   rt   r—   r   r…   r�   r£   r¥   r§   r¨   ÚHA_LIST_ENTITIES_SCHEMAÚHA_GET_STATE_SCHEMAÚHA_LIST_SERVICES_SCHEMAÚHA_CALL_SERVICE_SCHEMAÚtools.registryr´   r|   Úregisterr   r   r   ú<module>rË      s@  ðð
ð 
ð 
ð €€€Ø €€€Ø €€€Ø 	€	€	€	Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à )Ð )Ð )Ð )Ð )Ð )à	ˆÔ	˜8Ñ	$Ô	$€ð €	ˆ3Ð Ð Ñ Ø€ˆSÐ Ð Ñ ðð ð ð �”
Ð<Ñ=Ô=€ð �2”:Ð2Ñ3Ô3Ð ð
 �9ð ð ð ñ ô Ð ðð ˜ð  T¨#¨s¨(¤^ð ð ð ð ð  !Øð:ð :Øð:à�SŒMð:ð �3Œ-ð:ð 
ˆ#ˆsˆ(„^ð	:ð :ð :ð :ð: !Øð7ð 7Ø�SŒMð7à
�3Œ-ð7ð 
ˆ#ˆsˆ(„^ð7ð 7ð 7ð 7ð" cð ¨d°3¸°8¬nð ð ð ð ð*  $Ø%)ðð Ø˜Œ}ðà
�4˜˜S˜”>Ô
"ðð 
ˆ#ˆsˆ(„^ðð ð ð ðØðàðð ðð 
ˆ#ˆsˆ(„^ð	ð ð ð ð0  $Ø%)ð	<ð <Øð<àð<ð ˜Œ}ð<ð �4˜˜S˜”>Ô
"ð	<ð
 
ˆ#ˆsˆ(„^ð<ð <ð <ð <ð<!ð !ð !ð"	; ð 	;¨sð 	;ð 	;ð 	;ð 	;ðG˜Dð G¨3ð Gð Gð Gð Gð%E˜tð %E¨cð %Eð %Eð %Eð %EðX5ð 5 x°¤}ð 5ÀÀSÈ#ÀXÄð 5ð 5ð 5ð 5ðD; ð ;¨sð ;ð ;ð ;ð ;ð*˜Tð *ð *ð *ð *ð ð	Að
 ð !ð1ðð ð !ðOðð ð
ð 
ð" ð'ð ðð Ð ð> ð	Wð àØ ðCðð ð
ð !�Mðð ðð Ð ð, ð	&ð àØ ð=ðð ð
ð ðð ðð Ð ð0 ð	Oð ð !ðJðð ð !ð:ðð ð !ðLðð ð !ð?ðð ð/ 
ð  
ðB ˜yÐ)ðG$ð $ð+ð +Ð ðd 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /à €Ô Ø	ØØ"Ø!Ø Ø
ðñ ô ð ð €Ô Ø	ØØØØ Ø
ðñ ô ð ð €Ô Ø	ØØ"Ø!Ø Ø
ðñ ô ð ð €Ô Ø	ØØ!Ø Ø Ø
ðñ ô ð ð ð r   