§
    éƒtjTk  ã                  ó	  — d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZ ddlmZmZmZmZmZmZmZ ddlmZmZ ddlmZ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)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4  eddg¬¦  «        Z5 G d„ de¦  «        Z6 G d„ de¦  «        Z7 G d„ de¦  «        Z8 G d„ de¦  «        Z9 G d„ de¦  «        Z: G d„ de¦  «        Z; G d„ d e¦  «        Z< G d!„ d"e¦  «        Z= G d#„ d$e¦  «        Z> G d%„ d&e¦  «        Z?d}d*„Z@d~d/„ZAdd0œdd4„ZBdd0œd€d6„ZCd�d:„ZDe5 E                    d;e8¬<¦  «        d‚d=„¦   «         ZFe5 E                    d>e8¬<¦  «        dƒd@„¦   «         ZGe5 E                    dAe8¬<¦  «        d„dB„¦   «         ZHe5 I                    dCe9¬<¦  «        d…dE„¦   «         ZJe5 I                    dF¦  «        d†dG„¦   «         ZKe5 I                    dH¦  «        d‡dI„¦   «         ZLe5 E                    dH¦  «        dˆdJ„¦   «         ZMe5 I                    dK¦  «        d‰dL„¦   «         ZNe5 O                    dK¦  «        dŠdM„¦   «         ZPe5 Q                    dK¦  «        d‰dN„¦   «         ZRe5 E                    dO¦  «         edP¦  «        fd‹dS„¦   «         ZSe5 I                    dO¦  «        dŒdT„¦   «         ZTe5 I                    dU¦  «        d�dV„¦   «         ZUe5 E                    dU¦  «         edP¦  «        fd‹dW„¦   «         ZVe5 E                    dX¦  «        dŽdZ„¦   «         ZWe5 Q                    d[¦  «        d�d^„¦   «         ZXe5 E                    d_¦  «        d�d`„¦   «         ZYe5 E                    dae¬<¦  «        d‘dc„¦   «         ZZe5 E                    dd¦  «        d’df„¦   «         Z[e5 E                    dge¬<¦  «        	 d“d”dh„¦   «         Z\ G di„ dje¦  «        Z]e5 E                    dke¬<¦  «        d•dm„¦   «         Z^e5 I                    dk¦  «        d edndodp¬q¦  «        fd–dv„¦   «         Z_e5 I                    dw¦  «        d‡dx„¦   «         Z`e5 E                    dwe?¬<¦  «        d—dy„¦   «         Zae5 Q                    dz¦  «        d˜d|„¦   «         ZbdS )™uI   SaaS API routes â€” auth, chatbot agents, knowledge feed, chat, API keys.é    )ÚannotationsN)ÚPath)Ú	AnnotatedÚLiteral)Ú	APIRouterÚBackgroundTasksÚDependsÚFileÚHTTPExceptionÚQueryÚ
UploadFile)ÚFileResponseÚStreamingResponse)Ú	BaseModelÚField)ÚChatResponseÚFeedbackResponse)Údb)Ú
agent_chat)Údatabase)Úget_settings)Úavatar_storage_dirÚdelete_kb_vectorsÚdrop_agent_storeÚingest_kb_fileÚorg_storage_dir)ÚAuthContextÚgenerate_api_keyÚget_auth_contextÚhash_passwordÚissue_user_tokenÚverify_passwordz/saasÚsaas)ÚprefixÚtagsc                  ó    — e Zd ZU  edd¬¦  «        Zded<    edd¬¦  «        Zded<    ed	d
¬¦  «        Zded<    ed	d
¬¦  «        Zded<   dS )ÚRegisterRequesté   éÈ   ©Ú
min_lengthÚ
max_lengthÚstrÚemailé   é€   Úpasswordé   éx   Ú	full_nameÚorg_nameN)	Ú__name__Ú
__module__Ú__qualname__r   r.   Ú__annotations__r1   r4   r5   © ó    ú+/var/www/html/CA-Chatbot/app/saas/router.pyr'   r'   )   s’   € € € € € € Ø� !°Ð4Ñ4Ô4€EÐ4Ð4Ð4Ñ4Ø�E Q°3Ð7Ñ7Ô7€HÐ7Ð7Ð7Ñ7Ø�U a°CÐ8Ñ8Ô8€IÐ8Ð8Ð8Ñ8Ø�E Q°3Ð7Ñ7Ô7€HÐ7Ð7Ð7Ñ7Ð7Ð7r;   r'   c                  ó>   — e Zd ZU  edd¬¦  «        Zded<   ded<   dS )ÚLoginRequestr(   r)   r*   r-   r.   r1   N)r6   r7   r8   r   r.   r9   r:   r;   r<   r>   r>   0   s9   € € € € € € Ø� !°Ð4Ñ4Ô4€EÐ4Ð4Ð4Ñ4Ø€M€M�M€M€Mr;   r>   c                  ó^   — e Zd ZU ded<   dZded<   ded<   ded<    ee¬¦  «        Zd	ed
<   dS )ÚTokenResponser-   Úaccess_tokenÚbearerÚ
token_typeÚdictÚuserÚorg)Údefault_factoryú
list[dict]ÚagentsN)r6   r7   r8   r9   rC   r   ÚlistrI   r:   r;   r<   r@   r@   5   s_   € € € € € € ØÐÐÑØ€JÐÐÐÑØ€J€J�JØ€I€I�IØ˜¨tÐ4Ñ4Ô4€FÐ4Ð4Ð4Ñ4Ð4Ð4r;   r@   c                  ó.   — e Zd ZU ded<   ded<   ded<   dS )Ú
MeResponserD   rE   rF   rH   rI   N©r6   r7   r8   r9   r:   r;   r<   rL   rL   =   s0   € € € € € € Ø€J€J�JØ€I€I�IØÐÐÑÐÐr;   rL   c                  óŠ   — e Zd ZU  edd¬¦  «        Zded<    edd¬¦  «        Zd	ed
<   dZded<    edd¬¦  «        Zd	ed<   dS )ÚAgentCreateRequestr2   éP   r*   r-   ÚnameNé�  ©Údefaultr,   ú
str | NoneÚdescriptionÚtenantz)Literal['platform', 'tenant', 'combined']Úkb_modeéô  Úwelcome_message©	r6   r7   r8   r   rQ   r9   rV   rX   rZ   r:   r;   r<   rO   rO   C   sƒ   € € € € € € Ø� ¨rÐ2Ñ2Ô2€DÐ2Ð2Ð2Ñ2Ø#˜e¨D¸SÐAÑAÔA€KÐAÐAÐAÑAØ9A€GÐAÐAÐAÑAØ"' %°ÀÐ"EÑ"EÔ"E€OÐEÐEÐEÑEÐEÐEr;   rO   c                  óŒ   — e Zd ZU  eddd¬¦  «        Zded<    edd¬¦  «        Zded	<   dZd
ed<    edd¬¦  «        Zded<   dS )ÚAgentUpdateRequestNr2   rP   )rT   r+   r,   rU   rQ   rR   rS   rV   ú0Literal['platform', 'tenant', 'combined'] | NonerX   rY   rZ   r[   r:   r;   r<   r]   r]   J   s…   € € € € € € Ø�u T°aÀBÐGÑGÔG€DÐGÐGÐGÑGØ#˜e¨D¸SÐAÑAÔA€KÐAÐAÐAÑAØ@D€GÐDÐDÐDÑDØ"' %°ÀÐ"EÑ"EÔ"E€OÐEÐEÐEÑEÐEÐEr;   r]   c                  óP   — e Zd ZU  edd¬¦  «        Zded<   dZded<   dZd	ed
<   dS )ÚAgentChatRequestr2   é   r*   r-   ÚquestionNrU   Ú
session_idr^   rX   )r6   r7   r8   r   rb   r9   rc   rX   r:   r;   r<   r`   r`   Q   sT   € € € € € € Ø�E Q°4Ð8Ñ8Ô8€HÐ8Ð8Ð8Ñ8Ø!€JÐ!Ð!Ð!Ñ!Ø@D€GÐDÐDÐDÑDÐDÐDr;   r`   c                  ó   — e Zd ZU dZded<   dS )ÚAgentChatResetRequestNrU   rc   )r6   r7   r8   rc   r9   r:   r;   r<   re   re   W   s#   € € € € € € Ø!€JÐ!Ð!Ð!Ñ!Ð!Ð!r;   re   c                  ó4   — e Zd ZU  edd¬¦  «        Zded<   dS )ÚApiKeyCreateRequestr2   rP   r*   r-   rQ   N)r6   r7   r8   r   rQ   r9   r:   r;   r<   rg   rg   [   s2   € € € € € € Ø� ¨rÐ2Ñ2Ô2€DÐ2Ð2Ð2Ñ2Ð2Ð2r;   rg   c                  óB   — e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )ÚApiKeyCreateResponser-   ÚidrQ   Ú
key_prefixÚapi_keyÚmessageNrM   r:   r;   r<   ri   ri   _   s=   € € € € € € Ø€G€G�GØ€I€I�IØ€O€O�OØ€L€L�LØ€L€L�L€L€Lr;   ri   ÚagentrD   Úreturnc                óî   — t          | ¦  «        }|                     d¦  «        rd|d         › d�|d<   nd |d<   t          |                     d¦  «        ¦  «        |d<   |                     dd ¦  «         |S )NÚavatar_pathz/saas/agents/rj   z/avatarÚ
avatar_urlÚis_main)rD   ÚgetÚboolÚpop)rn   Úouts     r<   Ú_agent_publicrx   g   s}   € Ý
ˆu‰+Œ+€CØ
‡w‚wˆ}ÑÔð !Ø>¨C°¬IÐ>Ð>Ð>ˆˆLÑÐà ˆˆLÑÝ˜#Ÿ'š' )Ñ,Ô,Ñ-Ô-€Cˆ	�NØ‡G‚GˆM˜4Ñ Ô Ð Ø€Jr;   Úauthr   Úagent_idr-   c                óv   — t          j        |¦  «        }|r|d         | j        k    rt          dd¬¦  «        ‚|S )NÚorg_idé”  zChatbot not found©Ústatus_codeÚdetail)Úsaas_dbÚ	get_agentr|   r   )ry   rz   rn   s      r<   Ú_require_agentrƒ   r   sD   € ÝÔ˜hÑ'Ô'€EØð I�E˜(”O t¤{Ò2Ð2Ý¨Ð4GÐHÑHÔHÐHØ€Lr;   ©Ú
created_byr|   r…   rU   c               óü  — ddl }t          j        | |¬¦  «        }t          j        | ¦  «        }|s|S |D ]Æ}|d         }	 t	          | |¦  «         n# t
          $ r Y nw xY w|                     d¦  «        r;	 t          |d         ¦  «                             d¬¦  «         n# t          $ r Y nw xY wt          | |¦  «        }|                     ¦   «         r |j        |d¬¦  «         t          j        |¦  «         ŒÇ|S )	zEWorkspace policy: only Alex exists. Remove any legacy extra chatbots.r   Nr„   rj   rq   T©Ú
missing_ok©Úignore_errors)Úshutilr�   Úensure_main_agentÚlist_extra_agentsr   Ú	Exceptionrt   r   ÚunlinkÚOSErrorr   ÚexistsÚrmtreeÚdelete_agent)r|   r…   r‹   ÚalexÚextrasÚextraÚaidÚfolders           r<   Ú_purge_extra_agentsr™   y   s<  € à€M€M€MåÔ$ V¸
ÐCÑCÔC€DÝÔ& vÑ.Ô.€FØð ØˆØð "ð "ˆØ�DŒkˆð	Ý˜V SÑ)Ô)Ð)Ð)øÝð 	ð 	ð 	ØˆDð	øøøà�9Š9�]Ñ#Ô#ð 	ðÝ�U˜=Ô)Ñ*Ô*×1Ò1¸TÐ1ÑBÔBÐBÐBøÝð ð ð Ø�ðøøøå  ¨Ñ-Ô-ˆØ�=Š=‰?Œ?ð 	6ØˆFŒM˜&°Ð5Ñ5Ô5Ð5ÝÔ˜SÑ!Ô!Ð!Ð!Ø€Ks$   Á AÁ
AÁAÁ7)B!Â!
B.Â-B.rH   c               ód   — t          j        | ¦  «        }|r|S t          j        | |¬¦  «        }|gS )z?List agents without running purge/chroma work on every request.r„   )r�   Úlist_agentsrŒ   )r|   r…   rI   r”   s       r<   Ú_agents_for_orgrœ   “   s;   € åÔ  Ñ(Ô(€FØð ØˆÝÔ$ V¸
ÐCÑCÔC€DØˆ6€Mr;   rE   rF   Úrolec           
     ó<  — d„ t          |d         |                      d¦  «        ¬¦  «        D ¦   «         }t          t          | ||¦  «        | d         | d         |                      d¦  «        dœ|d         |d         |d         |d	         |d
         dœ|¬¦  «        S )Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r:   ©rx   ©Ú.0Úas     r<   ú
<listcomp>z#_token_response.<locals>.<listcomp>�   s    € Ð^Ð^Ð^ 1�m˜AÑÔÐ^Ð^Ð^r;   rj   r„   r.   r4   )rj   r.   r4   rQ   ÚslugÚplanrX   ©rj   rQ   r¥   r¦   rX   )rA   rE   rF   rI   )rœ   rt   r@   r!   )rE   rF   r�   rI   s       r<   Ú_token_responser¨   œ   sª   € Ø^Ð^­¸¸D¼	ÈdÏhÊhÐW[ÉnÌnÐ(]Ñ(]Ô(]Ð^Ñ^Ô^€FÝÝ% d¨C°Ñ6Ô6Ø˜”J¨¨g¬ÀTÇXÂXÈkÑEZÔEZÐ[Ð[à�d”)Ø˜”KØ˜”KØ˜”KØ˜9”~ð
ð 
ð ðñ ô ð r;   z/auth/guest)Úresponse_modelc            	   ƒ  ó®  K  — d} t          j        | ¦  «        }|snt          j        | t          t	          j        d¦  «        ¦  «        dd¬¦  «        }t          j        |d         ¦  «        }t          j        |d         ¦  «        }d}n·t          j        |d	         ¦  «        }|st          d
d¬¦  «        ‚|d         }|d         }t          j
        |d	         ¦  «        }|s<t          j        |d	         dd|d	         |                     d¦  «        pdd¬¦  «         n"t          j        |d	         |d	         ¬¦  «         |r|sJ ‚t          |||¦  «        S )u?   Skip login for now â€” create or reuse a local guest workspace.zguest@local.devé   ÚGuestzMy Workspace©r.   Úpassword_hashr4   r5   Úuser_idr|   Úownerrj   rY   zGuest workspace missingr~   r   r�   ÚAlexz*Your main accounting and finance assistantrX   rW   T)r|   rQ   rV   r…   rX   rs   r„   )r�   Úget_user_by_emailÚcreate_user_with_orgr    ÚsecretsÚtoken_urlsafeÚget_user_by_idÚget_orgÚlist_user_orgsr   r›   Úcreate_agentrt   rŒ   r¨   )r.   rE   ÚcreatedrF   r�   ÚorgsrI   s          r<   Úguest_sessionr¼   ®   sz  è è € ð €EÝÔ$ UÑ+Ô+€DØð HÝÔ.ØÝ'­Ô(=¸bÑ(AÔ(AÑBÔBØØ#ð	
ñ 
ô 
ˆõ Ô% g¨iÔ&8Ñ9Ô9ˆÝŒo˜g hÔ/Ñ0Ô0ˆØˆˆåÔ% d¨4¤jÑ1Ô1ˆØð 	SÝ¨CÐ8QÐRÑRÔRÐRØ�1ŒgˆØ�6Œ{ˆÝÔ$ S¨¤YÑ/Ô/ˆØð 	HÝÔ Ø˜4”yØØHØ œ:ØŸš 	Ñ*Ô*Ð6¨hØðñ ô ð ð õ Ô% c¨$¤i¸DÀ¼JÐGÑGÔGÐGØÐ�CÐÐˆ<Ý˜4  dÑ+Ô+Ð+r;   z/auth/registerÚbodyc              ƒ  óð  K  — | j                              ¦   «                              ¦   «         }t          j        d|¦  «        st          dd¬¦  «        ‚t          j        |¦  «        rt          dd¬¦  «        ‚t          j        |t          | j
        ¦  «        | j        | j        ¬¦  «        }t          j        |d         ¦  «        }t          j        |d         ¦  «        }|r|sJ ‚t          ||d	¦  «        S )
Nz^[^@\s]+@[^@\s]+\.[^@\s]+$rR   zInvalid emailr~   zEmail already registeredr­   r¯   r|   r°   )r.   ÚlowerÚstripÚreÚmatchr   r�   r²   r³   r    r1   r4   r5   r¶   r·   r¨   )r½   r.   rº   rE   rF   s        r<   ÚregisterrÃ   Ô   sô   è è € àŒJ×ÒÑÔ×$Ò$Ñ&Ô&€EÝŒ8Ð1°5Ñ9Ô9ð EÝ¨°OÐDÑDÔDÐDÝÔ  Ñ'Ô'ð PÝ¨Ð4NÐOÑOÔOÐOåÔ*ØÝ# D¤MÑ2Ô2Ø”.Ø”ð	ñ ô €Gõ Ô! '¨)Ô"4Ñ5Ô5€DÝ
Œ/˜' (Ô+Ñ
,Ô
,€CØÐ�CÐÐˆ<Ý˜4  gÑ.Ô.Ð.r;   z/auth/loginc              ƒ  ó¸  K  — t          j        | j                             ¦   «                              ¦   «         ¦  «        }|rt          | j        |d         ¦  «        st          dd¬¦  «        ‚t          j        |d         ¦  «        }|st          dd¬¦  «        ‚|d         }t          j	        |d         |d         ¬	¦  «         t          |||d
         ¦  «        S )Nr®   i‘  zInvalid email or passwordr~   rj   rR   zNo organization found for userr   r„   r�   )r�   r²   r.   r¿   rÀ   r"   r1   r   r¸   rŒ   r¨   )r½   rE   r»   rF   s       r<   ÚloginrÅ   è   sÔ   è è € åÔ$ T¤Z×%5Ò%5Ñ%7Ô%7×%=Ò%=Ñ%?Ô%?Ñ@Ô@€DØð Q• t¤}°d¸?Ô6KÑLÔLð QÝ¨Ð4OÐPÑPÔPÐPÝÔ! $ t¤*Ñ-Ô-€DØð VÝ¨Ð4TÐUÑUÔUÐUØ
ˆqŒ'€CåÔ˜c $œi°D¸´JÐ?Ñ?Ô?Ð?Ý˜4  c¨&¤kÑ2Ô2Ð2r;   z/meú1Annotated[AuthContext, Depends(get_auth_context)]c           	   ƒ  óþ   K  — d„ t          | j        | j        dk    r| j        nd ¬¦  «        D ¦   «         }t	          | j        | j        | j        | j        dœ| j        | j        | j	        | j
        | j        dœ|¬¦  «        S )Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r:   r    r¡   s     r<   r¤   zme.<locals>.<listcomp>ù   s0   € ð ð ð àõ 	�aÑÔðð ð r;   Újwtr„   )rj   r.   r4   r�   r§   )rE   rF   rI   )rœ   r|   Úauth_viar¯   rL   r.   r4   r�   r5   Úorg_slugr¦   rX   )ry   rI   s     r<   ÚmerÌ   ö   s®   è è € ðð å ØŒKØ'+¤}¸Ò'=Ð'=�t”|�|À4ð
ñ 
ô 
ðñ ô €Fõ à”,Ø”ZØœØ”Ið	
ð 
ð ”+Ø”MØ”MØ”IØ”|ð
ð 
ð ðñ ô ð r;   z/statsc              ƒ  ó8   K  — t          j        | j        ¦  «        S )zFOrg-wide chatbot dashboard: documents, chunks, and feedback per agent.)r�   Úbuild_org_dashboardr|   ©ry   s    r<   Úworkspace_statsrÐ     s   è è € õ Ô& t¤{Ñ3Ô3Ð3r;   z/agentsc              ƒ  ój   K  — d„ t          | j        | j        dk    r| j        nd ¬¦  «        D ¦   «         S )Nc                ó,   — g | ]}t          |¦  «        ‘ŒS r:   r    r¡   s     r<   r¤   zlist_agents.<locals>.<listcomp>  s0   € ð ð ð àõ 	�aÑÔðð ð r;   rÉ   r„   )rœ   r|   rÊ   r¯   rÏ   s    r<   r›   r›     sP   è è € ðð å ØŒKØ'+¤}¸Ò'=Ð'=�t”|�|À4ð
ñ 
ô 
ðñ ô ð r;   c           	   ƒ  ó
  K  — | j         pd                     ¦   «         }|st          dd¬¦  «        ‚|                     ¦   «         dk    rt          dd¬¦  «        ‚t	          j        |j        ¦  «        }t          |¦  «        dk    rt          dd¬¦  «        ‚t	          j        |j        |j	        ¬	¦  «         t	          j
        |j        || j        |j	        | j        d
v r| j        nd| j        d¬¦  «        }t          |¦  «        S )zLCreate an additional chatbot alongside Alex (Alex stays the main assistant).Ú rR   zName is requiredr~   r”   õ=   Alex is reserved as the main assistant â€” pick another name.é   z!You can have at most 20 chatbots.r„   >   rW   ÚcombinedrW   F)r|   rQ   rV   r…   rX   rZ   rs   )rQ   rÀ   r   r¿   r�   r›   r|   ÚlenrŒ   r¯   r¹   rV   rX   rZ   rx   )r½   ry   rQ   Úexistingrn   s        r<   r¹   r¹   %  s  è è € ð ŒIˆO˜×"Ò"Ñ$Ô$€DØð HÝ¨Ð4FÐGÑGÔGÐGØ‡z‚z�|„|�vÒÐÝØØRð
ñ 
ô 
ð 	
õ Ô" 4¤;Ñ/Ô/€HÝ
ˆ8�}„}˜ÒÐÝ¨Ð4WÐXÑXÔXÐXÝÔ˜dœk°d´lÐCÑCÔCÐCÝÔ ØŒ{ØØÔ$Ø”<Ø $¤Ð0FÐ FÐ F�”�ÈHØÔ,Øðñ ô €Eõ ˜ÑÔÐr;   z/agents/{agent_id}c              ƒ  ó†   K  — t          || ¦  «        }t          j        |j        | ¦  «        }t	          |¦  «        }||d<   |S )NÚ	documents)rƒ   r�   Úlist_kb_documentsr|   rx   )rz   ry   rn   Údocsrw   s        r<   r‚   r‚   C  sG   è è € õ
 ˜4 Ñ*Ô*€EÝÔ$ T¤[°(Ñ;Ô;€DÝ
˜Ñ
Ô
€CØ€CˆÑØ€Jr;   c              ƒ  óŠ  K  — t          || ¦  «        }|                     d¦  «        rd}nY|j        p|                     d¦  «        pd                     ¦   «         }|                     ¦   «         dk    rt          dd¬¦  «        ‚|j        }|d	vrd
}t          j        | ||j	        ||j
        ¬¦  «        }t          |pi ¦  «        S )Nrs   r±   rQ   Ú	Assistantr”   rR   rÕ   r~   >   NrW   r×   rW   )rQ   rV   rX   rZ   )rƒ   rt   rQ   rÀ   r¿   r   rX   r�   Úupdate_agentrV   rZ   rx   )rz   r½   ry   rn   rQ   rX   Úupdateds          r<   rà   rà   O  så   è è € õ ˜4 Ñ*Ô*€Eà‡y‚y�ÑÔð Øˆˆà”	Ð=˜UŸYšY vÑ.Ô.Ð=°+×DÒDÑFÔFˆØ�:Š:‰<Œ<˜6Ò!Ð!ÝØØVðñ ô ð ð Œl€GØÐ2Ð2Ð2ØˆÝÔ"ØØØÔ$ØØÔ,ðñ ô €Gõ ˜˜ BÑ'Ô'Ð'r;   c              ƒ  ó  K  — t          || ¦  «        }|                     d¦  «        rt          dd¬¦  «        ‚	 t          |j        | ¦  «         n# t
          $ r Y nw xY w|                     d¦  «        r;	 t          |d         ¦  «                             d¬¦  «         n# t          $ r Y nw xY wt          |j        | ¦  «        }| 
                    ¦   «         rt          j        |d¬¦  «         t          j        | ¦  «         d| d	œS )
Nrs   é“  z1Alex is the main assistant and cannot be deleted.r~   rq   Tr‡   r‰   )ÚokÚdeleted)rƒ   rt   r   r   r|   rŽ   r   r�   r�   r   r‘   r‹   r’   r�   r“   )rz   ry   rn   r˜   s       r<   r“   r“   m  s7  è è € õ
 ˜4 Ñ*Ô*€EØ‡y‚y�ÑÔð 
ÝØØFð
ñ 
ô 
ð 	
ð
Ý˜œ hÑ/Ô/Ð/Ð/øÝð ð ð Øˆðøøøà‡y‚y�ÑÔð ð	Ý��}Ô%Ñ&Ô&×-Ò-¸Ð-Ñ>Ô>Ð>Ð>øÝð 	ð 	ð 	ØˆDð	øøøå˜Tœ[¨(Ñ3Ô3€FØ‡}‚}�„ð 2ÝŒ�f¨DÐ1Ñ1Ô1Ð1ÝÔ˜Ñ"Ô"Ð"Ø 8Ð,Ð,Ð,s#   ºA Á
AÁAÁ6)B  Â 
B-Â,B-z/agents/{agent_id}/avatar.Úfiler   c              ƒ  ó  K  — t          || ¦  «         |j        st          dd¬¦  «        ‚t          |j        ¦  «        j                             ¦   «         }|dvrt          dd¬¦  «        ‚|                     ¦   «         ƒ d {V —†}|rt          |¦  «        dk    rt          dd¬¦  «        ‚t          |j	        ¦  «        | › |› �z  }| 
                    |¦  «         t          j        | t          |¦  «        ¬¦  «        }t          |pi ¦  «        S )	NrR   úFilename requiredr~   >   ú.gifú.jpgú.pngú.jpegú.webpzUse PNG, JPG, WEBP, or GIFi  P zAvatar must be under 5 MB)rq   )rƒ   Úfilenamer   r   Úsuffixr¿   ÚreadrØ   r   r|   Úwrite_bytesr�   rà   r-   rx   )rz   ry   ræ   rï   ÚrawÚdestrá   s          r<   Úupload_avatarrô   ‰  s!  è è € õ �4˜Ñ"Ô"Ð"ØŒ=ð IÝ¨Ð4GÐHÑHÔHÐHÝ�$”-Ñ Ô Ô'×-Ò-Ñ/Ô/€FØÐ?Ð?Ð?Ý¨Ð4PÐQÑQÔQÐQØ—	’	‘”Ð
Ð
Ð
Ð
Ð
Ð
€CØð Q•#�c‘(”(˜_Ò,Ð,Ý¨Ð4OÐPÑPÔPÐPÝ˜dœkÑ*Ô*°Ð-B¸&Ð-BÐ-BÑB€DØ×Ò�SÑÔÐÝÔ" 8½¸T¹¼ÐCÑCÔC€GÝ˜˜ BÑ'Ô'Ð'r;   c              ƒ  ó  K  — t          j        | ¦  «        }|r|                     d¦  «        st          dd¬¦  «        ‚t	          |d         ¦  «        }|                     ¦   «         st          dd¬¦  «        ‚t          |¦  «        S )Nrq   r}   z	No avatarr~   zAvatar file missing)r�   r‚   rt   r   r   r‘   r   )rz   rn   Úpaths      r<   Ú
get_avatarr÷   ž  s‹   è è € åÔ˜hÑ'Ô'€EØð A˜Ÿ	š	 -Ñ0Ô0ð AÝ¨°KÐ@Ñ@Ô@Ð@Ý��mÔ$Ñ%Ô%€DØ�;Š;‰=Œ=ð KÝ¨Ð4IÐJÑJÔJÐJÝ˜ÑÔÐr;   z/agents/{agent_id}/documentsc              ƒ  óZ   K  — t          || ¦  «         t          j        |j        | ¦  «        S ©N)rƒ   r�   rÜ   r|   )rz   ry   s     r<   Úlist_agent_documentsrú   «  s-   è è € õ
 �4˜Ñ"Ô"Ð"ÝÔ$ T¤[°(Ñ;Ô;Ð;r;   c              ƒ  óÌ  ‡ ‡	‡
‡‡K  — t          |‰ ¦  «         |j        st          dd¬¦  «        ‚t          |j        ¦  «        j                             ¦   «         }|dvrt          dd¬¦  «        ‚|                     ¦   «         ƒ d {V —†}|st          dd¬¦  «        ‚t          |¦  «        dk    rt          dd¬¦  «        ‚t          j	        d	d
|j        ¦  «        d d…         Št          j        |j        ‰|j        |j        dk    r|j        nd ‰ ¬¦  «        }t!          |j        ‰ ¦  «        |d         › d
‰› �z  Š	‰	                     |¦  «         t          j        |d         dddd¬¦  «         |j        Š|d         Š
dˆ ˆ	ˆ
ˆˆfd„}t'          j         |¦   «         ¦  «         t          j        ‰
¦  «        }t          j        ‰ ¦  «        }|dd|rt/          |¦  «        nd ddœS )NrR   rè   r~   >   ú.mdú.csvú.pdfú.txtú	.markdownz"Supported types: PDF, TXT, MD, CSVz
Empty filei  �zFile too large (max 25 MB)z
[^\w.\- ]+Ú_é´   rÉ   )r|   rî   Úcontent_typeÚuploaded_byrz   rj   Ú
processingu	   Queuedâ€¦r2   rÔ   )ÚstatusÚprogress_stageÚprogress_pctÚerrorro   ÚNonec               “  óz   •K  — 	 t          j        t          ‰‰‰‰‰ ¬¦  «        ƒ d {V —† d S # t          $ r Y d S w xY w©N)rz   ©ÚasyncioÚ	to_threadr   rŽ   ©rz   ró   Údoc_idr|   Ú	safe_names   €€€€€r<   Ú_run_ingestz*upload_agent_document.<locals>._run_ingestÝ  s„   øè è € ð	ÝÔ#ÝØØØØØ!ðñ ô ð ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	àˆDˆDð	øøøó   …%, ¬
:¹:r   Tu3   Processing started â€” watch progress in Knowledge.)ÚdocumentÚchunks_indexedÚasyncrn   rm   ©ro   r
  )rƒ   rî   r   r   rï   r¿   rð   rØ   rÁ   Úsubr�   Úcreate_kb_documentr|   r  rÊ   r¯   r   rñ   Úupdate_kb_documentr  Úcreate_taskÚget_kb_documentr‚   rx   )rz   ry   ræ   rï   rò   Údocr  rá   rn   ró   r  r|   r  s   `        @@@@r<   Úupload_agent_documentr  ´  sN  øøøøøè è € õ �4˜Ñ"Ô"Ð"ØŒ=ð IÝ¨Ð4GÐHÑHÔHÐHÝ�$”-Ñ Ô Ô'×-Ò-Ñ/Ô/€FØÐAÐAÐAÝ¨Ð4XÐYÑYÔYÐYà—	’	‘”Ð
Ð
Ð
Ð
Ð
Ð
€CØð BÝ¨°LÐAÑAÔAÐAÝ
ˆ3�x„xÐ"Ò"Ð"Ý¨Ð4PÐQÑQÔQÐQå”�} c¨4¬=Ñ9Ô9¸$¸3¸$Ô?€IÝ
Ô
$ØŒ{ØØÔ&Ø$(¤M°UÒ$:Ð$:�D”L�LÀØðñ ô €Cõ ˜4œ;¨Ñ1Ô1°s¸4´yÐ4NÐ4NÀ9Ð4NÐ4NÑN€DØ×Ò�SÑÔÐåÔØˆDŒ	ØØ"ØØðñ ô ð ð Œ[€FØ�ŒY€Fðð ð ð ð ð ð ð ð ð õ Ô˜˜™œÑ&Ô&Ð&åÔ% fÑ-Ô-€GÝÔ˜hÑ'Ô'€EàØØØ).Ð8•˜uÑ%Ô%Ð%°DØHðð ð r;   z+/agents/{agent_id}/documents/{doc_id}/retryr  c              ƒ  óÊ  ‡ ‡‡‡	‡
K  — t          |‰ ¦  «         t          j        ‰¦  «        }|r*|d         |j        k    s|                     d¦  «        ‰ k    rt          dd¬¦  «        ‚t          |j        ‰ ¦  «        }t          |                     ‰› d�¦  «        ¦  «        }|st          dd¬¦  «        ‚|d         Š|                     d	¦  «        p‰j	        Š
t          j        t          |j        ‰‰ ¦  «        ƒ d {V —† t          j        ‰d
ddddddd¬¦	  «	         |j        Š	dˆ ˆˆˆ	ˆ
fd„}t          j         |¦   «         ¦  «         t          j        ‰¦  «        }|dddœS )Nr|   rz   r}   úDocument not foundr~   ú_*u*   Original file missing â€” please re-uploadr   rî   r  u   Retryingâ€¦r2   rÔ   )r  r  r  r	  Úchunk_countÚembeddings_doneÚvectors_storedÚchunks_createdro   r
  c               “  óz   •K  — 	 t          j        t          ‰‰‰‰‰ ¬¦  «        ƒ d {V —† d S # t          $ r Y d S w xY wr  r  r  s   €€€€€r<   r  z)retry_agent_document.<locals>._run_ingest  s„   øè è € ð
	ÝÔ#ÝØØØØØ!ðñ ô ð ð ð ð ð ð ð ð ð øõ ð 	ð 	ð 	ØˆDˆDð	øøør  Tu.   Retry started â€” watch progress in Knowledge.)r  r  rm   r  )rƒ   r�   r  r|   rt   r   r   ÚsortedÚglobrQ   r  r  r   r  r  )rz   r  ry   r  r˜   Úmatchesr  rá   ró   r|   r  s   ``      @@@r<   Úretry_agent_documentr+  ø  s»  øøøøøè è € õ �4˜Ñ"Ô"Ð"Ý
Ô
! &Ñ
)Ô
)€CØð J�#�h”- 4¤;Ò.Ð.°#·'²'¸*Ñ2EÔ2EÈÒ2QÐ2QÝ¨Ð4HÐIÑIÔIÐIå˜Tœ[¨(Ñ3Ô3€FÝ�V—[’[ F   Ñ/Ô/Ñ0Ô0€GØð bÝ¨Ð4`ÐaÑaÔaÐaØ�1Œ:€DØ—’˜
Ñ#Ô#Ð0 t¤y€Iå
Ô
Õ-¨t¬{¸FÀHÑ
MÔ
MÐMÐMÐMÐMÐMÐMÐMÝÔØØØ$ØØØØØØð
ñ 
ô 
ð 
ð Œ[€Fðð ð ð ð ð ð ð ð ð õ Ô˜˜™œÑ&Ô&Ð&ÝÔ% fÑ-Ô-€GàØØCðð ð r;   z%/agents/{agent_id}/documents/{doc_id}Úbackground_tasksr   c              ƒ  óè  K  — t          || ¦  «         t          j        |¦  «        }|r*|d         |j        k    s|                     d¦  «        | k    rt          dd¬¦  «        ‚t          j        |¦  «         t          |j        | ¦  «        }|                     |› d�¦  «        D ]'}	 | 	                    ¦   «          Œ# t          $ r Y Œ$w xY w|                     t          |j        || ¦  «         d|dœS )	Nr|   rz   r}   r!  r~   r"  T)rä   r  )rƒ   r�   r  r|   rt   r   Údelete_kb_documentr   r)  r�   r�   Úadd_taskr   )rz   r  ry   r,  r  r˜   rö   s          r<   Údelete_agent_documentr0  /  s  è è € õ �4˜Ñ"Ô"Ð"Ý
Ô
! &Ñ
)Ô
)€CØð J�#�h”- 4¤;Ò.Ð.°#·'²'¸*Ñ2EÔ2EÈÒ2QÐ2QÝ¨Ð4HÐIÑIÔIÐIåÔ˜vÑ&Ô&Ð&Ý˜Tœ[¨(Ñ3Ô3€FØ—’˜v˜M˜M˜MÑ*Ô*ð ð ˆð	Ø�KŠK‰MŒMˆMˆMøÝð 	ð 	ð 	ØˆDð	øøøð ×ÒÕ/°´¸fÀhÑOÔOÐOØ &Ð)Ð)Ð)s   Â(B=Â=
C
Ã	C
z/agents/{agent_id}/chat/resetc              ƒ  ó�   K  — ddl m} t          || ¦  «         |j        pd                     ¦   «         pd}|r ||¦  «         d|dœS )zJClear in-memory follow-up turns so the next message starts a fresh thread.r   )Úclear_turnsrÔ   NT)rä   rc   )Úapp.saas.conversationr2  rƒ   rc   rÀ   )rz   r½   ry   r2  Úsids        r<   Úreset_agent_chatr5  I  sm   è è € ð 2Ð1Ð1Ð1Ð1Ð1å�4˜Ñ"Ô"Ð"ØŒ?Ð ˜b×
'Ò
'Ñ
)Ô
)Ð
1¨T€CØ
ð Øˆ�CÑÔÐØ cÐ*Ð*Ð*r;   z/agents/{agent_id}/chatr   c              ƒ  óò   K  — t          || ¦  «         	 t          j        t          |j        || |j        |j        ¬¦  «        ƒ d {V —†S # t          $ r$}t          dt          |¦  «        ¬¦  «        |‚d }~ww xY w)N)rb   ry   rz   rc   rX   i÷  r~   )
rƒ   r  r  r   rb   rc   rX   ÚRuntimeErrorr   r-   )rz   r½   ry   Úexcs       r<   Úchat_with_agentr9  Y  s®   è è € õ �4˜Ñ"Ô"Ð"ð
GÝÔ&ÝØ”]ØØØ”Ø”Lð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
øõ ð Gð Gð GÝ¨µC¸±H´HÐ=Ñ=Ô=À3ÐFøøøøðGøøøs   ”3A Á
A6ÁA1Á1A6z/agents/{agent_id}/chat/streamr   c              ƒ  óF  ‡ ‡‡‡‡‡‡K  — t          ‰‰ ¦  «         t          j        ¦   «         Št          j        ¦   «         Šdˆˆfd„Šdˆˆfd„Šdˆ ˆˆˆˆˆˆfd„}t          j        t          j        |¦  «        ¦  «         ˆfd	„}t           |¦   «         d
ddddœ¬¦  «        S )zJStream assistant tokens via Server-Sent Events, then a final done payload.Úchunkr-   ro   r
  c                óB   •— ‰                      ‰j        d| f¦  «         d S )NÚtoken©Úcall_soon_threadsafeÚ
put_nowait)r;  ÚloopÚqueues    €€r<   Úon_tokenz(chat_with_agent_stream.<locals>.on_tokenx  s'   ø€ Ø×!Ò! %Ô"2°W¸eÐ4DÑEÔEÐEÐEÐEr;   r  c                óB   •— ‰                      ‰j        d| f¦  «         d S )Nr  r>  )r  rA  rB  s    €€r<   Ú	on_statusz)chat_with_agent_stream.<locals>.on_status{  s'   ø€ Ø×!Ò! %Ô"2°X¸vÐ4FÑGÔGÐGÐGÐGr;   c            	     ó  •— 	 t          ‰j        ‰‰‰j        ‰j        ‰‰¬¦  «        } ‰                     ‰j        d| f¦  «         d S # t          $ r5}‰                     ‰j        dt          |¦  «        f¦  «         Y d }~d S d }~ww xY w)N)rb   ry   rz   rc   rX   rC  rE  Údoner	  )r   rb   rc   rX   r?  r@  rŽ   r-   )	Úresponser8  rz   ry   r½   rA  rE  rC  rB  s	     €€€€€€€r<   Úrun_chatz(chat_with_agent_stream.<locals>.run_chat~  s·   ø€ ð	MÝ!ØœØØ!Øœ?ØœØ!Ø#ðñ ô ˆHð ×%Ò% eÔ&6¸ÀÐ8JÑKÔKÐKÐKÐKøÝð 	Mð 	Mð 	MØ×%Ò% eÔ&6¸Å#ÀcÁ(Ä(Ð8KÑLÔLÐLÐLÐLÐLÐLÐLÐLøøøøð	Møøøs   ƒAA Á
BÁ*BÂBc                ó”  •K  — 	 ‰                      ¦   «         ƒ d {V —†\  } }| dk    rdt          j        d|i¦  «        › d�W V — nƒ| dk    rdt          j        d|i¦  «        › d�W V — n_| d	k    r4t          |t          ¦  «        sJ ‚d
|                     ¦   «         › d�W V — d S | dk    rdt          j        d|i¦  «        › d�W V — d S ŒÅ)NTr=  zevent: token
data: Úcontentz

r  zevent: status
data: ÚphaserG  zevent: done
data: r	  zevent: error
data: r€   )rt   ÚjsonÚdumpsÚ
isinstancer   Úmodel_dump_json)ÚkindÚpayloadrB  s     €r<   Úevent_streamz,chat_with_agent_stream.<locals>.event_stream�  s!  øè è € ð	Ø"'§)¢)¡+¤+Ð-Ð-Ð-Ð-Ð-Ð-‰MˆD�'Ø�wŠˆØS­T¬Z¸ÀGÐ8LÑ-MÔ-MÐSÐSÐSÐSÐSÐSÐSÐSØ˜Ò!Ð!ØR­d¬j¸'À7Ð9KÑ.LÔ.LÐRÐRÐRÐRÐRÐRÐRÐRØ˜’�Ý! '­<Ñ8Ô8Ð8Ð8Ð8ØK¨G×,CÒ,CÑ,EÔ,EÐKÐKÐKÐKÐKÐKÐKØ�Ø˜’�ØR­T¬Z¸À7Ð8KÑ-LÔ-LÐRÐRÐRÐRÐRÐRÐRØ�ð	r;   ztext/event-streamzno-cachez
keep-aliveÚno)zCache-ControlÚ
ConnectionzX-Accel-Buffering)Ú
media_typeÚheaders)r;  r-   ro   r
  )r  r-   ro   r
  r  )rƒ   r  Úget_running_loopÚQueuer  r  r   )	rz   r½   ry   rI  rS  rA  rE  rC  rB  s	   ```  @@@@r<   Úchat_with_agent_streamrZ  m  sC  øøøøøøøè è € õ �4˜Ñ"Ô"Ð"ÝÔ#Ñ%Ô%€DÝ/6¬}©¬€EðFð Fð Fð Fð Fð Fð FðHð Hð Hð Hð Hð Hð HðMð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mõ Ô�Ô)¨(Ñ3Ô3Ñ4Ô4Ð4ðð ð ð ð õ Øˆ‰ŒØ&à'Ø&Ø!%ð
ð 
ðñ ô ð r;   z/agent/chatc              ƒ  ó¬   K  — t          j        |j        ¦  «        }|st          dd¬¦  «        ‚|p|d         d         }t	          || |¦  «        ƒ d {V —†S )NrR   zCreate a chatbot firstr~   r   rj   )r�   r›   r|   r   r9  )r½   ry   rz   rI   Útargets        r<   Úsaas_agent_chat_legacyr]  ª  sm   è è € õ Ô  ¤Ñ-Ô-€FØð NÝ¨Ð4LÐMÑMÔMÐMØÐ(˜ œ 4œ€FÝ  ¨¨tÑ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4r;   c                  óì   — e Zd ZU  eddd¬¦  «        Zded<    edd¬¦  «        Zded<   d	ed
<    edd¬¦  «        Zded<   dZded<   dZ	ded<    edd¬¦  «        Z
ded<    edd¬¦  «        Zded<   dS )ÚAgentFeedbackRequest.r2   ra   r*   r-   rb   )r+   ÚanswerzLiteral['up', 'down']ÚratingNrS   rU   Ú
correctionrc   z
int | NoneÚlog_idrP   Ú
message_idé(   Úmode)r6   r7   r8   r   rb   r9   r`  rb  rc   rc  rd  rf  r:   r;   r<   r_  r_  ·  sâ   € € € € € € Ø�E˜#¨!¸Ð=Ñ=Ô=€HÐ=Ð=Ð=Ñ=Ø�%˜¨Ð*Ñ*Ô*€FÐ*Ð*Ð*Ñ*Ø!Ð!Ð!Ñ!Ø"˜U¨4¸DÐAÑAÔA€JÐAÐAÐAÑAØ!€JÐ!Ð!Ð!Ñ!Ø€FÐÐÐÑØ"˜U¨4¸BÐ?Ñ?Ô?€JÐ?Ð?Ð?Ñ?Ø�u T°bÐ9Ñ9Ô9€DÐ9Ð9Ð9Ñ9Ð9Ð9r;   r_  z/agents/{agent_id}/feedbackr   c              ƒ  ó  K  — t          || ¦  «         t          j        |j        |j        |j        |j        |j        |j        |j	        | |j
        |j        |j        t          ¦   «         j        ¬¦  «        }t          |d|j        ¬¦  «        S )zPSave thumbs up/down for this agent into SQLite (used for future model training).)rc  rc   rb   r`  ra  rb  r|   rz   r¯   rd  rf  Ú
model_nameu7   Thanks â€” your rating was saved for model improvement.)Úfeedback_idrm   ra  )rƒ   Úcore_dbÚsave_feedbackrc  rc   rb   r`  ra  rb  r|   r¯   rd  rf  r   Úollama_modelr   )rz   r½   ry   ri  s       r<   Úsubmit_agent_feedbackrm  Â  s’   è è € õ �4˜Ñ"Ô"Ð"ÝÔ'ØŒ{Ø”?Ø”ØŒ{ØŒ{Ø”?ØŒ{ØØ”Ø”?ØŒYÝ‘>”>Ô.ðñ ô €Kõ ØØIØŒ{ðñ ô ð r;   é2   r2   rY   )rT   ÚgeÚlera  úLiteral['up', 'down'] | NoneÚlimitÚintc              ƒ  óš   K  — t          || ¦  «         t          j        |d||j        | ¬¦  «        }t	          |¦  «        d„ |D ¦   «         dœS )z0List feedback for this agent (workspace scoped).r   )rr  Úoffsetra  r|   rz   c                ó  — g | ]…}|d          |d         |d         |d         |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        |                      d¦  «        d	œ	‘Œ†S )
rj   ra  rb   r`  rb  rf  rh  rd  Ú
created_at)	rj   ra  rb   r`  rb  rf  rh  rd  rw  )rt   )r¢   Úrs     r<   r¤   z'list_agent_feedback.<locals>.<listcomp>ñ  s–   € ð 
ð 
ð 
ð ð ˜”gØ˜Hœ+Ø˜jœMØ˜Hœ+ØŸeše LÑ1Ô1ØŸš˜f™œØŸeše LÑ1Ô1ØŸeše LÑ1Ô1ØŸeše LÑ1Ô1ð
ð 
ð
ð 
ð 
r;   )ÚcountÚitems)rƒ   rj  Úget_feedbackr|   rØ   )rz   ry   ra  rr  Úrowss        r<   Úlist_agent_feedbackr}  ß  sx   è è € õ �4˜Ñ"Ô"Ð"ÝÔØØØØŒ{Øðñ ô €Dõ �T‘”ð
ð 
ð ð
ñ 
ô 
ðð ð r;   z	/api-keysc              ƒ  ól   K  — | j         dvrt          dd¬¦  «        ‚t          j        | j        ¦  «        S )N>   Úadminr°   rã   úOwner/admin onlyr~   )r�   r   r�   Úlist_api_keysr|   rÏ   s    r<   Ú	list_keysr‚    s;   è è € à„yÐ*Ð*Ð*Ý¨Ð4FÐGÑGÔGÐGÝÔ  ¤Ñ-Ô-Ð-r;   c              ƒ  óî   K  — |j         dvrt          dd¬¦  «        ‚t          ¦   «         \  }}}t          j        |j        | j        |||j        ¬¦  «        }t          |d         |d         ||d¬	¦  «        S )
N>   r  r°   rã   r€  r~   )r|   rQ   rk   Úkey_hashr…   rj   rQ   u1   Copy this key now â€” it will not be shown again.)rj   rQ   rk   rl   rm   )	r�   r   r   r�   Úcreate_api_keyr|   rQ   r¯   ri   )r½   ry   rò   r$   r„  Úrows         r<   Ú
create_keyr‡    s˜   è è € ð
 „yÐ*Ð*Ð*Ý¨Ð4FÐGÑGÔGÐGÝ,Ñ.Ô.Ñ€Cˆ�Ý
Ô
 ØŒ{ØŒYØØØ”<ðñ ô €Cõ  ØˆtŒ9Ø�Œ[ØØØCðñ ô ð r;   z/api-keys/{key_id}Úkey_idc              ƒ  óž   K  — |j         dvrt          dd¬¦  «        ‚t          j        | |j        ¦  «        }|st          dd¬¦  «        ‚d| dœS )	N>   r  r°   rã   r€  r~   r}   zAPI key not foundT)rä   rˆ  )r�   r   r�   Úrevoke_api_keyr|   )rˆ  ry   rä   s      r<   Ú
revoke_keyr‹  #  si   è è € ð
 „yÐ*Ð*Ð*Ý¨Ð4FÐGÑGÔGÐGÝ	Ô	 ¨¬Ñ	4Ô	4€BØð IÝ¨Ð4GÐHÑHÔHÐHØ &Ð)Ð)Ð)r;   )rn   rD   ro   rD   )ry   r   rz   r-   ro   rD   )r|   r-   r…   rU   ro   rD   )r|   r-   r…   rU   ro   rH   )rE   rD   rF   rD   r�   r-   ro   r@   )ro   r@   )r½   r'   ro   r@   )r½   r>   ro   r@   )ry   rÆ   ro   rL   )ry   rÆ   ro   rD   )ry   rÆ   ro   rH   )r½   rO   ry   rÆ   ro   rD   )rz   r-   ry   rÆ   ro   rD   )rz   r-   r½   r]   ry   rÆ   ro   rD   )rz   r-   ry   rÆ   ræ   r   ro   rD   )rz   r-   )rz   r-   ry   rÆ   ro   rH   )rz   r-   r  r-   ry   rÆ   ro   rD   )
rz   r-   r  r-   ry   rÆ   r,  r   ro   rD   )rz   r-   r½   re   ry   rÆ   ro   rD   )rz   r-   r½   r`   ry   rÆ   ro   r   )rz   r-   r½   r`   ry   rÆ   ro   r   rù   )r½   r`   ry   rÆ   rz   rU   ro   r   )rz   r-   r½   r_  ry   rÆ   ro   r   )
rz   r-   ry   rÆ   ra  rq  rr  rs  ro   rD   )r½   rg   ry   rÆ   ro   ri   )rˆ  r-   ry   rÆ   ro   rD   )cÚ__doc__Ú
__future__r   r  rM  rÁ   r´   r‹   Úpathlibr   Útypingr   r   Úfastapir   r   r	   r
   r   r   r   Úfastapi.responsesr   r   Úpydanticr   r   Úapp.models.schemasr   r   Úapp.saasr   r�   Úapp.saas.agentr   Úappr   rj  Ú
app.configr   Úapp.saas.kbr   r   r   r   r   Úapp.saas.securityr   r   r   r    r!   r"   Úrouterr'   r>   r@   rL   rO   r]   r`   re   rg   ri   rx   rƒ   r™   rœ   r¨   Úpostr¼   rÃ   rÅ   rt   rÌ   rÐ   r›   r¹   r‚   Úpatchrà   Údeleter“   rô   r÷   rú   r  r+  r0  r5  r9  rZ  r]  r_  rm  r}  r‚  r‡  r‹  r:   r;   r<   ú<module>rž     sP	  ðØ OÐ Oà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ø =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø "Ð "Ð "Ð "Ð "Ð "Ø %Ð %Ð %Ð %Ð %Ð %Ø #Ð #Ð #Ð #Ð #Ð #Ø #Ð #Ð #Ð #Ð #Ð #ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 
ˆ˜'¨¨Ð	1Ñ	1Ô	1€ð8ð 8ð 8ð 8ð 8�iñ 8ô 8ð 8ðð ð ð ð �9ñ ô ð ð
5ð 5ð 5ð 5ð 5�Iñ 5ô 5ð 5ðð ð ð ð �ñ ô ð ðFð Fð Fð Fð F˜ñ Fô Fð FðFð Fð Fð Fð F˜ñ Fô Fð FðEð Eð Eð Eð E�yñ Eô Eð Eð"ð "ð "ð "ð "˜Iñ "ô "ð "ð3ð 3ð 3ð 3ð 3˜)ñ 3ô 3ð 3ðð ð ð ð ˜9ñ ô ð ðð ð ð ðð ð ð ð BFð ð ð ð ð ð ð4 >Bð ð ð ð ð ð ðð ð ð ð$ ‡‚ˆ]¨=€Ñ9Ô9ð",ð ",ð ",ñ :Ô9ð",ðJ ‡‚Ð¨m€Ñ<Ô<ð/ð /ð /ñ =Ô<ð/ð& ‡‚ˆ]¨=€Ñ9Ô9ð
3ð 
3ð 
3ñ :Ô9ð
3ð ‡‚ˆE *€Ñ-Ô-ðð ð ñ .Ô-ðð6 ‡‚ˆHÑÔð4ð 4ð 4ñ Ôð4ð ‡‚ˆIÑÔðð ð ñ Ôðð ‡‚ˆYÑÔð ð  ð  ñ Ôð ð: ‡‚Ð Ñ!Ô!ðð ð ñ "Ô!ðð ‡‚Ð"Ñ#Ô#ð(ð (ð (ñ $Ô#ð(ð: ‡‚Ð#Ñ$Ô$ð-ð -ð -ñ %Ô$ð-ð6 ‡‚Ð(Ñ)Ô)ð �t˜C‘y”yð(ð (ð (ð (ñ *Ô)ð(ð( ‡‚Ð'Ñ(Ô(ðð ð ñ )Ô(ðð ‡‚Ð*Ñ+Ô+ð<ð <ð <ñ ,Ô+ð<ð ‡‚Ð+Ñ,Ô,ð �t˜C‘y”yð@ð @ð @ð @ñ -Ô,ð@ðF ‡‚Ð:Ñ;Ô;ð3ð 3ð 3ñ <Ô;ð3ðl ‡‚Ð6Ñ7Ô7ð*ð *ð *ñ 8Ô7ð*ð2 ‡‚Ð,Ñ-Ô-ð+ð +ð +ñ .Ô-ð+ð ‡‚Ð&°|€ÑDÔDðGð Gð Gñ EÔDðGð& ‡‚Ð-Ñ.Ô.ð8ð 8ð 8ñ /Ô.ð8ðx ‡‚ˆ]¨<€Ñ8Ô8ð  ð	5ð 	5ð 	5ð 	5ñ 9Ô8ð	5ð:ð :ð :ð :ð :˜9ñ :ô :ð :ð ‡‚Ð*Ð;K€ÑLÔLðð ð ñ MÔLðð8 ‡‚Ð)Ñ*Ô*ð ,0Ø�˜r a¨CÐ0Ñ0Ô0ð	ð ð ð ñ +Ô*ððH ‡‚ˆKÑÔð.ð .ð .ñ Ôð.ð ‡‚ˆ[Ð)=€Ñ>Ô>ðð ð ñ ?Ô>ðð. ‡‚Ð#Ñ$Ô$ð	*ð 	*ð 	*ñ %Ô$ð	*ð 	*ð 	*r;   