
    Y6j                    n   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ dZ ed	d
e ed      d      ZddZddZej%                         	 	 d	 	 	 	 	 	 	 	 	 dd       Zej%                         	 	 d	 	 	 	 	 	 	 	 	 dd       Zej%                         	 	 	 d	 	 	 	 	 	 	 	 	 	 	 dd       Zej%                         	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d d       Zej%                         	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d!d       Zej%                         dd"d       Zej%                         d#d$d       Zd Zy)%uP   MCP del Workspace Agent — herramientas para guardar informes en files/agents/.    )annotationsN)FastMCP)TransportSecuritySettings)settings)agent_workspace_storagez/mcpzPIE360 Agent StorageTF)enable_dns_rebinding_protectionu   Guarda informes generados (PDF, Word, texto) en el servidor PIE360. Usa agent_id del workspace agent. Flujo: save_informe_texto → save_agent_pdf o save_agent_docx.)namestateless_httpstreamable_http_pathtransport_securityinstructionsc                h    t         j                  sy | r| t         j                  k7  rt        d      y y )Nu   Secret inválido.)r   
mcp_secret
ValueErrorsecrets    Q/var/www/pie360backend.cl/public_html/app/backend/services/agent_workspace_mcp.py_check_secretr       s1    &H///,-- 0v    c                p    | j                         }|j                         j                  |      s| | S |S )N)striplowerendswith)filenameextr	   s      r   _ensure_extensionr   '   s5    >>D::<  %u~Kr   c                    t        |       t        j                  |      }t        | d      }t        j                  ||      }|j                  t        j                  |d             t        j                  |||      S )z*Guarda un PDF en files/agents/{agent_id}/..pdfTvalidate	r   storageresolve_agent_idr   target_filewrite_bytesbase64	b64decodefile_result)r   
pdf_base64agent_idr   aidfnamepaths          r   save_agent_pdfr.   .   sj     &

"
"8
,Ch/EsE*DV%%j4@AtS%00r   c                    t        |       t        j                  |      }t        | d      }t        j                  ||      }|j                  t        j                  |d             t        j                  |||      S )z3Guarda un Word (.docx) en files/agents/{agent_id}/..docxTr   r!   )r   docx_base64r*   r   r+   r,   r-   s          r   save_agent_docxr2   >   sj     &

"
"8
,Ch0EsE*DV%%kDABtS%00r   c                   t        |       |j                         st        d      t        j                  |      }t        j                  dd| j                         t
        j                        }| d}t        j                  ||      }d| d}	|r	|	d| dz  }	|j                  |	dz   |z   d	
       t        j                  |||      }
||
d<   |
S )zMGuarda el escrito completo del informe como .txt en files/agents/{agent_id}/.u&   contenido_texto no puede estar vacío.z\.(txt|md)$ )flagsz.txtz# 
z# tipo: zutf-8)encodingtipo_informe)r   r   r   r"   r#   resub
IGNORECASEr$   
write_textr(   )nombrecontenido_textor8   r*   r   r+   baser,   r-   headerresults              r   save_informe_textorB   N   s     &  "ABB

"
"8
,C66."fllnBMMJDfDMEsE*D$r]FH\N"--OOFTMO3gOF  sE2F)F>Mr   c                    t        |       t        j                  |      }t        | ||||      }| j	                         j                  d      r| n|  d}t        ||||      }	d|||	dS )z;Guarda texto + PDF del informe en files/agents/{agent_id}/.r=   r>   r8   r*   r   r   )r   r)   r*   r   T)okr*   textopdf)r   r"   r#   rB   r   r   r.   )
r=   r>   r)   r8   r*   r   r+   rF   pdf_namerG   s
             r   save_informe_completerI   h   s~     &

"
"8
,C'!E  008voH
	C C%DDr   c                    t        |       t        j                  |      }t        | ||||      }| j	                         j                  d      r| n|  d}t        ||||      }	d|||	dS )zDGuarda texto + Word (.docx) del informe en files/agents/{agent_id}/.rD   r0   )r   r1   r*   r   T)rE   r*   rF   docx)r   r"   r#   rB   r   r   r2   )
r=   r>   r1   r8   r*   r   r+   rF   	docx_namerK   s
             r   save_informe_docx_completerM      s     &

"
"8
,C'!E !,,.11':6(%@PI	D C%FFr   c                `   t        |       t        j                  |       }t        j                  |      }t	        |j                               D cg c]C  }|j                         r1|j                  t        |      |j                         j                  dE }}d|t        |      |dS c c}w )z5Lista archivos guardados en files/agents/{agent_id}/.)r	   r-   
size_bytesT)rE   r*   folderfiles)r   r"   r#   agent_foldersortediterdiris_filer	   strstatst_size)r*   r   r+   rP   itemrQ   s         r   list_agent_filesrZ      s     &

"
"8
,C!!#&F 6>>+, <<> III))+--	
E  C3v;OOs   AB+c                F    t        |        dt        j                         dS )z6Devuelve el agent_id configurado (WORKSPACE_AGENT_ID).T)rE   r*   )r   r"   default_agent_idr   s    r   get_default_agent_idr]      s      &G$<$<$>??r   c                 *    t         j                         S )u;   Starlette app del MCP (interno /mcp → público /api/mcp).)workspace_mcpstreamable_http_app r   r   get_mcp_asgi_apprb      s    ,,..r   )r   rV   returnNone)r   rV   r   rV   rc   rV   )r4   r4   )
r   rV   r)   rV   r*   rV   r   rV   rc   dict)
r   rV   r1   rV   r*   rV   r   rV   rc   re   )r4   r4   r4   )r=   rV   r>   rV   r8   rV   r*   rV   r   rV   rc   re   )r=   rV   r>   rV   r)   rV   r8   rV   r*   rV   r   rV   rc   re   )r=   rV   r>   rV   r1   rV   r8   rV   r*   rV   r   rV   rc   re   )r*   rV   r   rV   rc   re   )r4   )r   rV   rc   re   )__doc__
__future__r   r&   r9   mcp.server.fastmcpr   mcp.server.transport_securityr   app.backend.core.configr   app.backend.utilsr   r"   MCP_HTTP_PATHr_   r   r   toolr.   r2   rB   rI   rM   rZ   r]   rb   ra   r   r   <module>rn      s   V "  	 & C , @ 	&0(-	J.  	111 1 	1
 
1 1  	111 1 	1
 
1 1    	
  
 2 
 EEE E 	E
 E E 
E E8 
 GGG G 	G
 G G 
G G8 P P" @ @/r   