§
    y›jh  ã                  óf  — d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 er
d dl6Z6d dl)m7Z7 dZ8 G d„ de'¦  «        Z9dS )é    )ÚannotationsN)ÚMapping)ÚdatetimeÚ	timedeltaÚtimezone)ÚTYPE_CHECKINGÚAny)Úurljoin)ÚOnce)ÚValidationError)ÚRequestExceptionÚSession)Ú	UA_HEADER)ÚVariablesOptions)ÚServerResponseCallbackÚinstall_logfire_response_hook)ÚUnexpectedResponse)ÚResolvedVariableÚVariableAlreadyExistsErrorÚVariableNotFoundErrorÚVariableProviderÚVariableWriteError)ÚKeyIsNotPresentÚKeyIsPresentÚLabeledValueÚLabelRefÚValueDoesNotEqualÚValueDoesNotMatchRegexÚValueEqualsÚ	ValueIsInÚValueIsNotInÚValueMatchesRegexÚVariableConfigÚVariablesConfig©ÚVariableTypeConfig)ÚLogfireRemoteVariableProviderc                  óâ   ‡ — e Zd ZdZ	 d@dAd
„Zd„ ZdBd„ZdCd„Zd„ Zd„ Z	dDd„Z
d„ ZdEdFd„Z	 	 dGdHd%„ZdIˆ fd'„ZdJdKd*„ZdLd-„ZdMd/„ZdNd2„ZdOd3„ZdPd4„ZdQd6„ZedRd8„¦   «         ZdSd;„ZdTd=„ZdUd?„Zˆ xZS )Vr'   z´Variable provider that fetches configuration from a remote Logfire API.

    The threading implementation draws heavily from opentelemetry.sdk._shared_internal.BatchProcessor.
    NÚbase_urlÚstrÚtokenÚoptionsr   Úserver_response_hookúServerResponseCallback | Nonec                ó  — |j         }|j        }|| _        || _        || _        t          ¦   «         | _        | j        j                             d|› �t          dœ¦  «         t          | j        |¦  «         |j        | _        || _        t          |t          t           f¦  «        rt#          |¬¦  «        n|| _        t'          j        ¦   «         | _        t-          ¦   «         | _        d| _        d| _        d| _        d| _        d| _        t'          j        ¦   «         | _        t'          j        ¦   «         | _        t'          j        ¦   «         | _         d| _!        d| _"        d| _#        d| _$        d| _%        tM          j'        ¦   «         | _(        dS )a|  Create a new remote variable provider.

        Args:
            base_url: The base URL of the Logfire API.
            token: Authentication token for the Logfire API.
            options: Options for retrieving remote variables.
            server_response_hook: Optional override for the API response hook
                (see `AdvancedOptions.server_response_hook`).
        úbearer )ÚAuthorizationú
User-Agent)ÚsecondsFN))Úblock_before_first_resolveÚpolling_intervalÚ	_base_urlÚ_tokenÚ_server_response_hookr   Ú_sessionÚheadersÚupdater   r   ÚtimeoutÚ_timeoutÚ_block_before_first_fetchÚ
isinstanceÚfloatÚintr   Ú_polling_intervalÚ	threadingÚLockÚ_session_lockr   Ú_reset_onceÚ_has_attempted_fetchÚ_last_fetched_atÚ_configÚ	_shutdownÚ_shutdown_timeout_exceededÚ_refresh_lockÚEventÚ_worker_awakenÚ_force_refresh_eventÚ_sse_connectedÚ_sse_threadÚ_logfireÚ_startedÚ_worker_threadÚosÚgetpidÚ_pid)Úselfr)   r+   r,   r-   r4   r5   s          úU/home/lighthouse/health/venv/lib/python3.11/site-packages/logfire/variables/remote.pyÚ__init__z&LogfireRemoteVariableProvider.__init__:   sk  € ð  &-Ô%GÐ"Ø"Ô3Ðà!ˆŒØˆŒØ%9ˆÔ"Ý™	œ	ˆŒØŒÔ×$Ò$Ð7HÀÐ7HÐ7HÕXaÐ%bÐ%bÑcÔcÐcÝ% d¤mÐ5IÑJÔJÐJØœˆŒØ)CˆÔ&å3=Ð>NÕQVÕX[ÐP\Ñ3]Ô3]Ðs�IÐ.Ð/Ñ/Ô/Ð/Ðcsð 	Ôõ 'œ^Ñ-Ô-ˆÔÝ™6œ6ˆÔØ*/ˆÔ!Ø15ˆÔà/3ˆŒàˆŒØ*/ˆÔ'Ý&œ^Ñ-Ô-ˆÔÝ'œoÑ/Ô/ˆÔÝ$-¤OÑ$5Ô$5ˆÔ!ð $ˆÔØ48ˆÔð 15ˆŒØˆŒð 8<ˆÔÝ”I‘K”KˆŒ	ˆ	ˆ	ó    c                ó®  — t          j        ¦   «         | _        t          j        ¦   «         | _        t          j        ¦   «         | _        t          j        ¦   «         | _        | j        rUt          j        d| j	        d¬¦  «        | _
        | j
                             ¦   «          d| _        |                      ¦   «          t          j        ¦   «         | _        d S )NÚLogfireRemoteProviderT©ÚnameÚtargetÚdaemonF)rC   rD   rL   rE   rM   rN   rO   rS   ÚThreadÚ_workerrT   ÚstartrP   Ú_start_sse_listenerrU   rV   rW   ©rX   s    rY   Ú_at_fork_reinitz-LogfireRemoteVariableProvider._at_fork_reinits   s³   € å&œ^Ñ-Ô-ˆÔÝ&œ^Ñ-Ô-ˆÔÝ'œoÑ/Ô/ˆÔÝ$-¤OÑ$5Ô$5ˆÔ!àŒ=ð 		'Ý"+Ô"2Ø,Ø”|Øð#ñ #ô #ˆDÔð
 Ô×%Ò%Ñ'Ô'Ð'à"'ˆDÔØ×$Ò$Ñ&Ô&Ð&Ý”I‘K”KˆŒ	ˆ	ˆ	r[   Úlogfire_instanceúlogfire.Logfire | NoneÚreturnÚNonec                ó”  ‡— |�|                      d¬¦  «        | _        | j        rdS d| _        t          j        d| j        d¬¦  «        | _        | j                             ¦   «          |                      ¦   «          t          t          d¦  «        r6t          j        | j        ¦  «        Šdˆfd
„}t          j        |¬¦  «         dS dS )a  Start background polling with the given logfire instance for error logging.

        Args:
            logfire_instance: The Logfire instance to use for error logging, or None if
                variable instrumentation is disabled (errors will be reported via warnings).
        Nzvariables.provider)Úcustom_scope_suffixTr]   r^   Úregister_at_forkrj   rk   c                 ó8   •—  ‰¦   «         } | � | ¦   «          d S d S ©N© )ÚmethodÚweak_reinits    €rY   Ú_after_in_childz<LogfireRemoteVariableProvider.start.<locals>._after_in_child¢   s+   ø€ Ø$˜™œ�ØÐ%Ø�F‘H”H�H�H�Hð &Ð%r[   )Úafter_in_child)rj   rk   )Úwith_settingsrR   rS   rC   rb   rc   rT   rd   re   ÚhasattrrU   ÚweakrefÚ
WeakMethodrg   rn   )rX   rh   rt   rs   s      @rY   rd   z#LogfireRemoteVariableProvider.start†   sû   ø€ ð Ð'Ø,×:Ò:ÐOcÐ:ÑdÔdˆDŒMØŒ=ð 	ØˆFØˆŒõ (Ô.Ø(Ø”<Øð
ñ 
ô 
ˆÔð
 	Ô×!Ò!Ñ#Ô#Ð#ð 	× Ò Ñ"Ô"Ð"õ •2Ð)Ñ*Ô*ð 	@Ý!Ô,¨TÔ-AÑBÔBˆKðð ð ð ð ð õ
 Ô¨Ð?Ñ?Ô?Ð?Ð?Ð?ð	@ð 	@r[   ÚmessageÚexcÚ	Exceptionc                ó®   — | j         �-| j                              d|t          |¦  «        |¬¦  «         dS t          j        |› d|› �t
          ¬¦  «         dS )zªLog an error using logfire if available, otherwise warnings.

        Args:
            message: The error message.
            exc: The exception that occurred.
        Nz{message}: {error})rz   ÚerrorÚ	_exc_infoz: )Úcategory)rR   r~   r*   ÚwarningsÚwarnÚRuntimeWarning)rX   rz   r{   s      rY   Ú
_log_errorz(LogfireRemoteVariableProvider._log_error©   sc   € ð Œ=Ð$ØŒM×ÒÐ 4¸gÍSÐQTÉXÌXÐadÐÑeÔeÐeÐeÐeåŒM˜WÐ-Ð-¨Ð-Ð-½ÐGÑGÔGÐGÐGÐGr[   c                ó¾   — | j         �| j                              ¦   «         rdS t          j        d| j        d¬¦  «        | _         | j                              ¦   «          dS )z4Start the SSE listener thread for real-time updates.NÚLogfireRemoteProviderSSETr^   )rQ   Úis_aliverC   rb   Ú_sse_listenerrd   rf   s    rY   re   z1LogfireRemoteVariableProvider._start_sse_listenerµ   sg   € àÔÐ'¨DÔ,<×,EÒ,EÑ,GÔ,GÐ'ØˆFå$Ô+Ø+ØÔ%Øð
ñ 
ô 
ˆÔð
 	Ô×ÒÑ Ô Ð Ð Ð r[   c                ó^  — t          | j        d¦  «        }d}d}| j        �s	 t          ¦   «         5 }|j                             d| j        › �t          dddœ¦  «         t          || j	        ¦  «         | 
                    |dd	¬
¦  «        }|j        dk    r<d| _        |                      |¦  «         t          |dz  |¦  «        }	 ddd¦  «         Œ¸d| _        d}|                     d¬¦  «        D ]Ó}| j        r nÉ|€Œ|                     ¦   «         }|sŒ%|                     d¦  «        r™|dd…                              ¦   «         }	 t%          j        |¦  «        }| 
                    d¦  «        }	|	dv r2| j                             ¦   «          | j                             ¦   «          Œ·# t$          j        t0          f$ r Y ŒÏw xY wŒÔddd¦  «         n# 1 swxY w Y   nF# t2          $ r9 d| _        | j        s(|                      |¦  «         t          |dz  |¦  «        }Y nw xY w| j        �¯	dS dS )zEListen for SSE updates from the server and trigger refresh on events.z/v1/variable-updates/g      ð?g      N@r0   ztext/event-streamzno-cache)r1   r2   ÚAcceptzCache-ControlT)é
   N)Ústreamr<   éÈ   Fé   N)Údecode_unicodezdata:é   Úevent)ÚcreatedÚupdatedÚdeleted)r
   r6   rJ   r   r:   r;   r7   r   r   r8   ÚgetÚstatus_coderP   Ú_wait_for_reconnectÚminÚ
iter_linesÚstripÚ
startswithÚjsonÚloadsrO   ÚsetrN   ÚJSONDecodeErrorÚ	TypeErrorr|   )
rX   Ússe_urlÚreconnect_delayÚmax_reconnect_delayÚsse_sessionÚresponseÚlineÚdata_strÚ
event_dataÚ
event_types
             rY   rˆ   z+LogfireRemoteVariableProvider._sse_listenerÁ   sø  € å˜$œ.Ð*AÑBÔBˆØˆØ"Ðà”.ñ ;	Tð:Tå‘Y”Yð 1% +ØÔ'×.Ò.à-D°t´{Ð-DÐ-DÝ*3Ø&9Ø-7ð	ð ñô ð õ 2°+¸tÔ?YÑZÔZÐZð  +Ÿš¨w¸tÈZ˜ÑXÔX�HØÔ+¨sÒ2Ð2à.3˜Ô+Ø×0Ò0°ÑAÔAÐAÝ*-¨oÀÑ.AÐCVÑ*WÔ*W˜Ø ð%1%ð 1%ð 1%ñ 1%ô 1%ð 1%ð 1%ð* +/�DÔ'Ø&)�Oð !)× 3Ò 3À4Ð 3Ñ HÔ Hð %ð %˜Øœ>ð "Ø!˜Eà˜<Ø$à#Ÿzšz™|œ|˜Ø#ð %Ø$ð  Ÿ?š?¨7Ñ3Ô3ð %Ø'+¨A¨B¨B¤x§~¢~Ñ'7Ô'7˜Hð
%Ý-1¬Z¸Ñ-AÔ-A 
Ø-7¯^ª^¸GÑ-DÔ-D 
à#-Ð1RÐ#RÐ#Rà$(Ô$=×$AÒ$AÑ$CÔ$CÐ$CØ$(Ô$7×$;Ò$;Ñ$=Ô$=Ð$=øøÝ$(Ô$8½)Ð#Dð %ð %ð %à $ ð%øøøð%ðK1%ð 1%ð 1%ñ 1%ô 1%ð 1%ð 1%ð 1%ð 1%ð 1%ð 1%øøøð 1%ð 1%ð 1%ð 1%øøõf ð Tð Tð Tà&+�Ô#Ø”~ð TØ×,Ò,¨_Ñ=Ô=Ð=Ý&)¨/¸AÑ*=Ð?RÑ&SÔ&S�OøøðTøøøðm ”.ñ ;	Tð ;	Tð ;	Tð ;	Tð ;	Tsh   £G ±BGÃG ÃA5GÅAF(Æ'GÆ(GÆ>GÇ GÇGÇG ÇGÇG ÇGÇG ÇA H ÈH Údelayr@   c                óÆ   — d}||k     rT| j         sQt          d||z
  ¦  «        }t          j        ¦   «                              |¦  «         ||z  }||k     r| j         ¯KdS dS dS dS )z<Wait for a delay before reconnecting, checking for shutdown.g        g      à?N)rJ   r˜   rC   rM   Úwait)rX   rª   ÚelapsedÚ	wait_times       rY   r—   z1LogfireRemoteVariableProvider._wait_for_reconnect  sr   € ð ˆØ˜Šoˆo d¤nˆoÝ˜C ¨¡Ñ1Ô1ˆIÝŒOÑÔ×"Ò" 9Ñ-Ô-Ð-Ø�yÑ ˆGð ˜Šoˆo d¤nˆoˆoˆoˆoˆoˆoˆoˆoˆor[   c                ód  — | j         s¨| j                             ¦   «         }|r| j                             ¦   «          |                      |¬¦  «         | j                             | j                             ¦   «         ¦  «        }|r| j                             ¦   «          | j         rd S | j         ¯¦d S d S )N©Úforce)	rJ   rO   Úis_setÚclearÚrefreshrN   r¬   rB   Útotal_seconds)rX   r±   Úawakeneds      rY   rc   z%LogfireRemoteVariableProvider._worker  sÆ   € Ø”.ð 	ð Ô-×4Ò4Ñ6Ô6ˆEØð 2ØÔ)×/Ò/Ñ1Ô1Ð1à�LŠL˜uˆLÑ%Ô%Ð%ð
 Ô*×/Ò/°Ô0F×0TÒ0TÑ0VÔ0VÑWÔWˆHØð ,ØÔ#×)Ò)Ñ+Ô+Ð+ØŒ~ð Ø�ð) ”.ð 	ð 	ð 	ð 	ð 	r[   Fr±   Úboolc                ó|  — | j                              ¦   «         rd}| j         5  |sE| j        �>| j        t          j        t
          j        ¬¦  «        | j        z
  k    r	 ddd¦  «         dS 	 | j        5  | j	         
                    t          | j        d¦  «        | j        ¬¦  «        }t          j        |¦  «         |                     ¦   «         }ddd¦  «         n# 1 swxY w Y   n9# t"          $ r,}|                      d|¦  «         Y d}~ddd¦  «         dS d}~ww xY w	 t'          j        |¦  «        }|| _        t          j        t
          j        ¬¦  «        | _        n-# t,          $ r }|                      d|¦  «         Y d}~nd}~ww xY wd| _        n# d| _        w xY w	 ddd¦  «         dS # 1 swxY w Y   dS )	z±Fetch the latest variable configuration from the remote API.

        Args:
            force: If True, fetch configuration even if the polling interval hasn't elapsed.
        FN)Útzú/v1/variables/©r<   zError retrieving variablesz8Failed to parse variables configuration from Logfire APIT)rL   ÚlockedrH   r   Únowr   ÚutcrB   rE   r9   r•   r
   r6   r=   r   Úraise_for_statusrœ   r|   r„   r$   Úmodel_validaterI   r   rG   )rX   r±   Úvariables_responseÚvariables_config_dataÚeÚ
new_configs         rY   r´   z%LogfireRemoteVariableProvider.refresh$  sÈ  € ð Ô×$Ò$Ñ&Ô&ð 	àˆEð
 Ôð 	1ð 	1àðàÔ)Ð5ØÔ)­H¬L½H¼LÐ,IÑ,IÔ,IÈDÔLbÑ,bÒbÐbàð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ðØÔ'ð Fð FØ)-¬×):Ò):Ý ¤Ð0@ÑAÔAÈ4Ì=ð *;ñ *ô *Ð&õ 'Ô7Ð8JÑKÔKÐKØ,>×,CÒ,CÑ,EÔ,EÐ)ðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Føøõ ð ð ð ð —’Ð <¸aÑ@Ô@Ð@Ø���ð'	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1øøøøðøøøð1Ý,Ô;Ð<QÑRÔR�
Ø)�”Ý(0¬½¼Ð(EÑ(EÔ(E�Ô%Ð%øÝ"ð _ð _ð _Ø—’Ð ZÐ\]Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^øøøøð_øøøð -1�Ô)Ð)ø¨D�Ô)Ð0Ð0Ð0Ð0Ð)ð9	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1sœ   £;F1Á,C(Á3ACÃC(ÃC 	Ã C(Ã#C 	Ã$C(Ã'F1Ã(
DÃ2DÄF1ÄDÄF1Ä"?E"Å!FÅ"
FÅ,FÆFÆFÆFÆF1Æ	F Æ F1Æ1F5Æ8F5Úvariable_nameÚtargeting_keyú
str | NoneÚ
attributesúMapping[str, Any] | NoneúResolvedVariable[str | None]c                ó&  — | j         t          j        ¦   «         k    r| j                             | j        ¦  «         | j        s| j        r|                      ¦   «          | j	        €t          |dd¬¦  «        S | j	                             |||¦  «        S )a±  Resolve a variable's serialized value from the remote configuration.

        Args:
            variable_name: The name of the variable to resolve.
            targeting_key: Optional key for deterministic label selection (e.g., user ID).
            attributes: Optional attributes for condition-based targeting rules.

        Returns:
            A ResolvedVariable containing the serialized value (or None if not found).
        NÚmissing_config)r_   ÚvalueÚreason)rW   rU   rV   rF   Údo_oncerg   rG   r>   r´   rI   r   Úresolve_serialized_value)rX   rÅ   rÆ   rÈ   s       rY   Úget_serialized_valuez2LogfireRemoteVariableProvider.get_serialized_valueO  sŒ   € ð  Œ9�œ	™œÒ#Ð#ØÔ×$Ò$ TÔ%9Ñ:Ô:Ð:àÔ(ð 	¨TÔ-Kð 	à�LŠL‰NŒNˆNàŒ<ÐÝ#¨¸dÐK[Ð\Ñ\Ô\Ð\àŒ|×4Ò4°]ÀMÐS]Ñ^Ô^Ð^r[   Úlabelc                ó  •— | j         t          j        ¦   «         k    r| j                             | j        ¦  «         | j        s| j        r|                      ¦   «          t          ¦   «          
                    ||¦  «        S )aN  Resolve a variable's serialized value for a specific label from the remote configuration.

        Args:
            variable_name: The name of the variable to resolve.
            label: The name of the label to select.

        Returns:
            A ResolvedVariable containing the serialized value (or None if not found).
        )rW   rU   rV   rF   rÏ   rg   rG   r>   r´   ÚsuperÚget_serialized_value_for_label)rX   rÅ   rÒ   Ú	__class__s      €rY   rÕ   z<LogfireRemoteVariableProvider.get_serialized_value_for_labelk  sn   ø€ ð Œ9�œ	™œÒ#Ð#ØÔ×$Ò$ TÔ%9Ñ:Ô:Ð:àÔ(ð 	¨TÔ-Kð 	Ø�LŠL‰NŒNˆNå‰wŒw×5Ò5°mÀUÑKÔKÐKr[   éˆ  Útimeout_millisc                óª  — | j         rdS d| _         | j                             ¦   «          t          |dz  d¦  «        dz  }t          |dz  d¦  «        dz  }| j        �| j                             |¬¦  «         | j        �| j                             |¬¦  «         | j        5  | j         	                    ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )zªStop the background polling thread and clean up resources.

        Args:
            timeout_millis: The timeout budget in milliseconds for shutdown operations.
        NTgffffffæ?r   iè  g333333Ó?r»   )
rJ   rN   rž   ÚmaxrT   ÚjoinrQ   rE   r9   Úclose)rX   rØ   Úworker_timeoutÚsse_timeouts       rY   Úshutdownz&LogfireRemoteVariableProvider.shutdown�  s*  € ð Œ>ð 	ØˆFØˆŒØÔ×ÒÑ!Ô!Ð!õ
 ˜^¨cÑ1°1Ñ5Ô5¸Ñ<ˆÝ˜.¨3Ñ.°Ñ2Ô2°TÑ9ˆØÔÐ*ØÔ×$Ò$¨^Ð$Ñ<Ô<Ð<ØÔÐ'ØÔ×!Ò!¨+Ð!Ñ6Ô6Ð6àÔð 	"ð 	"ØŒM×ÒÑ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"ð 	"ð 	"s   Â!CÃCÃCr_   úVariableConfig | Nonec                óH   — | j         €dS | j                              |¦  «        S )a†  Retrieve the full configuration for a variable from the cached config.

        This method supports alias-based lookup, so you can pass either the
        variable's current name or any of its configured aliases.

        Args:
            name: The name (or alias) of the variable.

        Returns:
            The VariableConfig if found, or None if the variable doesn't exist.
        N)rI   Ú_get_variable_config)rX   r_   s     rY   Úget_variable_configz1LogfireRemoteVariableProvider.get_variable_config™  s'   € ð Œ<ÐØ�4ØŒ|×0Ò0°Ñ6Ô6Ð6r[   r$   c                ó>   — | j         €t          i ¬¦  «        S | j         S )zíRetrieve all variable configurations from the cached config.

        Returns:
            A VariablesConfig containing all variable configurations.
            Returns an empty VariablesConfig if no config has been fetched yet.
        N)Ú	variables)rI   r$   rf   s    rY   Úget_all_variables_configz6LogfireRemoteVariableProvider.get_all_variables_config©  s%   € ð Œ<ÐÝ"¨RÐ0Ñ0Ô0Ð0ØŒ|Ðr[   Úconfigr#   c                óÎ  — |                       |¦  «        }	 | j        5  | j                             t	          | j        d¦  «        || j        ¬¦  «        }|j        dk    rt          d|j	        › d�¦  «        ‚t          j        |¦  «         ddd¦  «         n# 1 swxY w Y   n,# t          t          f$ r}t          d|› �¦  «        |‚d}~ww xY w|                      d¬	¦  «         |S )
ae  Create a new variable configuration via the remote API.

        Args:
            config: The configuration for the new variable.

        Returns:
            The created VariableConfig.

        Raises:
            VariableAlreadyExistsError: If a variable with this name already exists.
            VariableWriteError: If the API request fails.
        rº   ©rœ   r<   i™  ú
Variable 'z' already existsNzFailed to create variable: Tr°   )Ú_config_to_api_bodyrE   r9   Úpostr
   r6   r=   r–   r   r_   r   r¿   r   r   r´   ©rX   rç   Úbodyr¥   rÃ   s        rY   Úcreate_variablez-LogfireRemoteVariableProvider.create_variable´  sL  € ð ×'Ò'¨Ñ/Ô/ˆð		OØÔ#ð >ð >Øœ=×-Ò-Ý˜DœNÐ,<Ñ=Ô=ÀDÐRVÔR_ð .ñ ô �ð Ô'¨3Ò.Ð.Ý4Ð5_À&Ä+Ð5_Ð5_Ð5_Ñ`Ô`Ð`Ý"Ô3°HÑ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >øøõ #Õ$4Ð5ð 	Oð 	Oð 	OÝ$Ð%FÀ1Ð%FÐ%FÑGÔGÈQÐNøøøøð	Oøøøð 	�Š˜4ˆÑ Ô Ð Øˆs;   —B# žA-BÂB# ÂBÂB# ÂBÂB# Â#CÂ4CÃCc           	     óÌ  — |                       |¦  «        }	 | j        5  | j                             t	          | j        d|› d�¦  «        || j        ¬¦  «        }|j        dk    rt          d|› d�¦  «        ‚t          j
        |¦  «         ddd¦  «         n# 1 swxY w Y   n,# t          t          f$ r}t          d|› �¦  «        |‚d}~ww xY w|                      d	¬
¦  «         |S )a�  Update an existing variable configuration via the remote API.

        Args:
            name: The name of the variable to update.
            config: The new configuration for the variable.

        Returns:
            The updated VariableConfig.

        Raises:
            VariableNotFoundError: If the variable does not exist.
            VariableWriteError: If the API request fails.
        rº   ú/ré   é”  rê   ú' not foundNzFailed to update variable: Tr°   )rë   rE   r9   Úputr
   r6   r=   r–   r   r   r¿   r   r   r´   )rX   r_   rç   rî   r¥   rÃ   s         rY   Úupdate_variablez-LogfireRemoteVariableProvider.update_variableÑ  sU  € ð ×'Ò'¨Ñ/Ô/ˆð		OØÔ#ð >ð >Øœ=×,Ò,Ý˜DœNÐ,D¸TÐ,DÐ,DÐ,DÑEÔEÈDÐZ^ÔZgð -ñ ô �ð Ô'¨3Ò.Ð.Ý/Ð0N¸TÐ0NÐ0NÐ0NÑOÔOÐOÝ"Ô3°HÑ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >øøõ #Õ$4Ð5ð 	Oð 	Oð 	OÝ$Ð%FÀ1Ð%FÐ%FÑGÔGÈQÐNøøøøð	Oøøøð 	�Š˜4ˆÑ Ô Ð Øˆs;   —B" žA,BÂ
B" ÂBÂB" ÂBÂB" Â"CÂ3CÃCc           	     ó   — 	 | j         5  | j                             t          | j        d|› d�¦  «        | j        ¬¦  «        }|j        dk    rt          d|› d�¦  «        ‚t          j	        |¦  «         ddd¦  «         n# 1 swxY w Y   n,# t          t          f$ r}t          d|› �¦  «        |‚d}~ww xY w|                      d	¬
¦  «         dS )a  Delete a variable configuration via the remote API.

        Args:
            name: The name of the variable to delete.

        Raises:
            VariableNotFoundError: If the variable does not exist.
            VariableWriteError: If the API request fails.
        rº   rñ   r»   rò   rê   ró   NzFailed to delete variable: Tr°   )rE   r9   Údeleter
   r6   r=   r–   r   r   r¿   r   r   r´   )rX   r_   r¥   rÃ   s       rY   Údelete_variablez-LogfireRemoteVariableProvider.delete_variableï  s=  € ð		OØÔ#ð >ð >Øœ=×/Ò/Ý˜DœNÐ,D¸TÐ,DÐ,DÐ,DÑEÔEÈtÌ}ð 0ñ ô �ð Ô'¨3Ò.Ð.Ý/Ð0N¸TÐ0NÐ0NÐ0NÑOÔOÐOÝ"Ô3°HÑ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >øøõ #Õ$4Ð5ð 	Oð 	Oð 	OÝ$Ð%FÀ1Ð%FÐ%FÑGÔGÈQÐNøøøøð	Oøøøð 	�Š˜4ˆÑ Ô Ð Ð Ð s;   ‚B ‰A+B Á4B Â BÂB ÂBÂB ÂB5ÂB0Â0B5údict[str, Any]c                ó@  ‡ — d|j         i}|j        |d<   |j        �
|j        |d<   d|j        j        i|d<   ˆ fd„|j        D ¦   «         |d<   |j        �
|j        |d	<   |j        �
|j        |d
<   |j        r(ˆ fd„|j                             ¦   «         D ¦   «         |d<   |S )zÑConvert a VariableConfig to the API request body format.

        Args:
            config: The VariableConfig to convert.

        Returns:
            A dictionary suitable for the API request body.
        r_   ÚdescriptionNÚjson_schemaÚlabelsÚrolloutc                óT   •— g | ]$}ˆfd „|j         D ¦   «         d|j        j        idœ‘Œ%S )c                óX   •— g | ]&}|j         |j        d œ‰                     |¦  «        ¥‘Œ'S ))ÚkindÚ	attribute)r  r  Ú_condition_extra_fields)Ú.0ÚcondrX   s     €rY   ú
<listcomp>zPLogfireRemoteVariableProvider._config_to_api_body.<locals>.<listcomp>.<listcomp>  sI   ø€ ð ð ð àð "œY°T´^ÐjÐjÀt×GcÒGcÐdhÑGiÔGiÐjðð ð r[   rý   )Ú
conditionsrþ   )r  rþ   rý   )r  ÚoverriderX   s     €rY   r  zELogfireRemoteVariableProvider._config_to_api_body.<locals>.<listcomp>  si   ø€ ð 	
ð 	
ð 	
ð ðð ð ð à (Ô 3ðñ ô ð % hÔ&6Ô&=Ð>ðð ð	
ð 	
ð 	
r[   Ú	overridesÚaliasesÚexamplec                óB   •— i | ]\  }}|‰                      |¦  «        “ŒS rq   )Ú_label_to_api_data)r  Ú
label_nameÚlabel_valuerX   s      €rY   ú
<dictcomp>zELogfireRemoteVariableProvider._config_to_api_body.<locals>.<dictcomp>/  s;   ø€ ð ð ð ÙE\ÀZÐQ\�
˜D×3Ò3°KÑ@Ô@ðð ð r[   )	r_   rû   rü   rþ   rý   r	  r
  r  Úitems)rX   rç   rî   s   `  rY   rë   z1LogfireRemoteVariableProvider._config_to_api_body  só   ø€ ð !'¨¬Ð4ˆð %Ô0ˆˆ]ÑàÔÐ)Ø"(Ô"4ˆD�Ñà# V¤^Ô%:Ð;ˆˆY‰ð	
ð 	
ð 	
ð 	
ð #Ô,ð	
ñ 	
ô 	
ˆˆ[Ñð Œ>Ð%Ø$œnˆD�‰Oð Œ>Ð%Ø$œnˆD�‰Oð Œ=ð 	ðð ð ð Ø`fÔ`m×`sÒ`sÑ`uÔ`uðñ ô ˆD�‰Nð ˆr[   úLabeledValue | LabelRefc                óœ   — t          | t          ¦  «        rd| j        | j        dœS | j        dk    rddiS | j        dk    rddiS d| j        dœS )zÂConvert a label value to the API label data format.

        Args:
            label: The label to convert.

        Returns:
            A dictionary suitable for the API labels field.
        Úversion)Útarget_typer  Úserialized_valueÚlatestr  Úcode_defaultrÒ   )r  Útarget_label)r?   r   r  r  Úref)rÒ   s    rY   r  z0LogfireRemoteVariableProvider._label_to_api_data5  su   € õ �e�\Ñ*Ô*ð 	à(Ø œ=Ø$)Ô$:ðð ð ð Œ9˜Ò Ð Ø! 8Ð,Ð,ØŒY˜.Ò(Ð(Ø! >Ð2Ð2à#*¸E¼IÐFÐFÐFr[   Ú	conditionr	   c                ó€  — t          |t          t          f¦  «        r	d|j        iS t          |t          t
          f¦  «        rdt          |j        ¦  «        iS t          |t          t          f¦  «        r,|j
        }dt          |t          j        ¦  «        r|j
        n|iS t          |t          t          f¦  «        ri S i S )zËExtract extra fields from a condition based on its type.

        Args:
            condition: The condition object.

        Returns:
            A dictionary of extra fields for the condition.
        rÍ   ÚvaluesÚpattern)r?   r   r   rÍ   r    r!   Úlistr  r"   r   r  ÚreÚPatternr   r   )rX   r  r  s      rY   r  z5LogfireRemoteVariableProvider._condition_extra_fieldsM  s»   € õ �i¥+Õ/@Ð!AÑBÔBð 	Ø˜Yœ_Ð-Ð-Ý˜	¥I­|Ð#<Ñ=Ô=ð 	Ø�d 9Ô#3Ñ4Ô4Ð5Ð5Ý˜	Õ$5Õ7MÐ#NÑOÔOð 	ØÔ'ˆGØµ*¸WÅbÄjÑ2QÔ2QÐ^˜wœ˜ÐW^Ð_Ð_Ý˜	¥Lµ/Ð#BÑCÔCð 	ØˆIØˆ	r[   údict[str, VariableTypeConfig]c           	     ó  — ddl m} 	 | j        5  | j                             t          | j        d¦  «        | j        ¬¦  «        }t          j	        |¦  «         | 
                    ¦   «         }ddd¦  «         n# 1 swxY w Y   n%# t          $ r}t          d|› �¦  «        |‚d}~ww xY wi }|D ][} ||d         |                     di ¦  «        |                     d	¦  «        |                     d
¦  «        ¬¦  «        }|||j        <   Œ\|S )zŒList all variable types from the remote API.

        Returns:
            A dictionary mapping type names to their configurations.
        r   r%   ú/v1/variable-types/r»   NzFailed to list variable types: r_   rü   rû   Úsource_hint)r_   rü   rû   r%  )Úlogfire.variables.configr&   rE   r9   r•   r
   r6   r=   r   r¿   rœ   r   r_   )rX   r&   r¥   Ú
types_datarÃ   ÚresultÚ	type_datarç   s           rY   Úlist_variable_typesz1LogfireRemoteVariableProvider.list_variable_typesc  s|  € ð 	@Ð?Ð?Ð?Ð?Ð?ð	SØÔ#ð -ð -Øœ=×,Ò,­W°T´^ÐEZÑ-[Ô-[ÐeiÔerÐ,ÑsÔs�Ý"Ô3°HÑ=Ô=Ð=Ø%Ÿ]š]™_œ_�
ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -øøõ "ð 	Sð 	Sð 	SÝ$Ð%JÀqÐ%JÐ%JÑKÔKÐQRÐRøøøøð	Søøøà02ˆØ#ð 	)ð 	)ˆIØ'Ð'Ø˜vÔ&Ø%ŸMšM¨-¸Ñ<Ô<Ø%ŸMšM¨-Ñ8Ô8Ø%ŸMšM¨-Ñ8Ô8ð	ñ ô ˆFð #)ˆF�6”;ÑÐØˆs;   ˆB �AA8Á,B Á8A<Á<B Á?A<Â B Â
B&ÂB!Â!B&r&   c                óp  — |j         |j        |j        dœ}|j        �
|j        |d<   	 | j        5  | j                             t          | j        d¦  «        || j	        ¬¦  «        }t          j        |¦  «         ddd¦  «         n# 1 swxY w Y   n%# t          $ r}t          d|› �¦  «        |‚d}~ww xY w|S )aˆ  Create or update a variable type via the remote API.

        If a type with the given name exists, it will be updated.
        Otherwise, a new type will be created.

        Args:
            config: The type configuration to upsert.

        Returns:
            The created or updated VariableTypeConfig.

        Raises:
            VariableWriteError: If the API request fails.
        )r_   rü   rû   Nr%  r$  ré   z Failed to upsert variable type: )r_   rü   rû   r%  rE   r9   rì   r
   r6   r=   r   r¿   r   rí   s        rY   Úupsert_variable_typez2LogfireRemoteVariableProvider.upsert_variable_type}  s+  € ð  ”KØ!Ô-Ø!Ô-ð 
ð  
ˆð
 ÔÐ)Ø"(Ô"4ˆD�Ñð	TØÔ#ð >ð >àœ=×-Ò-Ý˜DœNÐ,AÑBÔBÈÐW[ÔWdð .ñ ô �õ #Ô3°HÑ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >øøõ "ð 	Tð 	Tð 	TÝ$Ð%KÈÐ%KÐ%KÑLÔLÐRSÐSøøøøð	Tøøøð ˆs;   ¨B ¯A
BÁ9B ÂB	Â	B ÂB	ÂB Â
B3ÂB.Â.B3rp   )r)   r*   r+   r*   r,   r   r-   r.   )rh   ri   rj   rk   )rz   r*   r{   r|   rj   rk   )rª   r@   )F)r±   r·   )NN)rÅ   r*   rÆ   rÇ   rÈ   rÉ   rj   rÊ   )rÅ   r*   rÒ   r*   rj   rÊ   )r×   )rØ   r@   )r_   r*   rj   rà   )rj   r$   )rç   r#   rj   r#   )r_   r*   rç   r#   rj   r#   )r_   r*   rj   rk   )rç   r#   rj   rù   )rÒ   r  rj   rù   )r  r	   rj   rù   )rj   r"  )rç   r&   rj   r&   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rZ   rg   rd   r„   re   rˆ   r—   rc   r´   rÑ   rÕ   rß   rã   ræ   rï   rõ   rø   rë   Ústaticmethodr  r  r*  r,  Ú__classcell__)rÖ   s   @rY   r'   r'   4   s'  ø€ € € € € ðð ð ?Cð7 ð 7 ð 7 ð 7 ð 7 ðr ð  ð  ð&!@ð !@ð !@ð !@ðF
Hð 
Hð 
Hð 
Hð
!ð 
!ð 
!ðATð ATð ATðF!ð !ð !ð !ðð ð ð.)1ð )1ð )1ð )1ð )1ð\ %)Ø/3ð	_ð _ð _ð _ð _ð8Lð Lð Lð Lð Lð Lð,"ð "ð "ð "ð "ð07ð 7ð 7ð 7ð 	ð 	ð 	ð 	ðð ð ð ð:ð ð ð ð<!ð !ð !ð !ð0,ð ,ð ,ð ,ð\ ðGð Gð Gñ „\ðGð.ð ð ð ð,ð ð ð ð4!ð !ð !ð !ð !ð !ð !ð !r[   r'   ):Ú
__future__r   Ú_annotationsrœ   rU   r   rC   r�   rx   Úcollections.abcr   r   r   r   Útypingr   r	   Úurllib.parser
   Úopentelemetry.util._oncer   Úpydanticr   Úrequestsr   r   Úlogfire._internal.clientr   Úlogfire._internal.configr   Ú!logfire._internal.server_responser   r   Úlogfire._internal.utilsr   Úlogfire.variables.abstractr   r   r   r   r   r&  r   r   r   r   r   r   r   r    r!   r"   r#   r$   Úlogfirer&   Ú__all__r'   rq   r[   rY   ú<module>rB     sq  ðØ 2Ð 2Ð 2Ð 2Ð 2Ð 2à €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø  Ð  Ð  Ð  Ð  Ð  à )Ð )Ð )Ð )Ð )Ð )Ø $Ð $Ð $Ð $Ð $Ð $Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .à .Ð .Ð .Ð .Ð .Ð .Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø cÐ cÐ cÐ cÐ cÐ cÐ cÐ cØ 6Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð <Ø€N€N€NØ;Ð;Ð;Ð;Ð;Ð;ð -€ðj	ð j	ð j	ð j	ð j	Ð$4ñ j	ô j	ð j	ð j	ð j	r[   