Ë
    €Éjè  ã                   óÖ   — 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mZ ej                  j                  dd«      Z
ej                  j                  e
d«      Zed„ «       Zd„ Zd	„ Zd
„ Zdd„Zy)zÀFeedback + re-run queue store for the asset library spike (prod). One JSON file, guarded by an flock.
Used by server.py (the page) and cli.py (the re-run worker on the local box, through ssh).é    N)ÚcontextmanagerÚFAL_DATAz/home/forge/fal-feedback/dataz
state.jsonc               #   ó  K  — t        j                  t        d¬«       t        t         j                  j                  t        d«      d«      5 } t        j                  | t        j                  «       	 t        j                  t        t        «      «      }|–— t        dz   }t        j                  |t        |d«      d¬«       t        j                  |t        «       d d d «       y # t        t        f$ r i g dœ}Y Œhw xY w# 1 sw Y   y xY w­w)	NT)Úexist_okz.lockÚw)ÚassetsÚjobsz.tmpé   )Úindent)ÚosÚmakedirsÚDATAÚopenÚpathÚjoinÚfcntlÚflockÚLOCK_EXÚjsonÚloadÚPATHÚOSErrorÚ
ValueErrorÚdumpÚreplace)ÚlkÚstÚtmps      ú=/home/claude-agent/forge-build/forge-assets/feedback/store.pyÚlockedr    	   sÅ   è ø€ ä‡K�K”˜tÕ$Ü	Œb�g‰g�l‰lœ4 Ó)¨3Ó	/ð 	°2Ü�‰�BœŸ™Ô&ð	,Ü—‘œ4¤›:Ó&ˆBð ŠÜ�V‰mˆÜ�	‰	�"”d˜3 “n¨QÕ/Ü
�
‰
�3œÔ÷	ð 	øô œÐ$ò 	,Ø¨Ñ+ŠBð	,ú÷		ð 	üsC   ‚A
DÁ%D Á2"C&ÂA	D Ã	DÃ&C=Ã:D Ã<C=Ã=D Ä D	ÄDc                  óR   — t        j                  dt        j                  «       «      S )Nz%Y-%m-%dT%H:%M:%SZ)ÚtimeÚstrftimeÚgmtime© ó    r   Únowr'      s   € Ü�=‰=Ð-¬t¯{©{«}Ó=Ð=r&   c                 ó~   — | d   j                  |dg i«      }t        «       |d d |dœ}|d   j                  |«       |S )Nr   Úfeedbacké   )ÚtÚtextÚuser)Ú
setdefaultr'   Úappend)r   Úaidr,   r-   ÚaÚitems         r   Úadd_feedbackr3      sH   € Ø
ˆ8‰×Ñ  j°"Ð%5Ó6€AÜ“  U d °TÑ:€DØ€j�M×Ñ˜ÔØ€Kr&   c                 ó4   — | j                  dd«      dk(  rdS dS )z^Astra re-runs (20-40 min) and quick jobs (lighter copy, use-in-games switch) queue separately.ÚkindÚrerunÚquick)Úget)Újs    r   Úlaner:   #   s   € à—e‘e˜F GÓ,°Ò7ˆ7ÐD¸WÐDr&   c                 ó   — | d   D ]2  }|d   |k(  sŒ|d   dv sŒt        |«      t        d|i«      k(  sŒ.d |fc S  t        j                  «       j                  d d |||xs i |d d |dt	        «       d d d	d d
œ}| d   j                  |«       |d fS )Nr	   ÚassetÚstate)ÚqueuedÚrunningr5   é   r*   r>   Ú )Úidr<   r5   Úparamsr)   r-   r=   r>   ÚstartedÚfinishedÚnoteÚversion)r:   ÚuuidÚuuid4Úhexr'   r/   )r   r0   r,   r-   r5   rC   r9   s          r   Úadd_jobrK   (   s´   € Ø�‰Zò ˆØˆW‰:˜Ó  7¡Ð/DÒ!DÌÈaËÔTXÐZ`ÐbfÐYgÓThÓIhØ˜�7ŠNðô �z‰z‹|×Ñ  Ð$¨s¸DÈFÊLÐVXÐfjÐkpÐlpÐfqÐ{Ø¤c£e¸È$ÐXZÐgkñ	m€Aà€v�J×Ñ�aÔØˆdˆ7€Nr&   )r6   N)Ú__doc__r   r   r   r"   rH   Ú
contextlibr   Úenvironr8   r   r   r   r   r    r'   r3   r:   rK   r%   r&   r   ú<module>rO      si   ðñ^ç "× "Ó "Ý %Ø	‡z�z‡~�~�jÐ"AÓB€Ø	‡w�w‡|�|�D˜,Ó'€ð ñó ðò>òòEô
r&   