Ë
    ª«ëj=  ã            	      óØ   — 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  ej                  e«      Zg d¢Zg d¢Zdd	d
ddddddœZddd„Zddd„Zddd„Zddd„Zdd„Zddd„Zy)zÚIndex builder and task extractor for the unified ingest pipeline.

Generates a lightweight index (index/index.jsonl) optimized for local models
on tablets, and extracts actionable items (TODOs, decisions) into tasks/.
é    )ÚannotationsN)ÚPath)Úuuid4)ÚTASK_PATTERNSÚbuild_indexÚextract_tasksÚ
read_index)
z\bTODO\bz	\bFIXME\bz
\bTODO:\s*z\bACTION:\s*u   \budÄ›lat\bu
   \bnutnÃ©\bu   \bje potÅ™eba\bz\brozhodnuto\bu   \bPOTÅ˜EBA\bz
\bTODO\b.*é   é   é   é   é   é   é   é   )z	ai-exportÚnoteÚdocÚcodeÚmediaÚarchiveÚotherÚ	duplicatec                óR   — | j                  «       } t        | «      |k  r| S | d | dz   S )Nz...)ÚstripÚlen)ÚtextÚ	max_charss     úH/home/oem/CyberBrain26-unified/src/cyberbrain26/product/index_builder.pyÚ_summarize_textr   3   s0   € Ø�:‰:‹<€DÜ
ˆ4ƒy�IÒØˆØ�
�Ð˜eÑ#Ð#ó    c                óŒ   — 	 t        | dd¬«      5 }|j                  |«      cd d d «       S # 1 sw Y   y xY w# t        $ r Y yw xY w)Núutf-8Úreplace)ÚencodingÚerrorsÚ )ÚopenÚreadÚOSError)ÚpathÚ	max_bytesÚfs      r   Ú_read_text_safer-   :   sG   € ðÜ�$ °Ô;ð 	%¸qØ—6‘6˜)Ó$÷	%÷ 	%ò 	%ûäò Ùðús#   ‚7 �+¡	7 «4°7 ´7 ·	AÁAc                ó²  ‡— | r't        | «      j                  «       j                  «       nd }|€ddlm}  |«       }|dz  }|dz  }|j                  ddd¬«       |dz  }g }|j                  «       �r8t        |j                  «       «      D �]  }|j                  «       sŒ|j                  }t        |j                  d	«      «      D ]Þ  }	|	j                  «       sŒt        j                  |	j                  «       «      j!                  «       }
t#        |	«      }t%        |«      }t&        j)                  |d
«      }|j+                  t-        «       j.                  t1        |	j3                  |«      «      |||t1        |	j3                  |«      «      |
t5        j4                  «       dœ«       Œà �Œ |j7                  d„ ¬«       |j9                  d«      }dj;                  d„ |D «       «      }|j=                  |d¬«       |j?                  |«       t1        |«      tA        |«      tC        d„ |D «       «      D �‡ci c]  Š‰tE        ˆfd„|D «       «      “Œ c}dœS c c}w )Nr   ©Úresolve_shared_rootÚsortedÚindexTéÀ  ©ÚparentsÚexist_okÚmodeúindex.jsonlÚ*éc   )ÚidÚsrc_relÚtypeÚpriorityÚsummaryÚpath_relÚsha256Útsc                ó   — | d   S )Nr>   © )Úes    r   ú<lambda>zbuild_index.<locals>.<lambda>f   s
   € ˜q ™}€ r    )Úkeyz.tmpr&   c              3  óT   K  — | ]   }t        j                  |d dd¬«      dz   –— Œ" y­w))ú,ú:F)Ú
separatorsÚensure_asciiÚ	allow_nanú
N)ÚjsonÚdumps©Ú.0rE   s     r   ú	<genexpr>zbuild_index.<locals>.<genexpr>i   s'   è ø€ ÒxÐkl”d—j‘j ¨zÈÐY^Ô_ÐbfÕfÑxùs   ‚&(r"   ©r$   c              3  ó&   K  — | ]	  }|d    –— Œ y­w)r=   NrD   rQ   s     r   rS   zbuild_index.<locals>.<genexpr>p   s   è ø€ ÒVrÐefÐWXÐY_ÕW`ÑVrùs   ‚c              3  ó4   •K  — | ]  }|d    ‰k(  sŒd–— Œ y­w)r=   r
   NrD   )rR   rE   Úcats     €r   rS   zbuild_index.<locals>.<genexpr>p   s   øè ø€ ÒG a°a¸±iÀ3Ó6F¤ÑGùs   ƒ‘)Ú
index_pathÚentries_countÚ
categories)#r   Ú
expanduserÚresolveÚ cyberbrain26.product.shared_rootr0   ÚmkdirÚexistsr1   ÚiterdirÚis_dirÚnameÚrglobÚis_fileÚhashlibrA   Ú
read_bytesÚ	hexdigestr-   r   ÚCATEGORY_PRIORITYÚgetÚappendr   ÚhexÚstrÚrelative_toÚtimeÚsortÚwith_suffixÚjoinÚ
write_textr#   r   ÚsetÚsum)Úshared_rootÚrootr0   Ú
sorted_dirÚ	index_dirrX   ÚentriesÚcat_dirÚcategoryr,   rA   r   r?   r>   Útmp_pathÚcontentrW   s                   `r   r   r   B   s  ø€ Ù7BŒ4�Ó×'Ñ'Ó)×1Ñ1Ô3È€DØ€|ÝHÙ"Ó$ˆà˜‘€JØ�w‘€IØ‡O�O˜D¨4°e€OÔ<Ø˜]Ñ*€Jà€Gà×ÑÕÜ˜j×0Ñ0Ó2Ó3ó 	ˆGØ—>‘>Ô#ØØ—|‘|ˆHÜ˜GŸM™M¨#Ó.Ó/ò �Ø—y‘y”{ØÜ Ÿ™¨¯©«Ó7×AÑAÓC�Ü& qÓ)�Ü)¨$Ó/�Ü,×0Ñ0°¸2Ó>�Ø—‘Ü›'Ÿ+™+Ü" 1§=¡=°Ó#6Ó7Ø$Ø (Ø&Ü # A§M¡M°$Ó$7Ó 8Ø$ÜŸ)™)›+ñ	 õ 	òð		ð, ‡L�LÑ,€LÔ-à×%Ñ% fÓ-€HØ�g‰gÑxÐpwÔxÓx€GØ×Ñ˜¨'ÐÔ2Ø×Ñ�ZÔ ô ˜*“oÜ˜W›ÜSVÑVrÐjqÔVrÓSr×sÈC�sœCÓG¨7ÔGÓGÑGÒsñð ùò ts   È3Ic                óª  — | r't        | «      j                  «       j                  «       nd }|€ddlm}  |«       }|dz  dz  }|j                  «       sg S g }t        |d¬«      5 }|D ]:  }|j                  «       }|sŒ	 |j                  t        j                  |«      «       Œ< 	 d d d «       |S # t        j                  $ r Y Œ]w xY w# 1 sw Y   |S xY w)Nr   r/   r2   r8   r"   rT   )r   r[   r\   r]   r0   r_   r'   r   rj   rO   ÚloadsÚJSONDecodeError)ru   rv   r0   rX   ry   r,   Úlines          r   r	   r	   t   sÑ   € Ù7BŒ4�Ó×'Ñ'Ó)×1Ñ1Ô3È€DØ€|ÝHÙ"Ó$ˆØ˜‘ -Ñ/€JØ×ÑÔØˆ	Ø€GÜ	ˆj 7Ô	+ð ¨qØò 	ˆDØ—:‘:“<ˆDÚðØ—N‘N¤4§:¡:¨dÓ#3Õ4ñ		÷ð €Nøô ×+Ñ+ò Ùðú÷ð €Nús0   Á$CÁ>$B/Â"CÂ/CÃCÃCÃCÃCc                ó  — g }t        «       }| j                  «       D ]m  }|j                  «       }|sŒt        D ]O  }t	        j
                  ||t        j                  «      sŒ)||vr"|j                  |«       |j                  |«        Œm Œo |S ©N)	rs   Ú
splitlinesr   r   ÚreÚsearchÚ
IGNORECASEÚaddrj   )r   ÚtasksÚseenr�   Úpats        r   Ú_extract_task_linesrŒ   ˆ   s�   € Ø€EÜ“U€DØ—‘Ó!ò 	ˆØ�z‰z‹|ˆÙØÜ ò 	ˆCÜ�y‰y˜˜d¤B§M¡MÕ2Ø˜tÑ#Ø—H‘H˜T”NØ—L‘L Ô&Ùñ	ð		ð €Lr    c           
     óþ  — | r't        | «      j                  «       j                  «       nd }|€ddlm}  |«       }|dz  }|j                  ddd¬«       |dz  }|dz  }g }|j                  «       r&	 t        j                  |j                  d	¬
«      «      }|D �ch c]%  }|j                  d«      sŒ|j                  d«      ’Œ' }}t        |«      }	g }
|dz  }|j                  «       r›t        |j                  d«      «      D ]~  }|j!                  «       sŒ|j"                  j%                  «       }|dvrŒ3t'        |d¬«      }t)        |«      }t+        |j-                  |«      «      }|D ]  }|
j/                  ||f«       Œ Œ€ |
D ]‰  \  }}t1        j2                  |j5                  d	«      «      j7                  «       }||v rŒ=|j9                  |«       |	j/                  t;        «       j<                  |||dt?        j>                  «       dœ«       Œ‹ |jA                  t        jB                  |	ddd¬«      dz   d	¬
«       	 |jE                  d«       dddt?        jF                  d«      › d�ddg}|	rÊ|j/                  d«       |j/                  d«       |	D ]5  }|j                  d«      dk(  sŒ|j/                  d|d   › d |d!   › d"�«       Œ7 |j/                  d«       |j/                  d#«       |j/                  d«       |	D ]5  }|j                  d«      dk7  sŒ|j/                  d$|d   › d |d!   › d"�«       Œ7 n|j/                  d%«       |jA                  djI                  |«      dz   d	¬
«       	 |jE                  d«       t+        |«      t+        |«      tK        |	«      tK        |	«      tK        |«      z
  d&œS # t        j                  t        f$ r g }Y �ŒAw xY wc c}w # t        $ r Y �Œœw xY w# t        $ r Y Œyw xY w)'Nr   r/   r‰   Tr3   r4   z
tasks.jsonzMASTER_TASKS.mdr"   rT   Úhashr1   r9   )
z.mdz.txtz.rstz.orgz.jsonz.pyz.shz.yamlz.ymlz.tomliPÃ  )r+   r'   )r;   Úsourcer   rŽ   ÚstatusrB   r   F)ÚindentrL   rM   rN   i€  z# MASTER_TASKSr&   u   *GenerovÃ¡no: z%Y-%m-%d %H:%M:%Su   ## OtevÅ™enÃ© Ãºkolyr�   z- [ ] r   z  *(zdroj: r�   z)*u   ## ZpracovanÃ©z- [x] u   *Å½Ã¡dnÃ© Ãºkoly nenalezeny.*)Ú
tasks_jsonÚmaster_tasksÚtotal_tasksÚ	new_tasks)&r   r[   r\   r]   r0   r^   r_   rO   r   Ú	read_textr€   r)   ri   Úlistr1   rc   rd   ÚsuffixÚlowerr-   rŒ   rl   rm   rj   re   rA   Úencoderg   rˆ   r   rk   rn   rr   rP   ÚchmodÚstrftimerq   r   )ru   rv   r0   Ú	tasks_dirÚtasks_json_pathÚmaster_tasks_pathÚexisting_tasksÚtÚseen_task_hashesr•   Úall_task_linesrw   r,   Úextr   Úlinesr<   r�   Ú	task_hashÚmd_liness                       r   r   r   ˜   sì  € Ù7BŒ4�Ó×'Ñ'Ó)×1Ñ1Ô3È€DØ€|ÝHÙ"Ó$ˆà�w‘€IØ‡O�O˜D¨4°e€OÔ<Ø ,Ñ.€OØ!Ð$5Ñ5Ðà!#€NØ×ÑÔð	 Ü!ŸZ™Z¨×(AÑ(AÈ7Ð(AÓ(SÓTˆNð 0>ÖO¨!ÀÇÁÀvÅ˜Ÿ™˜f�ÐOÐÐOä  Ó0€IØ,.€Nà˜‘€JØ×ÑÔÜ˜
×(Ñ(¨Ó-Ó.ò 
	7ˆAØ—9‘9”;ØØ—(‘(—.‘.Ó"ˆCØÐjÑjØÜ" 1°Ô7ˆDÜ'¨Ó-ˆEÜ˜!Ÿ-™-¨Ó-Ó.ˆGØò 7�Ø×%Ñ% w° oÕ6ñ7ð
	7ð (ò ‰ˆ�Ü—N‘N 4§;¡;¨wÓ#7Ó8×BÑBÓDˆ	ØÐ(Ñ(ØØ×Ñ˜YÔ'Ø×ÑÜ“'—+‘+ØØØØÜ—)‘)“+ñ
õ 	ðð ×ÑÜ�
‰
�9 Q°UÀeÔLÈtÑSØð ô ðØ×Ñ˜eÔ$ð ! "¨´t·}±}ÐEXÓ7YÐ6ZÐZ[Ð&\Ð^`ÐbdÐe€HÙØ�‰Ð.Ô/Ø�‰˜ÔØò 	PˆAØ�u‰u�X‹ &Ó(Ø—‘ &¨¨6©¨°;¸qÀ¹{¸mÈ2Ð NÕOð	Pð 	�‰˜ÔØ�‰Ð(Ô)Ø�‰˜ÔØò 	PˆAØ�u‰u�X‹ &Ó(Ø—‘ &¨¨6©¨°;¸qÀ¹{¸mÈ2Ð NÕOñ	Pð 	�‰Ð7Ô8Ø× Ñ  §¡¨8Ó!4°tÑ!;ÀgÐ ÔNðØ×Ñ Ô&ô
 ˜/Ó*ÜÐ-Ó.Ü˜9“~Ü˜“^¤c¨.Ó&9Ñ9ñ	ð øôC ×$Ñ$¤gÐ.ò 	 Ø‹Nð	 üâOøôN ò Úðûô* ò ÙðúsB   Á1%N9 ÂOÂ1OÈ?O  Í1O0 Î9OÏOÏ 	O-Ï,O-Ï0	O<Ï;O<)éÈ   )r   rl   r   ÚintÚreturnrl   )i'  )r*   r   r+   r©   rª   rl   rƒ   )ru   ústr | Path | Nonerª   Údict)ru   r«   rª   z
list[dict])r   rl   rª   z	list[str])Ú__doc__Ú
__future__r   re   rO   Úloggingr…   rn   Úpathlibr   Úuuidr   Ú	getLoggerÚ__name__ÚloggerÚ__all__r   rh   r   r-   r   r	   rŒ   r   rD   r    r   ú<module>r¶      s†   ðñõ #ã Û Û Û 	Û Ý Ý à	ˆ×	Ñ	˜8Ó	$€ò€ò€ð ØØØØØØØñ	Ð ô$ôô/ôdó(õ Ur    