§
    nÈjn  ã                  óÂ  — 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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:  éè  iX  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    ú]/home/lighthouse/esp32-dev/.cache/main-promotion-test-20261009/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__0   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>M   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._post8   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-   4   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__k   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.transcribeo   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   h   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__z   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.transcribe~   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   w   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                  óx  — 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<   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<    edd¬¦  «        Z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Ústater;   Ú	device_idF)Údefault_factoryÚreprÚ	bytearrayr­   Úsequence)Údefaultr¿   Ú
transcriptzasyncio.Task | Noner†   zasyncio.TimerHandle | NoneÚtimerÚdeadlineÚboolÚendedzobject | NoneÚdevice)r!   r"   r#   ro   r¹   rº   r¼   r½   r   rÀ   r­   rÁ   rÃ   r†   rÄ   rÅ   rÇ   rÈ   r   r   r   r²   r²   ¤   sn  € € € € € € à€M€M�MØ€O€O�OØ€K€K�KØ€J€J�JØ€O€O�OØ€I€I�IØ€JÐÐÐÑØ€GÐÐÐÑØ€EÐÐÐÑØ€IÐÐÐÑØ�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Ø+0¨5¸ÀEÐ+JÑ+JÔ+J€HÐJÐJÐJÑJØ€EÐÐÐÑØ!˜E¨$°UÐ;Ñ;Ô;€FÐ;Ð;Ð;Ñ;Ð;Ð;r   r²   c                  ó’   — e Zd Zd„ dd„ dfd„Zd„ Zd„ Zd„ Zdd	„Zd
ddœd„Zd„ Z	ddœd„Z
d„ Zd„ Z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   )rÈ   rº   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   r½   rÓ   rÐ   rµ   rÕ   r¹   r×   rº   rÔ   ©r   rÈ   Úrequests      r   ÚvalidzVoiceManager.validÉ   s¸   € ð ”×!Ò! 'Ô"3Ñ4Ô4¸Ð?ð _ÀDÇOÂOÐTZÑD[ÔD[ð _Ø—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   c                ó@   — | j                              |j        ¦  «        S )z@The in-flight request for this device, regardless of connection.)rÙ   rU   r½   )r   rÈ   s     r   Úcurrent_forzVoiceManager.current_forÐ   s   € àŒ}× Ò  Ô!1Ñ2Ô2Ð2r   Ú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        |j        fD ]}|r|                     ¦   «          Œ|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Ä   rÅ   Úcancelr†   rM   Úcurrent_taskr¼   r­   ÚclearrÃ   rã   Úemit_safelyrÚ   )r   rÈ   rñ   rò   ræ   Úhandles         r   rö   zVoiceManager.cancelÙ   s  € Ø”-×#Ò# FÔ$4°dÑ;Ô;ˆØð 
	>Ø"œ=¨'Ô*:Ð;ð $ð $�Øð $Ø—M’M‘O”O�OøØŒ|ð & ¤µGÔ4HÑ4JÔ4JÐ JÐ JØ”×#Ò#Ñ%Ô%Ð%Ø'ˆGŒMØŒK×ÒÑÔÐØ!#ˆGÔØð >Ø—
’
˜4×+Ò+¨F°GÑ<Ô<Ñ=Ô=Ð=Øð 	2ØŒI�MŠM˜&Ô*¨DÑ1Ô1Ð1Ð1Ð1ð	2ð 	2r   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Ú	transport©Úreasonc          	     ó†  — | j                              |j        ¦  «        }|r|j        |j        k    s	|j        dv rdS |j        dk    rdS t                               dt          |j	        ¦  «        ||j
        t          |j        ¦  «        ¦  «         d|_        |j        r"|j                             ¦   «          d|_        dS dS )a!  Keep an unfinished recording across a transport interruption.

        A weak link must not destroy audio that is already recorded, so the
        request, its PCM and its acknowledged sequence survive until the device
        reconnects and resumes, or the upload window expires.
        )ÚTRANSCRIBINGÚAWAITING_CONFIRMATIONÚSENDINGÚSENTÚFAILEDNÚ	SUSPENDEDzE[VOICE_RX] event=suspend voice_id=%s reason=%s chunks=%d pcm_bytes=%d)rÙ   rU   r½   r´   Úconnection_idr¼   r[   r\   r   r³   rÁ   rY   r­   rÄ   rö   )r   rÈ   rÿ   ræ   s       r   ÚsuspendzVoiceManager.suspendï   sÛ   € ð ”-×#Ò# FÔ$4Ñ5Ô5ˆØð 	˜'Ô,°Ô0DÒDÐDÈÌð  Z`ð  I`ð  I`àˆFØŒ=˜KÒ'Ð'ØˆFÝ�ŠÐ[Ý˜WÔ-Ñ.Ô.°¸Ô8HÍ#ÈgÌkÑJZÔJZñ	\ô 	\ð 	\à#ˆŒØŒ=ð 	!ØŒM× Ò Ñ"Ô"Ð"Ø ˆGŒMˆMˆMð	!ð 	!r   c              ƒ  ó|  ‡ ‡‡‡‡K  — ‰                      d¦  «        ‰                      d¦  «        }}t          |t          ¦  «        rt          j        d|¦  «        sd S ‰                      ‰¦  «        sd S |dk    �r‚t                               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        ‰j        <   	 |rd n-‰                      |¦  «                             |¦  «        ƒ d {V —†}‰                       ‰‰¦  «        s‰                      ‰¦  «         d S |r|d         n|j!        ‰_!        tE          j#        ¦   «          $                    tJ          ˆˆˆ fd„¦  «        ‰_&        tE          j#        ¦   «          $                    tN          ˆˆˆ fd„¦  «        ‰_(        ‰  )                    ‰‰¦  «        ƒ d {V —† n-# tT          $ r  ‰  +                    ‰‰d¦  «        ƒ d {V —† Y nw xY wd S |dk    rù‰  ,                    ‰¦  «        Š‰rà‰j-        |k    rÕ‰                       ‰‰¦  «        s‰                      ‰¦  «         d S ‰‰_.        ‰j	        ‰_/        ‰j0        dk    rd‰_0        ‰j	        ‰_/        ‰  1                    ‰‰¦  «        ƒ d {V —† ‰j2        r%‰j0        dv r‰  3                    ‰‰¦  «        ƒ d {V —† ‰j0        dk    r$‰  )                    ‰‰d‰j4        ¬¦  «        ƒ d {V —† d S |dk    rÜ‰                      d¦  «        dk    rÃ‰  ,                    ‰¦  «        Š‰rª‰j-        |k    rŸ‰                       ‰‰¦  «        s‰                      ‰¦  «         d S ‰j(        r‰j(                             ¦   «          tE          j#        ¦   «          $                    tN          ˆˆˆ fd „¦  «        ‰_(        ‰  1                    ‰‰¦  «        ƒ d {V —† d S ‰  ,                    ‰¦  «        Š‰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 ‰j0        dk    r‰j/        ‰j	        k    rd S |d!k    s|dk    r0‰                      d¦  «        d"k    r‰                      ‰¦  «         d S |d#k    �r ‰j0        d$v �r‰j0        dk    rd‰_0        ‰j	        ‰_/        	 ‰                      d%¦  «        }‰                      d&¦  «        }t          |t          ¦  «        rt          |¦  «        d'k    rtk          ¦   «         ‚tm          j7        |d(¬)¦  «        }tq          |¦  «        tr          us=|d*k     s7|r5t          |¦  «        d+z  s#t          |¦  «        tt          k    s|tv          k    rtk          ¦   «         ‚|‰j<        k     r‰  1                    ‰‰¦  «        ƒ d {V —† d S |‰j<        k    rtk          ¦   «         ‚t          ‰j=        ¦  «        t          |¦  «        z   t|          k    rtk          ¦   «         ‚‰j=         ?                    |¦  «         ‰xj<        d,z  c_<        nZ# tj          t€          jA        f$ rA t                               d-t          |¦  «        ¦  «         ‰                      ‰¦  «         Y d S w xY w‰  1                    ‰‰¦  «        ƒ d {V —† d S |d.k    �r.t                               d/t          |¦  «        t          ‰j	        ¦  «        ‰j<        t          ‰j=        ¦  «        ¦  «         ‰                      d0¦  «        }‰                      d1¦  «        }‰j2        ri‰j0        dv r^‰‰_.        ‰j	        ‰_/        ‰  3                    ‰‰¦  «        ƒ d {V —† ‰j0        dk    r$‰  )                    ‰‰d‰j4        ¬¦  «        ƒ d {V —† d S |�™tq          |¦  «        tr          us|t          ‰j=        ¦  «        k    rkt                               d2t          |¦  «        tq          |¦  «        tr          u r|nd3t          ‰j=        ¦  «        ¦  «         ‰                      ‰¦  «         d S |�…tq          |¦  «        tr          us|d4k    s|tJ          d4z  d4z   k    rXt                               d5t          |¦  «        tq          |¦  «        tr          u r|nd3¦  «         ‰                      ‰¦  «         d S ‰  B                    ‰‰¦  «        ƒ d {V —† d S |dk    �r¶‰                      d¦  «        d6k    �rž‰j0        dk    �r”d7‰_0        ‰j4        d8c}‰_4        ‰jC        pi                       d9¦  «        }t                               d:t          |¦  «        |d;v r|nd<t          ‰jC        pi                       d=¦  «        ¦  «        ¦  «         	 ‰jC        r#‰  D                    ‰‰jC        |¦  «        ƒ d {V —† n9‰                      ‰jE        ¦  «         F                    ‰jG        |¦  «        ƒ d {V —† d>‰_0        t                               d?t          |¦  «        ¦  «         ‰  )                    ‰‰¦  «        ƒ d {V —† d S # tT          $ rI t                               d@t          |¦  «        ¦  «         ‰  +                    ‰‰dA¦  «        ƒ d {V —† Y d S w xY wd S d S d S )BNrì   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½   rÈ   r•   c                 óV   •— ‰                      ‰                     ‰ ‰¦  «        ¦  «        S r   )rã   Úcap_reached©rÈ   Úreqr   s   €€€r   rÍ   z%VoiceManager.handle.<locals>.<lambda>5  s#   ø€ ˜DŸJšJ t×'7Ò'7¸ÀÑ'DÔ'DÑEÔE€ r   c                 óV   •— ‰                      ‰                     ‰ ‰¦  «        ¦  «        S r   ©rã   Úexpirer  s   €€€r   rÍ   z%VoiceManager.handle.<locals>.<lambda>9  s!   ø€ ˜DŸJšJ t§{¢{°6¸3Ñ'?Ô'?Ñ@Ô@€ r   zAgent unavailableÚvoice_statusr  r»   )r  r  r  Úvoice_transcript©rÃ   Úvoice_decisionÚdecisionÚretryc                 óV   •— ‰                      ‰                     ‰ ‰¦  «        ¦  «        S r   r  )rÈ   Úpendingr   s   €€€r   rÍ   z%VoiceManager.handle.<locals>.<lambda>^  s!   ø€ ˜DŸJšJ t§{¢{°6¸7Ñ'CÔ'CÑDÔD€ r   Úvoice_cancelrö   Úvoice_chunk©r»   r  r…   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_msÚtotal_byteszZ[VOICE_RX] event=cancel voice_id=%s reason=total_bytes_mismatch total_bytes=%s received=%dÚinvalidr   z\[VOICE_RX] event=cancel voice_id=%s reason=short_or_invalid_duration recorded_duration_ms=%srÒ   r  r;   rî   z<[VOICE_SEND] event=start voice_id=%s context=%s operation=%s)r  Ú
user_inputÚnew_sessionr  Úoperation_idr  z1[VOICE_SEND] event=complete voice_id=%s success=1z1[VOICE_SEND] event=complete voice_id=%s success=0z0Input failed; check Agent status before retrying)HrU   r   r   ÚreÚ	fullmatchrÓ   r[   r\   r   r  rÚ   Ú
setdefaultr½   rÛ   rY   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Ä   ÚMAX_UPLOAD_SECONDSrÅ   rð   rü   Úfailré   r³   rÈ   r´   r¼   ÚackrÇ   Úend_ackrÃ   rV   r‡   Ú	b64decoderì   r¸   ÚCHUNK_BYTESÚ
MAX_CHUNKSrÁ   r­   Ú	MAX_BYTESÚextendÚbinasciiÚErrorÚendrº   rØ   r¶   Ú
send_inputr·   )r   rÈ   r  rî   ÚvidÚusedrµ   r¹   ÚpreparedÚexcÚparsedr¶   ÚsidÚsessionr…   rÁ   r­   Údurationr*  rÃ   Úcontext_kindr#  r  s   ```                  @@r   rú   z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×'Ò'¨Ô(8½#¹%¼%Ñ@Ô@ˆ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ð  `fô  `pð  x~ð  ñ  ô  ˆCØ.1ˆ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Å+ØEÐEÐEÐEÐEÐEñGô G�”	õ  'Ô7Ñ9Ô9×DÒDÕEWØ@Ð@Ð@Ð@Ð@Ð@ñ Bô  B�”à—i’i ¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð Bð Bð BØ—i’i ¨Ð-@ÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAðBøøøàˆFØ�>Ò!Ð!ð ×&Ò& vÑ.Ô.ˆGØð h˜7Ô+¨sÒ2Ð2Ø—z’z &¨'Ñ2Ô2ð Ø—K’K Ñ'Ô'Ð'Ø�FØ!'�”Ø%+Ô%9�Ô"Ø”= KÒ/Ð/Ø$/�G”Mà)/Ô)=�GÔ&Ø—h’h˜v wÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø”=ð 8 W¤]Ð6_Ð%_Ð%_ØŸ,š, v¨wÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ø”=Ð$;Ò;Ð;ØŸ)š) F¨GÐ5GÐT[ÔTf˜)ÑgÔgÐgÐgÐgÐgÐgÐgÐgØˆFØÐ#Ò#Ð#¨¯	ª	°*Ñ(=Ô(=ÀÒ(HÐ(Hð ×&Ò& vÑ.Ô.ˆGØð 0˜7Ô+¨sÒ2Ð2Ø—z’z &¨'Ñ2Ô2ð Ø—K’K Ñ'Ô'Ð'Ø�FØÔ#ð .ØÔ$×+Ò+Ñ-Ô-Ð-Ý#*Ô#;Ñ#=Ô#=×#HÒ#HÕI[ØDÐDÐDÐDÐDÐDñ$Fô $F�Ô à—h’h˜v wÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØˆFØ×Ò˜vÑ&Ô&ˆØð 	�c”l cÒ)Ð)Ø�^Ò#Ð#Ø”Y×)Ò)¨&Ô*:½3¹5¼5ÑAÔA�Ý�t‘9”9˜S’=�= §¢¨#¡¤ ØˆFØ�zŠz˜& #Ñ&Ô&ð 	Ø�KŠK˜ÑÔÐØˆFØ�>Ò!Ð! dÐ.>Ò&>Ð&>À5Ç9Â9ÈZÑCXÔCXÐ\dÒCdÐCdØ�KŠK˜ÑÔÐØˆFØŒ9˜Ò#Ð#¨¬¸&Ô:NÒ(NÐ(Nð ˆFØ�>Ò!Ð! dÐ.>Ò&>Ð&>À5Ç9Â9ÈZÑCXÔCXÐ\dÒCdÐCdØ�KŠK˜ÑÔÐÐÐØ�]Ò"Ñ" s¤yÐ4NÐ'NÑ'NØŒy˜KÒ'Ð'Ø'�”	Ø!'Ô!5�”ðØŸ	š	 'Ñ*Ô*�Ø Ÿ9š9 ZÑ0Ô0�Ý! %­Ñ-Ô-ð 'µ°U±´¸dÒ1BÐ1BÝ$™,œ,Ð&ÝÔ& u°tÐ<Ñ<Ô<�Ý˜‘N”N­#Ð-Ð-°¸A²°ÀS°ÍCÐPSÉHÌHÐWXÉL°Ý˜s™8œ8¥kÒ1Ð1°XÅÒ5KÐ5KÝ$™,œ,Ð&Ø˜cœlÒ*Ð*ð Ÿ(š( 6¨3Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø�FØ˜sœ|Ò+Ð+å$™,œ,Ð&Ý�s”w‘<”<¥# c¡(¤(Ñ*­YÒ6Ð6Ý$™,œ,Ð&Ø”—’˜sÑ#Ô#Ð#Ø�” Ñ!�”�øÝ¥¤Ð/ð ð ð Ý—’ÐVÕX`ÐadÑXeÔXeÑfÔfÐfØ—’˜FÑ#Ô#Ð#Ø��ðøøøð —(’(˜6 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�[Ò Ñ Ý�KŠKÐ_Ý  ™œ¥x°Ô0DÑ'EÔ'EÀsÄ|ÕUXÐY\ÔY`ÑUaÔUañcô cð cà—Y’YÐ5Ñ6Ô6ˆHØŸ	š	 -Ñ0Ô0ˆKØŒyð à”9Ð IÐIÐIØ!'�C”JØ%+Ô%9�C”NØŸ,š, v¨sÑ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ø”yÐ$;Ò;Ð;Ø"Ÿiši¨°Ð5GÐTWÔTb˜iÑcÔcÐcÐcÐcÐcÐcÐcÐcØ�ð Ð&­D°Ñ,=Ô,=ÅSÐ,HÐ,HÈKÕ[^Ð_bÔ_fÑ[gÔ[gÒLgÐLgÝ—’ÐxÝ$ S™MœM½$¸{Ñ:KÔ:KÍsÐ:RÐ:R¨;¨;ÐXaÕcfÐgjÔgnÑcoÔcoñqô qð qà—’˜FÑ#Ô#Ð#Ð#Ð#ØÐ%­4°©>¬>ÅÐ+DÐ+DÈÐRVÊÈØ¥+°Ñ"4°tÑ";Ò;Ð;Ý—’Ð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ÐNrsb   Å#F  Æ 
G4Æ
AG/Ç/G4ËAO Ì0BO Ï'O9Ï8O9ÝC>c áA>c ãAd%ä$d%ð2B.s" ó"At5ô4t5c           
   ƒ  ó¼   K  — |                       |¦  «        rD|                      |t          d|j        |j        |j        |j        ¬¦  «        ¦  «        ƒ d{V —† dS dS )z=Authoritative upload position for retry and reconnect resume.Ú	voice_ack)rì   r³   Únext_sequencerÁ   r¼   N)rÓ   rÒ   rí   r³   rÁ   r¼   ©r   rÈ   r  s      r   r:  zVoiceManager.ack¿  s™   è è € à�?Š?˜6Ñ"Ô"ð 	UØ—)’)˜F¥D¨kÀCÄLØ!œl°S´\ÈÌð%Tñ %Tô %Tñ Uô Uð Uð Uð Uð Uð Uð Uð Uð Uð Uð	Uð 	Ur   c              ƒ  óÈ   K  — 	 |                       |¦  «        r8|                      |t          d|j        |j        ¬¦  «        ¦  «        ƒ d {V —† d S d S # t
          $ r Y d S w xY w)NÚvoice_end_ack)rì   r³   r¼   )rÓ   rÒ   rí   r³   r¼   rü   rQ  s      r   r;  zVoiceManager.end_ackÅ  s�   è è € ð	Ø�Š˜vÑ&Ô&ð lØ—i’i ­°/ÈCÌLÐ`cÔ`iÐ(jÑ(jÔ(jÑkÔkÐkÐkÐkÐkÐkÐkÐkÐkÐkðlð løåð 	ð 	ð 	ØˆDˆDð	øøøs   „AA Á
A!Á A!c              ƒ  óz  K  — |j         dvs|                      ||¦  «        sd S |j        |j        fD ]}|r|                     ¦   «          Œd|_        d|_         	 |                      ||¦  «        ƒ d {V —† |                      ||¦  «        ƒ d {V —† |                      |¦  «        |u r;|j         dk    r2|  	                    |  
                    ||¦  «        ¦  «        |_        d S d S d S # |                      |¦  «        |u r9|j         dk    r.|  	                    |  
                    ||¦  «        ¦  «        |_        w xY w)Nr&  Tr  )r¼   rç   rÄ   rÅ   rö   rÇ   r;  rù   ré   rã   r    r†   )r   rÈ   r  rú   s       r   rC  zVoiceManager.endÍ  si  è è € ØŒ9Ð6Ð6Ð6¸d¿jºjÈÐQTÑ>UÔ>UÐ6ØˆFØ”y #¤,Ð/ð 	 ð 	 ˆFØð  Ø—’‘”�øØˆŒ	Ø"ˆŒ	ð	DØ—,’,˜v sÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø×"Ò" 6¨3Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð ×Ò Ñ'Ô'¨3Ð.Ð.°3´9ÀÒ3NÐ3NØŸ:š: d§o¢o°f¸cÑ&BÔ&BÑCÔC�”��ð /Ð.Ð3NÐ3Nøˆt×Ò Ñ'Ô'¨3Ð.Ð.°3´9ÀÒ3NÐ3NØŸ:š: d§o¢o°f¸cÑ&BÔ&BÑCÔC�”ÐCÐCÐCÐCs   Á8C( Ã(AD:c              ƒ  ó  K  — |                       |¦  «        |us|j        dk    rdS t                               dt	          |j        ¦  «        |j        t          |j        ¦  «        ¦  «         d|_	        |  
                    |d¬¦  «         dS )a†  Recording length cap reached without an end from the device.

        The cap exists to bound memory, not to declare the recording finished.
        The device owns capture timing, so transcribing here would transcribe a
        truncated upload whenever the link is slow. Suspend instead: the PCM and
        the acknowledged sequence survive so a real voice_end can still arrive.
        r»   NzF[VOICE_RX] event=cap voice_id=%s chunks=%d pcm_bytes=%d action=suspendzrecording-caprþ   )ré   r¼   r[   r\   r   r³   rÁ   rY   r­   rÄ   r  rQ  s      r   r  zVoiceManager.cap_reachedÝ  sŒ   è è € ð ×Ò˜FÑ#Ô#¨3Ð.Ð.°#´)¸{Ò2JÐ2JØˆFÝ�ŠÐ\Ý˜Sœ\Ñ*Ô*¨C¬L½#¸c¼g¹,¼,ñ	Hô 	Hð 	HàˆŒ	Ø�Š�V OˆÑ4Ô4Ð4Ð4Ð4r   c              ƒ  ó  K  — |                       |¦  «        |us	|j        dvrdS t                               dt	          |j        ¦  «        |j        t          |j        ¦  «        ¦  «         |  	                    |¦  «         dS )zEUpload window elapsed without an end; release memory, keep it honest.)r»   r  r  Nz:[VOICE_RX] event=expire voice_id=%s chunks=%d pcm_bytes=%d)
ré   r¼   r[   r\   r   r³   rÁ   rY   r­   rö   rQ  s      r   r  zVoiceManager.expireì  s€   è è € à×Ò˜FÑ#Ô#¨3Ð.Ð.°#´)ÐCmÐ2mÐ2mØˆFÝ�ŠÐPÝ˜Sœ\Ñ*Ô*¨C¬L½#¸c¼g¹,¼,ñ	Hô 	Hð 	Hà�Š�FÑÔÐÐÐ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          ¦   «         ‚|j        p|}|                      |¦  «        |usŠ|                      |j        ¦  «        |j        k    sg|                      |j        ¦  «        |j        k    sD|                      |¦  «        r|                      ||j        ¦  «        r|                       ¦   «         ru	 |j	                             ¦   «          t                               dt	          |j        ¦  «        t	          |j        ¦  «        t          j        ¦   «         |z
  d	z  |¦  «         d S |                     ¦   «         d
c|_!        |_"        d}	 |  #                    ||d|j!        ¬¦  «        ƒ d {V —† n# tH          $ r Y nw xY wn\# t          j%        $ r ‚ tH          $ r@ |j        p|}|                      |¦  «        |u 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>   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  Tr  r  r'   )'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½   rµ   rÕ   r¹   rÓ   r×   rº   rÔ   rÃ   r¼   rð   rü   re   r9  )r   rÈ   r  rh   r7   r…   r:   s          r   r    zVoiceManager.transcribeô  s=  è è € Ý”.Ñ"Ô"ˆØˆÝ�ŠÐ^Ý˜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Ð"Ø”ZÐ) 6ˆFà× Ò  Ñ(Ô(°Ð3Ð3Ø—’ s¤}Ñ5Ô5¸¼ÒCÐCØ×*Ò*¨3¬=Ñ9Ô9¸S¼^ÒKÐKð Ÿš¨Ñ/Ô/ð	 Lð 9=×8JÒ8JÈ6ÐSVÔS^Ñ8_Ô8_ð	 Lð
 ×,Ò,Ñ.Ô.ð Lð ð Œ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àˆGðØ—i’i ¨Ð-?ÈCÌN�iÑ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[Ð[øÝð ð ð Ø�ðøøøøøåÔ%ð 	ð 	ð 	ØÝð 	Eð 	Eð 	EØ”ZÐ) 6ˆFØ×Ò Ñ'Ô'¨3Ð.Ð.Ø—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øøøsW   Á2F7K8 Ê#K8 Ë$K' Ë&K8 Ë'
K4Ë1K8 Ë3K4Ë4K8 Ë7O Ë8AMÍO ÍMÍO ÏA4P<c              ƒ  óL  K  — t                                dt          |j        ¦  «        |j        ¦  «         d\  |_        |_        |j                             ¦   «          |j        |j	        fD ]}|r| 
                    ¦   «          Œ|                      ||d|¬¦  «        ƒ d {V —† d S )Nz"[VOICE_ERROR] voice_id=%s phase=%s)r  r;   r  )r  )r[   r\   r   r³   r¼   rÃ   r­   rø   rÄ   rÅ   rö   rð   )r   rÈ   r  r  rú   s        r   r9  zVoiceManager.fail!  s¨   è è € Ý�ŠÐ8½(À3Ä<Ñ:PÔ:PÐRUÔR[Ñ\Ô\Ð\Ø$0Ñ!ˆŒ	�3”>ØŒ�Š‰ŒˆØ”y #¤,Ð/ð 	 ð 	 ˆFØð  Ø—’‘”�øØ�iŠi˜  ]¸GˆiÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDr   c              ƒ  ó¨  K  — | j                              ¦   «         D ]I}|j        |j        fD ]}|r|                     ¦   «          Œ|j                             ¦   «          d|_        ŒJ| 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Ú   rÜ   rM   Úgather)r   r  rú   r†   s       r   ÚclosezVoiceManager.close*  sÖ   è è € Ø”=×'Ò'Ñ)Ô)ð 	 ð 	 ˆCØœ9 c¤lÐ3ð +ð +�ØÐ*˜6Ÿ=š=™?œ?˜?øØŒ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ö   rù   r  rú   r:  r;  rC  r  r  r    r9  r_  r   r   r   rÊ   rÊ   º   s  € € € € € ØmyÐmyð  LPð  `zð  `zð  KOð ð ð ð ðð ð ð`ð `ð `ð3ð 3ð 3ðað að að að
 (,°Eð 2ð 2ð 2ð 2ð 2ð ð ð ð )4ð !ð !ð !ð !ð !ð,xað xað xaðtUð Uð Uðð ð ðDð Dð Dð 5ð 5ð 5ðð ð ð+Fð +Fð +FðZEð Eð Eð	Bð 	Bð 	Bð 	Bð 	Br   rÊ   )*Ú__doc__Ú
__future__r   rM   r‡   rA  r£   Úloggingr“   r/  rK   r¥   Údataclassesr   r   Útypingr   rN   Úcontrol.modelsr   r¼   r	   rª   r7  r?  r=  r>  r8  rŠ   Ú	getLoggerr[   r   r   ÚRuntimeErrorr%   r-   rq   r   r    r°   r²   rÊ   r   r   r   ú<module>rh     s•  ðØ RÐ RØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à €€€à (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à€à€Ø˜!‰O˜kÑ)€	Ø€Ø€
ð Ð ð 3€ð 
ˆÔ	Ð?Ñ	@Ô	@€ð?ð ?ð ?ð
=ð =ð =ð =ð =˜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ñ .ô .ð .ð$ð ð ð"ð ð ð ð<ð <ð <ð <ð <ñ <ô <ñ „ð<ð*yBð yBð yBð yBð yBñ yBô yBð yBð yBð yBr   