+
    i                         ^ RI t ^ RIt^ RIt^ RIt^ RIHt ^ RIHt ]P                  ! R4      t	]! RR7       ! R R4      4       t
]! RR7       ! R	 R
4      4       t ! R R4      tR# )    N)	dataclass)Anyzmcube.providerT)frozenc                   ,   a  ] tR t^t o V 3R ltRtV tR# )
CallResultc                >   < V ^8  d   Qh/ S[ ;R&   S[ ;R&   S[ ;R&   # )   call_sidstatusproviderstr)format__classdict__s   "jE:\live-kit-agent\livekit_voicebot\backend\agent_runtime\src\mcube_integration\providers\mcube_provider.py__annotate__CallResult.__annotate__   s'     M  K  M	      N__name__
__module____qualname____firstlineno____annotate_func____static_attributes____classdictcell__r   s   @r   r   r            r   r   c                   ,   a  ] tR t^t o V 3R ltRtV tR# )	SMSResultc                2   < V ^8  d   Qh/ S[ ;R&   S[ ;R&   # )r	   message_sidr   r   )r   r   s   "r   r   SMSResult.__annotate__   s       K r   r   Nr   r   s   @r   r!   r!      r   r   r!   c                      a  ] tR t^t o Rt]P                  ! RR4      tV 3R lR ltRRRR/V 3R	 lR
 llt	V 3R lR lt
V 3R lR ltRtV tR# )MCubeProviderz
Minimal MCube REST provider.
Stores outbound call initiation + hangup + webhook parsing helpers.

NOTE: For secrets handling, set MCUBE_API_KEY / MCUBE_API_SECRET in env
(do not hardcode credentials).
MCUBE_OUTBOUND_CALLS_URLz?https://config.mcube.com/Restmcube-api/outbound-calls-superdashc                    < V ^8  d   QhRS[ /# )r	   http_authorizationr   )r   r   s   "r   r   MCubeProvider.__annotate__'   s     
 
c 
r   c               n   Wn         \        P                  ! RR4      P                  4       P	                  4       V n        \        P                  ! RR4      P                  4       P	                  4       R9   V n        \        P                  ! RR4      P                  4       P	                  4       R9   V n        R# )z
MCube Click2Call endpoint expects authentication in HTTP header.

doc example uses:
- HTTP header: Authorization: <token>
- JSON body: custnumber, exenumber, gid, refurl, refid (as applicable)
MCUBE_PAYLOAD_MODElegacyMCUBE_INCLUDE_GID_REFID MCUBE_INCLUDE_CALLBACK_WSN)1trueyes)r)   osgetenvstriplower_payload_mode_include_gid_refid_include_callback_ws)selfr)   s   &$r   __init__MCubeProvider.__init__'   s     #5  YY';XFLLNTTV"$)),Er"J"P"P"R"X"X"Z _
 #

 %'II.I2$N$T$T$V$\$\$^ c
 %
!r   callback_urlNwebsocket_urlc                f   < V ^8  d   QhRS[ RS[ RS[ RS[ RS[ RS[ R,          RS[ R,          R	S[/# )
r	   
custnumber	exenumbergidrefurlrefidr>   Nr?   return)r   r   )r   r   s   "r   r   r*   >   sy     wN wN wN 	wN
 wN wN wN DjwN TzwN 
wNr   c               6
  a"   \        V4      P                  4       '       d   \        V4      MTp\        V4      P                  4       '       d   \        V4      MTp	R V P                  RV P                  R\        V4      R\        V4      RV	/p
V P                  R8w  g   V P
                  '       d	   WR&   WZR&   V P                  '       d   V'       d   WjR&   V'       d   WzR	&   \        P                  ! \        P                  ! R
4      R7      ;_uu_4       GRj  xL
 p\        V P                  4      pV P                  '       d   V P                  R)R MRp/ pV P                  '       d   V P                  VR&   V P                  VR &   \        P                  RV P                  VVVVVVV4	       VP                  V P                  WR7      G Rj  xL
 pVP                  o\        P                  RVP                   SR,          4        VP#                  4       pRp\'        V\(        4      '       d>   \        VP+                  R4      ;'       g    VP+                  R4      ;'       g    R4      p0 R*mp\,        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      pV'       d   RVP/                  4       9   d   RpVP                   R+9   g0   V'       g(   VP                   R8X  d   SP1                  4       '       g}    \)        V4      pRVR&   VP                  V P                  V
VR7      G Rj  xL
 pVP                  p\        P                  RVP                   VR,          4        VP#                  4       pRRR4      GRj  xL
  \        XP+                  R 4      ;'       gg    VP+                  R!4      ;'       gN    VP+                  R"4      ;'       g5    VP+                  R#4      ;'       g    VP+                  R$4      ;'       g    T4      p\        VP+                  R%4      ;'       gN    VP+                  R4      ;'       g5    VP+                  R4      ;'       g    VP+                  R&4      ;'       g    R4      p\5        VVR'R(7      #  EL EL  \$         d	    RS/p ELi ; i EL{  \$         d	    RT/p ELFi ; i  \$         d    \        P3                  R4        ELmi ; i ELf  + GRj  xL 
 '       g   i     EL~; i5i),HTTP_AUTHORIZATIONAuthorizationrA   rB   rD   r-   rC   rE   r>   r?   g      $@)timeoutNnoneztmcube outbound-call request url=%s exenumber=%s custnumber=%s gid=%s refurl=%s refid=%s auth_present=%s auth_tail=%s)jsonheadersz3mcube outbound-call response status_code=%s body=%s:Ni  N_rawr/   msgmessageinvalid requestc              3   H   <"   T F  qSP                  4       9   x  K  	  R # 5i)N)r7   ).0m	body_texts   & r   	<genexpr>.MCubeProvider.initiate_call.<locals>.<genexpr>   s     P1Y__%6 6s   "TFi  z!application/x-www-form-urlencodedzContent-Type)datarM   z?mcube outbound-call retry(form) response status_code=%s body=%sz%mcube outbound-call form retry failedcallidcallIdcalledcallSessionIdcall_idr   errormcube)r
   r   r   >   invalidbad requestrQ   )i  i  )r   isdigitintr)   r8   r9   r:   httpxAsyncClientTimeoutboolloginfoOUTBOUND_CALLS_URLposttextstatus_coderL   	Exception
isinstancedictgetanyr7   r6   	exceptionr   )r;   rA   rB   rC   rD   rE   r>   r?   norm_gidnorm_refurlpayloadclienttoken_present
token_tailrM   resprX   data_msginvalid_markerslooks_invalidheaders_form	resp_form	body_formr
   r   rU   s   &$$$$$$$                 @r   initiate_callMCubeProvider.initiate_call>   sM      #3x//113s8s%([%8%8%:%:c&k !$"9"9T44#j/Yk#
 )T-D-D-D%EN$G$$$*6'+8($$U]]4-@AAAV !8!89M:>:Q:Q:Q$11"#6W]JG&&&+/+B+B(040G0G,-HH G''
  T%<%<7\\D		IHHE  % +yy{
 H$%%txxKK$((92EKKLO
  CPPCCCPPPM-1AA $:-  C'	0A0AK#'=L3VL0&,kk$2I2IPWamk&n nI )IHHY!--!%(
3(~~/C BAR HHX  xx! xx!  xx(  xx	"	 
 
 TXXh'll488I+>ll$((5/llUYU]U]^eUflljlm8FWMMe B, ]  +	*+0 !o % 3 &	23  KMM"IJKI BAAAsL  B-T1TTT;TRTAS<+A%S<R 8S<
R#4S<S<(*S<S<5/S<%&S<1S>R9?8S8R<TS9 T5TT'T T#T=TT/TT S<#R62S<5R66S<9S<SSS<SS S62S<5S66S<9T<T	T
T	T		Tc                $   < V ^8  d   QhRS[ RR/# )r	   r
   rF   Nr   )r   r   s   "r   r   r*      s     f fS fT fr   c                   "   \        R 4      h5i)z@MCube hangup is not implemented for Restmcube-api click2call yet)NotImplementedError)r;   r
   s   &$r   hangup_callMCubeProvider.hangup_call   s      ""dees   c                R   < V ^8  d   QhRS[ S[S[3,          RS[ S[S[3,          /# )r	   rw   rF   )rq   r   r   )r   r   s   "r   r   r*      s+     
 
T#s(^ 
S#X 
r   c                    R VP                  R4      R\        VP                  RR4      4      P                  4       RVP                  R^ 4      RVP                  RR4      /# )r
   r]   r   r/   durationanswered_byhuman)rr   r   r7   )r;   rw   s   &&r   parse_webhookMCubeProvider.parse_webhook   sX    I.c'++h34::<J27;;}g>	
 	
r   )r:   r9   r8   r)   )r   r   r   r   __doc__r4   r5   rk   r<   r   r   r   r   r   r   s   @r   r&   r&      sh      "I

 
.wN $(wN %)wN wNrf f

 
r   r&   )re   r4   rL   loggingdataclassesr   typingr   	getLoggerri   r   r!   r&   r   r   r   <module>r      sp     	   ! () $   $  
j
 j
r   