
    /jA                   R   % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJr  S SKr S SK!r!S SK"J#r#  S S	K$J%r%J&r&J'r'J(r(  S S
K)J*r*  S SK+J,r,  S SK-J.r.  S SK/J0r0  S SK1J2r2J3r3  S SK4J5r5  S SK6J7r7  S SK8J9r9J:r:  SSK;J<r<  SSK=J>r>  SSK?J@r@  SSKAJBrB  SSKCJDrD  SSKEJFrFJGrG  SSKHJIrIJJrJ  SSKKJLrL  SSKMJNrN  SSKOJPrPJQrQJRrR  SSK;JSrS  SSKAJTrTJUrUJVrV  SS KWJXrXJYrY  S!rZ\(       a  S SK[r\\R                  \R                  4r_ " S" S#\`5      ra " S$ S%\`5      rb\S&   rcS'rd " S( S)\JR                  5      rf " S* S+\JR                  5      rh " S, S-5      riS.S//rj " S0 S15      rk " S2 S3\	R                  5      rmSUS4 jrn " S5 S6\	R                  5      rpSVS7 jrqS8S//rrSS9S:.         SWS; jjrs\\t\5-  S-  /S4   ru\S<S=S>S?S@.             SXSA jj5       rvSYSB jrw/ SCQrxSD\ySE'   SZSF jrzS[S\SG jjr{S]SH jr|      S^SI jr} S_       S`SJ jjr~SaSK jr " SL SM5      r\	GR                  SN.             SbSO jjrScSdSP jjr " SQ SR\t\GR                  5      rSeSS jrSfST jrg)g    )annotationsN)CallableIterator)contextmanager)time)	FrameType)TYPE_CHECKING	AnnotatedAnyLiteralColumns)ConsoleConsoleRenderableGroupRenderableType)Live)Segment)Spinner)Style)ColumnTable)Text)Theme)apirtc   )llm)CLIError)JobExecutorTypeloggerPlugin)aio	shortuuid)AgentSessionio)RunEvent)TranscriptSynchronizer)AgentServerServerEnvOptionWorkerOptions   )proto)JsonFormatter_merge_record_extra_silence_noisy_loggers)keyreadkey   c                      \ rS rSrSrg)_ToggleModeC    N__name__
__module____qualname____firstlineno____static_attributes__r9       G/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/cli/cli.pyr7   r7   C       r@   r7   c                      \ rS rSrSrg)_ExitCliG   r9   Nr:   r9   r@   rA   rD   rD   G   rB   r@   rD   )textaudio]  c                  T   ^  \ rS rSrSU 4S jjrS	S jrS
S jrSS jrSS jrSr	U =r
$ )ConsoleAudioInputm   c                n   > [         TU ]  SS9  Xl        [        R                  " 5       U l        SU l        g )Nr   labelT)super__init___loopr%   Chan	_audio_ch	_attachedselfloop	__class__s     rA   rP   ConsoleAudioInput.__init__n   s,    y)
3688:r@   c                ^    U R                   (       d  g U R                  R                  U5        g N)rT   rS   send_nowait)rV   frames     rA   
push_frameConsoleAudioInput.push_framet   s    ~~""5)r@   c                R   #    U R                   R                  5       I S h  vN $  N7fr[   )rS   	__anext__rV   s    rA   ra   ConsoleAudioInput.__anext__z   s     ^^--////s   '%'c                    SU l         g NTrT   rb   s    rA   on_attachedConsoleAudioInput.on_attached}   s	    r@   c                    SU l         g NFrf   rb   s    rA   on_detachedConsoleAudioInput.on_detached   s	    r@   )rT   rS   rQ   rW   asyncio.AbstractEventLoopreturnNoner]   rtc.AudioFramero   rp   )ro   rr   ro   rp   )r;   r<   r=   r>   rP   r^   ra   rg   rk   r?   __classcell__rX   s   @rA   rJ   rJ   m   s!    *0 r@   rJ   c                     ^  \ rS rSrSU 4S jjr\SS j5       r\SS j5       r\SS j5       rSS jr	SU 4S jjr
SU 4S jjrSS	 jrSU 4S
 jjrSU 4S jjrSS jrSS jrSS jrSrU =r$ )ConsoleAudioOutput   c           	       > [         TU ]  SS [        [        R                  " SS9S9  Xl        SU l        SU l        S U l        SU l	        [        5       U l        [        R                  " 5       U l        [        R                   " 5       U l        U R"                  R%                  5         [        R                   " 5       U l        S U l        SU l        SU l        g )Nr   T)pause)rN   next_in_chainsample_ratecapabilities        Fr   )rO   rP   SAMPLE_RATEr(   AudioOutputCapabilitiesrQ   _pushed_duration_capture_start_flush_task_playback_started_fired	bytearray_output_buf	threadingLock_audio_lockasyncioEvent_output_buf_emptyset_interrupted_ev
_paused_at_paused_duration_segment_idrU   s     rA   rP   ConsoleAudioOutput.__init__   s    #33$?	 	 	
 
'*%(6:-2$$;$>>+!(""$&}}(,'* r@   c                    U R                   $ r[   )r   rb   s    rA   
audio_lockConsoleAudioOutput.audio_lock       r@   c                    U R                   $ r[   )r   rb   s    rA   audio_bufferConsoleAudioOutput.audio_buffer   r   r@   c                    U R                   S L$ r[   )r   rb   s    rA   pausedConsoleAudioOutput.paused   s    d**r@   c                8    U R                   R                  5         g r[   )r   r   rb   s    rA   mark_output_empty$ConsoleAudioOutput.mark_output_empty   s    ""$r@   c                J  >#    [         TU ]  U5      I S h  vN   U R                  (       aI  U R                  R                  5       (       d*  [        R
                  " S5        U R                  I S h  vN   U R                  (       d  [        R                  " 5       U l	        U =R                  UR                  -  sl        U R                     U =R                  UR                  -  sl        U R                  R                  5         S S S 5        g  N N! , (       d  f       g = f7f)Nz8capture_frame called while previous flush is in progress)rO   capture_framer   doner"   errorr   r   	monotonicr   durationr   r   datar   clear)rV   r]   rX   s     rA   r    ConsoleAudioOutput.capture_frame   s     g#E***D$4$4$9$9$;$;LLST""""$$"&.."2D/

*""((*  	+ # s;   D#DAD#0D1AD#:D
D#D#
D D#c                X  > [         TU ]  5         U R                  (       a  U R                  (       aO  U R                  R	                  5       (       d0  [
        R                  " S5        U R                  R                  5         [        R                  " U R                  5       5      U l        g g )Nz0flush called while previous flush is in progress)rO   flushr   r   r   r"   r   cancelr   create_task_wait_for_playoutrV   rX   s    rA   r   ConsoleAudioOutput.flush   sr      (8(8(=(=(?(?OP  '')&2243I3I3KLD !r@   c                H   U R                      U R                  R                  5         U R                  R	                  5         U =R
                  S-  sl        SU l        S S S 5        U R                  (       a  U R                  R	                  5         g g ! , (       d  f       N;= f)Nr.   F)	r   r   r   r   r   r   r   r   r   rb   s    rA   clear_bufferConsoleAudioOutput.clear_buffer   sx    ""$""&&(!+0D(      $$& ! s   AB
B!c                r   > [         TU ]  5         U R                  c  [        R                  " 5       U l        g g r[   )rO   rz   r   r   r   r   s    rA   rz   ConsoleAudioOutput.pause   s)    ??""nn.DO #r@   c                   > [         TU ]  5         U R                  b=  U =R                  [        R
                  " 5       U R                  -
  -  sl        S U l        g g r[   )rO   resumer   r   r   r   r   s    rA   r   ConsoleAudioOutput.resume   sD    ??&!!T^^%5%GG!"DO 'r@   c                F  ^ #    SU 4S jjn[         R                  " T R                  R                  5       5      n[         R                  " U" 5       5      n [         R                  " X2/[         R                  S9I S h  vN   UR                  5       nUR                  5         UR                  5         T R                  b<  T =R                  [        R                  " 5       T R                  -
  -  sl        S T l        U(       aP  [        R                  " 5       T R                  -
  T R                  -
  n[        [        SU5      T R                  5      nOT R                  nT R                  XTS9  ST l        S T l        ST l        T R                  R!                  5         T R"                     T R$                  R'                  5         ST l        T =R*                  S-  sl        S S S 5        g  GNk! UR                  5         UR                  5         f = f! , (       d  f       g = f7f)	Nc                    >#    [        T R                  5      S:  a\  T R                  R                  5       I S h  vN   [        R
                  " S5      I S h  vN   [        T R                  5      S:  a  M[  g g  N? N#7f)Nr   )lenr   r   waitr   sleeprb   s   rA   _wait_buffered_audioBConsoleAudioOutput._wait_for_playout.<locals>._wait_buffered_audio   s^     d&&'!+,,11333mmA&&& d&&'!+3&s'   7A>A:A>A<A>8A><A>)return_whenr   )playback_positioninterruptedr~   Fr.   rs   )r   r   r   r   FIRST_COMPLETEDr   r   r   r   r   r   r   minmaxr   on_playback_finishedr   r   r   r   r   r   )rV   r   wait_for_interruptionwait_for_playoutr   played_durations   `     rA   r   $ConsoleAudioOutput._wait_for_playout   s    	'
 !( 3 3D4H4H4M4M4O P"../C/EF	+,,!9#33   0446K##%!((*??&!!T^^%5%GG!"DO"nn.1D1DDtG\G\\O!#a"94;P;PQO"33O!!O!] # #""$""&&(+0D(! 3 ##%!((*$ sI   AH!'G+ =G(>G+ DH!(7H	H!(G+ +"HH!
HH!c                   ^ ^^ T R                   (       a  gST l         [        5       mT R                  mT R                  R	                  UU U4S j5        g)z\Mark the playback as started if it hasn't been already. Must be called under ``audio_lock``.NTc                 $   > TR                  TT S9$ )N)
created_at
segment_id)_on_playback_started)r   rV   ts   rA   <lambda>AConsoleAudioOutput._maybe_mark_playback_started.<locals>.<lambda>  s    D--z-Rr@   )r   
_wall_timer   rQ   call_soon_threadsafe)rV   r   r   s   `@@rA   _maybe_mark_playback_started/ConsoleAudioOutput._maybe_mark_playback_started  s>    '''+$L%%


''R	
r@   c               D    U R                   U:w  a  g U R                  US9  g )N)r   )r   on_playback_started)rV   r   r   s      rA   r   'ConsoleAudioOutput._on_playback_started  s$    z)  J 7r@   )r   r   r   r   rQ   r   r   r   r   r   r   r   rm   )ro   zthreading.Lock)ro   r   ro   boolrs   rq   )r   floatr   intro   rp   )r;   r<   r=   r>   rP   propertyr   r   r   r   r   r   r   rz   r   r   r   r   r?   rt   ru   s   @rA   rw   rw      sx    4         + +%+M	'/#%"N	
8 8r@   rw   c                  T   \ rS rSr% SrS\S'   Sr\S$S j5       rS%S jr	S&S jr
\S'S	 j5       r\R                  S(S
 j5       r\S'S j5       r\R                  S(S j5       r\S)S j5       r\S'S j5       r\S*S j5       r\S+S j5       r\S,S j5       rS%S jr\S-S j5       r\S-S j5       r\S.S j5       r\R                  S/S j5       r            S0S jrSSS.       S1S jjrSSSS.         S2S jjrSS.S3S jjrSS.S3S jjr      S4S  jrS5S! jrS6S" jrS#r g)7AgentsConsolei  NAgentsConsole | None	_instancezconsole-recordingsc                L    U R                   c  U " 5       U l         U R                   $ r[   )r   )clss    rA   get_instanceAgentsConsole.get_instance  s    == ECM}}r@   c                   SSSS[         R                  " 5       [        SS9[        SS9[        SS9[        S	S9[        S
S9[        SS9[        SSS9[        SSSS9S.nSU l        [        [	        U5      S9U l        [        R                  " SSSSS9U l        SU l	        S U l
        S U l        SU l        S U l        S U l        [        R                   " 5       U l        [$        R&                  " S[$        R(                  S9U l        SU l        [        R                   " 5       U l        SU l        [        R2                  " 5       U l        SU l        SU l        S U l        S U l        [?        5       U l         [C        U 5      U l"        [F        RH                  " U RJ                  S[L        RL                  RO                  5       RQ                  S5       35      U l)        g )Nzblack on #1fd5f9z#8f83ffred#1fd5f9T)dimcyan)colorgreenyellowbluer   bold)r   r   reverse)tagrN   r   zlk-fglog.name	log.extrazlogging.level.notsetzlogging.level.debugzlogging.level.infozlogging.level.warningzlogging.level.devzlogging.level.errorzlogging.level.critical   )theme)echo_cancellationnoise_suppressionhigh_pass_filterauto_gain_controlr~      dtyperG   Fzsession-z%m-%d-%H%M%S)*r   null	tag_widthr   r   consoler   AudioProcessingModule_apm_input_delay_input_name_input_stream_output_delay_output_name_output_streamr   r   _input_locknpzerosfloat32_input_levels_console_mode_lock_io_acquiredr   _io_acquired_event_enabled_record_last_metrics_text_last_user_metricsTextModeLogFilter_text_mode_log_filterRichLoggingHandler_log_handlerpathlibPath_console_directorydatetimenowstrftime_session_directory)rV   r   s     rA   rP   AgentsConsole.__init__   s   %

4$)dO#(v#6"'g"6%*%:!&V!4#(u4#@&+%dD&Q)
 U5\2--""!"	
	  '+48 (,6:$>>+XXb

;*1^^%
!"+//"3/3<@%6%8".t4"),,##x((,,.77GHI#
r@   c                 ^ ^ T R                      T R                  (       a  [        S5      e[        R                  " 5       U:w  a  [        S5      eST l        UT l        [        R                  " 5       T l        [        U5      T l
        [        U5      T l        [        T R                  S S9T l        T R                  R!                  5         TT l        S S S 5        T(       a  SSKJnJn  TR+                  S5      SU 4S jj5       nTR+                  S	5      SU U4S
 jj5       nT R-                  TT R.                  T R                  T R                  R0                  T R                  R2                  5        g g ! , (       d  f       N= f)Nz5the ConsoleIO was already acquired by another sessionzFthe ConsoleIO must be acquired in the same asyncio loop as the sessionT)next_in_chain_audionext_in_chain_textr   )AgentStateChangedEventConversationItemAddedEventconversation_item_addedc                h  > [        U R                  [        R                  5      (       d  g U R                  R                  S:X  a  U R                  R
                  Tl        g U R                  R                  S:X  a7  [        TR                  U R                  R
                  5      Tl        S Tl        g g )Nuser	assistant)	
isinstanceitemr   ChatMessagerolemetricsr  _format_turn_metricsr  )eventrV   s    rA   _on_conversation_item_added=AgentsConsole.acquire_io.<locals>._on_conversation_item_addedu  s~    !%**coo>>::??f,.3jj.@.@D+ZZ__3.B//1C1C/D+ /3D+	 4r@   agent_state_changedc                   > U R                   S:X  a7  TR                  nU(       a#  [        TR                  U5      Tl        S Tl        g g U R                   S:X  a  S Tl        g g )Nspeakingthinking)	new_state_early_assistant_metricsr0  r  r  )r1  earlyrV   sessions     rA   _on_agent_state_changed9AgentsConsole.acquire_io.<locals>._on_agent_state_changed  s`    ??j0#<<E2F 33U3/ <@8	 
 __
2.2D+ 3r@   )r1  r&  ro   rp   )r1  r%  ro   rp   )r  r  RuntimeErrorr   get_running_loop_io_loopcontextvarscopy_context_io_contextrJ   _io_audio_inputrw   _io_audio_outputr*   _io_transcription_syncr  r   _io_sessionvoice.eventsr%  r&  on_update_sess_ioconsole_modeaudio_outputtext_output)rV   rW   r;  r%  r&  r2  r<  s   ` `    rA   
acquire_ioAgentsConsole.acquire_ioY  sL   ZZ  "#Z[['')T1"\  !%D DM*779D#4T#:D $6t$<D!*@$($9$9#'+D' ##'')&D' * 
 ZZ12
3 3
3 ZZ-.	3 /	3   !!$$++88++77? + Zs   CE55
Fc                    U R                   $ r[   r  rb   s    rA   enabledAgentsConsole.enabled  s    }}r@   c                    Xl         g r[   rQ  rV   vals     rA   rR  rS    s    r@   c                    U R                   $ r[   r  rb   s    rA   recordAgentsConsole.record  s    ||r@   c                    Xl         g r[   rX  rU  s     rA   rY  rZ    s    r@   c                    U R                   $ r[   )r   rb   s    rA   session_directoryAgentsConsole.session_directory  s    &&&r@   c                h    U R                      U R                  sS S S 5        $ ! , (       d  f       g = fr[   )r  r  rb   s    rA   io_acquiredAgentsConsole.io_acquired  s    ZZ$$ ZZs   #
1c                R    U R                   (       d  [        S5      eU R                  $ NzAgentsConsole is not acquired)r  r>  rG  rb   s    rA   
io_sessionAgentsConsole.io_session  #      >??r@   c                R    U R                   (       d  [        S5      eU R                  $ rc  )r  r>  r@  rb   s    rA   io_loopAgentsConsole.io_loop  s!      >??}}r@   c                R    U R                   (       d  [        S5      eU R                  $ rc  )r  r>  rC  rb   s    rA   
io_contextAgentsConsole.io_context  rf  r@   c                8    U R                   R                  5         g r[   )r  r   rb   s    rA   wait_for_io_acquisition%AgentsConsole.wait_for_io_acquisition  s    $$&r@   c                    U R                   $ r[   )r  rb   s    rA   
input_nameAgentsConsole.input_name  r   r@   c                    U R                   $ r[   )r  rb   s    rA   output_nameAgentsConsole.output_name  s       r@   c                    U R                   $ r[   )r  rb   s    rA   rK  AgentsConsole.console_mode  s    !!!r@   c           	     ^   U R                      Xl        U R                  (       d
   S S S 5        g U R                  R	                  U R
                  U R                  UU R                  U R                  R                  U R                  R                  5        S S S 5        g ! , (       d  f       g = fr[   )r  r  r  rh  r   rJ  rd  rD  rF  rL  rM  )rV   modes     rA   rK  rw    sz    ZZ!%$$	 Z LL--$$$$++88++77 ZZs   BA&B
B,c                   [         R                  " 5       U R                  :w  a  [        S5      eU R                     U R
                  (       d
   S S S 5        g U R                  U:w  d  U R                  U:w  a
   S S S 5        g US:X  aY  S UR                  l	        S UR                  l	        S UR                  l        U R                  R                  U R                  5        OUX1R                  l	        XAR                  l	        XQR                  l        U R                  R                  U R                  5        S S S 5        g ! , (       d  f       g = f)Nz/_update_sess_io must be executed on the io_looprF   )r   r?  rh  r>  r  r  rG  r  inputrG   outputtranscriptionr  	addFilterr  removeFilter)rV   sessry  audio_inputrL  rM  s         rA   rJ  AgentsConsole._update_sess_io  s     ##%5PQQZZ$$ Z 4'4+=+=+E Z v~#'

 $(!,0)!!++D,F,FG#.

 $0!,7)!!..t/I/IJ! ZZs   D>!D>B4D>>
E r   	tag_stylec               V    U R                   R                  U R                  XUS95        g )Nr  )r   print_render_tag)rV   childr   r  s       rA   r  AgentsConsole.print  s&     	4++Ei+PQr@   )r   r   r  c                  U(       a  SU S3nU=(       d    U R                   n[        R                  " [        US-   SS9[        SSS9SSSS	9nU[	        U5      -
  n[        S
U5      nU=(       d    U R                  R                  S5      n[        X'S9/n[        SU-  5      /UQn	UR                  [        U	6 [        U5      5        U$ )N r   Twidthno_wrapFfoldr  overflowr   r   r   r   paddingcollapse_paddingpad_edger   r   style)r   r   gridr   r   r   r   	get_styler   add_rowr   )
rV   r  r   r   r  tableleft_paddingr  tag_segmentslefts
             rA   r  AgentsConsole._render_tag  s     cU!*C/	

Q5562 !
 !3s8+1l+:T\\33E:12l*+;l;eTlE%L1r@   devicec          	        U R                   (       a(  U R                   R                  5         S =U l         U l        U(       d  g SS KnUc  UR                  R
                  u  p$ UR                  " USS9n[        U[        5      (       d   S5       eUR                  SS5      U l        UR                  " U R                  SS	US
SS9U l         U R                   R                  5         g ! [         a    [        S5      S ef = f)Nr   r{  kindUnable to access the microphone. 
Please ensure a microphone is connected and recognized by your system. To see available input devices, run: lk-agents console --list-devicesdevice_info is dictnamezUnnamed microphoneint16r.   rH   `	  callbackr   channelsr  
samplerate	blocksize)r  closer  sounddevicedefaultr  query_devices	Exceptionr   r+  dictgetInputStream_sd_input_callbackstartrV   enabler  sd_device_infos         rA   set_microphone_enabled$AgentsConsole.set_microphone_enabled$  s    $$&488D!1 >

))IF	**6@K +t,,C.CC,&??63GH^^,,
 	  "%  	X 		   "C% %C<c          	        U R                   (       a(  U R                   R                  5         S =U l         U l        U(       d  g SS KnUc  UR                  R
                  u  pB UR                  " USS9n[        U[        5      (       d   S5       eUR                  SS5      U l        UR                  " U R                  SS	US
SS9U l         U R                   R                  5         g ! [         a    [        S5      S ef = f)Nr   r|  r  Unable to access the speaker. 
Please ensure a speaker is connected and recognized by your system. To see available output devices, run: lk-agents console --list-devicesr  r  zUnnamed speakerr  r.   rH   r  r  )r  r  r  r  r  r  r  r  r   r+  r  r  OutputStream_sd_output_callbackr  r  s         rA   set_speaker_enabled!AgentsConsole.set_speaker_enabledG  s    %%'6::D$"3 >

))IA	**6AK +t,,C.CC,'OOF4EF oo--
 	!!#%  	Y 		r  c                   SS K n U(       a  UR                  " USS9   U(       a  UR                  " USS9  g g ! [         a    [        S5      S ef = f! [         a    [        S5      S ef = f)Nr   r{  r  r  r|  r  )r  r  r  r   )rV   input_deviceoutput_devicer  s       rA   _validate_device_or_raise'AgentsConsole._validate_device_or_raisej  s     	!	  G<	  X>   	X 		  	Y 		s   9 A AA*c           	     
   UR                   UR                  -
  U l        U R                  U R                  -   n U R                  R                  [        US-  5      5        SnUS S 2S4   R                  [        R                  5      S-  nUR                  nU[        R                  " U5      R                  [        R                  5      -  n[        R                  R                  XxS9n	[        R                  " U	5      R                  [        R                  5      SU-  -  n
U
S==   S-  ss'   U
S==   S	S[!        US
-  S:H  5      -  -
  -  ss'   [        R                  R#                  US	U-  S9n[%        U R&                  5      n[        R(                  " SUS-  S-  US-   5      R                  [        R                  5      n[        R*                  " [        R,                  " X5      S-
  SUS-
  5      nX-  R                  [        R                  5      n[        R.                  " XUS9n[        R0                  " [        R.                  " XS9S5      nUU-  nS[        R2                  " US-   5      -  nSu  nn[        R*                  " UU-
  UU-
  -  R                  [        R                  5      SS	5      n[        R0                  " US-  S-
  S5      n[!        UR5                  5       5      nU[        R*                  " SUS-   -  SS5      -  n[        R*                  " USS	5      n[!        [        R6                  " X-  * S-  5      5      nU R8                     U R&                  R                  [        R                  5      n[        R0                  " UUU-  5      U l        S S S 5        U R:                  (       d  g SnUU-  n[=        U5       GHL  nUU-  nUU-   nUUU n[>        R@                  " URC                  5       USSS9n U R                  RE                  U 5        [        RF                  " U RH                  [        RJ                  S9n![        RL                  " [        RN                  " U!R                  [        R                  5      S
-  5      5      n"[        RP                  " [        RJ                  5      R4                  n#S[        R2                  " U"U#-  S-   5      -  U l)        U RT                  RW                  U RX                  RZ                  U 5        GMO     g ! [         a     GNf = f! , (       d  f       GN= f)N  rH   r   g      @)ng       @g      ?      ?r   )dg      4@gQ?r.   )weights	minlength)r  g      $@g-q=)g     Qir~   g      ?g{Gz?gffffff?gư>g      @皙?   r   samples_per_channelr|   num_channelsr   ).currentTimeinputBufferAdcTimer  r  r  set_stream_delay_msr   r>  astyper
  r  sizehanningfftrfftabsr   rfftfreqr   r  	geomspaceclipdigitizebincountmaximumlog10r   expr	  r  ranger   
AudioFrametobytesprocess_stream
frombufferr   r  sqrtmeaniinfo	_micro_dbr@  r   rD  r^   )$rV   indataframe_countr   r  total_delaysrxr  Xmagfreqsnbedgesbpsumpcntspmeandbfloor_dbhot_dblevpeakdecayprevFRAME_SAMPLES
num_framesir  endcapture_chunkr]   in_data_aecrms	max_int16s$                                       rA   r   AgentsConsole._sd_input_callback  s    ,,t/F/FF((4+<+<<	II))#kD.@*AB 1a4L

+g5FF	RZZ]!!"**--FFKKKffQirzz*cAg6A#B3uQUaZ0000S2X.##$TBH#4b1f=DDRZZPGGBKK-11b1f=Yrzz*{{126zz"++a6:tBHHUU]++%&ggX&8*;<DDRZZPRUWZ[jjdT)3/SWWYrwwttd{+S#66ggc3$bffqvY_-.%%,,RZZ8D!#C!>D     M1
z"A%E-'C"5-MNN"**,$1!	E II$$U+--

"((CK''"''+"4"4RZZ"@A"EFGC*..I!BHHS9_t-C$DDDNMM..t/C/C/N/NPUV% #U  		@ s   'T" A	T3"
T0/T03
Uc                   U R                   (       d  SUS S & g UR                  UR                  -
  U l        SnU R                  R
                     U R                  R                  (       a  SUS S & GOwUS-  n[        U R                  R                  5      U:  a  [        U R                  R                  5      nUS:  a  U R                  R                  5         [        R                  " U R                  R                  [        R                  US-  S9US US-  2S4'   SXS-  S 2S4'   U R                  R                  S U2	 U R                  R                  U R                  R                  5        OwU R                  R                  5         U R                  R                  S U n[        R                  " U[        R                  US9US S 2S4'   U R                  R                  S U2	 S S S 5        X%-  n	[!        U	5       HS  n
X-  nX-   nXU2S4   n["        R$                  " UR'                  5       USSS9nU R(                  R+                  U5        MU     g ! , (       d  f       Nu= f)Nr   r  r   )r   countrH   r.   r  )r`  outputBufferDacTimer  r  rE  r   r   r   r   r   r
  r  r  rh  r   r   r  r   r  r  r  process_reverse_stream)rV   outdataframesr   r  r  bytes_neededavailable_byteschunk
num_chunksr  r  r  render_chunkrender_frame_for_aecs                  rA   r  !AgentsConsole._sd_output_callback  s   GAJ!558H8HH""--$$++
%zt,,99:\I&)$*?*?*L*L&MO&*--JJL9;--:: hh-2:G2o22A56
 :;Gq02A56--::;KO;KLLL55d6K6K6]6]^))FFH 11>>}ME$&MM%rxxv$VGAqDM--::=L=I+ .. ,
z"A%E'C"9a<0L#&>>!))+$1!	$  II,,-AB #1 .-s   FI
I%)r  r  r  r  r  r	  r  r  r  r  rD  rE  rC  r@  rG  rF  r  r  r  r  r  r  r  r  r  r   r  r   r   )ro   r   rs   )rW   rn   r;  r'   ro   rp   r   )rV  r   ro   rp   )ro   zpathlib.Path)ro   r'   )ro   rn   )ro   zcontextvars.Context)ro   
str | None)ro   ConsoleMode)ry  r"  ro   rp   )r  r'   ry  r"  r  rJ   rL  zio.AudioOutputrM  zio.TextOutputro   rp   )r  r   r   strr  Style | Nonero   rp   )
r  r   r   r#  r   z
int | Noner  r$  ro   r   )r  r   r  zint | str | Nonero   rp   )r  r!  r  r!  ro   rp   )
r  
np.ndarrayr  r   r   r   r  r   ro   rp   )
r  r%  r  r   r   r   r  r   ro   rp   )!r;   r<   r=   r>   r   __annotations__r  classmethodr   rP   rN  r   rR  setterrY  r]  r`  rd  rh  rk  rn  rq  rt  rK  rJ  r  r  r  r  r  r  r  r?   r9   r@   rA   r   r     sE   &*I#*- 
7
r;z   ^^    ]]  ' ' % %          '     ! ! " "   KK K '	K
 %K #K 
K< 46QUR#R-0RBNR	R  $"& 	
    
< RV !#F OS !$F):D	2BWH*Cr@   r   )Ctrl+Tz	text mode)zCtrl+Cexitc                  :    \ rS rSrSS.S	S jjrS
S jrSS jrSrg)FrequencyVisualizeri  zUnlabeled microphonerM   c               <    X l         / SQU l        Xl        SU l        g )N)u   ▁u   ▂u   ▃u   ▄u   ▅u   ▆u   ▇   █F)rN   height_charscshow_shortcuts)rV   agents_consolerN   s      rA   rP   FrequencyVisualizer.__init__  s    
T#r@   c                .   U R                   R                     [        U R                   R                  5      nU Vs/ s H.  n[	        S[        S[        [        US-  5      5      5      5      PM0     snU l        S S S 5        g s  snf ! , (       d  f       g = f)Nr      )	r0  r	  listr  r   r   r   round_levels_idx)rV   lvvs      rA   updateFrequencyVisualizer.update  si    VVdff**+BKMN2aAs1c%A,.?'@ A2ND  N  s   $B5B0BB
Bc           
     H  ^  [         R                  " SSS9nUR                  5         ST R                   S3nSR	                  U 4S jT R
                   5       5      nT R                  R                  R                  S5      n[        X$S	9nT R                  R                  n[        U5      [        U5      -   n[         R                  " [        [        U5      SS
9[        SSS9SSSS9nUR                  [        U5      [        U5      5        UR                  U5        Ub  [        UR                  5      n	T R                  R                  R                   n
Xy-   S-   U
::  a  [         R                  " SSS9nUR                  5         [         R                  " [        [        U5      SS
9[        SSS9[        SSS9SSSSS9nUR                  [        U5      [        U5      U5        UR                  U5        O(UR#                  5       nSUl        UR                  U5        UR                  [        S5      5        T R&                  (       a?  [(         H3  u  pUR                  [        R*                  " SUS4SU 3S45      5        M5     U$ UR                  [        SSS	95        U$ )Nr   T)r  expand     r  c              3  H   >#    U  H  nS TR                   U    3v   M     g7f)r  N)r/  ).0r  rV   s     rA   	<genexpr>/FrequencyVisualizer.__rich__.<locals>.<genexpr>  s&     K:JQ$++A./0:Js   "rN   r  r  r  r  r  Fr     right)r  justify)r  r  r  r>  )r?  r  dim boldr   z   ? for shortcuts)r   r  
add_columnrN   joinr8  r0  r   r  r   r  r   r   r  r   plainr  copyrG  r1  AUDIO_SHORTCUTSassemble)rV   r  rN   barr  	label_segmetrics_text
left_widthinner_tablemetrics_widthconsole_width
wide_tableright_metricsshortcut_keydescs   `              rA   __rich__FrequencyVisualizer.__rich__  s9   

1T2djj\$ggK$:J:JKK((1,	vv00Z#c(*
jjUT24&1 !
 	E),eCj9k"# 2 23M FFNN00M)A->

1T:  ""ZZUT:4&949(%)"
 ""5#3U3ZNj) !- 1 1 3(/%m,d2h&5"MM+j/IbQUPVKY^K_` '6  MM$35ABr@   )r8  r0  r/  rN   r1  N)r2  r   rN   r#  rs   )ro   r   )r;   r<   r=   r>   rP   r;  rZ  r?   r9   r@   rA   r,  r,    s    F\ $O
9r@   r,  c                  @   ^  \ rS rSrSU 4S jjrSS jrSS jrSrU =r$ )r  iB  c                <   > [         TU ]  5         Xl        S U l        g r[   )rO   rP   r0  
_last_time)rV   r2  rX   s     rA   rP   RichLoggingHandler.__init__C  s     (,r@   c                	   S"S jn[        UR                  =(       a    UR                  S:g  =(       d    UR                  5      nU(       aF  UR                  UR                  pTS Ul        S Ul         U R                  U5      nXEsUl        Ul        OU R                  U5      nSn[        R
                  " SS9nUR                  SS9  UR                  SS	S
S9  UR                  SUS
SS9  UR                  SSS9  UR                  SS
S9  / n	U R                  c  S OU R                  R                  n
[        R                  R                  UR                  5      nU=(       d$    U R                  R                  R                  5       nU
(       a  [        UR!                  U
5      5      O[        UR!                  S5      S S 5      nXR"                  :X  a3  UR$                  nU	R'                  [        S[)        U5      -  5      5        OU	R'                  U5        Xl        [        R*                  " UR,                  R/                  S	5      SUR,                  R1                  5        35      nU	R'                  U5        U" UR2                  U5      n[        U5      nU	R'                  U5        [        U5      nU	R'                  U5        U R                  R                  R4                  nSn[7        UU-
  S-
  S5      nUR8                  nS	n[;        UR8                  S5      nUR8                  n0 n[=        UU5        SnSnU(       a;  [>        R@                  " U[B        RD                  SS9n[        U5      nUR8                  nS nUU-   U-   U-   U-   U-   n[        U5      =(       a    UU:*  nU(       a  U	R'                  [        USS95        OU	R'                  [        S5      5        URF                  " U	6   U R                  RI                  UUS!9n U R                  R                  RK                  U5        U(       aU  U(       dN  UU-   S-   U-   S-   U-   S-   n SU S-   -  n![        U!U-   SS9n"U R                  R                  RK                  U"5        U(       a  U RM                  U5        g g ! XEsUl        Ul        f = f! [N         a    U RQ                  U5         g f = f)#Nc                r    [        U 5      U::  a  U $ US::  a  SS U $ US-
  nUS-  nX#-
  nU S U S-   X* S  -   $ )Nr.   u   …r   )r   )s	max_widthvisibler  rF  s        rA   middle_truncate0RichLoggingHandler.emit.<locals>.middle_truncateK  s\    1v"A~Zi((!mGa<DNEUd8e#aj00r@   )NNN   r   r.   r  zlog.timer  z	log.level   T)r  r  r  r   ellipsis)r  r  r  r  r.   zlog.message)ratior  r   )r  r  z%H:%M:%S.%fr  zlogging.level.r            r  r   F)r   ensure_asciirE  )r   )rb  r#  rc  r   ro   r#  ))r   exc_infoexc_textformatr   r  rI  	formatterdatefmtr  fromtimestampcreatedr0  r   get_datetimer   r  r^  rK  appendr   styled	levelnameljustlowerr  r  r   cell_lenr   r1   jsondumpsr0   JsonEncoderr  r  r  _print_plain_tracebackr  handleError)#rV   rY  re  has_excrr  rs  messageMAX_NAME_WIDTHr|  rowtime_formatlog_timelog_time_displaytime_str
level_textlogger_name	name_textmsg_textrU  r   available_widthtime_len	level_lenname_lenmsg_lenextra	extra_str	extra_len
extra_textspaces_between_columnstotal_len_with_extrainline_extraindent_widthindent
extra_lines#                                      rA   emitRichLoggingHandler.emitJ  s?   	1 __F4F!FZ6??
 !'&//h"FO"FOF++f-3;0kk&)GF+
+1dC
.$Ycd7T:$&"nn4d$..:P:P$$226>>B<tvv~~::<  "";/0h''6s;< 	 .'--HJJtC#h-/01JJ'(.O[[""1%V--33567

 	

:%fkk>B%	

9=

8,,	mi7!;R@#,,	y))2.## "FE*		

5m.G.GV[\IiJ"++I!"y 8+g5	ADZZ 	 IR+??+RJJtI[9:JJtCy!##Fi#@	%FFNN  ((83a7)CaG(RUVVq 01!&9"4KH
$$Z0++F3 s 4<0x  	%V$	%s   1R' BR: 'R7:SSc                    UR                   (       a  UR                   nO5UR                  u  p4nSR                  [        R                  " X4U5      5      n[        USS9nU R                  R                  R                  USS9  U R                  R                  R                  5         g ! [         a    U R                  U5         g f = f)Nr  r   r  )r  )rs  rr  rJ  	tracebackformat_exceptionr   r0  r   r  r  r  )rV   rY  tb_strexc_type	exc_valueexc_tbtb_texts          rA   r  )RichLoggingHandler._print_plain_traceback  s    	%.4oo+V!;!;HQW!XY6/GFFNN  b 1FFNN  " 	%V$	%s   B%B( (CC)r^  r0  )r2  r   )rY  logging.LogRecordro   rp   )	r;   r<   r=   r>   rP   r  r  r?   rt   ru   s   @rA   r  r  B  s    ,s%j% %r@   r  c                t  ^ [         R                  " [        S5        [         R                  " 5       nU (       a  UR	                  U R
                  5        ON[         R                  " [        R                  5      nUR	                  U5        UR                  [        5       5        UR                  T5        [        5         SSKJn  UR                  [         R                   :X  a  UR                  " T5        SSKJn  SU4S jjnUR&                   H  nU" U5        M     UR(                  R+                  SU5        g )NTRACEr   r!   r#   c                   > U R                   bE  U R                   R                  [        R                  :X  a  U R                   R	                  T5        g g g r[   )r"   levelloggingNOTSETsetLevel)plugin	log_levels    rA   _configure_plugin_logger3_configure_logger.<locals>._configure_plugin_logger  s=    ==$)<)<)NMM""9- *O$r@   plugin_registered)r  r$   ro   rp   )r  addLevelNameTRACE_LOG_LEVEL	getLogger
addHandlerr  StreamHandlersysstdoutsetFormatterr0   r  r2   logr"   r  r  r  r$   registered_pluginsemitterrI  )r0  r  roothandlerr"   r$   r  r  s    `      rA   _configure_loggerr    s    '2D'''

3 ]_-MM)||w~~%	". ++ ( , NN)+CDr@   c                      \ rS rSr\R
                  " S\R                  5      \R
                  " S\R                  5      /rSS jrSr	g)r  i  z\bexecuting tool\bz\btools execution completed\bc                   ^ UR                   S:w  a  gUR                  5       m[        U4S jU R                   5       5      (       + $ )Nzlivekit.agentsTc              3  D   >#    U  H  oR                  T5      v   M     g 7fr[   )search)rB  rxmsgs     rA   rC  +TextModeLogFilter.filter.<locals>.<genexpr>  s     ?"yy~~s    )r  
getMessageany	_patterns)rV   rY  r  s     @rA   filterTextModeLogFilter.filter  s9    ;;**!?????r@   r9   N)rY  r  ro   r   )
r;   r<   r=   r>   recompile
IGNORECASEr  r  r?   r9   r@   rA   r  r    s7     	

("--8


3R]]CI
@r@   r  c            	     t   SS K n [        5       nU R                  " 5       nU R                  R                  u  p4[        SSS S9nUR                  SSSS9  UR                  S	S
SS9  UR                  SS
S9  UR                  SSS9  [        U5       H  u  pgUS   nUS   S:  n	US   S:  n
U	(       a5  Xc:X  a
  [        SSS9OSnUR                  [        U5      [        SSS9X5        U
(       d  M_  Xd:X  a
  [        SSS9OSnUR                  [        U5      [        SSS9X5        M     UR                  U5        g )Nr   TF)show_header
show_linesboxIDr   rF  )r  rG  Typer   centerNamer  Default)rG  r  max_input_channelsmax_output_channelsyesz#23de6br  Inputz#6c7a89Output)r  r   r  r  r  r   rI  	enumerater   r  r#  r  )r  r   devicesdefault_inputdefault_outputr  idxdevr  	has_input
has_outputr  s               rA   _print_audio_devicesr    s8   iG G$&JJ$5$5!Mdu$?E	TG<	V68<	V6*	Y1g&6{,-1	./!3
696Jd5	2PRGMM#c(D	$BDR:696Kd5	2QSGMM#c(D$CTS ' MM%r@   )r)  z
audio moder  )key_read_cbplaceholderc                 ^^^^	^
 / mUR                   R                  m
SmSm	S
UUUU	U
4S jjn[        U" 5       USSS9 n [        5       nU(       a  U" U5        U[        R
                  :X  a  OUS:X  a&  T(       d  T	(       + m	UR                  U" 5       5        M[  U[        R                  :X  a!  T	(       a  Sm	UR                  U" 5       5        M  U[        R                  :X  a/  T(       a&  TR                  5         UR                  U" 5       5        M  [        U5      S:X  a<  UR                  5       (       a'  TR                  U5        UR                  U" 5       5        GM   S S S 5        S	R                  T5      $ ! , (       d  f       N= f)Nu   ─Fc            	     d  > [         R                  " SS9n U R                  5         U R                  [	        TT-  SS95        SR                  T5      nU(       a*  U R                  [        R                  " SUS4S5      5        O*U R                  [        R                  " SSSTS	45      5        U R                  [	        TT-  SS95        T(       a?  [         H3  u  p#U R                  [        R                  " S
US4SU 3S45      5        M5     U $ T(       d  U R                  [	        SSS95        U $ )Nr   ri  r   r  r  )u   ❯ r   )r.  white)r  r  z
dim italic)r@  r  rH  r@  z  ? for shortcuts)r   r  rI  r  r   rJ  rN  TEXT_SHORTCUTS)	r  
input_textrX  rY  buffer	line_charr  r1  r  s	       rA   render_promptprompt.<locals>.render_prompt.  s
   

1%d9u,E:;WWV_
MM$--(;j"=MObcdMM')<i+WcId 	d9u,E:;&4"MM*|Z.HRPTv;X]J^_ '5  MM$2%@Ar@   T   )r   	transientrefresh_per_second?r.   r  )ro   r   )r  r  r   r4   r3   ENTERr;  ESC	BACKSPACEpopr   isprintablerz  rJ  )r  r   r  r  r  livechr  r  r1  r  s      `   @@@@rA   promptr  "  s.    FLLEIN 8 
mow$SU	VZ^BBSYY Sy%3!3MO,SWW}!%*NKK0S]]"JJLKK02w!| 0 0b!MO,;  
W@ 776?A 
W	Vs   D"E::
Flinez	bold blue   T)spinnerspinner_styler  r  c             #    ^^^	^
#    [        U[        5      (       a  UO[        [        U5      5      m	[        X#S9m
SU	U
4S jjm[	        T" 5       U UUS9 mSSUUU	4S jjjnUv   S S S 5        g ! , (       d  f       g = f7f)Nr  c                     > [        T T/SSSS9$ )NFrh  )r>  equalr  r   )r  spins   rA   _renderlive_status.<locals>._render}  s    T{5vNNr@   r   r  r  c                   > U bB  [        U [        5      (       a  U O[        [        U 5      5      mTR                  T" 5       5        g g r[   )r+  r   r#  r;  )new_textr  r   r  s    rA   r;  live_status.<locals>.update  s8    #",Xt"<"<h$s8}BUGI& $r@   )ro   r   r[   )r  zstr | Text | Nonero   rp   )r+  r   r#  r   r   )r   rF   r  r  r  r  r;  r  r   r  r
  s          @@@@rA   live_statusr  p  sv      #4..DTOC70DO O 
	-	

 
	' 	' 
 
 
s   AB A/&	B /
A=9B c                d  ^  SS jn  [        [        R                  " S5      T R                  USS9nUR                  5       (       d  T R                  R                  5         M]  SU 4S jjnT R                  R                  5       nT R                  R                  X2UT R                  S9  T R                  R                  5         T R                  R                  [        R                  " SS5      5        UR                  S	5       H*  nT R                  R                  [        S
U 35      5        M,     [        T R                  [        R                  " S5      5         UR                  5       (       d-  [         R"                  " S5        UR                  5       (       d  M-  S S S 5        S nUR%                  5        HO  nUR&                  S:X  a0  UR(                  R*                  S:X  a  UR(                  R,                  n[/        T Xv5        MQ     GM	  ! [         a     g f = f! , (       d  f       N= f)Nc                @    U [         R                  :X  a
  [        5       eg r[   )r3   CTRL_Tr7   )r  s    rA   	_key_read_text_mode.<locals>._key_read  s    - r@   z  [bold]User input[/bold]: zType to talk to your agent)r   r  r  c                   >^ SU4S jjnSU4S jjn[         R                  " U" U 5      5      nUR                  U5        g )Nc                   >#    TR                   R                  U S9I S h  vN nUR                  R                  5       $  N7f)N)
user_input)rd  runeventsrL  )rF   r  r0  s     rA   	_generate=_text_mode.<locals>._generate_with_context.<locals>._generate  s8     \\--->>{{'')) ?s   A?Ac                   > U R                  5       =n(       a  TR                  U5        g TR                  U R                  5       5        g r[   )	exceptionset_exception
set_resultresult)taskr  
result_futs     rA   _done_callbackB_text_mode.<locals>._generate_with_context.<locals>._done_callback  s7     $ 0090,,Y7))$++-8r@   )rF   r#  ro   zlist[RunEvent])r#  zasyncio.Task[list[RunEvent]]ro   rp   )r   r   add_done_callback)rF   r$  r  r%  r#  r0  s    `   rA   _generate_with_context*_text_mode.<locals>._generate_with_context  s1    *9 &&y7D"">2r@   )context)     ● #1FD5F9)Youbold #1FD5F9
    z  [dim]Thinking...[/dim]r  r  r)  )r  r#  ro   rp   )rF   r#  r$  zasyncio.Future[list[RunEvent]]ro   rp   )r  r   from_markupr   KeyboardInterruptstripbellrh  create_futurer   rk  r  rN  splitr  r   r   r   r"  typer,  r.  r/  _print_run_event)r0  r  rF   r(  hr  last_user_metricsr1  s   `       rA   
_text_moder;    s     	  !>?		%8	D zz||IINN	3 -.II,C,C,E			&&'=QPQP\P\&]						MM('	
 JJt$DIIOOD4v/0 % D$4$45O$PQffhh

3 ffhh R 7;XXZEzzY&5::??f+D$)JJ$6$6!Q9  _  ! 		D RQs   *H AH!
HH!
H/)r,  z#09C338z#1F5DF9z#BA1FF9z#F9AE1Fz#FA4C39z	list[str]AGENT_PALETTEc                    [         R                  " U R                  S5      SS9R                  5       n[        R                  US5      [        [        5      -  n[        [        U   SS9$ )Nzutf-8r   )digest_sizebigTr   )	hashlibblake2bencodedigestr   
from_bytesr   r<  r   )r  r9  r  s      rA   _agent_stylerE    sP    G,!<CCEA
..E
"S%7
7C}S)55r@   c                    [         R                  " XS9n[        U5      U::  a  SR                  U5      $ US-
  nUS U nUSS  nSR                  US/-   U-   5      $ )N)r  r/  r   r  z...)textwrapwrapr   rJ  )rF   	max_linesr  wrapped
head_countheadtails          rA   _truncate_textrN    se    mmD.G
7|y yy!!QJ;JD23<D99TUG^d*++r@   c                H    U S-  nUS:  a  US S3$ US:  a  US S3$ US S3$ )Nr  
   z.0fmsr.   z.1fz.2fr9   )secondsrQ  s     rA   _format_duration_msrS    sC    	4B	RxS}	qS}S}r@   c                   / nU (       ap  SU ;   a2  U S   nUR                  S5        UR                  [        U5      S45        SU ;   a2  U S   nUR                  S5        UR                  [        U5      S45        U(       ap  SU;   a2  US   nUR                  S5        UR                  [        U5      S45        SU;   a2  US   nUR                  S	5        UR                  [        U5      S45        / nU(       a@  S
U;   a:  US
   nUR                  S5        UR                  [        U5      US:  a  SOS45        U(       d  U(       d  g / n[        U5      S-  n[        U5       HI  nUS:  a  UR                  S5        UR                  X'S-     5        UR                  X'S-  S-      5        MK     U(       a)  U(       a  UR                  S5        UR	                  U5        [
        R                  " U6 $ )Nend_of_turn_delay)zend_of_turn: r   r   on_user_turn_completed_delay)zturn_completed_cb: r   llm_node_ttft)z
llm_ttft: r   tts_node_ttfb)z
tts_ttfb: r   e2e_latency)ze2e: r   r  r   r   r   )u    · r   r.   )u     ─  r   )rz  rS  r   r  extendr   rN  )user_metricsassistant_metricspartsr:  	e2e_parts	assembled
pair_countr  s           rA   r0  r0    s    $&E ,.01ALL12LL-a0%89)\9;<ALL78LL-a0%89 //!/2ALL./LL-a0%89//!/2ALL./LL-a0%89')I].??m,)*-a018%OP')IUqJ:q5011u&1uqy)*	  23#==)$$r@   c                	   UR                   S:X  aa  U R                  R                  5         U R                  R                  [        R                  " SUR
                  R                  S45      5        g UR                   S:X  Ga  UR
                  R                  nUnUR                  5       R                  S5      =(       d    UR                  5       R                  S5      nU(       d   SS K
nUR                  S5      nUS:  a  X7S  nUR                  " U5      n	[        U	[        5      (       af  / n
U	R                  5        H(  u  pUc  M
  US	:w  d  M  U
R!                  U S
U 35        M*     SR#                  U
S S 5      n[%        U
5      S:  a  US-  nU(       a;  U R                  R                  [        R                  " S[-        USS9S45      5        g U R                  R                  [        R                  " SUS45      5        g UR                   S:X  a  UR.                  nUR0                  n[3        UR4                  R6                  5      n[3        UR4                  R6                  5      nU R                  R                  [        R                  " SS[        UR4                  R6                   US9S[        UR4                  R6                   US95      5        g UR                   S:X  GaN  UR
                  R8                  (       Ga1  U R                  R                  5         U R                  R                  [        R                  " SS5      5        UR
                  R8                  R;                  S5       H*  nU R                  R                  [        SU 35      5        M,     [=        UR
                  R>                  S:X  a  UOS UR
                  R>                  S:X  a  UR
                  R@                  OS 5      nUb8  [        S5      nURC                  U5        U R                  R                  U5        g g g [D        RF                  " SUR                    35        g ! WR&                  [(        [*        4 a    [-        USS9n GNf = f) Nfunction_call)u     ➜ r,  r.  function_call_outputr   r  r   {r7  =z,    z, ...r   )rI  )u       ✗ #EF4444rg  )u       ✓ #6BCB77r   agent_handoff)r+  z#FFD93D)z	Handoff: zbold #FFD93Dr  )u    → r   r  )r+  rh  )Agentzbold #6BCB77r/  r0  r*  zunknown RunEvent type )$r7  r   r  r   rN  r,  r  r|  r~  
startswithr  findloadsr+  r  itemsrz  rJ  r   JSONDecodeError	TypeError
ValueErrorrN  	old_agent	new_agentrE  rX   r;   text_contentr6  r0  r.  r/  append_textr"   warning)r0  r1  r:  r|  display_outputis_errorr  
json_startjson_strr   summary_partskr:  rr  rs  	old_style	new_styler  rQ  metrics_lines                       rA   r8  r8  %  s   
 zz_$						MM(.1	
 
-	-""<<>,,W5_9R9RS^9_E#[[-
?%k2H::h/D!$--(*$(JJLDA }f - 4 4s!A3Z @ %1 *.=!3D)E}-1*g5N IIOO.#Fa8)D IIOO.#U+ 
	&OO	OO	 !4!4!=!=>	 !4!4!=!=>				MM(-	++445iH#	++445iH	
 
y	 ::"""IIOOIIOO,- 

//55d;		tD6] 34 < 0%*ZZ__%C!&+jjoo&D

""$L '#F|((6		- ( #( 	/

|<=m (()Z@ E!/!!DEs    (AQ  
Q  AQ   %R	R	c                 ^^ [         R                  " 5       mS mSUU4S jjn[         R                  " USS9nUR                  5         U R	                  SUS9  U R                  SUS9  [        X R                  =(       d    SS9mTR                  5         [        TU R                  SSS9   TR                  5       (       d=  TR                  5         [        R                  " S	5        TR                  5       (       d  M=  S S S 5        U R	                  S
5        U R                  S
5        TR                  5       (       a
  [        5       eg ! , (       d  f       NP= f)Nc                 :  > TR                  5       (       d  [        5       n U [        R                  :X  a  TR	                  5         g U S:X  a  Tb  TR
                  (       + Tl        OU [        R                  :X  a
  Tb  STl        TR                  5       (       d  M  g g )Nr  F)is_setr4   r3   r  r   r1  r  )r  ctrl_t_e
visualizers    rA   _listen_for_keys%_audio_mode.<locals>._listen_for_keys  ss    //##BSZZsz50:0I0I,I
)sww:#9,1
) //##r@   T)targetdaemonr  unknownrM   r  r  g?Frs   )r   r   Threadr  r  r  r,  rq  r;  r   r   r  r   r   r7   )r0  r  r  r  listenerr  r  s        @@rA   _audio_moder    s    H-1J	2 	2 '7EHNNT,7$}5$Qll.GiHJ	j!))d	S//##JJt //## 
T
 U#% m  
T	Ss   *AE
Ec                  F    \ rS rSrS	S jrS
S jrS
S jrS
S jrS
S jrSr	g)_ConsoleWorkeri  c                   [         R                  " 5       U l        Xl        X l        [
        R                  " 5       U l        SU l        g rj   )	r   new_event_looprQ   _server_shutdown_cbr   r   r  _closed)rV   servershutdown_cbs      rA   rP   _ConsoleWorker.__init__  s2    ++-
'^^%
r@   c                ~    [         R                  " U R                  S9U l        U R                  R	                  5         g )N)r  )r   r  _worker_thread_threadr  rb   s    rA   r  _ConsoleWorker.start  s*     ''t/B/BCr@   c                8    U R                   R                  5         g r[   )r  rJ  rb   s    rA   rJ  _ConsoleWorker.join  s    r@   c                    U R                      [        R                  " U R                  R	                  5       U R
                  5        S S S 5        g ! , (       d  f       g = fr[   )r  r   run_coroutine_threadsafer  acloserQ   rb   s    rA   shutdown_ConsoleWorker.shutdown  s4    ZZ,,T\\-@-@-BDJJO ZZs   :A
Ac                   ^  [         R                  " T R                  5        SU 4S jjnT R                  R                  U" 5       5        g )Nc                   >#    TR                      TR                  (       a  TR                  5          S S S 5        g  S S S 5        [        R                  TR
                  l        TR
                  R                  S5      SU4S jj5       n TR
                  R                  SSS9I S h  vN   TR                  5         g ! , (       d  f       N= f N&7f)Nworker_startedc                 z   > [         R                  " T R                  R                  SSSS9T R                  5        g )Nzconsole-roomr   T)agent_identityfake_job)r   r  r  simulate_jobrQ   rb   s   rA   _simulate_jobI_ConsoleWorker._worker_thread.<locals>._async_main.<locals>._simulate_job  s8    00LL--&y4 .  JJ	r@   Tdevmodeunregisteredrs   )	r  r  r  r    THREADr  _job_executor_typeoncer  )r  rV   s    rA   _async_main2_ConsoleWorker._worker_thread.<locals>._async_main  s     <<%%'  
 />.D.DDLL+\\/0 1 ,,""4d"CCC#   Ds-   C#B=	CA*C'C(C=
CCrs   )r   set_event_looprQ   run_until_complete)rV   r  s   ` rA   r  _ConsoleWorker._worker_thread  s0    tzz*	 ( 	

%%km4r@   )r  r  rQ   r  r  r  N)r  r+   r  r   ro   rp   rs   )
r;   r<   r=   r>   rP   r  rJ  r  r  r?   r9   r@   rA   r  r    s    P5r@   r  )r  c                D  ^^ [         R                  5       nX6l        SUl        XFl        [        Xe5        UR                  SSS9  UR                  (       a2  UR                  SUR                   3S[        R                  " S5      S9  UR                  S	5         UR                  XS
9  SmSS jnSUU4S jjn[         H  n	[        R                  " X5        M     [        XS9mTR                  5          UR                  5           UR                  S:X  a  [!        U5        OUR                  S:X  a
  [#        XaUS
9  M9  ! [$         a    UR                  S:X  a  SOSUl         N'f = f! [&         a     Of = fTR)                  5         TR+                  5         g ! TR)                  5         TR+                  5         f = f! [,        [.        4 aP  n
UR                  S	5        UR                  SU
 35        UR                  S	5        [0        R2                  " SS9S eS n
A
ff = f)NTu   Starting console mode 🚀Agents)r   z#Session recording will be saved to 	Recordingzblack on redr  r  )r  r  Fc                      [         R                  " [         R                  5        g ! [         a9     [         R                  " [         R                  5         g ! [         a      g f = ff = fr[   )signalraise_signalSIGTERMr  SIGINTr9   r@   rA   _on_worker_shutdown)_run_console.<locals>._on_worker_shutdown  sQ    ##FNN3 ''6  s&   $' 
A*$A
A&"A*%A&&A*c                L   > T(       d  Sm[        5       eTR                  5         g re   )rD   r  )sigr]   console_workerexit_triggereds     rA   _handle_exit"_run_console.<locals>._handle_exit  s    !!%j ##%r@   )r  r  rF   rG   [error]r.   coders   r  r   r]   zFrameType | Nonero   rp   )r   r   rK  rR  rY  r  r  r]  r   parser  HANDLED_SIGNALSr  r  r  rn  r;  r  r7   rD   r  rJ  r   rq  typerExit)r  r  r  ry  rY  r  r0  r  r  r  er  r  s              @@rA   _run_consoler    s    	""$ANAIHa#GG(hG7xx	1!2E2E1FGkk.1 	 	
 GGCL8+
 	
###[		& 	& #CMM#, # (vW	"%%'U~~/"172#AP]^  # U01&0HWfANU  		 ##%! ##%!j! +		'!	jja d*	+sz   AF? 6E) E  #E) $E  >E)  #E&#E) %E&&E) )
E63F 5E66F 9 F? "F<<F? ?HAHHc           
     0	  ^ ^^^ S nTR                   (       a  [        R                  5       nSmT(       d+  SU4S jjn[         H  n[        R                  " XT5        M     [        UTR                  5        [        R                  " 5       n[        R                  " U5        SUl
        SUUU 4S jjnS nTR                  (       a  SSKJn	  U	" T TUS9nUR                  5          UR                  U" T 5      SS	9n
 UR!                  U
5         SmTR                   (       d    UR!                  T R%                  5       5        UR!                  T R-                  5       5        U(       a  UR!                  UR-                  5       5        T(       a  UR3                  5         g [4        R6                  " ["        5          [        R8                  " U5      nU H  nUR;                  5         M     UR!                  [        R<                  " USS065        UR!                  UR?                  5       5        UR!                  URA                  5       5        UR3                  5          S S S 5        g ! ["         a     GNff = f! [        R&                   a    [(        R*                  " S
5         GNcf = f! ["         a7    T(       d,  [(        R*                  " S5        SS KnUR0                  " S5         GNbf = f! UR!                  UR?                  5       5        UR!                  URA                  5       5        UR3                  5         f = f! , (       d  f       g = f! T(       a  UR3                  5         f [4        R6                  " ["        5          [        R8                  " U5      nU H  nUR;                  5         M     UR!                  [        R<                  " USS065        UR!                  UR?                  5       5        UR!                  URA                  5       5        UR3                  5         OS! UR!                  UR?                  5       5        UR!                  URA                  5       5        UR3                  5         f = f S S S 5        f ! , (       d  f       f = f= f)NFc                ,   > T(       d  Sm[        5       eg re   )rD   )r  r]   r  s     rA   r  !_run_worker.<locals>._handle_exit1  s    !!%j  "r@   r  c                   >#     TR                  TR                  TS9I S h  vN   g  N! [         a    [        R                  " S5         g f = f7f)Nr  zworker failed)r  r  r  r"   r  )workerargsjupyterr  s    rA   _worker_run _run_worker.<locals>._worker_runA  sA     	.**T\\*HHH 	._-	.s1   A* (* A*  A
AAAr.   )WatchClientrW   worker_main_task_clir  z!drain timed out, forcing shutdownexiting forcefullyr   return_exceptionsTr  )r  r+   ro   rp   )!r  r   r   r  r  r  r  r   r  r  slow_callback_durationreloadwatcherr  r  r   r  rD   drainTimeoutErrorr"   rv  r  os_exitr  
contextlibsuppress	all_tasksr   gathershutdown_asyncgensshutdown_default_executor)r  r  r  r0  r  r  rW   r  watch_clientr  	main_taskr  tasksr#  r  s   ```           @rA   _run_workerr  (  si   "A||&&(N	! #CMM#, # a(!!#D4 "%D. . L{{("64d;'!$$[%8?U$V		##I.	"N<<H++FLLN; ##FMMO4''(;(;(=> JJL$$X.	!#--d3E % !& ++GNNE,ZUY,Z[++D,C,C,EF++D,J,J,LMJJL /.3  		 ++ HNN#FGH  	34	$ ++D,C,C,EF++D,J,J,LMJJL /. JJL$$X.	!#--d3E % !& ++GNNE,ZUY,Z[++D,C,C,EF++D,J,J,LMJJL ++D,C,C,EF++D,J,J,LMJJLL /..s   $M ;I% J' !I6  AJ' 7L>9AK+AL>%
I3/M 2I33M 6*J$ J' #J$$J' '=K($M 'K((M +AL;;L>>
M3RRAP'AR'AQ7	7R;	R
RRc                  ,    \ rS rSrSrSrSrSrSrSr	Sr
g	)
LogLeveliy  r  DEBUGINFOWARNERRORCRITICALr9   N)r;   r<   r=   r>   tracedebuginfowarnr   criticalr?   r9   r@   rA   r  r  y  s     EEDDEHr@   r  c                  ^  [         R                  " SS9nUR                  SS9SS j5       n[        [        R
                  " T R                  S5      5      n[        [        R
                  " T R                  S5      5      nUR                  5       S S SSSUS.             SU 4S jjj5       nUR                  5       US S S S S	.           SU 4S
 jjj5       nUR                  5       USS S S S.           SU 4S jjj5       nUR                  5       [        R                  S S S S S.             SU 4S jjj5       nUR                  5       SS j5       n	U$ )Nrich)rich_markup_modeT)invoke_without_commandc                    U R                   c.  [        U R                  5       5        [        R                  " 5       eU R                   S;   a  S[
        R                  S'   g g )N)r   r  1LIVEKIT_DEV_MODE)invoked_subcommandr  get_helpr  r  r  environ)ctxs    rA   _set_dev_mode!_build_cli.<locals>._set_dev_mode  sK    !!)#,,.!**,!!%77-0BJJ)* 8r@   F)r  r  list_devicesrF   rY  r  c           	     0  > U(       a  [        5         [        R                  " 5       eU (       a   U R                  5       (       a  [	        U 5      n U(       a   UR                  5       (       a  [	        U5      n[        TU UU(       a  SOSUUR                  S9  g)zE
Run a [bold]LiveKit Agents[/bold] in [yellow]console[/yellow] mode.
rF   rG   )r  r  r  ry  rY  r  N)r  r  r  isdigitr   r  value)r  r  r	  rF   rY  r  r  s         rA   r   _build_cli.<locals>.console  ss    H  "**,L0022|,L]2244.M%'Woo	
r@   )r  urlapi_key
api_secretdrain_timeoutc           
     |   > Ub  TR                  US9  [        T[        R                  " U R                  UUUS9S9  g )N)r  )r  r  r  r  r  r  )update_optionsr  r/   CliArgsr  )r  r  r  r  r  r  s        rA   r  _build_cli.<locals>.start  sD    J $!!!>#//%		
r@   )r  r  r  r  r  c           	       >^^ [         R                  " U R                  UUUSUS9n[        R	                  5       n[        X`R                  5        [        R                  R                  S5      nUS:X  a)  UR                  (       a  UR                  S5        SUl	        UR                  (       d  [        TUS9  g SS	KJn  [        R                  " [         R"                  S
   5      R$                  n	[&        R(                  " 5       m[&        R*                  " T5        U" [        TXTS9mSUU4S jjn
[,         H  n[.        R.                  " X5        M     SU4S jjn TR1                  U" 5       5        g ! [2         a    [4        R6                  " 5       S e[8         a/    [:        R<                  " S5        [        R>                  " S5         g f = f)NT)r  r  r  r  r  r  TERM_PROGRAMz	iTerm.appzH[error]Auto-reload is not supported on the iTerm2 terminal, disabling...Fr  r.   )WatchServerr   r  c                L   > [         R                  " TR                  5       TS9  g )Nr  )r   r  r  )r  r]   rW   watch_servers     rA   r  -_build_cli.<locals>.dev.<locals>._handle_exit;  s    ,,\-@-@-BNr@   c                 B   >#    T R                  5       I S h  vN   g  N7fr[   )r  )r  s   rA   	_run_loop*_build_cli.<locals>.dev.<locals>._run_loopA  s     ""$$$s   r  r  rs   ) r/   r  r  r   r   r  r  r  r  r  r  r  r  r  r  r  r  argvparentr   r  r  r  r  r  rD   r  r  r2  r"   rv  r  )r  r  r  r  r  r  r0  term_programr  	main_filer  r  r  rW   r  r  s                @@rA   r  _build_cli.<locals>.dev  sT   F }}oo!
 &&(!__-zz~~n5;&4;;GG^_DK{{vD1(LL!-44	%%'t$";	dS	O 	O #CMM#, #	%	##IK0 	)**,D(  	NN/0HHQK	s   E5 5AGG)r  r  r  r  participant_identityc           	       >^^^^^^
 Tc  [        S5      m[        R                  5       n[        X`R                  5        [
        R                  " 5       n[
        R                  " U5        S m
TR                  S5      SU
UUUUUU4S jj5       n UR                  TR                  SSS95        g ! [         a    [        R                  " 5       S e[         a/    [        R                   " S5        ["        R$                  " S5         g [&        [(        4 aP  n	UR+                  S5        UR+                  S	U	 35        UR+                  S5        [        R                  " SS
9S eS n	A	ff = f)Nzagent-r  c                 V   > SUUUUUU4S jjn [         R                  " U " 5       5      mg )Nc                   >#    [         R                  " T	TT5       IS h  vN n [         R                  " T/S9nU R                  R	                  U5      I S h  vN nUR
                  (       d6  U R                  R                  [         R                  " TS95      I S h  vN nOUR
                  S   nS S S 5      IS h  vN   TR                  TSWTS9I S h  vN   g  N N NC N%! , IS h  vN  (       d  f       N:= f N'7f)N)namesr  r   F)roomr  	room_infor  )	r   
LiveKitAPIListRoomsRequestr*  
list_roomsroomscreate_roomCreateRoomRequestr  )
lk_apiroom_requestactive_roomr+  r  r  r%  r*  r  r  s
       rA   r  H_build_cli.<locals>.connect.<locals>._simulate_job.<locals>.simulate_job  s     >>#w
CCv#&#7#7tf#EL(.(>(>|(L"LK&,,*0++*A*A#BWBW]aBb*c$c	$/$5$5a$8	 DC ))"'#7	 *    D"L %d DCCCsu   DCD4C&C AC&C"C&3D>C$?DD D C&"C&$D&C=,C/-C=9Drs   )r   r   )r  _taskr  r  r%  r*  r  r  s    rA   r  2_build_cli.<locals>.connect.<locals>._simulate_job{  s!     " ''7Er@   Tr  r  r.   r  r  r  rs   )r&   r   r   r  r  r   r  r  r  r  r  rD   r  r  r2  r"   rv  r  r  r   rq  r  )r  r  r  r  r*  r%  r0  rW   r  r  r6  r  s    `````    @rA   connect_build_cli.<locals>.connectL  s   J  '#,X#6 &&(!__-%%'t$%)	%	&	8 	8 
'	8,	/##FJJt$J$OP 	)**,D(  	NN/0HHQK*% 	/GGCLGGgaSM"GGCL**!$$.		/s    B/ /AE%E%AE  E%c                    [         R                  5       n SU l        [        U [        R
                  5         [        R                   HY  n[        R                  " SUR                   35        UR                  5         [        R                  " SUR                   35        M[     g ! [         aP  nU R                  S5        U R                  SU 35        U R                  S5        [        R                  " SS9S eS nAff = f)NTzDownloading files for zFinished downloading files for r  r  r.   r  )r   r   rR  r  r  r  r$   r  r"   r  packagedownload_filesr   r  r  r  )r0  r  r  s      rA   r<  "_build_cli.<locals>.download_files  s    &&(	!W]]+	/
 !334V^^4DEF%%'=fnn=MNO 4
  	/GGCLGGgaSM"GGCL**!$$.		/s   A-B% %
C?/AC::C?)r  ztyper.Contextro   rp   )r  zeAnnotated[str | None, typer.Option(help='Numeric input device ID or input device name substring(s)')]r  zgAnnotated[str | None, typer.Option(help='Numeric output device ID or output device name substring(s)')]r	  zXAnnotated[bool, typer.Option(help='List all available input and output audio devices.')]rF   zOAnnotated[bool, typer.Option(help='Whether to start the console in text mode')]rY  zHAnnotated[bool, typer.Option(help='Whether to record the AgentSession')]r  mAnnotated[LogLevel, typer.Option(help='Set the log level', case_sensitive=False, envvar='LIVEKIT_LOG_LEVEL')]ro   rp   )r  r>  r  |Annotated[str | None, typer.Option(help='The WebSocket URL of your LiveKit server or Cloud project.', envvar='LIVEKIT_URL')]r  Annotated[str | None, typer.Option(help='API key for authenticating with your LiveKit server or Cloud project.', envvar='LIVEKIT_API_KEY')]r  Annotated[str | None, typer.Option(help='API secret for authenticating with your LiveKit server or Cloud project.', envvar='LIVEKIT_API_SECRET')]r  zlAnnotated[int | None, typer.Option(help='Time in seconds to wait for jobs to finish before shutting down.')]ro   rp   )r  r>  r  z`Annotated[bool, typer.Option(help='Enable auto-reload of the server when (code) files change.')]r  r?  r  r@  r  rA  ro   rp   )r  zQAnnotated[LogLevel, typer.Option(help='Set the log level', case_sensitive=False)]r  r?  r  r@  r  rA  r*  z<Annotated[str, typer.Option(help='Room name to connect to')]r%  z@Annotated[str | None, typer.Option(help='Participant identity')]ro   rp   rs   )	r  Typerr  r  r,   getvaluer  commandr  )
r  appr  _start_log_default_dev_log_defaultr   r  r  r8  r<  s
   `         rA   
_build_clirH    s   
++v
.C\\\.1 /1 "/":":6;K;KU"ST 8 89I9I4 PQ[[]    [` =4

4

4

4
(
)4
0 Y14
2
34
> 
?4
 4
l 	[[]     E/

/

/

/
,
-/
:
;/
F 
G/
 /
b 	[[]     AP
P
P
P&
'P4
5PB 
CP Pd 	[[] NN    EP/
P/
P/
P/(
)P/6
7P/>
?P/F 
GP/ P/d 	[[]/ /, Jr@   c                z    [        U [        5      (       a  [        R                  " U 5      n [	        U 5      " 5         g r[   )r+  r-   r+   from_server_optionsrH  )r  s    rA   run_apprK    s*    &-((008vr@   )r0  r   r  	int | strro   rp   rs   )
r  
str | Textr   r   r  zCallable[[str], Any] | Noner  r#  ro   r#  )r   r   rF   rM  r  r#  r  r#  r  r   r  r   ro   zIterator[UpdateFn])r0  r   ro   rp   )r  r#  ro   r   )r   P   )rF   r#  rI  r   r  r   ro   r#  )rR  r   ro   r#  )r[  llm.MetricsReport | Noner\  rO  ro   zText | Noner[   )r0  r   r1  r)   r:  rO  ro   rp   )r0  r   r  r!  r  r!  ro   rp   )r  r+   r  r!  r  r!  ry  r"  rY  r   r  rL  ro   rp   )F)r  r+   r  zproto.CliArgsr  r   ro   rp   )r  r+   ro   ztyper.Typer)r  zAgentServer | WorkerOptionsro   rp   )
__future__r   r   r  rA  r  enumr@  r  r  r  r  r  r  r  rG  r   r   r  collections.abcr   r   r   r   typesr   typingr	   r
   r   r   numpyr
  r  rich.columnsr   rich.consoler   r   r   r   	rich.liver   rich.segmentr   rich.spinnerr   
rich.styler   
rich.tabler   r   	rich.textr   
rich.themer   livekitr   r   r  r   _exceptionsr   jobr    r  r"   r  r$   utilsr%   r&   voicer'   r(   voice.run_resultr)   voice.transcriptionr*   r  r+   r,   r-   r/   r0   r1   r2   readcharr3   r4   r  r  r  r  r  r  r  r7   rD   r"  r   
AudioInputrJ   AudioOutputrw   r   rM  r,  Handlerr  r  Filterr  r  r  r  r#  UpdateFnr  r;  r<  r&  rE  rN  rS  r0  r8  r  r  r  r  r  Enumr  rH  rK  r9   r@   rA   <module>rm     sJ   "         	  	  
     . % #  9 9     J J       $     " !   " $ ' 8 @ @  K K # MM
NN	) 		y 	B o& .O8 O8d[C [C~ E EPJ% J%ZE@@ @ <  04HH H -	H
 H 	HV S4Z$&'-. 
 $ 
 	
     >7:ty 6
,1%*1%/1% 1%n 37X>X>X> 0X> 
	X>v!H*5 *5h #==T+T+ T+ 	T+
 T+ T+ T+ 
T+nN!bsDII tn	r@   