§
    ^”Ãj;E  ã                  ó¾  — d Z 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	Z	ddl
Z
ddlZddlmZmZ ddlmZ ddlZddlmZ ddlmZ d	Zd
Zedz  ez  ZdZdZdZ ej        d¦  «        Zd„ Z G d„ de¦  «        Z G d„ de ¦  «        Z! G d„ d¦  «        Z" G d„ de"¦  «        Z# G d„ de"¦  «        Z$d„ Z%d„ Z&e G d„ d¦  «        ¦   «         Z' G d„ d ¦  «        Z(dS )!zLBounded, memory-only push-to-talk. Identity is pinned before capture starts.é    )ÚannotationsN)Ú	dataclassÚfield)ÚProtocolé   )ÚControlError)Úsplit_targetéD¬  é   é   i:  éè  z!@cf/openai/whisper-large-v3-turboz"uvicorn.error.device_gateway.voicec                óD   — t          | t          ¦  «        r
| dd…         ndS )zBBound correlation IDs in lifecycle logs; never log voice contents.Né   Úunknown)Ú
isinstanceÚstr)Úvalues    úU/home/lighthouse/esp32-dev/.cache/agent-navigator-0.6b/server/device_gateway/voice.pyÚshort_idr       s#   € å# E­3Ñ/Ô/Ð>ˆ5��"�Œ:ˆ:°YÐ>ó    c                  ó   — e Zd Zdd„ZdS )ÚSpeechToTextProviderÚ	wav_bytesÚbytesÚreturnr   c              ƒ  ó
   K  — d S ©N© )Úselfr   s     r   Ú
transcribezSpeechToTextProvider.transcribe&   s
   è è € € € r   N)r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r    r   r   r   r   r   %   s   € € € € € Ø<Ð<Ð<Ð<Ð<Ð<r   r   c                  ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚTranscriptionErrorc                óJ   •— t          ¦   «                              d¦  «         d S )NúTranscription failed)ÚsuperÚ__init__)r   Ú	__class__s    €r   r)   zTranscriptionError.__init__*   s"   ø€ Ý‰Œ×ÒÐ/Ñ0Ô0Ð0Ð0Ð0r   )r!   r"   r#   r)   Ú__classcell__)r*   s   @r   r%   r%   )   s8   ø€ € € € € ð1ð 1ð 1ð 1ð 1ð 1ð 1ð 1ð 1r   r%   c                  ó*   — e Zd ZU dZded<   ddœd„ZdS )Ú_HttpSTTProviderNzfloat | NoneÚlast_request_secondsF)Úunwrap_resultc          	   ‹  ó¨  K  — t          j        ¦   «         d }}d}d | _        	 t          j        d¦  «        4 ƒd {V —† t          j        dd¬¦  «        4 ƒd {V —†} |j        |fddd| j        z   ii|¤Žƒ d {V —†}|j	        }| 
                    ¦   «          |                     ¦   «         }	|rB|	                     d¦  «        d	us|	                     d
¦  «        rt          ¦   «         ‚|	d         }	|	d         }
t          |
t          ¦  «        st          ¦   «         ‚d                     d„ |
D ¦   «         ¦  «                             ¦   «         }
|
r&t%          |
                     d¦  «        ¦  «        dk    rt          ¦   «         ‚d}|
cd d d ¦  «        ƒd {V —† cd d d ¦  «        ƒd {V —† t          j        ¦   «         |z
  | _        t(                               d| j        ||| j        ¦  «         S # 1 ƒd {V —†swxY w Y   	 d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   n§# t
          j        $ r d}t1          ¦   «         d ‚t
          j        t4          f$ r d}t1          ¦   «         d ‚t
          j        $ r d}t1          ¦   «         d ‚t          t8          t:          t<          f$ r d}t1          ¦   «         d ‚t          j        $ r d}‚ w xY wt          j        ¦   «         |z
  | _        t(                               d| j        ||| j        ¦  «         d S # t          j        ¦   «         |z
  | _        t(                               d| j        ||| j        ¦  «         w xY w)NÚ
incompleteé   F)ÚtimeoutÚfollow_redirectsÚheadersÚAuthorizationzBearer ÚsuccessTÚerrorsÚresultÚtextÚ c              3  óH   K  — | ]}|d v st          |¦  «        dk    ¯|V — ŒdS ©z
	é    N©Úord©Ú.0Úcs     r   ú	<genexpr>z)_HttpSTTProvider._post.<locals>.<genexpr>G   s4   è è € Ð"RÐ"R¨°a¸6°k°kÅSÈÁVÄVÈrÂ\À\ 1À\À\À\À\Ð"RÐ"Rr   úutf-8é   z9STT provider=%s status=%s outcome=%s request_seconds=%.3fÚhttp_statusr3   ÚnetworkÚinvalid_responseÚ	cancelled) ÚtimeÚ	monotonicr.   Úasyncior3   ÚhttpxÚAsyncClientÚpostÚapi_keyÚstatus_codeÚraise_for_statusÚjsonÚgetÚ
ValueErrorr   r   ÚjoinÚstripÚlenÚencodeÚloggerÚinfoÚprovider_nameÚHTTPStatusErrorr%   ÚTimeoutExceptionÚTimeoutErrorÚ	HTTPErrorÚKeyErrorÚ	TypeErrorÚAttributeErrorÚCancelledError)r   Úurlr/   ÚkwargsÚstartedÚstatusÚoutcomeÚclientÚresponseÚpayloadr:   s              r   Ú_postz_HttpSTTProvider._post2   sþ  è è € Ýœ.Ñ*Ô*¨D�ˆØˆØ$(ˆÔ!ð)	Xõ ” rÑ*Ô*ð  ð  ð  ð  ð  ð  ð  ð  Ý Ô,°RÈ%ÐPÑPÔPð  ð  ð  ð  ð  ð  ð  ÐTZØ%0 V¤[°ð &Wð &WØ!0°)¸d¼lÑ2JÐ Kð&WØOUð&Wð &Wð  Wð  Wð  Wð  Wð  Wð  W�Hà%Ô1�FØ×-Ò-Ñ/Ô/Ð/Ø&Ÿmšm™oœo�GØ$ð 4Ø"Ÿ;š; yÑ1Ô1¸Ð=Ð=ÀÇÂÈXÑAVÔAVÐ=Ý",¡,¤,Ð.Ø")¨(Ô"3˜Ø" 6œ?�DÝ% d­CÑ0Ô0ð +Ý(™lœlÐ*ØŸ7š7Ð"RÐ"R¨dÐ"RÑ"RÔ"RÑRÔR×XÒXÑZÔZ�DØð +¥3 t§{¢{°7Ñ';Ô';Ñ#<Ô#<¸tÒ#CÐ#CÝ(™lœlÐ*Ø'�GØð# ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ð  ð ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ð  õH )-¬Ñ(8Ô(8¸7Ñ(BˆDÔ%Ý�KŠKÐSØÔ*¨F°G¸TÔ=VñXô Xð Xð XðI ð  ð  ð  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð  ð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  øøõ& Ô$ð 	1ð 	1ð 	1Ø#ˆGÝ$Ñ&Ô&¨DÐ0ÝÔ&­Ð5ð 	1ð 	1ð 	1ØˆGÝ$Ñ&Ô&¨DÐ0ÝŒð 	1ð 	1ð 	1ØˆGÝ$Ñ&Ô&¨DÐ0Ý�H¥iµÐ@ð 	1ð 	1ð 	1à(ˆGÝ$Ñ&Ô&¨DÐ0ÝÔ%ð 	ð 	ð 	Ø!ˆGØð	øøøõ )-¬Ñ(8Ô(8¸7Ñ(BˆDÔ%Ý�KŠKÐSØÔ*¨F°G¸TÔ=VñXô Xð Xð Xð Xøõ )-¬Ñ(8Ô(8¸7Ñ(BˆDÔ%Ý�KŠKÐSØÔ*¨F°G¸TÔ=VñXô Xð Xð Xøøøsm   ¢H  ¼HÁD)G*ÆHÆH  Ç*
G4	Ç4HÇ7G4	Ç8HÇ<H  È
HÈH  ÈHÈH  ÈL È B$KËL ÌAM)r!   r"   r#   r.   Ú__annotations__rn   r   r   r   r-   r-   .   sK   € € € € € € à)-ÐÐ-Ð-Ð-Ñ-à05ð -Xð -Xð -Xð -Xð -Xð -Xð -Xr   r-   c                  ó    — e Zd ZdZdd„Zd„ ZdS )ÚOpenAICompatibleSTTúopenai-compatibleNc                óf   — |                      d¦  «        ||c| _        | _        | _        || _        d S )Nú/)ÚrstripÚbase_urlrQ   ÚmodelÚinitial_prompt)r   rv   rQ   rw   rx   s        r   r)   zOpenAICompatibleSTT.__init__e   s3   € Ø2:·/²/À#Ñ2FÔ2FÈÐQVÐ/ˆŒ�t”| T¤ZØ,ˆÔÐÐr   c              ƒ  ó�   K  — d| j         i}| j        r
| j        |d<   |                      | j        dz   |dd|dfi¬¦  «        ƒ d {V —†S )Nrw   Úpromptz/audio/transcriptionsÚfilez	voice.wavz	audio/wav)ÚdataÚfiles)rw   rx   rn   rv   )r   r   r|   s      r   r    zOpenAICompatibleSTT.transcribei   s†   è è € Ø˜œÐ$ˆØÔð 	1Ø!Ô0ˆD�‰NØ—Z’Z ¤Ð0GÑ GÈdØ˜K¨°KÐ@ÐAð  ñ Cô Cð Cð Cð Cð Cð Cð Cð 	Cr   r   )r!   r"   r#   r]   r)   r    r   r   r   rq   rq   b   sA   € € € € € Ø'€Mð-ð -ð -ð -ðCð Cð Cð Cð Cr   rq   c                  ó$   — e Zd ZdZedfd„Zd„ ZdS )ÚCloudflareWorkersAISttProviderúcloudflare-workers-aiNc                ó@   — |||c| _         | _        | _        || _        d S r   )Ú
account_idrQ   rw   rx   )r   r‚   rQ   rw   rx   s        r   r)   z'CloudflareWorkersAISttProvider.__init__t   s&   € Ø4>ÀÈÐ1ˆŒ˜œ t¤zØ,ˆÔÐÐr   c              ƒ  óØ   K  — t          j        |¦  «                             d¦  «        ddœ}| j        r
| j        |d<   |                      d| j        › d| j        › �d|¬¦  «        ƒ d {V —†S )	NÚasciir    )ÚaudioÚtaskrx   z.https://api.cloudflare.com/client/v4/accounts/z/ai/run/T)r/   rT   )Úbase64Ú	b64encodeÚdecoderx   rn   r‚   rw   )r   r   rm   s      r   r    z)CloudflareWorkersAISttProvider.transcribex   s�   è è € å"Ô,¨YÑ7Ô7×>Ò>¸wÑGÔGÐQ]Ð^Ð^ˆØÔð 	<Ø(,Ô(;ˆGÐ$Ñ%à—Z’ZØb¸T¼_ÐbÐbÐVZÔV`ÐbÐbØ Wð  ñ .ô .ð .ð .ð .ð .ð .ð .ð 	.r   )r!   r"   r#   r]   ÚCF_STT_MODELr)   r    r   r   r   r   r   q   sA   € € € € € Ø+€Mà2>Ètð -ð -ð -ð -ð.ð .ð .ð .ð .r   r   c                 óŠ  — t           j                             d¦  «        } t           j                             d¦  «        pd }| dk    r|t           j                             d¦  «        }t           j                             d¦  «        }t           j                             d¦  «        pt          }|r|rt	          ||||¦  «        nd S | dk    rzd„ d	D ¦   «         }|d
         rI|d
                              d¦  «        dk    r*|d         s"t           j                             d¦  «        |d<   t          |¦  «        rt          |d|iŽnd S d S )NÚGATEWAY_STT_PROVIDERÚGATEWAY_STT_INITIAL_PROMPTr€   ÚGATEWAY_CF_ACCOUNT_IDÚGATEWAY_CF_API_TOKENÚGATEWAY_STT_MODELrr   c                óR   — g | ]$}t           j                             d |z   ¦  «        ‘Œ%S )ÚGATEWAY_STT_)ÚosÚenvironrU   )rB   Únames     r   ú
<listcomp>z"configured_stt.<locals>.<listcomp>Œ   s+   € ÐeÐeÐe¸D•"”*—.’. °$Ñ!6Ñ7Ô7ÐeÐeÐer   )ÚBASE_URLÚAPI_KEYÚMODELr   rt   zhttps://api.groq.com/openai/v1r   ÚGROQ_API_KEYrx   )r“   r”   rU   rŠ   r   ru   Úallrq   )Úproviderrz   ÚaccountÚtokenrw   Úvaluess         r   Úconfigured_sttr    ƒ   s8  € ÝŒz�~Š~Ð4Ñ5Ô5€HÝŒZ�^Š^Ð8Ñ9Ô9ÐA¸T€FØÐ*Ò*Ð*Ý”*—.’.Ð!8Ñ9Ô9ˆÝ”
—’Ð5Ñ6Ô6ˆÝ”
—’Ð2Ñ3Ô3ÐCµ|ˆØPWÐkÐ\aÐkÕ-¨g°u¸eÀVÑLÔLÐLÐgkÐkØÐ&Ò&Ð&ØeÐeÐDdÐeÑeÔeˆà�!Œ9ð 	7˜ œ×)Ò)¨#Ñ.Ô.Ð2RÒRÐRÐ[aÐbcÔ[dÐRÝœ
Ÿš ~Ñ6Ô6ˆF�1‰IÝFIÈ&ÁkÄkÐ[Õ" FÐB¸6ÐBÐBÐBÐW[Ð[Øˆ4r   c                ó\  — t          j        ¦   «         }t          j        |d¦  «        5 }|                     d¦  «         |                     d¦  «         |                     t          ¦  «         |                     | ¦  «         d d d ¦  «         n# 1 swxY w Y   | 	                    ¦   «         S )NÚwbr   r   )
ÚioÚBytesIOÚwaveÚopenÚsetnchannelsÚsetsampwidthÚsetframerateÚSAMPLE_RATEÚwriteframesÚgetvalue)ÚpcmÚoutputÚstreams      r   Úwav_pcmr°   ”   sÓ   € ÝŒZ‰\Œ\€FÝ	Œ�6˜4Ñ	 Ô	 ð   FØ×Ò˜AÑÔÐØ×Ò˜AÑÔÐØ×Ò�KÑ(Ô(Ð(Ø×Ò˜3ÑÔÐð	 ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð
 �?Š?ÑÔÐs   ©ABÂBÂBc                  ó  — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   dZd	ed
<   dZded<   dZded<    eed¬¦  «        Z	ded<   dZ
d	ed<    edd¬¦  «        Zded<    edd¬¦  «        Zded<    edd¬¦  «        Zded<   dS )ÚVoiceRequestr   Úvoice_idÚ
connectionÚtargetÚagentÚ
session_idr•   r   ÚintÚ
generationNzdict | NoneÚcontextÚ	RECORDINGÚstateF)Údefault_factoryÚreprÚ	bytearrayr­   Úsequencer;   )Údefaultr¾   Ú
transcriptzasyncio.Task | Noner†   zasyncio.TimerHandle | NoneÚtimer)r!   r"   r#   ro   r¹   rº   r¼   r   r¿   r­   rÀ   rÂ   r†   rÃ   r   r   r   r²   r²   ž   s  € € € € € € à€M€M�MØ€O€O�OØ€K€K�KØ€J€J�JØ€O€O�OØ€I€I�IØ€JÐÐÐÑØ€GÐÐÐÑØ€EÐÐÐÑØ�U¨9¸5ÐAÑAÔA€CÐAÐAÐAÑAØ€HÐÐÐÑØ�e B¨UÐ3Ñ3Ô3€JÐ3Ð3Ð3Ñ3Ø % ¨d¸Ð ?Ñ ?Ô ?€DÐ?Ð?Ð?Ñ?Ø(-¨°dÀÐ(GÑ(GÔ(G€EÐGÐGÐGÑGÐGÐGr   r²   c                  óh   — e Zd Zd„ dd„ dfd„Zd„ Zd„ Zdd„Zd	d
dœd„Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ ZdS )ÚVoiceManagerc                ó   — dS )Nr   r   )Údids    r   ú<lambda>zVoiceManager.<lambda>±   s   € Ðxy€ r   Nc                ó   — dS )NTr   )Údevicerº   s     r   rÈ   zVoiceManager.<lambda>±   s   € ð  vz€ r   c                óØ   — |||c| _         | _        | _        |||c| _        | _        | _        || _        || _        |	| _        |
| _	        i | _
        i | _        t          ¦   «         | _        d S r   )rœ   Ú
target_forÚadapter_forÚsendÚ
is_currentÚapproval_pendingÚgeneration_forÚcontext_prepareÚcontext_validÚcontext_submitÚrequestsÚseenÚsetÚtasks)r   rœ   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   s              r   r)   zVoiceManager.__init__±   sx   € Ø;CÀZÐQ\Ð8ˆŒ�t”¨Ô(8Ø<@À*ÐN^Ð9ˆŒ	�4”? DÔ$9Ø*ˆÔÀ¨4Ô+?ÐcpÐPTÔPbð  FTÐquô  rEØˆŒØˆŒ	Ý‘U”UˆŒ
ˆ
ˆ
r   c                ó    — t          j        |¦  «        }| j                             |¦  «         |                     | j        j        ¦  «         |S r   )rM   Úcreate_taskrØ   ÚaddÚadd_done_callbackÚdiscard)r   Úcoror†   s      r   ÚspawnzVoiceManager.spawn¹   sD   € ÝÔ" 4Ñ(Ô(ˆØŒ
�Š�tÑÔÐØ×Ò˜tœzÔ1Ñ2Ô2Ð2Øˆr   c                óZ  — | j                              |j        ¦  «        |u oŠ|                      |¦  «        ou|                      |j        ¦  «        |j        k    oR|                      |j        ¦  «        |j        k    o/|  	                    ||j
        ¦  «        o|                      ¦   «          S r   )rÕ   rU   Úconnection_idrÏ   rÌ   Ú	device_idrµ   rÑ   r¹   rÓ   rº   rÐ   ©r   rÊ   Úrequests      r   ÚvalidzVoiceManager.valid¿   s¶   € Ø”×!Ò! &Ô"6Ñ7Ô7¸7ÐBð _ÀtÇÂÐW]ÑG^ÔG^ð _Ø—O’O FÔ$4Ñ5Ô5¸¼ÒGð_ØLP×L_ÒL_Ð`fÔ`pÑLqÔLqÐszô  tFò  MFð_à×&Ò& v¨g¬oÑ>Ô>ð_àGK×G\ÒG\ÑG^ÔG^ÐC^ð	`r   Úvoice_statec              ‹  óÄ   K  — |                       |¦  «        rH|                      |t          d||j        |j        |j        |j        |j        dœ|¤Ž¦  «        ƒ d {V —† d S d S )N)Útyper³   r¼   r¶   r·   r•   r   )rÏ   rÎ   Údictr³   r¼   r¶   r·   r•   )r   rÊ   rä   ÚkindÚextras        r   ÚemitzVoiceManager.emitÄ   s°   è è € Ø�?Š?˜6Ñ"Ô"ð 	aØ—)’)˜F¥Dð %`¨d¸WÔ=MÐU\ÔUbØ”m°Ô0BÈÌð%`ð %`ØY^ð%`ð %`ñ aô að að að að að að að að að að	að 	ar   TF)ÚnotifyÚforgetc               óê  — | j                              |j        d ¦  «        }|r¬|j        r|j                             ¦   «          |j        r3|j        t          j        ¦   «         ur|j                             ¦   «          d|_        |j	         
                    ¦   «          d|_        |r)|                      |                      ||¦  «        ¦  «         |r"| j                             |j        d ¦  «         d S d S )NÚ	CANCELLEDr;   )rÕ   Úpoprá   rÃ   Úcancelr†   rM   Úcurrent_taskr¼   r­   ÚclearrÂ   rß   Úemit_safelyrÖ   )r   rÊ   rí   rî   rä   s        r   rò   zVoiceManager.cancelÉ   só   € Ø”-×#Ò# FÔ$8¸$Ñ?Ô?ˆØð 		>ØŒ}ð 'Ø”×$Ò$Ñ&Ô&Ð&ØŒ|ð & ¤µGÔ4HÑ4JÔ4JÐ JÐ JØ”×#Ò#Ñ%Ô%Ð%Ø'ˆGŒMØŒK×ÒÑÔÐØ!#ˆGÔØð >Ø—
’
˜4×+Ò+¨F°GÑ<Ô<Ñ=Ô=Ð=Øð 	6ØŒI�MŠM˜&Ô.°Ñ5Ô5Ð5Ð5Ð5ð	6ð 	6r   c              ƒ  óf   K  — 	 |                       ||¦  «        ƒ d {V —† d S # t          $ r Y d S w xY wr   )rì   Ú	Exceptionrã   s      r   rõ   zVoiceManager.emit_safelyØ   sY   è è € ð	Ø—)’)˜F GÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð 	ð 	ð 	ØˆDˆDð	øøøs   „" ¢
0¯0c              ƒ  óF  ‡ ‡‡‡K  — ‰                      d¦  «        ‰                      d¦  «        }}t          |t          ¦  «        rt          j        d|¦  «        sd S ‰                      ‰¦  «        sd S |dk    �rEt                               dt          |¦  «        t          ‰j	        ¦  «        ¦  «         ‰ j
                             ‰j	        t          ¦   «         ¦  «        }||v st          |¦  «        dk    rd S |                     |¦  «         ‰                      ‰¦  «         ‰                      ‰j        ¦  «        }‰                      ‰j        ¦  «        }d }‰ j        r”‰                      ‰‰¦  «        ƒ d {V —†}nw# t(          $ rj}	t                               dt          |¦  «        |	j        ¦  «         ‰                      ‰t/          d||	j        ¬	¦  «        ¦  «        ƒ d {V —† Y d }	~	d S d }	~	ww xY w|r|d
         |d         fnt3          |¦  «        }
|
s"‰                      ‰d|dd	œ¦  «        ƒ d {V —† d S ‰                      ¦   «         rd S |
\  }}t7          ˆfd„dD ¦   «         ¦  «        r"‰                      ‰d|dd	œ¦  «        ƒ d {V —† d S t9          |‰j	        ||||||r|d         nd ¬¦  «        Š‰‰ j        ‰j	        <   	 |rd n-‰                      |¦  «                             |¦  «        ƒ d {V —†}‰                       ‰‰¦  «        s‰                      ‰¦  «         d S |r|d         n|j!        ‰_!        tE          j#        ¦   «          $                    tJ          ˆˆˆ fd„¦  «        ‰_&        ‰  '                    ‰‰¦  «        ƒ d {V —† n-# tP          $ r  ‰  )                    ‰‰d¦  «        ƒ d {V —† Y nw xY wd S ‰ j                              ‰j	        ¦  «        Š‰r‰j*        |k    r\|dk    rT‰ j
                             ‰j	        t          ¦   «         ¦  «        }t          |¦  «        dk     r|                     |¦  «         d S ‰                       ‰‰¦  «        s‰                      ‰¦  «         d S |dk    s|dk    r0‰                      d¦  «        dk    r‰                      ‰¦  «         d S |dk    �r¥‰j+        dk    �r™	 ‰                      d¦  «        }t          |t          ¦  «        rt          |¦  «        dk    rtY          ¦   «         ‚t[          j.        |d¬¦  «        }t_          ‰                      d¦  «        ¦  «        t`          usz‰d         ‰j1        k    si|rgt          |¦  «        d z  sUt          |¦  «        td          k    s=t          ‰j3        ¦  «        t          |¦  «        z   th          k    s‰j1        tj          k    rtY          ¦   «         ‚‰j3         6                    |¦  «         ‰xj1        d!z  c_1        d S # tX          tn          j8        f$ rA t                               d"t          |¦  «        ¦  «         ‰                      ‰¦  «         Y d S w xY w|d#k    rýt                               d$t          |¦  «        t          ‰j	        ¦  «        ‰j1        t          ‰j3        ¦  «        ¦  «         ‰                      d%¦  «        }|�tt_          |¦  «        t`          us|d&k    rXt                               d't          |¦  «        t_          |¦  «        t`          u r|nd(¦  «         ‰                      ‰¦  «         d S ‰  9                    ‰‰¦  «        ƒ d {V —† d S |dk    �r¶‰                      d¦  «        d)k    �rž‰j+        d*k    �r”d+‰_+        ‰j:        d,c}‰_:        ‰j;        pi                       d-¦  «        }t                               d.t          |¦  «        |d/v r|nd0t          ‰j;        pi                       d1¦  «        ¦  «        ¦  «         	 ‰j;        r#‰  <                    ‰‰j;        |¦  «        ƒ d {V —† n9‰                      ‰j=        ¦  «         >                    ‰j?        |¦  «        ƒ d {V —† d2‰_+        t                               d3t          |¦  «        ¦  «         ‰  '                    ‰‰¦  «        ƒ d {V —† d S # tP          $ rI t                               d4t          |¦  «        ¦  «         ‰  )                    ‰‰d5¦  «        ƒ d {V —† Y d S w xY wd S d S d S )6Nrè   r³   z[A-Za-z0-9_-]{1,64}Úvoice_startz0[VOICE_RX] event=start voice_id=%s connection=%sé   z-[VOICE_RX] event=reject voice_id=%s status=%dÚvoice_error)rè   r³   Úmessager¶   r·   zNO AGENT SELECTEDc              3  óP   •K  — | ] \  }}‰                      |¦  «        |k    V — Œ!d S r   )rU   )rB   ÚkÚvÚevents      €r   rD   z&VoiceManager.handle.<locals>.<genexpr>û   s6   øè è € ÐdÐd©¨¨A�5—9’9˜Q‘<”< 1Ò$ÐdÐdÐdÐdÐdÐdr   ))Úsample_rater
   )Úbitsr   )Úchannelsr   zUnsupported audio formatrº   )r¹   rº   r•   c                 óV   •— ‰                      ‰                     ‰ ‰¦  «        ¦  «        S r   )rß   Úend)rÊ   Úreqr   s   €€€r   rÈ   z%VoiceManager.handle.<locals>.<lambda>	  s!   ø€ ˜DŸJšJ t§x¢x°¸Ñ'<Ô'<Ñ=Ô=€ r   zAgent unavailableÚvoice_cancelÚvoice_decisionÚdecisionrò   Úvoice_chunkr»   r…   iø  T)ÚvalidaterÀ   r   r   z8[VOICE_RX] event=cancel voice_id=%s reason=invalid_chunkÚ	voice_endzE[VOICE_RX] event=end voice_id=%s connection=%s chunks=%d pcm_bytes=%dÚrecorded_duration_msr   z\[VOICE_RX] event=cancel voice_id=%s reason=short_or_invalid_duration recorded_duration_ms=%sÚinvalidrÎ   ÚAWAITING_CONFIRMATIONÚSENDINGr;   rê   z<[VOICE_SEND] event=start voice_id=%s context=%s operation=%s)rü   Ú
user_inputÚnew_sessionrü   Úoperation_idÚSENTz1[VOICE_SEND] event=complete voice_id=%s success=1z1[VOICE_SEND] event=complete voice_id=%s success=0z0Input failed; check Agent status before retrying)@rU   r   r   ÚreÚ	fullmatchrÏ   r[   r\   r   rá   rÖ   Ú
setdefaultr×   rY   rÛ   rò   rÌ   râ   rÑ   rÒ   r   ri   rÎ   ré   Údetailr	   rÐ   Úanyr²   rÕ   rÍ   Úget_sessionrå   r•   rM   Úget_running_loopÚ
call_laterÚMAX_SECONDSrÃ   rì   r÷   Úfailr³   r¼   rV   r‡   Ú	b64decoderè   r¸   rÀ   ÚCHUNK_BYTESr­   Ú	MAX_BYTESÚ
MAX_CHUNKSÚextendÚbinasciiÚErrorr  rÂ   rº   rÔ   r¶   Ú
send_inputr·   )r   rÊ   r   rê   ÚvidÚusedrµ   r¹   ÚpreparedÚexcÚparsedr¶   ÚsidÚsessionr…   r­   ÚdurationrÂ   Úcontext_kindr  s   ```                @r   ÚhandlezVoiceManager.handleÞ   sõ	  øøøøè è € Ø—I’I˜fÑ%Ô% u§y¢y°Ñ'<Ô'<ˆcˆÝ˜#�sÑ#Ô#ð 	­2¬<Ð8NÐPSÑ+TÔ+Tð 	ØˆFØ�Š˜vÑ&Ô&ð 	ØˆFØ�=Ò Ñ Ý�KŠKÐJÝ  ™œ¥x°Ô0DÑ'EÔ'EñGô Gð Gà”9×'Ò'¨Ô(<½c¹e¼eÑDÔDˆDØ�dˆ{ˆ{�c $™iœi¨3Ò.Ð.Ø�Ø�HŠH�S‰MŒMˆMØ�KŠK˜ÑÔÐØ—_’_ VÔ%5Ñ6Ô6ˆFØ×*Ò*¨6Ô+;Ñ<Ô<ˆJØˆHØÔ#ð lØ#'×#7Ò#7¸¸uÑ#EÔ#EÐEÐEÐEÐEÐEÐE�H�HøÝ#ð lð lð lÝ—K’KÐ OÕQYÐZ]ÑQ^ÔQ^Ð`cÔ`jÑkÔkÐkØŸ)š) F­4°]ÈCÐX[ÔXbÐ+cÑ+cÔ+cÑdÔdÐdÐdÐdÐdÐdÐdÐdÐekÐekÐekÐekÐekÐekøøøøðløøøð DLÐe�h˜wÔ'¨°Ô(>Ð?Ð?ÕQ]Ð^dÑQeÔQeˆFØð Ø—i’i °ÈÐWjÐ(kÐ(kÑlÔlÐlÐlÐlÐlÐlÐlÐlØ�Ø×$Ò$Ñ&Ô&ð Ø�Ø‰JˆE�3ÝÐdÐdÐdÐdÐ1cÐdÑdÔdÑdÔdð Ø—i’i °ÈÐWqÐ(rÐ(rÑsÔsÐsÐsÐsÐsÐsÐsÐsØ�õ ˜s 6Ô#7¸¸uÀSÈÐXbð  CKð  lUÐksÐt}Ôk~Ðk~ð  QUð  Vñ  Vô  VˆCØ25ˆDŒM˜&Ô.Ñ/ð
BØ"*Ð^˜$˜$°d×6FÒ6FÀuÑ6MÔ6M×6YÒ6YÐZ]Ñ6^Ô6^Ð0^Ð0^Ð0^Ð0^Ð0^Ð0^�Ø—z’z &¨#Ñ.Ô.ð Ø—K’K Ñ'Ô'Ð'Ø�FØ/7ÐI˜8 FÔ+Ð+¸W¼\�”Ý#Ô4Ñ6Ô6×AÒAÅ+Ø=Ð=Ð=Ð=Ð=Ð=ñ?ô ?�”	à—i’i ¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð Bð Bð BØ—i’i ¨Ð-@ÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAðBøøøàˆFØŒm×Ò Ô 4Ñ5Ô5ˆØð 	�c”l cÒ)Ð)Ø�^Ò#Ð#Ø”Y×)Ò)¨&Ô*>½s¹u¼uÑEÔE�Ý�t‘9”9˜S’=�= §¢¨#¡¤ ØˆFØ�zŠz˜& #Ñ&Ô&ð 	Ø�KŠK˜ÑÔÐØˆFØ�>Ò!Ð! dÐ.>Ò&>Ð&>À5Ç9Â9ÈZÑCXÔCXÐ\dÒCdÐCdØ�KŠK˜ÑÔÐÐÐØ�]Ò"Ñ" s¤y°KÒ'?Ñ'?ð$ØŸ	š	 'Ñ*Ô*�Ý! %­Ñ-Ô-ð 'µ°U±´¸dÒ1BÐ1BÝ$™,œ,Ð&ÝÔ& u°tÐ<Ñ<Ô<�Ý˜Ÿš :Ñ.Ô.Ñ/Ô/µsÐ:Ð:¸eÀJÔ>OÐSVÔS_Ò>_Ð>_Ø"ð ?`Ý&)¨#¡h¤h°¡lð ?`Ý69¸#±h´hÅÒ6LÐ6LÝ˜sœw™<œ<­#¨c©(¬(Ñ2µYÒ>Ð>À#Ä,ÕR\ÒB\ÐB\Ý$™,œ,Ð&Ø”—’˜sÑ#Ô#Ð#Ø�” Ñ!�”��øÝ¥¤Ð/ð $ð $ð $Ý—’ÐVÕX`ÐadÑXeÔXeÑfÔfÐfØ—’˜FÑ#Ô#Ð#Ð#Ð#Ð#ð$øøøð �[Ò Ð Ý�KŠKÐ_Ý  ™œ¥x°Ô0DÑ'EÔ'EÀsÄ|ÕUXÐY\ÔY`ÑUaÔUañcô cð cà—Y’YÐ5Ñ6Ô6ˆHØÐ#­¨h©¬½sÐ)BÐ)BÀhÐPTÂnÀnÝ—’ÐzÝ$ S™MœMµt¸H±~´~ÍÐ7LÐ7L¨8¨8ÐR[ñ]ô ]ð ]à—’˜FÑ#Ô#Ð#Ð#Ð#Ø—x’x ¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÐ%Ò%Ñ%¨%¯)ª)°JÑ*?Ô*?À6Ò*IÑ*IÈcÌiÐ[rÒNrÑNrà!ˆCŒIØ),¬¸Ð&ˆJ˜œØœKÐ-¨2×2Ò2°6Ñ:Ô:ˆLÝ�KŠKÐVÝ  ™œ°|ÐGmÐ7mÐ7m | |Ðs|Ý  #¤+Ð"3°×!8Ò!8¸Ñ!HÔ!HÑIÔIñKô Kð KðaØ”;ð ] T×%8Ò%8¸ÀÄÈJÑ%WÔ%WÐWÐWÐWÐWÐWÐWÐWÐWØ×+Ò+¨C¬IÑ6Ô6×AÒAÀ#Ä.ÐQ[Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ø"�”	Ý—’ÐOÕQYÐZ]ÑQ^ÔQ^Ñ_Ô_Ð_Ø—i’i ¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð að að aÝ—’ÐOÕQYÐZ]ÑQ^ÔQ^Ñ_Ô_Ð_Ø—i’i ¨Ð-_Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`ðaøøøð &Ð%Ð*IÐ*IÐNrÐNrs[   Å"E? Å?
G3Æ	AG.Ç.G3Ë	AN Ì(A(N Î'N;Î:N;ÓD<X ØAYÙYàB.c ãAdädc              ƒ  ó2  K  — |j         dk    s|                      ||¦  «        sd S |j        r|j                             ¦   «          d|_         |                      ||¦  «        ƒ d {V —† |                      |                      ||¦  «        ¦  «        |_        d S )Nr»   ÚTRANSCRIBING)r¼   rå   rÃ   rò   rì   rß   r    r†   )r   rÊ   r  s      r   r  zVoiceManager.endC  s›   è è € ØŒ9˜Ò#Ð#¨4¯:ª:°f¸cÑ+BÔ+BÐ#ØˆFØŒ9ð 	ØŒI×ÒÑÔÐØ"ˆŒ	Ø�iŠi˜ Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø—:’:˜dŸošo¨f°cÑ:Ô:Ñ;Ô;ˆŒˆˆr   c           	   ƒ  ó  K  — t          j        ¦   «         }d}t                               dt	          |j        ¦  «        t	          |j        ¦  «        |j        t          |j	        ¦  «        ¦  «         	 | j
        r|j	        st          ¦   «         ‚t          |j	        ¦  «        }|j	                             ¦   «          t          j        | j
                             |¦  «        d¦  «        ƒ d {V —†}t#          |t$          ¦  «        r1d                     d„ |D ¦   «         ¦  «                             ¦   «         }t#          |t$          ¦  «        r(|r&t          |                     d¦  «        ¦  «        dk    rt          ¦   «         ‚|                      ||¦  «        su	 |j	                             ¦   «          t                               dt	          |j        ¦  «        t	          |j        ¦  «        t          j        ¦   «         |z
  d	z  |¦  «         d S |                     ¦   «         d
c|_        |_        |                      ||d|j        ¬¦  «        ƒ d {V —† d}nR# t          j        $ r ‚ t6          $ r6 |                      ||¦  «        r|                      ||d¦  «        ƒ d {V —† Y nw xY w|j	                             ¦   «          t                               dt	          |j        ¦  «        t	          |j        ¦  «        t          j        ¦   «         |z
  d	z  |¦  «         d S # |j	                             ¦   «          t                               dt	          |j        ¦  «        t	          |j        ¦  «        t          j        ¦   «         |z
  d	z  |¦  «         w xY w)NFzH[VOICE_STT] event=start voice_id=%s connection=%s chunks=%d pcm_bytes=%dé   r;   c              3  óH   K  — | ]}|d v st          |¦  «        dk    ¯|V — ŒdS r=   r?   rA   s     r   rD   z*VoiceManager.transcribe.<locals>.<genexpr>X  s4   è è € ÐNÐN Q°!°v°+°+ÅÀQÁÄÈ2ÂÀ˜qÀÀÀÀÐNÐNr   rE   rF   zP[VOICE_STT] event=complete voice_id=%s connection=%s duration_ms=%.1f success=%dr   r  Úvoice_transcript)rÂ   Tr'   )rK   rL   r[   r\   r   r³   r´   rÀ   rY   r­   rœ   rV   r°   rô   rM   Úwait_forr    r   r   rW   rX   rZ   rå   rÂ   r¼   rì   re   r÷   r  )r   rÊ   r  rh   r7   r…   r:   s          r   r    zVoiceManager.transcribeL  sr  è è € Ý”.Ñ"Ô"ˆØˆÝ�ŠÐ^Ý˜Sœ\Ñ*Ô*­H°S´^Ñ,DÔ,DÀcÄlÕTWÐX[ÔX_ÑT`ÔT`ñ	bô 	bð 	bð	FØ”=ð #¨¬ð #Ý ‘l”lÐ"Ý˜CœGÑ$Ô$ˆEØŒG�MŠM‰OŒOˆOÝ Ô)¨$¬-×*BÒ*BÀ5Ñ*IÔ*IÈ2ÑNÔNÐNÐNÐNÐNÐNÐNˆDÝ˜$¥Ñ$Ô$ð WØ—w’wÐNÐN¨$ÐNÑNÔNÑNÔN×TÒTÑVÔV�Ý˜d¥CÑ(Ô(ð #°ð #½¸D¿KºKÈÑ<PÔ<PÑ8QÔ8QÐTXÒ8XÐ8XÝ ‘l”lÐ"Ø—:’:˜f cÑ*Ô*ð Øð ŒG�MŠM‰OŒOˆOÝ�KŠKÐjÝ  ¤Ñ.Ô.µ¸¼Ñ0HÔ0HÝœÑ)Ô)¨GÑ3°tÑ;¸WñFô Fð Fð Fð Fð )-¯
ª
©¬Ð6MÐ%ˆCŒN˜CœIØ—)’)˜F CÐ);ÈÌ�)ÑWÔWÐWÐWÐWÐWÐWÐWÐWØˆGˆGøÝÔ%ð 	ð 	ð 	ØÝð 	Eð 	Eð 	EØ�zŠz˜& #Ñ&Ô&ð EØ—i’i ¨Ð-CÑDÔDÐDÐDÐDÐDÐDÐDÐDøøð	Eøøøð ŒG�MŠM‰OŒOˆOÝ�KŠKÐjÝ  ¤Ñ.Ô.µ¸¼Ñ0HÔ0HÝœÑ)Ô)¨GÑ3°tÑ;¸WñFô Fð Fð Fð Føð ŒG�MŠM‰OŒOˆOÝ�KŠKÐjÝ  ¤Ñ.Ô.µ¸¼Ñ0HÔ0HÝœÑ)Ô)¨GÑ3°tÑ;¸WñFô Fð Fð Føøøs4   Á2D#I È
AI ÉL ÉAJ!ÊL Ê J!Ê!L ÌA4Nc              ƒ  ó>  K  — t                                dt          |j        ¦  «        |j        ¦  «         d\  |_        |_        |j                             ¦   «          |j        r|j         	                    ¦   «          |  
                    ||d|¬¦  «        ƒ d {V —† d S )Nz"[VOICE_ERROR] voice_id=%s phase=%s)ÚFAILEDr;   rû   )rü   )r[   r\   r   r³   r¼   rÂ   r­   rô   rÃ   rò   rì   )r   rÊ   r  rü   s       r   r  zVoiceManager.failk  s˜   è è € Ý�ŠÐ8½(À3Ä<Ñ:PÔ:PÐRUÔR[Ñ\Ô\Ð\Ø$0Ñ!ˆŒ	�3”>ØŒ�Š‰ŒˆØŒ9ð 	ØŒI×ÒÑÔÐØ�iŠi˜  ]¸GˆiÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDr   c              ƒ  óš  K  — | j                              ¦   «         D ]B}|j        r|j                             ¦   «          |j                             ¦   «          d|_        ŒC| j                              ¦   «          | j                             ¦   «          | j        D ]}|                     ¦   «          Œt          j
        | j        ddiŽƒ d {V —† d S )Nr;   Úreturn_exceptionsT)rÕ   rŸ   rÃ   rò   r­   rô   rÂ   rÖ   rØ   rM   Úgather)r   r  r†   s      r   ÚclosezVoiceManager.closes  sÆ   è è € Ø”=×'Ò'Ñ)Ô)ð 	 ð 	 ˆCØŒyÐ,˜#œ)×*Ò*Ñ,Ô,Ð,ØŒG�MŠM‰OŒOˆOØˆCŒNˆNØŒ×ÒÑÔÐØŒ	�ŠÑÔÐØ”JÐ-Ð-ˆD §¢¡¤  ÝŒn˜dœjÐA¸DÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAr   )ræ   )r!   r"   r#   r)   rß   rå   rì   rò   rõ   r0  r  r    r  r=  r   r   r   rÅ   rÅ   °   s  € € € € € ØmyÐmyð  LPð  `zð  `zð  KOð ð ð ð ðð ð ð`ð `ð `ð
að að að að
 (,°Eð 6ð 6ð 6ð 6ð 6ðð ð ðcað cað caðJ<ð <ð <ðFð Fð Fð>Eð Eð EðBð Bð Bð Bð Br   rÅ   ))Ú__doc__Ú
__future__r   rM   r‡   r$  r£   Úloggingr“   r  rK   r¥   Údataclassesr   r   Útypingr   rN   Úcontrol.modelsr   r¼   r	   rª   r  r!  r   r"  rŠ   Ú	getLoggerr[   r   r   ÚRuntimeErrorr%   r-   rq   r   r    r°   r²   rÅ   r   r   r   ú<module>rF     s“  ðØ RÐ RØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à €€€à (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à€Ø€Ø˜!‰O˜kÑ)€	Ø€Ø€
Ø2€ð 
ˆÔ	Ð?Ñ	@Ô	@€ð?ð ?ð ?ð
=ð =ð =ð =ð =˜8ñ =ô =ð =ð1ð 1ð 1ð 1ð 1˜ñ 1ô 1ð 1ð
1Xð 1Xð 1Xð 1Xð 1Xñ 1Xô 1Xð 1XðhCð Cð Cð Cð CÐ*ñ Cô Cð Cð.ð .ð .ð .ð .Ð%5ñ .ô .ð .ð$ð ð ð"ð ð ð ðHð Hð Hð Hð Hñ Hô Hñ „ðHð"KBð KBð KBð KBð KBñ KBô KBð KBð KBð KBr   