Ë
    †+Ôj»&  ã                   ó’   — d Z ddlZddlmZmZ ddlmZmZ ddlmZm	Z	 edz  Z
dZdd	„Zd
efd„ZdZd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zy)z¸Auditoria dos itens: cada um com a mensagem de origem e o contexto da conversa.

Renderiza o painel editavel (servido por painel.py, so pelo Tailscale) e uma copia estatica de reserva.é    N)ÚdatetimeÚ	timedeltaé   )ÚpreferenciasÚwhatsapp)ÚDADOSÚFUSOzauditoria.htmlz0https://vm-oracle.taila68a44.ts.net:8443/agente/c                 ól  ‡‡— ‰d   dk7  s‰d   sg S ‰d   j                  dd«      d   }t        j                  | |‰d   dz
  ‰d   d	z   «      Š‰sg S t        t	        t        ‰«      «      ˆˆfd
„¬«      }t        ‰«      D ��cg c]$  \  }}||z
  |cxk  r	||z   k  sŒn n
||k(  |d   f‘Œ& c}}S c c}}w )zSLinhas da conversa ao redor da mensagem que originou o item (so itens do WhatsApp).Úorigemr   Úmsg_tsÚ
origem_refÚ:r   r   i€ô i £ c                 ó2   •— t        ‰|    d   ‰d   z
  «      S )NÚtsr   )Úabs)ÚkÚitemÚlinhass    €€ú8/home/ubuntu/projetos/agente-tarefas/agente/auditoria.pyÚ<lambda>zcontexto.<locals>.<lambda>   s   ø€ ´°V¸A±Y¸t±_ÀtÈHÁ~Ñ5UÔ1Vó    )ÚkeyÚtexto)Úrsplitr   Úlinhas_conversaÚminÚrangeÚlenÚ	enumerate)	Úconr   ÚantesÚdepoisÚchatÚalvor   Úlr   s	    `      @r   Úcontextor&      sÆ   ù€ àˆH�~˜Ò#¨4°ª>Øˆ	Ø�Ñ×$Ñ$ S¨!Ó,¨QÑ/€DÜ×%Ñ% c¨4°°h±À)Ñ1KÈTÐRZÉ^Ð^gÑMgÓh€FÙØˆ	ÜŒu”S˜“[Ó!Ô'VÔW€DÜ09¸&Ô0AÔhÑ0A©¨¨1ÀTÈEÁ\ÐUVÔEgÐZ^ÐagÑZgÖEgˆQ�$‰Y˜˜'™
Ò#Ð0AÒhÐhùÓhs   ÂB0ÂB0Úreturnc                 óÔ   — d|d   › d|d   › �d|d   › d|d   xs d	› �g}t        | |d
d¬«      }|r'|j                  dj                  d„ |D «       «      «       dj                  |«      S )zVersao para o WhatsApp.z*#Úidz* Útituloz
_Origem:_ r   u    â€” Ú	evidenciaÚ é   é   )r!   r"   Ú
c              3   ó:   K  — | ]  \  }}|rd nd|dd z   –— Œ y­w)u   ðŸ‘‰ r,   Ni,  © )Ú.0r$   Úts      r   Ú	<genexpr>z!texto_contexto.<locals>.<genexpr>   s&   è ø€ ÐWÑSVÉÈÈa©D¡°b¸A¸d¸s¸GÕ CÑSVùs   ‚z

)r&   ÚappendÚjoin)r    r   ÚpartesÚctxs       r   Útexto_contextor9      s€   € à�4˜‘:�,˜b  h¡Ð 0Ð1°ZÀÀXÁÐ?OÈuÐUYÐZeÑUfÒUlÐjlÐTmÐ3nÐo€FÜ
�3˜ A¨aÔ
0€CÙ
Ø�‰�d—i‘iÑWÑSVÓWÓWÔXØ�;‰;�vÓÐr   aò  
:root{--bg:#fafafa;--fg:#1d1d1f;--mut:#6e6e73;--card:#fff;--bd:#e3e3e8;--hl:#fff4c2;--tag:#eef1ff;--ac:#2f5bea;--ok:#1f8a4c;--no:#c4352b}
@media (prefers-color-scheme:dark){:root{--bg:#121214;--fg:#ececf0;--mut:#9a9aa3;--card:#1c1c20;--bd:#2c2c33;--hl:#4a3f12;--tag:#252a44;--ac:#7f9cff;--ok:#4cc27e;--no:#ff7a6e}}
*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--fg);font:15px/1.5 system-ui,sans-serif}
main{max-width:880px;margin:0 auto;padding:20px 16px 60px}h1{font-size:1.4rem;margin:0 0 4px}
h2{font-size:1.1rem;margin:28px 0 10px;border-bottom:1px solid var(--bd);padding-bottom:6px}
.mut{color:var(--mut);font-size:.85rem}details{background:var(--card);border:1px solid var(--bd);border-radius:10px;
margin:8px 0;padding:10px 14px}summary{cursor:pointer;font-weight:600}summary span{font-weight:400}
.tag{display:inline-block;background:var(--tag);border-radius:6px;padding:0 6px;font-size:.78rem;margin-right:4px}
.ctx{margin:10px 0 0;padding:8px 10px;border-left:3px solid var(--bd);font-size:.88rem;white-space:pre-wrap;word-break:break-word}
.ctx div{padding:2px 4px}.ctx .alvo{background:var(--hl);border-radius:4px}a{color:var(--ac)}
form.ed{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px;padding-top:12px;border-top:1px dashed var(--bd)}
form.ed .full{grid-column:1/-1}label{font-size:.8rem;color:var(--mut);display:flex;flex-direction:column;gap:2px}
input,select,textarea{font:inherit;color:var(--fg);background:var(--bg);border:1px solid var(--bd);border-radius:6px;padding:5px 7px;width:100%}
textarea{min-height:52px}.bt{display:flex;flex-wrap:wrap;gap:6px}
button{font:inherit;font-size:.88rem;border:1px solid var(--bd);background:var(--card);color:var(--fg);border-radius:6px;padding:5px 10px;cursor:pointer}
button.pri{background:var(--ac);border-color:var(--ac);color:#fff}button.ok{color:var(--ok)}button.no{color:var(--no)}
.aviso{background:var(--tag);border-radius:8px;padding:8px 12px;margin:12px 0}
@media (max-width:560px){form.ed{grid-template-columns:1fr}}
c                 ó*   — | sy| d d d| v r| dd fS dfS )N)r,   r,   é
   ÚTé   é   r,   r1   )Úvalors    r   Ú
_data_horar@   9   s-   € ÙØØ��"ˆ:¨¨u©˜˜b ˜Ð=Ð=¸"Ð=Ð=r   c                 óf  ‡ — t         j                  }t        ‰ d   dk(  r‰ d   n‰ d   «      \  }}dj                  ˆ fd„dD «       «      }‰ d   d	v }|rd
nd}‰ d   dk(  rdnd}d‰ d   › d |‰ d   «      › d|› d‰ d   dk(  rdnd› d|› d|› d |‰ d   xs d«      › d |‰ d   xs d«      › d|› |› d�S )NÚtipoÚcompromissoÚinicioÚprazor,   c              3   óJ   •K  — | ]  }d |› d|‰d   k(  rdnd› d|› d�–— Œ y­w)z<option value='Ú'rB   z	 selectedr,   Ú>z	</option>Nr1   )r2   r3   Úis     €r   r4   z_form_edicao.<locals>.<genexpr>B   s@   øè ø€ ð DÙB˜ð ' q c¨¸!¸qÀ¹yº.©;ÈbÐ*QÐQRÐSTÐRUÐU^Ô_ÙBùó   ƒ #)ÚtarefarC   ÚprojetoÚstatus)Ú	concluidoÚ
descartadou;   <button name='acao' value='reabrir'>â†©ï¸� Reabrir</button>uÜ   <button name='acao' value='concluir' class='ok'>âœ… ConcluÃ­do</button><button name='acao' value='nao_e_meu' class='no'>ðŸ™… NÃ£o Ã© meu</button><button name='acao' value='descartar' class='no'>ðŸ—‘ï¸� Descartar</button>Úa_confirmaruH   <button name='acao' value='confirmar' class='ok'>ðŸ‘� Confirmar</button>z,<form class='ed' method='post' action='item/r)   u9   '><label class='full'>TÃ­tulo<input name='titulo' value='r*   z)'></label><label>Tipo<select name='tipo'>z</select></label><label>ÚDataÚPrazoz&<input type='date' name='data' value='zF'></label><label>Hora (opcional)<input type='time' name='hora' value='z5'></label><label>Projeto<input name='projeto' value='rL   uD   '></label><label class='full'>DescriÃ§Ã£o<textarea name='descricao'>Ú	descricaouk   </textarea></label><div class='bt full'><button name='acao' value='salvar' class='pri'>ðŸ’¾ Salvar</button>z</div></form>)ÚhtmlÚescaper@   r6   )rI   ÚeÚdataÚhoraÚopcoesÚfechadoÚbotoes_statusÚ	confirmars   `       r   Ú_form_edicaor]   ?   s3  ø€ Ü�‰€AÜ¨1¨V©9¸Ò+E˜A˜hšKÈ1ÈWÉ:ÓV�J€Dˆ$Ø�W‰Wó DÙBóDó D€Fà�‰kÐ8Ð8€GÙV]ÑRðcð ð
 �h‘K =Ò0ñ \Ø68ð à:¸1¸T¹7¸)ð DFÙFGÈÈ(ÉÃnÐEUð V.Ø.4¨Xð 6Ø ! &¡	¨]Ò :‘fÀÐHÐHnÐosÐntð uKØKOÈ&ð Q:Ù:;¸A¸i¹LÒ<NÈBÓ:OÐ9Pð QIÙIJÈ1È[É>ÒK_Ð]_ÓI`ÐHað bgàˆk˜-˜¨ð7ð 8r   c                 ó†  ‡— t         j                  Š|d   xs	 |d   xs d}|d   r,t        j                  |d   t        «      j                  d«      nd}|d   �|d   d›nd}d	j                  ˆfd
„t        | |«      D «       «      }|d   dk(  r|d   rd ‰|d   «      › d�n ‰|d   xs d	«      }d|d   › d|d   › d ‰|d   «      › d ‰|«      › d ‰|d   «      › d ‰|d   «      › d ‰|d   «      › d|› d|› d�|d   r|sd ‰|d   «      › d�nd	z   d |› d�z   |rd!|› d"�nd	z   |rt        |«      z   d#z   S d	z   d#z   S )$NrD   rE   zsem datar   ú%d/%m %H:%Mu   â€”Ú	confiancaz.0%r,   c              3   óJ   •K  — | ]  \  }}d |rdnd› d ‰|«      › d�–— Œ y­w)z<div class='r$   r,   z'>ú</div>Nr1   )r2   r$   r3   rV   s      €r   r4   z_cartao.<locals>.<genexpr>[   s3   øè ø€ ÐmÑ\lÑQXÐQUÐWX˜±¡f¸"Ð%=¸RÁÀ!Ã¸vÀVÔLÑ\lùrJ   r   Ú	classroomr+   z	<a href='z'>abrir no Classroom</a>z<details id='ir)   z'><summary>#Ú r*   u    <span class='mut'>Â· z&</span></summary><p><span class='tag'>rB   z</span><span class='tag'>rM   u$   </span><span class='mut'>confianÃ§a u    Â· mensagem de z</span></p>rS   z<p>ú</p>z<p class='mut'>z<div class='ctx'>rb   z
</details>)	rT   rU   r   Úfromtimestampr	   Ústrftimer6   r&   r]   )	r    rI   ÚeditavelÚquandoÚvistoÚconfÚctx_htmlÚlinkrV   s	           @r   Ú_cartaorn   V   sã  ø€ Ü�‰€AØˆx‰[Ò4˜A˜g™JÒ4¨*€FØQRÐS[ÒQ\ŒH×"Ñ" 1 X¡;´Ó5×>Ñ>¸}ÔMÐbg€EØ&'¨¡nÐ&@ˆa�‰n˜SÑ!Àe€DØ�w‰wÓmÔ\dÐehÐjkÔ\lÓmÓm€HØGHÈÁ{ÐVaÒGaÐfgÐhsÒftˆi™˜!˜K™.Ó)Ð*Ð*BÑCÙ�1�[‘>Ò' RÓ(ð 	à˜Q˜t™W˜I \°!°D±'°¸!¹A¸aÀ¹k»NÐ;KÐKaÑbcÐdjÓbkÐalð m$Ù$% a¨¡i£L >Ð1JÉ1ÈQÈxÉ[Ë>ÐJZð [!Ù!" 1 X¡;£Ð 0Ð0TÐUYÐTZÐZjÐkpÐjqÐq|ð~ð 12°+²Áx�‘Q�q˜‘~Ó&Ð' tÑ,ÐUWñYð   ˜v TÐ*ñ	+ñ W_Ð0AÀ(ÀÈ6Ñ.RÐdfñ	hñ
 #+Œ|˜A‹ñ4ð
 7CñCð Dð
 13ñ4ð
 7CñCð Dr   c                 ó¦   ‡— t         j                  Šdj                  ˆfd„t        t	        j
                  | «      d«      D «       «      xs d}d|› d�S )Nr,   c              3   óH   •K  — | ]  \  }}d  ‰|d   «      › d|› d�–— Œ y­w)z<li>r   z) <form method='post' action='preferencia/u]   /remover' style='display:inline'><button class='no' title='Esquecer'>âœ•</button></form></li>Nr1   )r2   ÚnÚprV   s      €r   r4   z&_secao_preferencias.<locals>.<genexpr>h   s@   øè ø€ ð Há F™˜˜1ð ™1˜Q˜w™Z›=˜/Ð)RÐSTÐRUð VSô Tá Fùs   ƒ"r   z<li class='mut'>Nenhuma.</li>u-   <h2>âš™ï¸� PreferÃªncias permanentes</h2><ul>u  </ul><form method='post' action='preferencia' class='ed'><label class='full'>Nova preferÃªncia<input name='texto' placeholder='Ex.: pedidos de outras pessoas no grupo X nÃ£o sÃ£o meus'></label><div class='bt full'><button class='pri'>âž• Guardar e aplicar</button></div></form>)rT   rU   r6   r   r   Úlistar)r    ÚitensrV   s     @r   Ú_secao_preferenciasru   f   sd   ø€ Ü�‰€AØ�G‰Gó Hä )¬,×*=Ñ*=¸cÓ*BÀAÔ FóHó Hò kàKjð 
ð <¸E¸7ð Ccð cð dr   c                   ó   — y)NuY  <details><summary>âž• Adicionar item</summary><form class='ed' method='post' action='novo'><label class='full'>TÃ­tulo<input name='titulo' required></label><label>Tipo<select name='tipo'><option>tarefa</option><option>compromisso</option><option>projeto</option></select></label><label>Data / prazo<input type='date' name='data'></label><label>Hora (opcional)<input type='time' name='hora'></label><label>Projeto<input name='projeto'></label><label class='full'>DescriÃ§Ã£o<textarea name='descricao'></textarea></label><div class='bt full'><button class='pri'>Adicionar</button></div></form></details>r1   r1   r   r   Ú_secao_novorw   q   s   € ðar   c           	      ó  ‡ ‡— ‰ j                  d«      j                  «       }t        j                  t        «      t        d¬«      z
  j                  «       }‰ j                  d|f«      j                  «       }d|D �cg c]  }|d   dk(  sŒ|d   rŒ|‘Œ c}fd	|D �cg c]  }|d   dk(  sŒ|d   sŒ|‘Œ c}fd
|D �cg c]  }|d   dk(  sŒ|‘Œ c}fd|D �cg c]  }|d   dk(  sŒ|‘Œ c}fd|fg}dj                  ˆ ˆfd„|D «       «      }‰rt        «       t        ‰ «      z   nd}	|rdt        j                  |«      › d�nd}
dt        › dt        j                  t        «      d›d�‰rdndz   d|
› |	› |› d�z   S c c}w c c}w c c}w c c}w )NziSELECT * FROM itens WHERE status IN ('aberto','a_confirmar') ORDER BY COALESCE(inicio, prazo, '9999'), idé   )ÚdayszrSELECT * FROM itens WHERE status IN ('descartado', 'concluido') AND atualizado_em >= ? ORDER BY atualizado_em DESCu   ðŸ“� Tarefas sem prazorB   rK   rE   u   ðŸ“Œ Tarefas com prazou   ðŸ“… CompromissosrC   u   ðŸ—‚ï¸� ProjetosrL   u5   ðŸ—‘ï¸� ConcluÃ­dos e descartados nos Ãºltimos 7 diasr,   c              3   ó€   •K  — | ]5  \  }}d |› dt        |«      › d�dj                  ˆˆfd„|D «       «      z   –— Œ7 y­w)z<h2>z <span class='mut'>(z)</span></h2>r,   c              3   ó8   •K  — | ]  }t        ‰|‰«      –— Œ y ­w)N)rn   )r2   rI   r    rh   s     €€r   r4   z#render.<locals>.<genexpr>.<genexpr>‡   s"   øè ø€ ÐQwÑuvÐpqÔRYÐZ]Ð_`Ðbj×RkÑuvùs   ƒN)r   r6   )r2   r3   Úgr    rh   s      €€r   r4   zrender.<locals>.<genexpr>‡   sF   øè ø€ ð (Ù &™˜˜1ð ˜1˜#Ð1´#°a³&°¸ÐGÈ"Ï'É'ÔQwÑuvÓQwÓJwÕwÙ &ùs   ƒ;>z<div class='aviso'>rb   zª<!doctype html><html lang='pt-BR'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>Auditoria do agente</title><style>zF</style></head><body><main><h1>Auditoria do agente</h1><p class='mut'>r_   uW   . Clique num item para ver de onde ele veio (a linha destacada Ã© a mensagem de origem)uH    e editar. As mudanÃ§as valem na hora para a agenda Agente e os resumos.Ú.re   z</main></body></html>)ÚexecuteÚfetchallr   Únowr	   r   Ú	isoformatr6   rw   ru   rT   rU   ÚCSS)r    rh   ÚavisoÚabertosÚlimiteÚfechadosrI   ÚgruposÚcorpoÚextraÚtopos   ``         r   ÚrenderrŒ   z   sÏ  ù€ Ø�k‰kð Ió JßJRÉ(Ë*ð ä�l‰lœ4Ó ¤9°!Ô#4Ñ4×?Ñ?ÓA€FØ�{‰{ð 9Ø;A¸)óEßEMÁXÃZð ð 
"©wÓ#c©w¨!¸!¸F¹)ÀxÓ:OÐXYÐZaÓXb¢A¨wÑ#cÐdØ	!©wÓ#_©w¨!¸!¸F¹)ÀxÓ:OÐTUÐV]ÓT^¢A¨wÑ#_Ð`Ø	©'ÓP©' Q°Q°v±YÀ-Ó5Ošq¨'ÑPÐQØ	©ÓK© A°A°f±IÀÓ4Jša¨ÑKÐLØ	@À(ÐKð€Fð �G‰Gô (Ù &ó(ó (€Eá:BŒ[‹]Ô0°Ó5Ò5È€EÙ@EÐ!¤$§+¡+¨eÓ"4Ð!5°VÑ<È2€Dðä�Uð Ü&Ÿl™l¬4Ó0°Ð=ð >:ð;ñ
 ^fÑYÐknñpð �T�F˜5˜' % Ð(=Ð>ñ?ð @ùò $dùÚ#_ùÚPùÚKs<   Á<E9Â
E9ÂE9ÂE>Â*E>Â0E>Â<F
Ã
F
ÃFÃ$Fc                 ój   — t         j                  t        | «      «       t         j                  d«       y)z'Copia estatica de reserva (sem edicao).i€  N)ÚARQUIVOÚ
write_textrŒ   Úchmod)r    s    r   Úgerarr‘   ”   s    € ä×Ñ”v˜c“{Ô#Ü‡M�M�%Õr   )é   é   )FN)Ú__doc__rT   r   r   r,   r   r   Úconfigr   r	   rŽ   ÚURLr&   Ústrr9   rƒ   r@   r]   rn   ru   rw   rŒ   r‘   r1   r   r   Ú<module>r˜      si   ðñkó ß (ç $ß à
Ð"Ñ
"€Ø8€ó	ið ó ð€ò,>ò8ò.Dò dòbó@ó4r   