Ë
    z&Ôj`.  ã                   ó¦  — d Z ddlZddlZddlmZmZmZ ddlmZmZm	Z	 ddl
mZmZmZmZmZ ddlmZmZmZmZmZmZ dd	d
giZddddd	g d¢dœddd
gid	g d¢dœdd	ieeeeeddd	idœddidd	iddd
gidœg d¢dœdœidgdœZdZdedefd„Zd„ Zd„ Zd„ Zd„ Zdddddidddidœdœd d!gdœdœddddidd	id"œd#d$gdœdœd%œd&d'gdœZ d(Z!e"fd)„Z#ede"fd*„Z$y)+zTExtracao de compromissos, tarefas e projetos das conversas do WhatsApp com o Gemini.é    N)ÚdateÚdatetimeÚ	timedeltaé   )ÚllmÚpreferenciasÚwhatsapp)Úatualizar_itemÚgravar_itemÚitens_abertosÚ	progressoÚsalvar_progresso)ÚDIAS_PROJETOSÚDIAS_TAREFASÚFUSOÚMODELO_EXTRACAOÚMSGS_CONTEXTOÚMSGS_POR_LOTEÚtypeÚstringÚnullÚobjectÚitensÚarray)ÚnovoÚ	atualizarÚconcluirÚcancelar)r   ÚenumÚinteger)ÚcompromissoÚtarefaÚprojeto)r   ÚitemsÚnumber)ÚacaoÚitem_idÚtipoÚtituloÚ	descricaoÚinicioÚfimÚprazor#   ÚpessoasÚ	confiancaÚ	evidenciaÚlinha)r&   r(   r)   r/   r0   )r   Ú
propertiesÚrequiredaš
  Voce e o assistente pessoal do Joao (aparece como "Eu" nas conversas): estudante do ITA, diretor de consultoria estrategica na ITA Junior e pesquisador (IC ITAndroids). Voce le trechos das conversas de WhatsApp dele e identifica o que precisa entrar na agenda ou na lista de tarefas DELE.

Tipos:
- compromisso: algo com data (e de preferencia horario) em que o Joao vai estar: reuniao, aula extra, prova, call, evento, entrega presencial. Use "inicio"/"fim" no formato AAAA-MM-DDTHH:MM (ou AAAA-MM-DD se nao houver hora).
- tarefa: algo que o Joao precisa FAZER: ele se comprometeu ("vou mandar", "deixa comigo"), alguem pediu a ele e ele nao recusou, ou ele foi designado. Use "prazo" (AAAA-MM-DD ou AAAA-MM-DDTHH:MM) quando houver; senao null.
- projeto: iniciativa em andamento que dura semanas (ex.: IC, um projeto da ITA Junior, um campeonato), para a visao semanal. Descreva o estado atual e o proximo passo conhecido.

Regras:
- So o que e responsabilidade ou compromisso do Joao. Ignore tarefas de outras pessoas, conversa casual, memes, combinados que ja aconteceram e coisas que ele recusou.
- Em GRUPOS, so extraia quando: (a) o proprio Joao ("Eu") disse que vai fazer/ir, (b) alguem se dirigiu diretamente a ele (pelo nome "Joao"/"Penna", respondendo a uma mensagem dele, ou designando-o), ou (c) e uma reuniao/entrega de um grupo de trabalho do qual ele claramente faz parte. Avisos, divulgacoes, convites gerais, oportunidades ("inscricoes abertas", "quem puder..."), pendencias de outros membros e eventos que ele nao confirmou NAO sao itens dele.
- Em conversas diretas, pedidos feitos a ele e combinados entre os dois contam.
- Resolva datas relativas ("amanha", "sexta", "semana que vem") a partir da data/hora da mensagem.
- Linhas marcadas [CONTEXTO] ja foram analisadas antes: use so como contexto, nao extraia delas de novo.
- Mensagens com mais de {dias_tarefas} dias (antes de {corte}): extraia apenas projetos em andamento e compromissos/prazos com data a partir de hoje ({hoje}).
- Se o item ja existe na lista de itens abertos, use acao "atualizar" (mudou data, detalhe) ou "concluir" (ficou claro que foi feito) ou "cancelar" (foi desmarcado), com o item_id. Nao crie duplicatas.
- Itens marcados "(Classroom)" ja sao acompanhados pelo Classroom: nao os crie de novo nem tente altera-los.
- "confianca": 0.9+ quando explicito e com data; 0.6-0.8 quando provavel; abaixo de 0.5 quando duvidoso.
- "evidencia": a frase curta que justifica o item, com o nome de quem disse.
- "linha": o numero (n) da mensagem que originou ou atualizou o item.
- Titulos curtos e acionaveis, em portugues ("Enviar relatorio de diagnostico para o cliente X").
- Se nao houver nada, devolva {{"itens": []}}.ÚtextoÚreturnc                 óØ   — t        j                  d| j                  «       «      j                  dd«      j	                  «       }t        j                  dd|«      j                  d«      d d S )NÚNFKDÚasciiÚignorez
[^a-z0-9]+Ú-é<   )ÚunicodedataÚ	normalizeÚlowerÚencodeÚdecodeÚreÚsubÚstrip)r4   Úts     ú7/home/ubuntu/projetos/agente-tarefas/agente/extrator.pyÚ_slugrF   K   sU   € Ü×Ñ˜f e§k¡k£mÓ4×;Ñ;¸GÀXÓN×UÑUÓW€AÜ�6‰6�-  aÓ(×.Ñ.¨sÓ3°C°RÐ8Ð8ó    c                 ó0  — g }t        | «      D ]o  }|d   dk7  r|j                  d|d   › d|d   › �«       Œ)|d   xs	 |d   xs d}|j                  d	|d
   › d|d   › d|d   › d|› d�	|d   rd|d   › �ndz   «       Œq dj                  |dd «      xs dS )z`So os itens que a leitura do WhatsApp pode alterar; os do Classroom vao como referencia, sem id.Úorigemr	   z(Classroom) r)   u    â€” prazo r-   r+   úsem dataÚ#Úidú [r(   ú] z (Ú)r#   u    â€” projeto Ú Ú
iÿÿÿNz(nenhum))r   ÚappendÚjoin)ÚconÚlinhasÚiÚquandos       rE   Ú_lista_abertosrX   P   s×   € à€FÜ˜3ÖˆØˆX‰;˜*Ò$Ø�M‰M˜L¨¨8©¨°[ÀÀ7ÁÀÐMÔNØØ�8‘Ò8  '¡
Ò8¨jˆØ�‰˜˜!˜D™'˜ " Q v¡Y K¨r°!°H±+°¸bÀÀÈÐJÐpqÐr{Òp|ÐP]Ð^_Ð`iÑ^jÐ]kÑNlð  CEñ  Fõ  	Gð  ð �9‰9�V˜D˜E�]Ó#Ò1 zÐ1rG   c                 ó¦   — | sy 	 d| v r#t        j                  | «      j                  «       S t        j                  | d d «      S # t        $ r Y y w xY w)NÚTé
   )r   Úfromisoformatr   Ú
ValueError)Úvalors    rE   Ú_datar_   \   sY   € ÙØðØ7:¸e±|Œx×%Ñ% eÓ,×1Ñ1Ó3ÐgÌ×I[ÑI[Ð\aÐbeÐceÐ\fÓIgÐgøÜò Ùðús   …&A ¬A Á	AÁAc                 ó2  — t        j                  t        «      j                  «       }|d   dv rœ|j	                  d«      r‹| j                  d|d   f«      j                  «       }|r	|d   dk7  ry|rZ|d   dk(  r6d	D �ci c]  }|j	                  |«      sŒ|||   “Œ }}t        | |d   fi |¤Ž yt        | |d   |d   d
k(  rdnd¬«       y|d   dk(  rt        |j	                  d«      «      nt        |j	                  d«      «      }	|d   dk(  r|	�|	|k  ry|d   dk(  r|	r|	|t        t        ¬«      z
  k  ryt        j                  |t        «      j                  «       |t        t        ¬«      z
  k  }
|d   dk(  r|	s|
ryt        |j	                  d«      xs d«      }|dk  ryt        | i dD �ci c]  }||j	                  |«      “Œ c}¥|dk\  rdnd|d|› dt        |d   «      › �|xs d› d|j	                  d d!«      › �d d" |d#œ¥«       y$c c}w c c}w )%Nr&   )r   r   r   r'   z%SELECT origem FROM itens WHERE id = ?rI   r	   Úignorador   )r)   r*   r+   r,   r-   r#   r   Ú	concluidoÚ
descartado)ÚstatusÚ
atualizador(   r!   r+   r-   r"   ©Údaysr/   r   gš™™™™™Ù?)r(   r)   r*   r+   r,   r-   r#   r.   g      è?ÚabertoÚa_confirmarÚ:r)   Úconversaú: r0   rP   iô  )rd   r/   rI   Ú
origem_refr0   Úmsg_tsr   )r   Únowr   r   ÚgetÚexecuteÚfetchoner
   r_   r   r   ÚfromtimestampÚfloatr   rF   )rT   ÚchatÚ	chat_nomeÚitrn   ÚhojeÚexisteÚkÚcamposrW   ÚantigaÚconfs               rE   Ú_aplicarr~   e   sB  € Ü�<‰<œÓ×"Ñ"Ó$€DØ	ˆ&�zÐ:Ñ:¸r¿v¹vÀiÔ?PØ—‘ÐDÀrÈ)Á}ÐFVÓW×`Ñ`ÓbˆÙ�f˜XÑ&¨*Ò4ØÙØ�&‰z˜[Ò(Ù,hÓvÑ,h qÐln×lrÑlrÐstÕlu˜!˜R ™U™(Ð,h�ÐvÜ˜s B y¡MÑ<°VÒ<ð  ô ˜s B y¡MÈÈFÉÐWaÒIa¹+ÐgsÕtØà(*¨6©
°mÒ(CŒU�2—6‘6˜(Ó#Ô$ÌÈrÏvÉvÐV]ËÓI_€FØ	ˆ&�z�]Ò"¨¨¸&À4º-ØØ	ˆ&�z�XÒ¡&¨V°d¼YÌLÔ=YÑ6YÒ-YØÜ×#Ñ# F¬DÓ1×6Ñ6Ó8¸4Ä)ÔQ]ÔB^Ñ;^Ñ^€FØ	ˆ&�z�XÒ¡f±ØÜ�—‘˜Ó$Ò)¨Ó*€DØˆc‚zØÜ�ð Ù!pÓ
qÑ!p˜Aˆ1ˆb�f‰f�Q‹i‰<Ð!pÑ
qðà" dšl‘(°ØØØ˜˜a¤ b¨¡lÓ 3Ð4Ð5Ø!Ò/ ZÐ0°°2·6±6¸+ÀrÓ3JÐ2KÐLÈTÈcÐRØòô ð ùò5 wùò$ rs   Á=HÂHÆ0Hc                 óò  — t        | d|› �|«      }t        j                  | ||«      }|D �cg c]  }|d   |kD  sŒ|‘Œ }}|sy t        j                  t
        «      }t        j                  t        |j                  d«      |t        t        ¬«      z
  j                  d«      ¬«      }	|	dt        j                  | «      z   z  }	|d   d	   xs d
}
|d   d   rdnd}|D �cg c]  }|d   |k  sŒ|‘Œ c}t         d  }t        dt        |«      t         «      D �]U  }|||t         z    }||d | z   t         d  }d|j                  d«      › d|j#                  «       › d|
› dt%        | «      › d�	dj'                  d„ |D «       «      z   |rdndz   dj'                  d„ t)        |«      D «       «      z   }t+        j,                  t.        ||	t0        | d¬«      }|j3                  dg «      D ]q  }|j3                  d«      }t5        |t6        «      rd|cxk  rt        |«      k  rn n||   d   n|d   d   }t9        | ||
||«      }|j3                  |d«      dz   ||<   Œs t;        | d|› �|d   d   «       �ŒX y c c}w c c}w )Nzwa:Útsz%d/%m/%Y (%A)rf   z%d/%m)Údias_tarefasrx   Úcortez

r   rv   rk   Úem_grupoÚgrupozconversa diretazAgora: z%A %d/%m/%Y %H:%MrQ   rl   z

Itens abertos:
z

Mensagens:
c              3   ó,   K  — | ]  }d |d   › �–— Œ y­w)z[CONTEXTO] r4   N© )Ú.0Úls     rE   Ú	<genexpr>zextrair_chat.<locals>.<genexpr>œ   s   è ø€ ÐJÁ¸A˜{¨1¨W©:¨,Ô7Áùs   ‚rP   c              3   ó8   K  — | ]  \  }}d |› d|d   › �–— Œ y­w)Ú(z) r4   Nr†   )r‡   Únrˆ   s      rE   r‰   zextrair_chat.<locals>.<genexpr>�   s+   è ø€ Ð9lÑ\kÑTXÐTUÐWX¸A¸a¸SÀÀ1ÀWÁ:À,Ô:OÑ\kùs   ‚Úextracao©ÚsistemaÚesquemarT   Úetapar   r1   éÿÿÿÿr   )r   r	   Úlinhas_conversar   ro   r   ÚSISTEMAÚformatr   Ústrftimer   r   Úpara_promptr   ÚrangeÚlenr   Ú
capitalizerX   rS   Ú	enumerater   Úgerarr   ÚESQUEMArp   Ú
isinstanceÚintr~   r   )rT   ru   Údesde_tsÚcontagemÚultimorU   rˆ   ÚnovasÚagora_r�   ÚnomeÚ	tipo_chatÚ
anterioresrV   ÚloteÚcontextor4   Úresprw   rŒ   rn   Úrs                         rE   Úextrair_chatr¬   Š   s’  € Ü�s˜c $ ˜L¨(Ó3€FÜ×%Ñ% c¨4°Ó:€FÙÓ3™�1 ! D¡'¨FÓ"2ŠQ˜€EÐ3ÙØÜ�\‰\œ$Ó€FÜ�n‰n¬,¸V¿_¹_È_Ó=]Ø$*¬Y¼LÔ-IÑ$I×#SÑ#SÐT[Ó#\ð ó ^€Gàˆvœ×0Ñ0°Ó5Ñ5Ñ5€GØ�‰8�KÑ Ò. J€DØ  ™8 JÒ/‘Ð5F€IÙ#Ó9™V˜ q¨¡w°&Ó'8’!˜VÑ9¼=¸.¸/ÐJ€JÜ�1”c˜%“j¤-×0ˆØ�Q�qœ=Ñ(Ð)ˆØ  r¨ Ñ*¬]¨N¨OÐ<ˆØ˜6Ÿ?™?Ð+>Ó?Ð@ÀÀ9×CWÑCWÓCYÐBZÐZ\Ð]aÐ\bð c$Ü$2°3Ó$7Ð#8Ð8HðJà—9‘9ÑJÁÓJÓJñKñ %‘D¨"ñ.ð 15·	±	Ñ9lÔ\eÐfjÔ\kÓ9lÓ0lñmˆô �y‰yœ¨%¸Ì'ÐWZÐblÔmˆØ—(‘(˜7 BÖ'ˆBØ—‘�w“ˆAÜ&0°´CÔ&8¸QÀ!Ô=OÄcÈ$ÃiÕ=O�T˜!‘W˜T’]ÐUYÐZ\ÑU]Ð^bÑUcˆFÜ˜˜d D¨"¨fÓ5ˆAØ"Ÿ,™, q¨!Ó,¨qÑ0ˆH�QŠKð	 (ô
 	˜  D 6˜l¨D°©H°T©NÖ;ñ 1ùò 4ùò :s   ¬I/ºI/ÃI4Ã,I4)ÚmanterÚremoverr­   r®   )rL   ÚmotivorL   r¯   )Ú
duplicatasÚ	descartarr°   r±   a+  Voce revisa a lista de itens que um assistente extraiu das conversas de WhatsApp do Joao.
1. duplicatas: itens que sao a MESMA coisa (mesmo compromisso ou mesma tarefa, ainda que vindos de conversas diferentes ou com titulos diferentes). Mantenha o mais completo.
2. descartar: itens que NAO sao do Joao: convites e divulgacoes de festas/eventos que ele nao confirmou, oportunidades genericas ("inscreva-se", "summer job aberto"), avisos para a turma toda sem acao dele, pendencias de outras pessoas. Na duvida, NAO descarte.
Use apenas os ids fornecidos.c           
      ó`  — t        | «      D �cg c]  }|d   dk(  sŒ|‘Œ }}t        |«      dk  ry dj                  d„ |D «       «      }t        j                  t
        |t        t        | d¬«      }|D �ch c]  }|d   ’Œ	 }}d	x}}|j                  d
g «      D ]<  }	|	d   |vrŒ|	d   D ]*  }
|
|v sŒ|
|	d   k7  sŒt        | |
dd|	d   › �¬«       |dz  }Œ, Œ> |j                  dg «      D ]*  }	|	d   |v sŒt        | |	d   dd|	d   d d › �¬«       |dz  }Œ,  |d|› d|› d�«       y c c}w c c}w )NrI   r	   é   rQ   c              3   ó€   K  — | ]6  }d |d   › d|d   › d|d   › d|d   xs	 |d   xs d	› d|d
   xs ddd › �
–— Œ8 y­w)rK   rL   rM   r(   rN   r)   z | r+   r-   rJ   r0   rP   Né    r†   )r‡   rV   s     rE   r‰   zconsolidar.<locals>.<genexpr>À   sp   è ø€ ð HÙAF¸Að ˜!˜D™'˜ " Q v¡Y K¨r°!°H±+°¸cÀ!ÀHÁ+ÒBiÐQRÐSZÑQ[ÒBiÐ_iÐAjÐjmØ˜K™.Ò.¨B°°Ð5Ð6ô8ÙAFùs   ‚<>Ú
consolidarrŽ   rL   r   r°   r­   r®   rc   zduplicata de #)rd   r*   r   r±   zdescartado: r¯   éÈ   zconsolidacao: z duplicatas, z descartados)
r   r™   rS   r   rœ   r   ÚSISTEMA_CONSOLIDARÚESQUEMA_CONSOLIDARrp   r
   )rT   ÚlogrV   r   Úlistar«   ÚvalidosÚn_dupÚn_descÚdÚxs              rE   r¶   r¶   ¼   sw  € Ü% cÔ*ÓHÑ*�1¨a°©k¸ZÓ.GŠQÐ*€EÐHÜ
ˆ5ƒz�A‚~ØØ�I‰Iñ HÙAFóHó H€Eä�	‰	”/ 5Ô2DÔN`Ø ô	/€Aá %Ó&¡˜1ˆq�‹w €GÐ&ØÐ€EˆFØ�U‰U�< Ö$ˆØˆX‰;˜gÑ%ØØ�9”ˆAØ�GŠ|  Q x¡[Ó 0Ü˜s A¨lÈÐWXÐYaÑWbÐVcÐFdÕeØ˜‘
‘ñ ð %ð �U‰U�; Ö#ˆØˆT‰7�gÒÜ˜3  $¡°È,ÐWXÐYaÑWbÐcgÐdgÐWhÐViÐHjÕkØ�a‰K‰Fð $ñ ˆ.˜˜˜}¨V¨H°LÐAÕBùò) Iùò 's   ŽD&œD&Á4D+c                 ó6  — t        j                  |«      }t        j                  |«      d | } |dt        |«      › �«       t        j                  | ||«      } |d|› �«       i }t        |d«      D ]6  \  }}		 t        | |	||«       |dz  dk(  sŒ ||› d	t        |«      › d
|› �«       Œ8  |d|› �«       |j                  d«      rt        | |«       |S # t        $ r:}
 |d|	› dt        |
«      j                  › dt        |
«      d d › �«       Y d }
~
ŒŒd }
~
ww xY w)Nzconversas relevantes: zmidias lidas: r   z	falha em rl   r·   é   r   Ú/z conversas | zextracao concluida: r   )r	   ÚdesdeÚchats_relevantesr™   Úprocessar_midiasr›   r¬   Ú	Exceptionr   Ú__name__Ústrrp   r¶   )rT   ÚdiasÚlimite_chatsrº   r    ÚchatsrŒ   r¡   rz   ru   Úes              rE   ÚextrairrÎ   Ô   s*  € Ü�~‰~˜dÓ#€HÜ×%Ñ% hÓ/°°Ð>€EÙÐ
 ¤ U£ Ð-Ô.Ü×!Ñ! # u¨hÓ7€AÙˆ.˜˜ÐÔØ€HÜ˜U AÖ&‰ˆˆ4ð	HÜ˜˜d H¨hÔ7ð ˆr‰6�Q‹;Ù�1�#�Q”s˜5“z�l -°¨zÐ:Õ;ð 'ñ Ð
˜x˜jÐ)Ô*Ø‡|�|�FÔÜ�3˜ÔØ€Oøô ò 	HÙ�)˜D˜6 ¤D¨£G×$4Ñ$4Ð#5°R¼¸A»¸tÀ¸°~ÐF×GÑGûð	Hús   Á9CÃ	DÃ0DÄD)%Ú__doc__rA   r<   r   r   r   rP   r   r   r	   Úbancor
   r   r   r   r   Úconfigr   r   r   r   r   r   ÚNULO_STRr�   r”   rÉ   rF   rX   r_   r~   r¬   r¹   r¸   Úprintr¶   rÎ   r†   rG   rE   Ú<module>rÔ      sœ  ðÙ ZÛ 	Û ß .Ñ .ç )Ñ )ß ZÕ Zß d× dà�X˜vÐ&Ð'€ààØà à%-Ò7dÑeØ &¨°FÐ(;Ð<Ø%-Ò7[Ñ\Ø% xÐ0Ø!)Ø&Ø#Ø%Ø'Ø(/¸6À8Ð:LÑMØ"(¨(Ð!3Ø"(¨(Ð!3Ø$ y°&Ð&9Ð:ñò Qñ#ñ
ðð0 �	ñ5€ð: 2€ðF9�ð 9˜ó 9ò
	2òò"òJ<ð< à&¸(Ø˜yÐ)¸wÐRXÐZcÐQdÑ6eñSgà! 9Ð-ñ2/ñ 0ð &¸Ø˜9Ð%°&¸(Ð1CñREØSWÐYaÐRbñ1dñ eñ	ð ˜{Ð+ñ
Ð ð!Ð ð ó Cð0 $°$¸Eô rG   