Ë
    :vžjw  ã                   ó<  — d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z ddlmZ ddlmZ 	 ddlmZ 	 dd
lmZ ddlmZ ddlmZ ddlmZ dZ G d„ de«      Z G d„ de«      Z G d„ deee«      Z G d„ de«      Z d„ Z!y# e$ r d	„ ZY ŒWw xY w# e$ r	 dd
lmZ Y Œaw xY w)zF tornado handler for managing and communicating with language servers
é    )ÚOptionalÚText)Úensure_async)Ú
APIHandlerÚJupyterHandler)Úurl_path_join)Úweb)ÚWebSocketHandler)Ú
authorizedc                 ó   — | S )z)A no-op fallback for `jupyter_server 1.x`© )Úmethods    úe/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_lsp/handlers.pyr   r      s   € àˆó    )ÚWebSocketMixiné   )ÚLanguageServerManager)ÚSERVERS_RESPONSE)Úcensored_specÚlspc                   ó   — e Zd ZdZdefd„Zy)ÚBaseHandlerNÚmanagerc                 ó   — || _         y ©N©r   ©Úselfr   s     r   Ú
initializezBaseHandler.initialize$   ó	   € Øˆ�r   ©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   !   ó   „ Ø€GðÐ"7ô r   r   c                   ó   — e Zd ZdZdefd„Zy)ÚBaseJupyterHandlerNr   c                 ó   — || _         y r   r   r   s     r   r   zBaseJupyterHandler.initialize+   r    r   r!   r   r   r   r'   r'   (   r%   r   r'   c                   óX   ‡ — e Zd ZU dZeZdZee   e	d<   d„ Z
ˆ fd„Zˆ fd„Zd„ Zd„ Zˆ xZS )	ÚLanguageServerWebSocketHandlerad  Setup tornado websocket to route to language server sessions.

    The logic of `get` and `pre_get` methods is derived from jupyter-server ws handlers,
    and should be kept in sync to follow best practice established by upstream; see:
    https://github.com/jupyter-server/jupyter_server/blob/v2.12.5/jupyter_server/services/kernels/websocket.py#L36
    NÚlanguage_serverc              ƒ   ó:  K  — | j                   }|€0| j                  j                  d«       t        j                  d«      ‚t        | d«      syt        | j                  j                  | |dt        «      «      ƒ d{  –—† }|st        j                  d«      ‚y7 Œ­w)zHandle a pre_get.Nz*Couldn't authenticate WebSocket connectioni“  Ú
authorizerÚexecute)
Úcurrent_userÚlogÚwarningr	   Ú	HTTPErrorÚhasattrr   r-   Úis_authorizedÚAUTH_RESOURCE)r   Úuserr4   s      r   Úpre_getz&LanguageServerWebSocketHandler.pre_get=   sŽ   è ø€ ð × Ñ ˆØˆ<Ø�H‰H×ÑÐIÔJÜ—-‘- Ó$Ð$ä�t˜\Ô*Øô +Ø�O‰O×)Ñ)¨$°°iÄÓOó
÷ 
ˆñ Ü—-‘- Ó$Ð$ð ð
ús   ‚A:BÁ<BÁ=Bc              �   ó~   •K  — | j                  «       ƒ d{  –—†  t        ‰| �  |i |¤Ž}|�|ƒ d{  –—†  yy7 Œ!7 Œ­w)zGet an event socket.N)r7   ÚsuperÚget)r   ÚargsÚkwargsÚresÚ	__class__s       €r   r:   z"LanguageServerWebSocketHandler.getP   sE   øè ø€ à�l‰l‹n×ÐÜ‰g‰k˜4Ð* 6Ñ*ˆØˆ?Ø�I‰Ið ð 	øð ús   ƒ=—9˜=²;³=»=c              ƒ   ó  •K  — | j                   j                  «       ƒ d {  –—†  || _        | j                   j                  | «       | j                  j                  dj                  | j                  «      «       t        ‰| �!  «        y 7 Œi­w)Nz[{}] Opened a handler)	r   Úreadyr+   Ú	subscriber0   ÚdebugÚformatr9   Úopen)r   r+   r>   s     €r   rD   z#LanguageServerWebSocketHandler.openW   sg   øè ø€ Ø�l‰l× Ñ Ó"×"Ð"Ø.ˆÔØ�‰×Ñ˜tÔ$Ø�‰�‰Ð.×5Ñ5°d×6JÑ6JÓKÔLÜ‰‰�ð	 	#ús   ƒB¡B¢A*Bc              ƒ   óÀ   K  — | j                   j                  dj                  | j                  «      «       | j                  j                  || «      ƒ d {  –—†  y 7 Œ­w)Nz[{}] Handling a message)r0   rB   rC   r+   r   Úon_client_message)r   Úmessages     r   Ú
on_messagez)LanguageServerWebSocketHandler.on_message^   sB   è ø€ Ø�‰�‰Ð0×7Ñ7¸×8LÑ8LÓMÔNØ�l‰l×,Ñ,¨W°dÓ;×;Ò;ús   ‚AAÁAÁAc                 ó¢   — | j                   j                  | «       | j                  j                  dj	                  | j
                  «      «       y )Nz[{}] Closed a handler)r   Úunsubscriber0   rB   rC   r+   )r   s    r   Úon_closez'LanguageServerWebSocketHandler.on_closeb   s6   € Ø�‰× Ñ  Ô&Ø�‰�‰Ð.×5Ñ5°d×6JÑ6JÓKÕLr   )r"   r#   r$   Ú__doc__r5   Úauth_resourcer+   r   r   Ú__annotations__r7   r:   rD   rH   rK   Ú__classcell__)r>   s   @r   r*   r*   /   s7   ø… ñð "€Mà&*€O�X˜d‘^Ó*ò%ô&ôò<öMr   r*   c                   óF   — e Zd ZdZeZeZej                  e
d„ «       «       Zy)ÚLanguageServersHandlerzsReports the status of all current servers

    Response should conform to schema in schema/servers.schema.json
    c           
   ƒ   óT  K  — | j                   j                  «       ƒ d{  –—†  d| j                   j                  j                  «       D ��ci c]  \  }}||j	                  «       “Œ c}}| j                   j
                  j                  «       D ��ci c]  \  }}|t        |«      “Œ c}}dœ}t        | j                  j                  |«      «      }|r4| j                  j                  dj                  t        |«      |«      «       | j                  |«       y7 Œùc c}}w c c}}w ­w)z4finish with the JSON representations of the sessionsNé   )ÚversionÚsessionsÚspecsz{} validation errors: {})r   r@   rU   ÚitemsÚto_jsonÚall_language_serversr   ÚlistÚ	validatorÚiter_errorsr0   r1   rC   ÚlenÚfinish)r   r+   ÚsessionÚkeyÚspecÚresponseÚerrorss          r   r:   zLanguageServersHandler.getp   s  è ø€ ð �l‰l× Ñ Ó"×"Ð"ð ð 15·±×0EÑ0E×0KÑ0KÔ0Môá0MÑ,�O Wð   §¡Ó!2Ñ2Ø0Mòð "&§¡×!BÑ!B×!HÑ!HÔ!Jôá!J‘I�C˜ð ”] 4Ó(Ñ(Ø!Jòñ

ˆô �d—n‘n×0Ñ0°Ó:Ó;ˆáØ�H‰H×ÑÐ7×>Ñ>¼sÀ6»{ÈFÓSÔTà�‰�HÕð' 	#úóùóùs.   ‚D( D¡,D(ÁDÁ(*D(ÂD"
Â(A3D(ÄD(N)r"   r#   r$   rL   r5   rM   r   r[   r	   Úauthenticatedr   r:   r   r   r   rQ   rQ   g   s3   „ ñð
 "€MØ €Ià×ÑØñó ó ñr   rQ   c           	      óÒ   — t        | j                  d«      }d}d| j                  i}| j                  j	                  dt        |d«      t
        |ft        |d|«      t        |fg«       y)zAAdd Language Server routes to the notebook server web applicationr   z(?P<language_server>.*)r   z.*ÚstatusÚwsN)ÚujoinÚbase_urlÚlanguage_server_managerÚweb_appÚadd_handlersrQ   r*   )ÚnbappÚlsp_urlÚre_langserversÚoptss       r   rl   rl   Š   sj   € ä�E—N‘N EÓ*€GØ.€Nà�u×4Ñ4Ð5€Dà	‡M�M×ÑØä�7˜HÓ%Ô'=¸tÐDä�g˜t ^Ó4Ü.Øðð	
õ
r   N)"rL   Útypingr   r   Újupyter_core.utilsr   Újupyter_server.base.handlersr   r   Újupyter_server.utilsr   rh   Útornador	   Útornado.websocketr
   Újupyter_server.auth.decoratorr   ÚImportErrorÚjupyter_server.base.websocketr   Újupyter_server.base.zmqhandlersr   r   Úschemar   Úspecs.utilsr   r5   r   r'   r*   rQ   rl   r   r   r   Ú<module>r}      s¨   ðñ÷ "å +ß CÝ 7Ý Ý .ðÝ8ð?Ý<õ +Ý $Ý &à€ô�*ô ô˜ô ô5MØÐ$Ð&8ô5Môp ˜[ô  óFøðy ò ôðûð ò ?ß>ð?ús"   ¬A? ³B Á?B
Â	B
ÂBÂB