Ë
    Å[êj‹W  ã            	       óÐ  — d Z ddl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	 ddl
mZ ddl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  e	 e e«       «      «      Z eej8                  j;                  dej8                  j;                  dd«      «      «      Zedz  Zedz  Z e dz  Z!ejE                  dd¬«       e jE                  dd¬«        G d„ d«      Z# G d„ d«      Z$ G d„ d«      Z% e# ee«      «      Z& e$«       Z' e%«       Z( eddd¬«      Z)e)jU                  edgddgdg¬«        G d„ d e«      Z+ G d!„ d"e«      Z, G d#„ d$e«      Z- G d%„ d&e«      Z.e)j;                  d'«      d(„ «       Z/e)j;                  d)«      d*„ «       Z0e)jc                  d+e,¬,«      d-e+fd.„«       Z2e)j;                  d+«      dnd/edz  fd0„«       Z3e)j;                  d1«      d2efd3„«       Z4e)j;                  d4e-¬,«      d2efd5„«       Z5e)jc                  d6e.¬,«      d2efd7„«       Z6e)jc                  d8«      d2efd9„«       Z7e)jc                  d:«      d2efd;„«       Z8e)js                  d1«      dod2ed<e:fd=„«       Z;dd>l<m=Z=  e=«       Z> G d?„ d@e«      Z? G dA„ dBe«      Z@e)jc                  dC«      d-e?fdD„«       ZAe)j;                  dE«      dpd2edFefdG„«       ZBe)jc                  dH«      dIefdJ„«       ZCe)jc                  dK«      d-e@fdL„«       ZDe)j;                  dM«      dN„ «       ZEddOlFmGZG  eG e e«       «      «      ZH G dP„ dQe«      ZIe)jc                  dR«      d-eIfdS„«       ZJe)j;                  dT«      dUefdV„«       ZKe)jc                  dW«      dUefdX„«       ZLe)j;                  dY«      dnd2edz  fdZ„«       ZMe)j;                  d[«      dUefd\„«       ZNe)j;                  d]«      dqdUed^efd_„«       ZOdd`lPmQZR  eRe)«       eSdak(  r~ eTdb«        eTdc«        eTdb«        eTdde› �«        eTdee› �«        eTdfe › �«        eTdge!› �«        eTdh«        eTdie› �«        eTdj«        eTdb«        ejª                  e)dkedl¬m«       yy)ruC   
CyberBrain26 LAB - WebApp
KompletnÃ­ verze s vlastnÃ­mi manaÅ¾ery
é    N)Údatetime)ÚPath)ÚAny)ÚFastAPIÚHTTPException)ÚCORSMiddleware)ÚFileResponse)Ú	BaseModel)Úproject_rootÚCB26_WEB_PORTÚCB26_WEBAPP_PORTÚ8180Ú
workspaceszdata-labz
tasks.jsonT©ÚparentsÚexist_okc            	       ó¶   — e Zd ZdZdefd„Zdedefd„Zdedeeef   fd„Z	d	ede
d
z  fd„Zd	edefd„Zd	ededeeef   fd„Zdd	ededeeef   fd„Zd	efd„Zy
)ÚWorktreeManageru   SprÃ¡va Git worktreeÚ	base_repoc                 ó¢   — t        |«      j                  «       | _        | j                  dz  | _        | j                  j	                  dd¬«       y )Nr   Tr   )r   Úresolver   Úworktrees_dirÚmkdir)Úselfr   s     úF/home/oem/CyberBrain26-unified/src/cyberbrain26/services/webapp/app.pyÚ__init__zWorktreeManager.__init__.   s@   € Ü˜i›×0Ñ0Ó2ˆŒØ!Ÿ^™^¨lÑ:ˆÔØ×Ñ× Ñ ¨¸Ð Õ=ó    ÚnameÚreturnc                 óª   — t        j                  dd|«      }t        j                  dd|«      }|j                  d«      }t        |«      dkD  r|dd }|S )u*   Sanitizace nÃ¡zvu pro Git branch a sloÅ¾kuz[^a-zA-Z0-9\-]ú-z-+é2   N)ÚreÚsubÚstripÚlen)r   r   s     r   Ú	_sanitizezWorktreeManager._sanitize3   sQ   € ô �v‰vÐ'¨¨dÓ3ˆä�v‰v�e˜S $Ó'ˆà�z‰z˜#‹ˆäˆt‹9�rŠ>Ø˜˜�9ˆDØˆr   Údescriptionc           
      ót  — | j                  |«      }| j                  |«      }t        j                  «       j                  d«      }t	        t        j                  «       «      dd }| j                  |z  }d|› d|› �}|j                  «       rt        j                  |d¬«       dd	t	        | j                  «      d
dd|t	        |«      dg	}t        j                  |dd¬«      }	|	j                  dk7  rt        d|	j                   › �«      ‚||t	        |«      t        j                  «       j#                  «       dœS )u   VytvoÅ™Ã­ novÃ½ worktreez%Y%m%d%H%M%SNé   ztask/r!   T©Úignore_errorsÚgitú-CÚworktreeÚaddz-bÚHEAD©Úcapture_outputÚtextr   zGit worktree add selhal: )Útask_idÚbranchÚpathÚ
created_at)r'   r   ÚutcnowÚstrftimeÚstrÚuuidÚuuid4r   ÚexistsÚshutilÚrmtreer   Ú
subprocessÚrunÚ
returncodeÚRuntimeErrorÚstderrÚ	isoformat)
r   r(   Úfolder_nameÚbranch_nameÚ	timestampr5   r7   r6   ÚcmdÚresults
             r   Úcreate_worktreezWorktreeManager.create_worktree@   s  € ð —n‘n [Ó1ˆà—n‘n [Ó1ˆÜ—O‘OÓ%×.Ñ.¨~Ó>ˆ	ô ”d—j‘j“lÓ# B QÐ'ˆð ×!Ñ! GÑ+ˆØ˜˜ Q y kÐ2ˆð �;‰;Œ=Ü�M‰M˜$¨dÕ3ð �4œ˜TŸ^™^Ó,Ø˜˜t VÜ�‹I�vð
ˆô
 —‘ °D¸tÔDˆØ×Ñ Ò!ÜÐ!:¸6¿=¹=¸/ÐJÓKÐKð ØÜ˜“IÜ"Ÿ/™/Ó+×5Ñ5Ó7ñ	
ð 	
r   r5   Nc                 óH   — | j                   |z  }|j                  «       r|S dS )u   VrÃ¡tÃ­ cestu k worktreeN)r   r>   )r   r5   r7   s      r   Úget_worktree_pathz!WorktreeManager.get_worktree_pathd   s%   € à×!Ñ! GÑ+ˆØ—{‘{”}ˆtÐ.¨$Ð.r   c                 óü   — | j                  |«      }|st        d|› d�«      ‚t        j                  ddt	        |«      dddgdd¬	«       ddt	        |«      d
dg}t        j                  |dd¬	«      }|j
                  S )uF   VrÃ¡tÃ­ diff worktree proti hlavnÃ­ vÄ›tvi (vÄ�etnÄ› novÃ½ch souborÅ¯)ú	Worktree ú neexistujer-   r.   r0   z-Nú.Tr2   Údiffz
--no-color)rN   ÚFileNotFoundErrorrA   rB   r;   Ústdout)r   r5   r7   rJ   rK   s        r   Úget_diffzWorktreeManager.get_diffi   s‚   € à×%Ñ% gÓ.ˆÙÜ# i°¨y¸Ð$DÓEÐEô 	�‰Ø�Dœ#˜d›) U¨D°#Ð6Ø dõ	
ð �dœC ›I v¨|Ð<ˆÜ—‘ °D¸tÔDˆØ�}‰}Ðr   Úpatch_contentc                 óP  — | j                  |«      }|st        d|› d�«      ‚|dz  }|j                  |«       ddt        |«      dt        |«      g}t	        j
                  |dd¬«      }|j                  d¬	«       |j                  d
k7  rt        d|j                  › �«      ‚dddœS )zAplikuje patch na worktreerP   rQ   z
temp.patchr-   r.   ÚapplyTr2   )Ú
missing_okr   zPatch selhal: u   Patch aplikovÃ¡n)ÚappliedÚmessage)
rN   rT   Ú
write_textr;   rA   rB   ÚunlinkrC   rD   rE   )r   r5   rW   r7   Ú
patch_filerJ   rK   s          r   Úapply_patchzWorktreeManager.apply_patch{   s¬   € à×%Ñ% gÓ.ˆÙÜ# i°¨y¸Ð$DÓEÐEà˜LÑ(ˆ
Ø×Ñ˜mÔ,à�dœC ›I w´°J³Ð@ˆÜ—‘ °D¸tÔDˆØ×Ñ TÐÔ*à×Ñ Ò!Ü °·±¨Ð?Ó@Ð@àÐ,>Ñ?Ð?r   Útarget_branchc                 óà  — | j                  |«      }|st        d|› d�«      ‚t        j                  ddt	        |«      dddgddd¬	«      }|j
                  j                  «       }|r|dk(  rt        d
«      ‚t        j                  ddt	        |«      ddgdd¬«       t        j                  ddt	        |«      ddd|› d�gdd¬«      }|j                  dk7  r&d|j
                  vrt        d|j                  › �«      ‚t        j                  ddt	        | j                  «      dddgddd¬	«      }|j
                  j                  «       }||k7  r1t        j                  ddt	        | j                  «      d|gddd¬«       t        j                  ddt	        | j                  «      d|ddd|› �gdd¬«      }	|	j                  dk7  r&t        d|	j                  xs |	j
                  › �«      ‚d||dœS )u6   SlouÄ�Ã­ worktree do cÃ­lovÃ© vÄ›tve (v hlavnÃ­m repu)rP   rQ   r-   r.   z	rev-parsez--abbrev-refr1   T)r3   r4   Úchecku   Nelze zjistit vÄ›tev worktreer0   rR   ©rc   r3   Úcommitz-mzTask z: worktree changesr2   r   znothing to commitzCommit selhal: Úcheckout)rc   r3   r4   Úmergez--no-ffzMerge task zMerge selhal: )Úmergedra   Útask_branch)rN   rT   rA   rB   r;   rU   r%   rD   rC   rE   r   )
r   r5   ra   r7   Úbranch_resultri   Úcommit_resultÚcurrent_branch_resultÚcurrent_branchÚmerge_results
             r   Úmerge_worktreezWorktreeManager.merge_worktree�   s  € à×%Ñ% gÓ.ˆÙÜ# i°¨y¸Ð$DÓEÐEô #Ÿ™Ø�Dœ#˜d›) [°.À&ÐIØ d°$ô
ˆð $×*Ñ*×0Ñ0Ó2ˆÙ˜k¨VÒ3ÜÐ>Ó?Ð?ô 	�‰Ø�Dœ#˜d›) U¨CÐ0Ø tõ	
ô #Ÿ™Ø�Dœ#˜d›) X¨t°u¸W¸IÐEWÐ5XÐYØ dô
ˆð
 ×#Ñ# qÒ(Ð-@È×H\ÑH\Ñ-\Ü °×1EÑ1EÐ0FÐGÓHÐHô
 !+§¡Ø�Dœ#˜dŸn™nÓ-¨{¸NÈFÐSØ d°$ô!
Ðð /×5Ñ5×;Ñ;Ó=ˆð ˜]Ò*Ü�N‰NØ˜œc $§.¡.Ó1°:¸}ÐMØ¨4°dõô "—~‘~Ø�Dœ#˜dŸn™nÓ-¨w¸Ø˜ ¨G¨9Ð5ð7à dô
ˆð
 ×"Ñ" aÒ'Ü °×0CÑ0CÒ0ZÀ|×GZÑGZÐ/[Ð\Ó]Ð]ð Ø*Ø&ñ
ð 	
r   c                 óÒ   — | j                  |«      }|syddt        | j                  «      ddt        |«      g}t        j                  |dd¬«       t        j                  |d¬«       y)	u   OdstranÃ­ worktreeNr-   r.   r/   ÚremoveTrd   r+   )rN   r;   r   rA   rB   r?   r@   )r   r5   r7   rJ   s       r   Úremove_worktreezWorktreeManager.remove_worktreeÈ   sU   € à×%Ñ% gÓ.ˆÙØà�dœC §¡Ó/°¸XÄsÈ4ÃyÐQˆÜ�‰�s $°tÕ<Ü�‰�d¨$Ö/r   )zlab/phase-3a)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   r   r'   Údictr   rL   r   rN   rV   r`   ro   rr   © r   r   r   r   +   sÄ   „ Ùð> #ó >ð
˜cð  có ð"
¨3ð "
°4¸¸S¸±>ó "
ðH/¨ð /°¸±ó /ð
 ð ¨ó ð$@ 3ð @°sð @¸tÀCÈÀH¹~ó @ñ$9
 cð 9
¸#ð 9
ÐSWÐX[Ð]`ÐX`ÑSaó 9
ðv0 sô 0r   r   c                   óô   — e Zd ZdZd„ Zdeeef   fd„Zd„ Z	dedeeef   defd„Z
d	edeeef   d
z  fd„Zd	edeeef   fd„Zd	edefd„Zd	edeeef   fd„Zd	efd„Zd	efd„Zdded
z  deeeef      fd„Zy
)ÚTaskManageru   SprÃ¡va ÃºkolÅ¯c                 óD   — t         | _        | j                  «       | _        y ©N)Ú
TASKS_FILEÚ
tasks_fileÚ_loadÚtasks©r   s    r   r   zTaskManager.__init__Ù   s   € Ü$ˆŒØ—Z‘Z“\ˆ�
r   r   c                 ó¨   — | j                   j                  «       r.	 t        j                  | j                   j	                  «       «      S i S #  i cY S xY w)u   NaÄ�te Ãºkoly ze souboru)r~   r>   ÚjsonÚloadsÚ	read_textr�   s    r   r   zTaskManager._loadÝ   sF   € à�?‰?×!Ñ!Ô#ðÜ—z‘z $§/¡/×";Ñ";Ó"=Ó>Ð>ð ˆ	øðØ’	ús   œ,A ÁAc                 óz   — | j                   j                  t        j                  | j                  dd¬«      «       y)u   UloÅ¾Ã­ Ãºkoly do souborué   F)ÚindentÚensure_asciiN)r~   r]   rƒ   Údumpsr€   r�   s    r   Ú_savezTaskManager._saveæ   s&   € à�‰×"Ñ"¤4§:¡:¨d¯j©jÀÐQVÔ#WÕXr   r(   Úworktree_infoc           	      óà   — |d   }||d|ddt        j                  «       j                  «       t        j                  «       j                  «       dœ| j                  |<   | j	                  «        |S )u   VytvoÅ™Ã­ novÃ½ Ãºkolr5   ÚcreatedN)Úidr(   Ústatusr/   rS   Úreviewr8   Ú
updated_at)r   r9   rF   r€   r‹   )r   r(   rŒ   r5   s       r   Úcreate_taskzTaskManager.create_taskê   sd   € à 	Ñ*ˆàØ&ØØ%ØØÜ"Ÿ/™/Ó+×5Ñ5Ó7Ü"Ÿ/™/Ó+×5Ñ5Ó7ñ	
ˆ�
‰
�7Ñð 	�
‰
ŒØˆr   r5   Nc                 ó8   — | j                   j                  |«      S )u   VrÃ¡tÃ­ Ãºkol podle ID)r€   Úget©r   r5   s     r   Úget_taskzTaskManager.get_taskú   s   € à�z‰z�~‰~˜gÓ&Ð&r   Údatac                 óâ   — || j                   v ra| j                   |   j                  |«       t        j                  «       j	                  «       | j                   |   d<   | j                  «        yy)u   Aktualizuje Ãºkolr’   N)r€   Úupdater   r9   rF   r‹   )r   r5   r˜   s      r   Úupdate_taskzTaskManager.update_taskþ   sV   € à�d—j‘jÑ Ø�J‰J�wÑ×&Ñ& tÔ,Ü08·±Ó0A×0KÑ0KÓ0MˆD�J‰J�wÑ Ñ-Ø�J‰J�Lð !r   rS   c                 ó,   — | j                  |d|i«       y)u   NastavÃ­ diff ÃºkolurS   N©r›   )r   r5   rS   s      r   Úset_diffzTaskManager.set_diff  s   € à×Ñ˜ 6¨4 .Õ1r   Úreview_resultc                 ó.   — | j                  ||ddœ«       y)u   NastavÃ­ review ÃºkoluÚ	reviewing)r‘   r�   Nr�   )r   r5   rŸ   s      r   Ú
set_reviewzTaskManager.set_review	  s   € à×Ñ˜¨]ÀkÑ"RÕSr   c                 ó,   — | j                  |ddi«       y)õ   SchvÃ¡lÃ­ Ãºkolr�   ÚapprovedNr�   r–   s     r   Úapprove_taskzTaskManager.approve_task  s   € à×Ñ˜ 8¨ZÐ"8Õ9r   c                 ó,   — | j                  |ddi«       y)u   OznaÄ�Ã­ Ãºkol jako slouÄ�enÃ½r�   rh   Nr�   r–   s     r   Ú
merge_taskzTaskManager.merge_task  s   € à×Ñ˜ 8¨XÐ"6Õ7r   r�   c                 ó¼   — t        | j                  j                  «       «      }|r$|D �cg c]  }|j                  d«      |k(  sŒ|‘Œ }}t	        |d„ d¬«      S c c}w )õ   VrÃ¡tÃ­ seznam ÃºkolÅ¯r�   c                 ó&   — | j                  dd«      S )Nr8   Ú )r•   )Úxs    r   ú<lambda>z(TaskManager.list_tasks.<locals>.<lambda>  s   € ¨1¯5©5°¸rÓ+B€ r   T)ÚkeyÚreverse)Úlistr€   Úvaluesr•   Úsorted)r   r�   ÚitemsÚts       r   Ú
list_taskszTaskManager.list_tasks  sT   € ä�T—Z‘Z×&Ñ&Ó(Ó)ˆÙØ %ÖC˜1¨¯©¨x«¸FÓ)B’QÐCˆEÐCÜ�eÑ!BÈDÔQÐQùò Ds   ªAÁAr|   )rs   rt   ru   rv   r   rw   r;   r   r   r‹   r“   r—   r›   rž   r¢   r¦   r¨   r±   r¶   rx   r   r   rz   rz   Ö   sñ   „ Ùò"ð�t˜C ˜H‘~ó òYð sð ¸4ÀÀSÀ¹>ð Ècó ð ' ð '¨¨S°#¨X©¸Ñ(=ó 'ð 3ð ¨d°3¸°8©nó ð2 ð 2¨3ó 2ðT #ð T°d¸3À¸8±nó Tð: Có :ð8 #ó 8ñR  t¡ð R°t¸DÀÀcÀ¹NÑ7Kô Rr   rz   c            	       ó0   — e Zd ZdZddededeeef   fd„Zy)ÚReviewerAgentu#   Recenzent kÃ³du (jednoduchÃ¡ verze)rS   r(   r   c                 óD   — |r|j                  «       sddddœS ddd|› �dœS )u%   Zkontroluje diff a vrÃ¡tÃ­ hodnocenÃ­TÚlowu   Å½Ã¡dnÃ© zmÄ›ny k review)ÚsafeÚriskÚcommentu   Automaticky schvÃ¡leno: )r%   )r   rS   r(   s      r   Úreview_diffzReviewerAgent.review_diff#  s<   € á˜4Ÿ:™:œ<àØØ5ñð ð ØØ1°+°Ð?ñ
ð 	
r   N)r¬   )rs   rt   ru   rv   r;   rw   r   r¾   rx   r   r   r¸   r¸      s'   „ Ù-ñ
 ð 
°#ð 
¸tÀCÈÀH¹~ô 
r   r¸   úCyberBrain26 LABú3.1zWorktree management API)ÚtitleÚversionr(   Ú*)Úallow_originsÚallow_credentialsÚallow_methodsÚallow_headersc                   ó,   — e Zd ZU eed<   dZedz  ed<   y)Ú
TaskCreater(   NrH   )rs   rt   ru   r;   Ú__annotations__rH   rx   r   r   rÉ   rÉ   P  s   … ØÓØ"€K��t‘Ô"r   rÉ   c                   ó,   — e Zd ZU eed<   eeef   ed<   y)ÚTaskResponser5   r/   N)rs   rt   ru   r;   rÊ   rw   r   rx   r   r   rÌ   rÌ   T  s   … ØƒLØ�3˜�8‰nÔr   rÌ   c                   ó   — e Zd ZU eed<   y)ÚDiffResponserS   N©rs   rt   ru   r;   rÊ   rx   r   r   rÎ   rÎ   X  s   … Ø
„Ir   rÎ   c                   ó,   — e Zd ZU eed<   eed<   eed<   y)ÚReviewResponser»   r¼   r½   N)rs   rt   ru   ÚboolrÊ   r;   rx   r   r   rÑ   rÑ   [  s   … Ø
ƒJØ
ƒIØ„Lr   rÑ   ú/c                  ó   — ddddœS )u   KoÅ™enovÃ½ endpointÚokr¿   rÀ   )r�   ÚservicerÂ   rx   rx   r   r   Úrootr×   e  s   € ð Ø%Øñð r   z/healthc                  ó   — ddt         dœS )zHealth checkrÕ   Úwebapp)r�   rÖ   Úport)ÚWEB_PORTrx   r   r   ÚhealthrÜ   n  s   € ð ØÜñð r   z/v1/worktree/tasks)Úresponse_modelr˜   c                 óÚ   — 	 t         j                  | j                  «      }t        j	                  | j                  |«      }||dœS # t
        $ r}t        dt        |«      ¬«      ‚d}~ww xY w)u    VytvoÅ™Ã­ novÃ½ Ãºkol s worktree)r5   r/   é�  ©Ústatus_codeÚdetailN)ÚwmrL   r(   Útmr“   Ú	Exceptionr   r;   )r˜   rŒ   r5   Úes       r   r“   r“   z  s_   € ð<Ü×*Ñ*¨4×+;Ñ+;Ó<ˆÜ—.‘. ×!1Ñ!1°=ÓAˆØ"°Ñ>Ð>øÜò <Ü¨´C¸³FÔ;Ð;ûð<ús   ‚AA Á	A*ÁA%Á%A*r�   c                 ó0   — dt         j                  | «      iS )rª   r€   )rä   r¶   )r�   s    r   r¶   r¶   …  s   € ð ”R—]‘] 6Ó*Ð+Ð+r   z/v1/worktree/tasks/{task_id}r5   c                 óN   — t         j                  | «      }|st        dd¬«      ‚|S )u   VrÃ¡tÃ­ detail Ãºkolué”  úTask not foundrà   )rä   r—   r   )r5   Útasks     r   r—   r—   ‹  s(   € ô �;‰;�wÓ€DÙÜ¨Ð4DÔEÐEØ€Kr   z!/v1/worktree/tasks/{task_id}/diffc                 ó<  — t         j                  | «      }|st        dd¬«      ‚	 t        j	                  | «      }t         j                  | |«       d|iS # t        $ r}t        dt        |«      ¬«      ‚d}~wt        $ r}t        dt        |«      ¬«      ‚d}~ww xY w)u   VrÃ¡tÃ­ diff Ãºkoluré   rê   rà   rS   Nrß   )	rä   r—   r   rã   rV   rž   rT   r;   rå   )r5   rë   rS   ræ   s       r   rV   rV   ”  s‰   € ô �;‰;�wÓ€DÙÜ¨Ð4DÔEÐEð<Ü�{‰{˜7Ó#ˆÜ
�‰�G˜TÔ"Ø˜ˆ~ÐøÜò <Ü¨´C¸³FÔ;Ð;ûÜò <Ü¨´C¸³FÔ;Ð;ûð<ús#   ¦.A Á	BÁA4Á4BÂ BÂBz#/v1/worktree/tasks/{task_id}/reviewc                 óÄ  — t         j                  | «      }|st        dd¬«      ‚|j                  d«      }|s,	 t        j                  | «      }t         j                  | |«       |r|j                  «       st        dd¬«      ‚t        j                  ||j                  d	d
«      «      }t         j                  | |«       |S # t        $ r}t        dd|›�¬«      ‚d}~ww xY w)u   ZahÃ¡jÃ­ review Ãºkoluré   rê   rà   rS   rß   zCannot get diff: NzNo diff to reviewr(   r¬   )rä   r—   r   r•   rã   rV   rž   rå   r%   Úreviewerr¾   r¢   )r5   rë   rS   ræ   rK   s        r   Úreview_taskrï   ¥  sÎ   € ô �;‰;�wÓ€DÙÜ¨Ð4DÔEÐEð �8‰8�FÓ€DÙð	SÜ—;‘;˜wÓ'ˆDÜ�K‰K˜ Ô&ñ �t—z‘z”|Ü¨Ð4GÔHÐHô ×!Ñ! $¨¯©°ÀÓ(CÓD€FÜ‡M�M�'˜6Ô"Ø€Møô ò 	SÜ¨CÐ:KÈAÈ5Ð8QÔRÐRûð	Sús   ¹+C Ã	CÃ
CÃCz$/v1/worktree/tasks/{task_id}/approvec                 óú   — t         j                  | «      }|st        dd¬«      ‚|j                  d«      }|st        dd¬«      ‚|j                  dd«      st        d	d
¬«      ‚t         j	                  | «       ddiS )r¤   ré   rê   rà   r‘   rß   zTask must be reviewed firstr»   Fé“  zReview did not pass safetyr�   r¥   )rä   r—   r   r•   r¦   )r5   rë   r‘   s      r   r¦   r¦   ¾  su   € ô �;‰;�wÓ€DÙÜ¨Ð4DÔEÐEà�X‰X�hÓ€FÙÜ¨Ð4QÔRÐRà�:‰:�f˜eÔ$Ü¨Ð4PÔQÐQä‡O�O�GÔØ�jÐ!Ð!r   z"/v1/worktree/tasks/{task_id}/mergec                 ó4  — t         j                  | «      }|st        dd¬«      ‚|j                  d«      dk7  rt        dd¬«      ‚	 t        j                  | «      }t         j                  | «       |S # t        $ r}t        dt        |«      ¬«      ‚d	}~ww xY w)
u#   SlouÄ�Ã­ worktree do hlavnÃ­ vÄ›tveré   rê   rà   r�   r¥   rñ   z"Task must be approved before mergerß   N)	rä   r—   r   r•   rã   ro   r¨   rå   r;   )r5   rë   rK   ræ   s       r   r¨   r¨   Ð  s‰   € ô �;‰;�wÓ€DÙÜ¨Ð4DÔEÐEà‡x�x�Ó˜ZÒ'Ü¨Ð4XÔYÐYð<Ü×"Ñ" 7Ó+ˆÜ
�‰�gÔØˆøÜò <Ü¨´C¸³FÔ;Ð;ûð<ús   Á+A3 Á3	BÁ<BÂBÚforcec                 ó8  — t         j                  | «      }|st        dd¬«      ‚|j                  d«      dvr|st        dd¬«      ‚	 t        j                  | «       t         j                  j                  | d«       t         j                  «        dd	iS #  Y Œ<xY w)
u   SmaÅ¾e Ãºkol a worktreeré   rê   rà   r�   )rh   Úrejectedrß   z3Task not finished. Use force=true to remove anyway.NÚremoved)	rä   r—   r   r•   rã   rr   r€   Úpopr‹   )r5   ró   rë   s      r   Údelete_taskrø   â  s�   € ô �;‰;�wÓ€DÙÜ¨Ð4DÔEÐEà‡x�x�ÓÐ!7Ñ7ÁÜØØHô
ð 	
ð
Ü
×Ñ˜7Ô#ô ‡H�H‡L�L�˜$ÔÜ‡H�H„JØ�iÐ Ð øðÙús   ÁB ÂB)ÚTerminalServicec                   ó0   — e Zd ZU eed<   eed<   dZeed<   y)ÚExecRequestr5   Úcommandé   ÚtimeoutN)rs   rt   ru   r;   rÊ   rþ   Úintrx   r   r   rû   rû     s   … ØƒLØƒLØ€GˆSÔr   rû   c                   ó   — e Zd ZU eed<   y)ÚVSCodiumRequestr5   NrÏ   rx   r   r   r  r  	  s   … Ø„Lr   r  z/v1/terminal/execc                 ó,  — t         j                  | j                  «      }|st        dd¬«      ‚|j	                  di «      j	                  d«      }|st        dd¬«      ‚t
        j                  | j                  || j                  | j                  ¬«      S )	u)   SpustÃ­ pÅ™Ã­kaz v worktree danÃ©ho taskuré   rê   rà   r/   r7   rß   õ   Task nemÃ¡ worktree)r5   Úworktree_pathrü   rþ   )	rä   r—   r5   r   r•   ÚtsÚexecuterü   rþ   )r˜   rë   r  s      r   Úterminal_execr    s�   € ô �;‰;�t—|‘|Ó$€DÙÜ¨Ð4DÔEÐEØ—H‘H˜Z¨Ó,×0Ñ0°Ó8€MÙÜ¨Ð4IÔJÐJÜ�:‰:Ø—‘Ø#Ø—‘Ø—‘ð	 ó ð r   z/v1/terminal/history/{task_id}Úlimitc                 ó2   — dt         j                  | |«      iS )u$   VrÃ¡tÃ­ historii pÅ™Ã­kazÅ¯ pro taskÚhistory)r  r
  )r5   r  s     r   Úterminal_historyr    s   € ð ”r—z‘z '¨5Ó1Ð2Ð2r   z /v1/terminal/stop/{execution_id}Úexecution_idc                 ó,   — t         j                  | «      S )u   ZastavÃ­ bÄ›Å¾Ã­cÃ­ pÅ™Ã­kaz)r  Ústop)r  s    r   Úterminal_stopr  !  s   € ô �7‰7�<Ó Ð r   z/v1/vscodium/openc                 ó`  — t         j                  | j                  «      }|st        dd¬«      ‚|j	                  di «      j	                  d«      }|st        dd¬«      ‚dd	l} |j                  d
«      rdd
d|› �|ddœS  |j                  d«      rdd	l}	  |j                  d|g«       dd|dœS  |j                  d«      rdd	l}	  |j                  d|g«       dd|dœS dd|dœS # t        $ r}dt        |«      dœcY d	}~S d	}~ww xY w# t        $ r}dt        |«      dœcY d	}~S d	}~ww xY w)u+   OtevÅ™e worktree ve VSCodium / code-serveruré   rê   rà   r/   r7   rß   r  r   Nzcode-serverFzhttp://0.0.0.0:8443/?folder=u/   OtevÅ™ete URL v prohlÃ­Å¾eÄ�i (pÅ™es SSH tunel))ÚopenedÚmodeÚurlr  r\   ÚcodiumT)r  r  r  )r  ÚerrorÚcodeu,   VSCodium ani code-server nenÃ­ nainstalovÃ¡n)r  r  r  )rä   r—   r5   r   r•   r?   ÚwhichrA   ÚPopenrå   r;   )r˜   rë   r  r?   rA   ræ   s         r   Úvscodium_openr  &  s^  € ô �;‰;�t—|‘|Ó$€DÙÜ¨Ð4DÔEÐEØ—H‘H˜Z¨Ó,×0Ñ0°Ó8€MÙÜ¨Ð4IÔJÐJó Ø€v‡|�|�MÔ"ð Ø!Ø1°-°ÐAØ*ØHñ
ð 	
ð €v‡|�|�HÔÛð	6ØˆJ×Ñ˜h¨Ð6Ô7àØ Ø!.ñð ð €v‡|�|�FÔÛð	6ØˆJ×Ñ˜f mÐ4Ô5àØØ!.ñð ð Ø?Ø&ñð øô# ò 	6Ø#¬c°!«fÑ5Õ5ûð	6ûô ò 	6Ø#¬c°!«fÑ5Õ5ûð	6ús<   ÂC( ÃD Ã(	D	Ã1DÃ>D	ÄD	Ä	D-ÄD(Ä"D-Ä(D-z/uic                  óz   — t        t        t        t        «      j	                  «       j
                  dz  «      «      S )Nzstatic_ui.html)r	   r;   r   Ú__file__r   Úparentrx   r   r   Úuir  a  s+   € äœœD¤›N×2Ñ2Ó4×;Ñ;Ð>NÑNÓOÓPÐPr   )ÚOpenClawAdapterc                   ó&   — e Zd ZU eed<   dZeed<   y)ÚOpenClawStartr5   é
   Ú	max_stepsN)rs   rt   ru   r;   rÊ   r"  rÿ   rx   r   r   r   r   m  s   … ØƒLØ€IˆsÔr   r   z/v1/openclaw/startc                 ó6  — t         j                  | j                  «      }|st        dd¬«      ‚|j	                  di «      j	                  d«      }|st        dd¬«      ‚t
        j                  | j                  ||j	                  dd	«      | j                  «      S )
Nré   rê   rà   r/   r7   rß   zTask nema worktreer(   r¬   )rä   r—   r5   r   r•   ÚoaÚstartr"  )r˜   rë   Úwts      r   Úopenclaw_startr'  q  sy   € ä�;‰;�t—|‘|Ó$€DÙÜ¨Ð4DÔEÐEØ	�‰�*˜bÓ	!×	%Ñ	% fÓ	-€BÙÜ¨Ð4HÔIÐIÜ�8‰8�D—L‘L " d§h¡h¨}¸bÓ&AÀ4Ç>Á>ÓRÐRr   z/v1/openclaw/status/{run_id}Úrun_idc                 óN   — t         j                  | «      }|st        dd¬«      ‚|S )Nré   zRun not foundrà   )r$  r�   r   )r(  Úss     r   Úopenclaw_statusr+  {  s%   € ä
�	‰	�&Ó€AÙÜ¨°OÔDÐDØ€Hr   z/v1/openclaw/stop/{run_id}c                 ó,   — t         j                  | «      S r|   )r$  r  )r(  s    r   Úopenclaw_stopr-  ‚  s   € ä�7‰7�6‹?Ðr   z/v1/openclaw/runsc                 ó0   — dt         j                  | «      iS )NÚruns)r$  Ú	list_runs)r5   s    r   Úopenclaw_runsr1  †  s   € à”B—L‘L Ó)Ð*Ð*r   z/v1/openclaw/result/{run_id}c                 óN   — t         j                  | «      }|st        dd¬«      ‚|S )Nré   zResult not foundrà   )r$  Ú
get_resultr   )r(  Úrs     r   Úopenclaw_resultr5  Š  s&   € ä
�‰�fÓ€AÙÜ¨Ð4FÔGÐGØ€Hr   z/v1/openclaw/log/{run_id}Útailc                 ó2   — dt         j                  | |«      iS )NÚlog)r$  Úget_log)r(  r6  s     r   Úopenclaw_logr:  ‘  s   € à”2—:‘:˜f dÓ+Ð,Ð,r   )ÚregisterÚ__main__z<============================================================z CyberBrain26 LAB - WebAppz Base dir: z Worktrees: z Data: z Tasks file: z<------------------------------------------------------------z# Starting server on http://0.0.0.0:z Press Ctrl+C to stopz0.0.0.0Úinfo)ÚhostrÚ   Ú	log_levelr|   )F)r"   )éd   )Vrv   rƒ   Úosr#   r?   rA   r<   r   Úpathlibr   Útypingr   ÚuvicornÚfastapir   r   Úfastapi.middleware.corsr   Úfastapi.responsesr	   Úpydanticr
   Úcyberbrain26.pathsr   Ú_project_root_fnr;   ÚBASE_DIRrÿ   Úenvironr•   rÛ   ÚWORKTREES_DIRÚDATA_DIRr}   r   r   rz   r¸   rã   rä   rî   ÚappÚadd_middlewarerÉ   rÌ   rÎ   rÑ   r×   rÜ   Úpostr“   r¶   r—   rV   rï   r¦   r¨   ÚdeleterÒ   rø   Ú"cyberbrain26.core.terminal_servicerù   r  rû   r  r  r  r  r  r  Ú"cyberbrain26.core.openclaw_adapterr  r$  r   r'  r+  r-  r1  r5  r:  Ú!cyberbrain26.core.webapp_phase3fgr;  Úregister_phase3fgrs   ÚprintrB   rx   r   r   ú<module>rX     s†  ðñó
 Û 	Û 	Û Û Û Ý Ý Ý ã ß *Ý 2Ý *Ý å ?ñ
 ‘Ñ$Ó&Ó'Ó(€áˆr�z‰z�~‰~˜o¨r¯z©z¯~©~Ð>PÐRXÓ/YÓZÓ[€Ø˜<Ñ'€Ø�jÑ €Ø˜Ñ$€
ð × Ñ ˜D¨4Ð Ô 0Ø ‡��t d€Ô +÷e0ñ e0÷VDRñ DR÷T
ñ 
ñ2 ‘S˜“]Ó#€Ùƒ]€Ù‹?€ñ Ø
ØØ)ô€ð × Ñ ØØ�%ØØ�%Ø�%ð ô ô#�ô #ô�9ô ô�9ô ô�Yô ð ‡�ˆƒñó ðð ‡�ˆÓñó ðð ‡�Ð
¨|€Ó<ð<�jò <ó =ð<ð ‡�Ð	Óñ,�s˜T‘zò ,ó ð,ð
 ‡�Ð	'Ó(ð�cò ó )ðð ‡�Ð	,¸\€ÓJð<�cò <ó Kð<ð  ‡�Ð
/À€ÓOð˜ò ó Pðð0 ‡�Ð
0Ó1ð"˜#ò "ó 2ð"ð" ‡�Ð
.Ó/ð<˜ò <ó 0ð<ð" ‡�Ð*Ó+ñ!˜ð ! Tò !ó ,ð!õ: ?áÓ€ô�)ô ô
�iô ð ‡�Ð
Óð˜ò ó ðð ‡�Ð	)Ó*ñ3˜cð 3¨#ò 3ó +ð3ð ‡�Ð
,Ó-ð! ò !ó .ð!ð ‡�Ð
Óð6˜ò 6ó ð6ðt ‡�ˆƒñQó ðQõ ?á‘SÑ)Ó+Ó,Ó-€ô�Iô ð ‡�Ð
ÓðS˜ò Só  ðSð ‡�Ð	'Ó(ð˜Cò ó )ðð ‡�Ð
&Ó'ð˜#ò ó (ðð ‡�Ð	Óñ+˜3 ™:ò +ó ð+ð ‡�Ð	'Ó(ð˜Cò ó )ðð ‡�Ð	$Ó%ñ-˜ð - Cò -ó &ð-õ Lá �#Ô àˆzÒÙ	ˆ(„OÙ	Ð
&Ô'Ù	ˆ(„OÙ	ˆK˜�zÐ
"Ô#Ù	ˆL˜˜Ð
(Ô)Ù	ˆG�H�:Ð
ÔÙ	ˆM˜*˜Ð
&Ô'Ù	ˆ(„OÙ	Ð/°¨zÐ
:Ô;Ù	Ð
!Ô"Ù	ˆ(„Oà€G‡K�KØØØØö	ð r   