§
     ’ÞjÃr  ã                  óh  — U 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Zddl	Z	ddl
mZ ddlmZ ddlmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) ddl*m+Z+ dZ,dZ-dZ. ej/        dd 0                    d„ eD ¦   «         ¦  «        z   dz   ¦  «        Z1da2 e3¦   «         Z4de5d<   d/d„Z6d/d„Z7 G d„ de8¦  «        Z9 ed ¬!¦  «         G d"„ d#¦  «        ¦   «         Z:d0d%„Z; G d&„ d'¦  «        Z<d1d*„Z= G d+„ d,¦  «        Z> G d-„ d.¦  «        Z?dS )2a  Deepy requests started by plugins.

A job waits until Deepy and the generation queue are idle, sets the user's conversation and workspace aside, runs the
plugin's request in its own session and workspace (shown in the UI meanwhile), then brings the user's back.
é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚAnyÚIterator)ÚProgressUpdateÚSessionEventÚWanGPSessionÚextract_status_phase_label)Úmedia_registryÚsession_store)Úbuild_file_access_policy)Úgallery_media_ids)ÚGALLERY_SOURCESÚMESH_IMPORT_EXTENSIONSÚsource_for_kind)Úpersist_gallery_import)Úpeek_settings)Úimport_mesh_file)ÚSTORAGE_KEYÚbackground_gallery)Úload_gallery)ÚisolatedÚ	temporaryÚcurrent)ÚcopyÚlink)ÚdoneÚ	cancelledÚerrorz^(?:ú|c              #  óH   K  — | ]}t          j        |j        ¦  «        V — Œd S ©N)ÚreÚescapeÚ	media_ids)Ú.0Úsources     ú@C:\Users\johnn\OneDrive\Documents\AI\shared\deepy\plugin_jobs.pyú	<genexpr>r*   "   s/   è è € Ð,gÐ,gÈV­R¬Y°vÔ7GÑ-HÔ-HÐ,gÐ,gÐ,gÐ,gÐ,gÐ,gó    z):[0-9a-f]{12}$z	set[Path]Ú_open_scratchÚreturnÚNonec                ó
   — | a dS )z4The web UI's Deepy service, which plugin jobs drive.N©Ú_service©Úservices    r)   Úattach_servicer4   '   s   € ð €H€H€Hr+   c                ó    — t           | u rd a d S d S r#   r0   r2   s    r)   Údetach_servicer6   -   s   € å�7ÐÐØˆˆˆð Ðr+   c                  ó   — e Zd ZdS )ÚJobCancelledN)Ú__name__Ú
__module__Ú__qualname__© r+   r)   r8   r8   3   s   € € € € € Ø€Dr+   r8   T)Úfrozenc                  ój   — e Zd ZU ded<   dZded<   dZded<   dZd	ed
<   dZd	ed<   edd„¦   «         Z	dS )ÚDeepyResultÚstrÚstatusÚ Útextr<   ztuple[dict[str, Any], ...]ÚoutputsNú
str | NoneÚsession_dirr    r-   Úboolc                ó   — | j         dk    S )Nr   )rA   ©Úselfs    r)   r   zDeepyResult.cancelled?   s   € àŒ{˜kÒ)Ð)r+   ©r-   rG   )
r9   r:   r;   Ú__annotations__rC   rD   rF   r    Úpropertyr   r<   r+   r)   r?   r?   7   s}   € € € € € € à€K€K�KØ€D€N€N€N�NØ*,€GÐ,Ð,Ð,Ñ,Ø"€KÐ"Ð"Ð"Ñ"Ø€EÐÐÐÑàð*ð *ð *ñ „Xð*ð *ð *r+   r?   r   c           
     ó"  — d x}x}}| d         }| d         dk    r©| d         d         | d         }}t          |t          ¦  «        r*t          |d         ¦  «        t          |d         ¦  «        }}t          |¦  «        dk    rt	          |d         ¦  «        n|}t          |¦  «        dk    rt	          |d         ¦  «        nd }t          j        |¦  «        }t          ||t          j        |||¦  «        ||t          |¦  «        pd |¬¦  «        S )	NÚdescriptionÚtypeÚprogressÚdatar   é   é   )ÚphaserA   rQ   Úcurrent_stepÚtotal_stepsÚ	raw_phaseÚunit)
Ú
isinstanceÚtupleÚintÚlenr@   r
   Ú_normalize_phaser   Ú_estimate_progressr   )ÚeventrV   rW   rY   rA   ÚheadrR   rU   s           r)   Ú_progress_updaterb   D   s<  € Ø(,Ð,€LÐ,�; Ø�=Ô!€FØˆV„}˜
Ò"Ð"Ø˜6”] 1Ô% u¨V¤}ˆdˆÝ�d�EÑ"Ô"ð 	CÝ(+¨D°¬G©¬µc¸$¸q¼'±l´l˜+ˆLÝ!$ T¡¤¨Q¢ •�T˜!”W‘”�°FˆÝ" 4™yœy¨1š}˜}�s�4˜”7‰|Œ|ˆ|°$ˆÝÔ)¨&Ñ1Ô1€EÝ ¨f½|Ô?^Ð_dÐfrÐtñ  @Aô  @Að  P\ð  juõ  A[ð  \bñ  Acô  Acð  Akð  gkð  rvð  wñ  wô  wð  wr+   c                  ó€   — e Zd ZdZddœd„Zddd
„Zddd„Zdd„Zd d„Zd!d„Z	d!d„Z
d„ Zd„ Zdd„Zdd„Zd„ Zd„ Zd„ ZdS )"ÚDeepyJobzlA plugin's Deepy request. Iterate events(), read result(), then close() it (or use it as a context manager).rB   )Úinstructionsc               óR  — |||||f\  | _         | _        | _        | _        | _        |	| _        || _        ||c| _        | _        t          j
        ¦   «         dz  }
t          |
¦  «         |
t          j        ¦   «         j        z  | _        t                                | j        ¦  «         |p	| j        dz  | _        dt          j        ¦   «         j        z   | _        t)          j        ¦   «         | _        t/          j        ¦   «         | _        t/          j        ¦   «         | _        d | _        d| _        di d i f\  | _        | _        | _        | _         tC          ¦   «         dc| _"        | _#        t/          j$        | j%        d|› d�d	¬
¦  «        | _&        | j&         '                    ¦   «          d S )Nz.plugin-jobsÚsessionzplugin-ÚwaitingrB   r   zDeepy job (ú)T)ÚtargetÚnameÚdaemon)(ÚownerÚpromptÚ
media_modeÚ	workspaceÚtitlere   rF   r1   Ú_pathsr   Úsessions_rootÚ_sweep_scratchÚuuidÚuuid4ÚhexÚ_scratchr,   ÚaddÚ_session_folderÚ_submission_idÚqueueÚQueueÚ_eventsÚ	threadingÚEventÚ_cancelÚ_doneÚ_resultÚ_phaseÚ_textÚ_toolsÚ_statusÚ_outputsÚsetÚ_knownÚ_steersÚThreadÚ_runÚ_threadÚstart)rJ   r3   rm   rn   Úpathsro   rF   rp   rq   re   Úroots              r)   Ú__init__zDeepyJob.__init__T   so  € ØOTÐV\Ð^hÐjsÐuzÐOzÑLˆŒ
�D”K ¤°$´.À$Ä*Ø(ˆÔØ&ˆÔØ%,¨eÐ"ˆŒ�t”{ÝÔ*Ñ,Ô,¨~Ñ=ˆÝ�tÑÔÐà�tœz™|œ|Ô/Ñ/ˆŒÝ×Ò˜$œ-Ñ(Ô(Ð(Ø*ÐG¨d¬m¸iÑ.GˆÔØ'­$¬*©,¬,Ô*:Ñ:ˆÔÝ”{‘}”}ˆŒÝ ”Ñ(Ô(ˆŒÝ”_Ñ&Ô&ˆŒ
ØˆŒØˆŒØ?AÀ2ÀtÈRÐ?OÑ<ˆŒ
�D”K ¤¨t¬}Ý$'¡E¤E¨1Ð!ˆŒ�T”\Ý Ô'¨t¬yÐ?UÈUÐ?UÐ?UÐ?UÐ^bÐcÑcÔcˆŒØŒ×ÒÑÔÐÐÐr+   NÚtimeoutúfloat | Noner-   úIterator[SessionEvent]c              #  óh   K  — 	 | j                              |¬¦  «        }|V — |j        t          v rdS Œ0)zpEvents until the job ends: queued, started, status, text, tool, progress, output, then done, cancelled or error.T©r“   N)r~   ÚgetÚkindÚTERMINAL_EVENTS)rJ   r“   r`   s      r)   ÚeventszDeepyJob.eventsj   sC   è è € ð	Ø”L×$Ò$¨WÐ$Ñ5Ô5ˆEØˆKˆKˆKØŒz�_Ð,Ð,Ø�ð		r+   r?   c                ób   — | j                              |¦  «        st          d¦  «        ‚| j        S )NzThe Deepy job is still running.)r‚   ÚwaitÚTimeoutErrorrƒ   )rJ   r“   s     r)   ÚresultzDeepyJob.resultr   s0   € ØŒz�Š˜wÑ'Ô'ð 	BÝÐ@ÑAÔAÐAØŒ|Ðr+   rG   c                ó4   — | j                              ¦   «         S r#   )r‚   Úis_setrI   s    r)   r   zDeepyJob.donew   s   € ØŒz× Ò Ñ"Ô"Ð"r+   rC   r@   r.   c                ó
  — | j         dk    s| j                             ¦   «         rt          d¦  «        ‚| xj        dz  c_        | j                             t          |¦  «        | j        › d| j        › �d| j	        ¬¦  «         dS )z{Send Deepy a message while it works on this job; it applies it at its next step, as a message typed in the Deepy chat does.ÚstartedzYThis Deepy job is not running: send the message with a new run() on the same session_dir.rS   z-steer-T)ÚsteeringÚauthorN)
r„   r‚   r¡   ÚRuntimeErrorr‹   r1   Úsubmitr@   r{   rm   )rJ   rC   s     r)   ÚsteerzDeepyJob.steerz   s„   € àŒ;˜)Ò#Ð# t¤z×'8Ò'8Ñ':Ô':Ð#ÝÐzÑ{Ô{Ð{ØˆŒ˜ÑˆŒØŒ×Ò�S ™YœY¨4Ô+>Ð(UÐ(UÀtÄ|Ð(UÐ(UÐ`dÐmqÔmwÐÑxÔxÐxÐxÐxr+   c                ó¾   — | j                              ¦   «          | j        j        5  | j        j                             ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )z>Stop waiting for Deepy, or interrupt the request once it runs.N)r�   r‰   r1   Ú
_conditionÚ
notify_allrI   s    r)   ÚcancelzDeepyJob.cancel�   sœ   € àŒ×ÒÑÔÐØŒ]Ô%ð 	2ð 	2ØŒMÔ$×/Ò/Ñ1Ô1Ð1ð	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð 	2ð 	2s   ¦AÁAÁAc                ó  — | j                              ¦   «         s-|                      ¦   «          | j                              ¦   «          t	          j        | j        d¬¦  «         t                               | j        ¦  «         dS )zaEnd the job (cancelling it if needed) and delete its private files, temporary workspace included.T©Úignore_errorsN)	r‚   r¡   r¬   r�   ÚshutilÚrmtreerx   r,   ÚdiscardrI   s    r)   ÚclosezDeepyJob.close‡   sj   € àŒz× Ò Ñ"Ô"ð 	Ø�KŠK‰MŒMˆMØŒJ�OŠOÑÔÐÝŒ�d”m°4Ð8Ñ8Ô8Ð8Ý×Ò˜dœmÑ,Ô,Ð,Ð,Ð,r+   c                ó   — | S r#   r<   rI   s    r)   Ú	__enter__zDeepyJob.__enter__�   s   € Øˆr+   c                ó.   — |                       ¦   «          d S r#   )r³   )rJ   Úexcs     r)   Ú__exit__zDeepyJob.__exit__’   s   € Ø�
Š
‰Œˆˆˆr+   c                óV   — | j                              t          ||¦  «        ¦  «         d S r#   )r~   Úputr	   )rJ   r™   rR   s      r)   Ú_emitzDeepyJob._emit•   s(   € ØŒ×Ò� d¨DÑ1Ô1Ñ2Ô2Ð2Ð2Ð2r+   c                ó&  — t          || j        t          | j                             ¦   «         ¦  «        | j        €d nt          | j        ¦  «        |¦  «        | _        | j         	                    ¦   «          |  
                    || j        ¦  «         d S r#   )r?   r…   r[   rˆ   ÚvaluesrF   r@   rƒ   r‚   r‰   r»   )rJ   rA   r    s      r)   Ú_finishzDeepyJob._finish˜   s–   € Ý" 6¨4¬:µu¸T¼]×=QÒ=QÑ=SÔ=SÑ7TÔ7TÐ^bÔ^nÐ^vÐVZÐVZÕ|ð  AEô  AQñ  }Rô  }Rð  TYñ  Zô  ZˆŒØŒ
�ŠÑÔÐØ�
Š
�6˜4œ<Ñ(Ô(Ð(Ð(Ð(r+   c                óL  — 	 | j                              | ¦  «        }|                      |rdnd¦  «         d S # t          $ r |                      d¦  «         Y d S t          $ rA}t          j        ¦   «          |                      dt          |¦  «        ¦  «         Y d }~d S d }~ww xY w)Nr   r   r    )r1   Ú_plugin_runr¾   r8   Ú	ExceptionÚ	tracebackÚ	print_excr@   )rJ   Úinterruptedr    s      r)   r�   zDeepyJob._run�   sÉ   € ð	AØœ-×3Ò3°DÑ9Ô9ˆKð �LŠL¨Ð?˜˜¸Ñ@Ô@Ð@Ð@Ð@øõ ð 	&ð 	&ð 	&Ø�LŠL˜Ñ%Ô%Ð%Ð%Ð%Ð%Ýð 	.ð 	.ð 	.ÝÔÑ!Ô!Ð!Ø�LŠL˜¥# e¡*¤*Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-øøøøð	.øøøs   ‚7 ·B#Á	B#Á"6BÂB#c                óÌ  — | j         }|j        }|j        5  |j        |j        }}ddi|j        | j        <   ddd¦  «         n# 1 swxY w Y   |j        5  d„ |j        D ¦   «         x}| _	        ddd¦  «         n# 1 swxY w Y   | 
                    | j        | j        || j        ¬¦  «         d}	 	 |j        rt          d¦  «        ‚|                     |d	|¬
¦  «        D ]m}|d         }|d         dk    r|d         d         }Œ%|d         dk    r<|d         �4| j        dk    r)|                      dt%          |d         ¦  «        ¦  «         Œn|j        5  |j        | j                 }	|	d         dk    r#|                     ¦   «         rt          d¦  «        ‚ddd¦  «         n# 1 swxY w Y   |	d         dk    rd| _        |                      ||¦  «         |	d         dk    r0	 |j        5  |j        | j        = ddd¦  «         dS # 1 swxY w Y   dS |	d         dk    rct+          |	d         ¦  «        o | j                             ¦   «         p| j         	 |j        5  |j        | j        = ddd¦  «         S # 1 swxY w Y   S | j                             ¦   «         r|sd}|                     di ¦  «         �Œ# |j        5  |j        | j        = ddd¦  «         w # 1 swxY w Y   w xY w)zaSubmit the request, translate what Deepy does into events, and return whether it was interrupted.rU   Ú	submittedNc                óH   — h | ]}|                      d ¦  «        ¯|d          ’Œ S )Úpath_key©r˜   )r'   Úrecords     r)   ú	<setcomp>z#DeepyJob._follow.<locals>.<setcomp>°   s2   € Ð"uÐ"uÐ"u¸&Ð^d×^hÒ^hÐisÑ^tÔ^tÐ"u 6¨*Ô#5Ð"uÐ"uÐ"ur+   )Úmediar¥   FTzWanGP is shutting down.rS   )r“   ÚinstanceÚidrP   ÚsnapshotrR   rÍ   rQ   r£   z>Deepy did not run the request; its reply is in the Deepy chat.r   ÚfinishedrÄ   Ústop)r1   Ú_sessionrª   Ú	_revisionÚ_instance_idÚ_request_statesr{   Ú	turn_lockr   rŠ   r§   rn   rm   Ú_closingr¦   Úevents_afterr„   r»   rb   Ú_plugin_idleÚ_scanrG   r�   r¡   r‹   Úcontrol)
rJ   rÌ   r3   rg   ÚcursorrÍ   ÚknownÚstoppingr`   Ústates
             r)   Ú_followzDeepyJob._follow¨   s   € à”-ˆØÔ"ˆØÔð 	Rð 	RØ&Ô0°'Ô2F�HˆFØ<CÀ[Ð;QˆGÔ# DÔ$7Ñ8ð	Rð 	Rð 	Rñ 	Rô 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Røøøð 	Rð 	Rð 	Rð 	Rð Ôð 	vð 	vØ"uÐ"uÀGÔDZÐ"uÑ"uÔ"uÐuˆE�D”Kð	vð 	vð 	vñ 	vô 	vð 	vð 	vð 	vð 	vð 	vð 	vøøøð 	vð 	vð 	vð 	và�Š�t”{ DÔ$7¸uÈTÌZˆÑXÔXÐXØˆð	Að0ØÔ#ð BÝ&Ð'@ÑAÔAÐAØ$×1Ò1°&À!ÈhÐ1ÑWÔWð Pð P�EØ" 4œ[�FØ˜V”}¨
Ò2Ð2Ø#(¨¤=°Ô#<˜˜Ø˜vœ¨*Ò4Ð4¸¸v¼Ð9RÐW[ÔWbÐfoÒWoÐWoØŸ
š
 :Õ/?ÀÀfÄÑ/NÔ/NÑOÔOÐOøØÔ'ð mð mØ#Ô3°DÔ4GÔH�Eà˜W”~¨Ò4Ð4¸×9MÒ9MÑ9OÔ9OÐ4Ý*Ð+kÑlÔlÐlð	mð mð mñ mô mð mð mð mð mð mð møøøð mð mð mð mð
 ˜”> YÒ.Ð.Ø"+�D”KØ—
’
˜7 EÑ*Ô*Ð*Ø˜”> [Ò0Ð0Øð Ô#ð Að AØÔ+¨DÔ,?Ð@ðAð Að Añ Aô Að Að Að Að Að Að Að Aøøøð Að Að Að Að Að Að ˜”> ZÒ/Ð/å  mÔ 4Ñ5Ô5Ðe¸4¼<×;NÒ;NÑ;PÔ;PÐ;dÐX\ÔXdÐTdÐeð
 Ô#ð Að AØÔ+¨DÔ,?Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að Að	 ”<×&Ò&Ñ(Ô(ð 0°ð 0Ø#�HØ—O’O F¨BÑ/Ô/Ð/ñ10øð4 Ô#ð Að AØÔ+¨DÔ,?Ð@ðAð Að Añ Aô Að Að Að Að Að Að Aøøøð Að Að Að Að Aøøøsª   – AÁAÁ	AÁA9Á9A=Â A=Â/B$J5 ÅAF!ÆJ5 Æ!F%Æ%J5 Æ(F%Æ)8J5 Ç)HÈHÈHÈAJ5 ÉI4É4I8	É;I8	Ê 5J5 Ê5K#Ê=KËK#ËKËK#ËKËK#c           	     óP  ‡ ‡‡‡— |j         5  |j        Št          ˆ ˆfd„t          t	          ‰¦  «        dz
  dd¦  «        D ¦   «         d ¦  «        }g }|�\‰|dz   d …         D ]N}|                     d¦  «        dk    r3|                     d„ |                     dg ¦  «        D ¦   «         ¦  «         ŒO|j        }ˆfd„|j        D ¦   «         }d d d ¦  «         n# 1 swxY w Y   d	 	                    d
„ |D ¦   «         ¦  «        }|‰ j
        k    rV‰                      d||                     ‰ j
        ¦  «        r|t	          ‰ j
        ¦  «        d …         n|dœ¦  «         |‰ _
        |D ]�Š‰                     d¦  «        dk    rr‰ j                             ‰d         ¦  «        ‰d         ‰d         fk    r@‰d         ‰d         f‰ j        ‰d         <   ‰                      dˆfd„dD ¦   «         ¦  «         ŒŽ|�0|‰ j        k    r%‰                      d|d         |d         dœ¦  «         |‰ _        |D ]y\  }	}
}}|	‰ j        vrit!          |
t#          |¦  «        j        ¦  «        d         |
|t'          |
¦  «        j        |dœ‰ j        |	<   ‰                      d‰ j        |	         ¦  «         Œzd S )Nc              3  ód   •K  — | ]*}‰|                               d ¦  «        ‰j        k    ¯&|V — Œ+dS )Úclient_submission_idN)r˜   r{   )r'   ÚindexrJ   Ú
transcripts     €€r)   r*   z!DeepyJob._scan.<locals>.<genexpr>Ô   s{   øè è € ð  Yð  Y EÐS]Ð^cÔSd×ShÒShÐiñ  TAô  TAð  EIô  EXò  TXð  TX˜%ð  TXð  TXð  TXð  TXð  Yð  Yr+   rS   éÿÿÿÿÚroleÚuserc              3  ó^   K  — | ](}t          |t          ¦  «        ¯t          |¦  «        V — Œ)d S r#   )rZ   Údict©r'   Úblocks     r)   r*   z!DeepyJob._scan.<locals>.<genexpr>Ú   s:   è è € Ð%sÐ%s°eÕ[eÐfkÕmqÑ[rÔ[rÐ%s¥d¨5¡k¤kÐ%sÐ%sÐ%sÐ%sÐ%sÐ%sr+   Úblocksc           	     óð   •— g | ]r}d |                      dg ¦  «        v ¯|                      d¦  «        ‰v¯1|                      d¦  «        ¯F|d         |d         |d         |                      dd¦  «        f‘ŒsS )ÚwriteÚaccessrÈ   ÚpathÚ
media_typeÚlabelrB   rÉ   )r'   rÊ   rÝ   s     €r)   ú
<listcomp>z"DeepyJob._scan.<locals>.<listcomp>Ü   s  ø€ ð  wð  wð  wÐouð  T[ð  _e÷  _iò  _ið  jrð  tvñ  _wô  _wð  Twð  Twð  |B÷  |Fò  |Fð  GQñ  |Rô  |Rð  Z_ð  |_ð  |_ð  dj÷  dnò  dnð  ouñ  dvô  dvð  |_˜˜zÔ*¨F°6¬N¸FÀ<Ô<PÐRX×R\ÒR\Ð]dÐfhÑRiÔRiÐjð  |_ð  |_ð  |_r+   z

c              3  ó‚   K  — | ]:}|                      d ¦  «        dk    ¯|                      d¦  «        ¯0|d         V — Œ;dS )rP   ÚmarkdownrC   NrÉ   rë   s     r)   r*   z!DeepyJob._scan.<locals>.<genexpr>Ý   sR   è è € ÐvÐv¨UÀÇ	Â	È&Ñ@QÔ@QÐU_Ò@_Ð@_Ðdi×dmÒdmÐntÑduÔduÐ@_˜5 œ=Ð@_Ð@_Ð@_Ð@_ÐvÐvr+   rC   )rC   ÚdeltarP   ÚtoolrÎ   rA   Ústatus_textc                ó"   •— i | ]}|‰|         “ŒS r<   r<   )r'   Úkeyrì   s     €r)   ú
<dictcomp>z"DeepyJob._scan.<locals>.<dictcomp>ä   s   ø€ Ð#pÐ#pÐ#p¸ C¨¨s¬Ð#pÐ#pÐ#pr+   )rÎ   rk   ró   rA   rù   r™   )r™   rC   r   )rÎ   rñ   r™   rk   ró   Úoutput)rÖ   Úchat_transcriptÚnextÚranger]   r˜   ÚextendÚchat_statusr   Újoinr…   r»   Ú
startswithr†   r‡   rˆ   r   r   r&   r   rk   )rJ   rg   rÝ   r�   rí   rÊ   rA   ÚwrittenrC   rÈ   rñ   r™   ró   rì   rå   s   ` `          @@r)   rÚ   zDeepyJob._scanÑ   s¤  øøøø€ ØÔð 
	wð 
	wØ Ô0ˆJÝð  Yð  Yð  Yð  Yð  Y­Uµ3°z±?´?ÀQÑ3FÈÈBÑ-OÔ-Oð  Yñ  Yô  Yð  [_ñ  `ô  `ˆEØˆFØÐ à(¨°©¨¨Ô4ð tð t�FØ—z’z &Ñ)Ô)¨VÒ3Ð3ØŸšÐ%sÐ%s¸v¿zºzÈ(ÐTVÑ?WÔ?WÐ%sÑ%sÔ%sÑsÔsÐsøØÔ(ˆFð wð  wð  wð  wð  zAô  zPð  wñ  wô  wˆGð
	wð 
	wð 
	wñ 
	wô 
	wð 
	wð 
	wð 
	wð 
	wð 
	wð 
	wøøøð 
	wð 
	wð 
	wð 
	wð �{Š{ÐvÐv°fÐvÑvÔvÑvÔvˆØ�4”:ÒÐØ�JŠJ�v¨ÐQU×Q`ÒQ`ÐaeÔakÑQlÔQlÐ7v°t½CÀÄ
¹O¼OÐ<LÐ<LÔ7MÐ7MÐrvÐwÐwÑxÔxÐxØˆDŒJØð 	rð 	rˆEØ�yŠy˜Ñ Ô  FÒ*Ð*¨t¬{¯ª¸uÀT¼{Ñ/KÔ/KÐPUÐV^ÔP_ÐafÐgtÔauÐOvÒ/vÐ/vØ,1°(¬O¸UÀ=Ô=QÐ+R�”˜E $œKÑ(Ø—
’
˜6Ð#pÐ#pÐ#pÐ#pÐ?oÐ#pÑ#pÔ#pÑqÔqÐqøØÐ &¨D¬LÒ"8Ð"8Ø�JŠJ�x¨&°¬.À&ÈÄ.Ð!QÐ!QÑRÔRÐRØˆŒØ+2ð 	>ð 	>Ñ'ˆH�d˜D %Ø˜tœ}Ð,Ð,Ý1BÀ4ÍÐY]ÑI^ÔI^ÔIhÑ1iÔ1iÐjkÔ1lÐvzð  EIõ  SWð  X\ñ  S]ô  S]ô  Sbð  mrð  +sð  +s�”˜hÑ'Ø—
’
˜8 T¤]°8Ô%<Ñ=Ô=Ð=øð	>ð 	>s   ŒB>CÃCÃCr#   )r“   r”   r-   r•   )r“   r”   r-   r?   rK   )rC   r@   r-   r.   ©r-   r.   )r9   r:   r;   Ú__doc__r’   r›   rŸ   r   r¨   r¬   r³   rµ   r¸   r»   r¾   r�   rà   rÚ   r<   r+   r)   rd   rd   Q   s6  € € € € € ØvÐvàqsð ð ð ð ð ð,ð ð ð ð ðð ð ð ð ð
#ð #ð #ð #ðyð yð yð yð2ð 2ð 2ð 2ð-ð -ð -ð -ðð ð ðð ð ð3ð 3ð 3ð 3ð)ð )ð )ð )ð
	Að 	Að 	Að'Að 'Að 'AðR>ð >ð >ð >ð >r+   rd   r‘   r   c                óÖ   ‡— |                       ¦   «         sdS |                      ¦   «         D ]<Š‰t          vr1t          ˆfd„dD ¦   «         ¦  «        st	          j        ‰d¬¦  «         Œ=dS )zVRemove private job folders left by an earlier run that ended without closing its jobs.Nc              3  óF   •K  — | ]}t          j        ‰|z  ¦  «        V — Œd S r#   )r   Úsession_folder_in_use)r'   rk   Úchilds     €r)   r*   z!_sweep_scratch.<locals>.<genexpr>ó   sN   øè è € ð  2Gð  2GÐhlµ-Ô2UÐV[Ð^bÑVbÑ2cÔ2cð  2Gð  2Gð  2Gð  2Gð  2Gð  2Gr+   )rg   ÚparkedTr®   )Úis_dirÚiterdirr,   Úanyr°   r±   )r‘   r  s    @r)   rt   rt   î   sœ   ø€ à�;Š;‰=Œ=ð ØˆØ—’‘”ð 5ð 5ˆØ�Ð%Ð%­cð  2Gð  2Gð  2Gð  2Gð  qFð  2Gñ  2Gô  2Gñ  /Gô  /GÐ%ÝŒM˜%¨tÐ4Ñ4Ô4Ð4øð5ð 5r+   c                  ó’   — e Zd ZdZdd„Zdd„Zd„ Zddd	„Zdd„Zd d„Z	d„ Z
d!d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )"ÚPluginJobSupportz6Service side of plugin jobs (mixed into DeepyService).r-   úlist[dict[str, Any]]c                ó�   ‡ — ‰ j         5  ˆ fd„‰ j                             ¦   «         D ¦   «         cd d d ¦  «         S # 1 swxY w Y   d S )Nc                óB   •— g | ]}d di|¥d|d         ‰j         k    i¥‘ŒS )Ústorage_modeÚsharedÚshownrÎ   )Úworkspace_id)r'   ÚitemrJ   s     €r)   rô   z6PluginJobSupport.plugin_workspaces.<locals>.<listcomp>ü   sL   ø€ ð  Hð  Hð  HÐei�^ XÐ`°Ð`°wÀÀTÄ
ÈdÔN_Ò@_Ð`Ð`ð  Hð  Hð  Hr+   )Ú_mutation_lockÚ
workspacesÚcatalogrI   s   `r)   Úplugin_workspacesz"PluginJobSupport.plugin_workspacesú   sÐ   ø€ ØÔ ð 	Hð 	Hð Hð  Hð  Hð  HÐmqÔm|÷  nEò  nEñ  nGô  nGð  Hñ  Hô  Hð	Hð 	Hð 	Hð 	Hñ 	Hô 	Hð 	Hð 	Hð 	Hð 	Hð 	Hð 	Høøøð 	Hð 	Hð 	Hð 	Hð 	Hð 	Hs   ‰%;»?Á?Fc                óØ   — t           j                             |¦  «        }t          ||j        ¦  «        d         || j                             |¦  «        t          |¦  «        j        ||dœS )Nr   )rÎ   rñ   r™   rk   Úselectedrp   )	Úosrñ   Úabspathr   r&   ÚgalleryÚ_detect_media_typer   rk   )rJ   rñ   r(   r  r  s        r)   Ú_plugin_media_itemz#PluginJobSupport._plugin_media_itemþ   s„   € ÝŒw�Š˜tÑ$Ô$ˆÝ'¨¨fÔ.>Ñ?Ô?ÀÔBÈDÐZ^ÔZf×ZyÒZyÐz~ÑZÔZõ  JNð  OSñ  JTô  JTô  JYð  goð  ~Jð  Kð  Kð  	Kr+   c                ó¬   — || j         k    r| j        d         S t          | |¦  «        p,t          | j                             |¦  «        | j        ¦  «        S )NÚgen)r  Ú_stater   r   r  r˜   Ú_workspace_settings)rJ   r  s     r)   Ú_plugin_gallery_statez&PluginJobSupport._plugin_gallery_state  sa   € Ø˜4Ô,Ò,Ð,Ø”;˜uÔ%Ð%Ý! $¨Ñ5Ô5ð  C½ÀdÄo×FYÒFYÐZfÑFgÔFgÐimô  jBñ  :Cô  :Cð  	Cr+   Nc                óÊ   ‡ ‡‡‡— ‰ j         5  ‰p‰ j        Š‰                      ‰¦  «        Šˆˆ ˆfd„t          D ¦   «         }d d d ¦  «         n# 1 swxY w Y   ˆfd„|D ¦   «         S )Nc                óž   •— g | ]I}t          ‰|j                 ¦  «        D ],\  }}‰                     ||‰|‰|j                 k    ¦  «        ‘Œ-ŒJS r<   )Ú	enumerateÚ	files_keyr$  Úselected_key)r'   r(   rä   rñ   r&  rJ   r  s       €€€r)   rô   z3PluginJobSupport.plugin_gallery.<locals>.<listcomp>  s§   ø€ ð  ð  ð  Ðpvõ  ^gð  hkð  lrô  l|ô  h}ñ  ^~ô  ^~ð  ð  ñ  OZð  OTð  VZ�T×,Ò,¨T°6¸<ÈÐRUÐV\ÔViÔRjÒIjÑkÔkð  ð  ð  ð  r+   c                ó0   •— g | ]}‰�|d         ‰k    ¯|‘ŒS )Nr™   r<   )r'   r  r™   s     €r)   rô   z3PluginJobSupport.plugin_gallery.<locals>.<listcomp>  s+   ø€ ÐOÐOÐO˜¨$¨,¸$¸v¼,È$Ò:NÐ:N�Ð:NÐ:NÐ:Nr+   )r  r  r)  r   )rJ   r  r™   Úitemsr&  s   ``` @r)   Úplugin_galleryzPluginJobSupport.plugin_gallery  sñ   øøøø€ ØÔ ð 	ð 	Ø'Ð<¨4Ô+<ˆLØ×,Ò,¨\Ñ:Ô:ˆCð ð  ð  ð  ð  ð  õ  {Jð  ñ  ô  ˆEð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð PÐOÐOÐO ÐOÑOÔOÐOs   Œ4AÁAÁAúdict[str, Any] | Nonec                ój  ‡— | j         5  | j        d         Št          ˆfd„t          D ¦   «         ¦  «        }‰|j                 }d|cxk    rt          ‰|j                 ¦  «        k     r1n n.|                      ‰|j                 |         || j        d¦  «        nd cd d d ¦  «         S # 1 swxY w Y   d S )Nr&  c              3  ó>   •K  — | ]}|j         ‰d          k    ¯|V — ŒdS )Úcurrent_gallery_sourceN)rÎ   )r'   r(   r&  s     €r)   r*   z3PluginJobSupport.plugin_selected.<locals>.<genexpr>  s5   øè è € ÐmÐm VÀ&Ä)ÈsÐSkÔOlÒBlÐBl˜&ÐBlÐBlÐBlÐBlÐmÐmr+   r   T)	r  r'  rÿ   r   r.  r]   r-  r$  r  )rJ   r(   rä   r&  s      @r)   Úplugin_selectedz PluginJobSupport.plugin_selected  sc  ø€ ØÔ ð 	_ð 	_Ø”+˜eÔ$ˆCÝÐmÐmÐmÐm­ÐmÑmÔmÑmÔmˆFØ˜Ô+Ô,ˆEØmnÐrwð  nUð  nUò  nUð  nUÕz}ð  Bð  CIô  CSô  Tñ  {Uô  {Uò  nUð  nUð  nUð  nUð  nU�4×*Ò*¨3¨vÔ/?Ô+@ÀÔ+GÈÐQUÔQbÐdhÑiÔiÐið  [_ð		_ð 	_ð 	_ð 	_ñ 	_ô 	_ð 	_ð 	_ð 	_ð 	_ð 	_ð 	_øøøð 	_ð 	_ð 	_ð 	_ð 	_ð 	_s   ‰BB(Â(B,Â/B,ú	list[str]c                óž  — g }|D ]Ç}t          |t          ¦  «        r|d         }t          j        |¦  «        }t                               |¦  «        r|                      |¦  «        nt          j                             |¦  «        }t          j         	                    |¦  «        st          d|› �¦  «        ‚|                     |¦  «         ŒÈ|S )zjGallery ids (shown workspace first, then the others), gallery items or file paths, as existing file paths.rñ   zMedia file not found: )rZ   rê   r   ÚfspathÚ_MEDIA_ID_REÚ	fullmatchÚ_plugin_find_media_idrñ   r!  ÚisfileÚFileNotFoundErrorÚappend)rJ   rÌ   r�   r  rC   rñ   s         r)   Úplugin_resolve_mediaz%PluginJobSupport.plugin_resolve_media  sÄ   € àˆØð 	ð 	ˆDÝ˜$¥Ñ%Ô%ð $Ø˜F”|�Ý”9˜T‘?”?ˆDÝ7C×7MÒ7MÈdÑ7SÔ7SÐn�4×-Ò-¨dÑ3Ô3Ð3ÕY[ÔY`×YhÒYhÐimÑYnÔYnˆDÝ”7—>’> $Ñ'Ô'ð IÝ'Ð(GÀÐ(GÐ(GÑHÔHÐHØ�LŠL˜ÑÔÐÐØˆr+   c                óÔ  — | j         5  | j        d         }t          D ]‚}t          ||j                 ¦  «        D ]e\  }}|t          ||j        t          ||j                 |¦  «        ¦  «        v r/t          j
                             |¦  «        c c cd d d ¦  «         S ŒfŒƒ| j        j        D ]’}| j                             |¦  «        d         }t          D ]h}|                     |j        g ¦  «        D ]J}|t          ||j        ¦  «        v r1t          j
                             |¦  «        c c c cd d d ¦  «         S ŒKŒiŒ“	 d d d ¦  «         n# 1 swxY w Y   t          d|› d�¦  «        ‚)Nr&  r"  zNo gallery media has the id ú.)r  r'  r   r,  r-  r   r&   r   Úsettings_keyr   rñ   r!  r  Úrecordsr˜   Ú
ValueError)rJ   Úmedia_idr&  r(   rä   rñ   r  r"  s           r)   r<  z&PluginJobSupport._plugin_find_media_id"  s  € ØÔ ð 	9ð 	9Ø”+˜eÔ$ˆCÝ)ð 5ð 5�Ý#,¨S°Ô1AÔ-BÑ#CÔ#Cð 5ð 5‘K�E˜4ØÕ#4°T¸6Ô;KÍ]Ð[^Ð_eÔ_rÔ[sÐuzÑM{ÔM{Ñ#|Ô#|Ð|Ð|Ý!œwŸš¨tÑ4Ô4Ð4Ð4Ð4Ð4ð	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð }ð5ð !%¤Ô 7ð 9ð 9�Øœ/×-Ò-¨lÑ;Ô;¸IÔF�Ý-ð 9ð 9�FØ '§¢¨FÔ,<¸bÑ AÔ Að 9ð 9˜Ø#Õ'8¸¸vÔ?OÑ'PÔ'PÐPÐPÝ#%¤7§?¢?°4Ñ#8Ô#8Ð8Ð8Ð8Ð8Ð8Ð8ð	9ð 	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð Qð9ð9ð9ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9õ ÐC¸ÐCÐCÐCÑDÔDÐDs   ˆB	EÂBEÄ<EÅEÅEr@   c                óF  — | j         5  |dk    r?| j                             | j        ¦  «                             dd¦  «        cddd¦  «         S |dk    s|�dn1| j                             ¦   «                              t          d¦  «        cddd¦  «         S # 1 swxY w Y   dS )zkStorage of the workspace a job would use: 'dedicated' (own folder) or 'shared' (files kept where they are).r   r  r  Nr   Ú	dedicated)r  r  r˜   r  Ú_depsÚget_server_configr   )rJ   rp   rF   s      r)   Úplugin_job_storagez#PluginJobSupport.plugin_job_storage1  s/  € àÔ ð 	Uð 	UØ˜IÒ%Ð%Ø”×*Ò*¨4Ô+<Ñ=Ô=×AÒAÀ.ÐRZÑ[Ô[ð	Uð 	Uð 	Uð 	Uñ 	Uô 	Uð 	Uð 	Uð #,¨{Ò":Ð":¸kÐ>U�;�;Ð[_Ô[e×[wÒ[wÑ[yÔ[y×[}Ò[}õ  Jð  LTñ  \Uô  \Uð	Uð 	Uð 	Uð 	Uñ 	Uô 	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	Uøøøð 	Uð 	Uð 	Uð 	Uð 	Uð 	Us   ˆ9BÁ;BÂBÂBc                ó¦   — | j         5  || j        v r'd|i|¥| j        |<   | j                              ¦   «          d d d ¦  «         d S # 1 swxY w Y   d S )NrU   )rª   rÕ   r«   )rJ   Úsubmission_idrU   Úinfos       r)   Ú_plugin_request_eventz&PluginJobSupport._plugin_request_event8  s§   € ØŒ_ð 	-ð 	-Ø Ô 4Ð4Ð4Ø7>ÀÐ6NÈÐ6N�Ô$ ]Ñ3Ø”×*Ò*Ñ,Ô,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s   ˆ1AÁA
ÁA
c                ór   — | j         }| j        p(|j        p!|j        p| j        p| j        o| j        d          S )NÚpending)rÒ   Ú_threadsÚworker_activeÚqueued_job_countÚgeneration_runningÚ_restoration)rJ   rg   s     r)   rÙ   zPluginJobSupport._plugin_idle>  so   € Ø”-ˆØ”Mð  j WÔ%:ð  j¸gÔ>Vð  jÐZ^ÔZqð  jÐvzô  wHð  wið  MQô  M^ð  _hô  Mið  kð  	kr+   c                ó  — |                       |¦  «        }	 |                     d|j        €d nt          |j        ¦  «        | j        dœ¦  «         |j                             ¦   «         rt          ¦   «         ‚| j        5  |  	                    |¦  «        }d d d ¦  «         n# 1 swxY w Y   | 
                    |¦  «        | j        5  |                      ¦   «         s/| j                             d¬¦  «         |                      ¦   «         ¯/d d d ¦  «         n# 1 swxY w Y   |j        dk    r |                     | j        |j        ¦  «         |                      ||¦  «         S # | j        5  |                      ¦   «         s/| j                             d¬¦  «         |                      ¦   «         ¯/d d d ¦  «         n# 1 swxY w Y   |j        dk    r |                     | j        |j        ¦  «         |                      ||¦  «         w xY w)Nr£   )rF   r  rS   r—   )Ú_plugin_acquirer»   rF   r@   r  r�   r¡   r8   r  Ú_plugin_attachrà   rª   rÙ   r�   r„   rÚ   rÒ   rŠ   Ú_plugin_restore)rJ   Újobr  rÌ   s       r)   rÀ   zPluginJobSupport._plugin_runB  sÏ  € Ø×%Ò% cÑ*Ô*ˆð	.Ø�IŠI�i¸¼Ð9P°°ÕVYÐZ]ÔZiÑVjÔVjð  }Aô  }Nð  "Oð  "Oñ  Pô  Pð  PØŒ{×!Ò!Ñ#Ô#ð %Ý"‘n”nÐ$ØÔ$ð 1ð 1Ø×+Ò+¨CÑ0Ô0�ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1à—;’;˜uÑ%Ô%à”ð 4ð 4Ø×+Ò+Ñ-Ô-ð 4Ø”O×(Ò(°Ð(Ñ3Ô3Ð3ð ×+Ò+Ñ-Ô-ð 4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð Œz˜YÒ&Ð&Ø—	’	˜$œ-¨¬Ñ4Ô4Ð4Ø× Ò   fÑ-Ô-Ð-Ð-øð ”ð 4ð 4Ø×+Ò+Ñ-Ô-ð 4Ø”O×(Ò(°Ð(Ñ3Ô3Ð3ð ×+Ò+Ñ-Ô-ð 4ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð Œz˜YÒ&Ð&Ø—	’	˜$œ-¨¬Ñ4Ô4Ð4Ø× Ò   fÑ-Ô-Ð-Ð-øøøsi   —A'E# Á>B ÂE# Â B$Â$E# Â'B$Â(E# ÃADÄD	ÄD	Å#HÅ+AF;Æ/HÆ;F?Æ?HÇF?ÇAHc                ó`  — | j         5  | j                             |¦  «         d d d ¦  «         n# 1 swxY w Y   	 d}	 | j         5  | j        d         |u r| j        €|                      ¦   «         s…|j                             ¦   «         rt          ¦   «         ‚|sd}|                     d¦  «         | j          	                    d¬¦  «         | j        d         |u ¯j| j        ­q|                      ¦   «         ¯…d d d ¦  «         n# 1 swxY w Y   | j
        5  | j        €¥|                      ¦   «         r‘|| _        	 |                      |¦  «        cd d d ¦  «         | j         5  | j                             |¦  «         | j                              ¦   «          d d d ¦  «         S # 1 swxY w Y   S # t          $ r	 d | _        ‚ w xY wd d d ¦  «         n# 1 swxY w Y   �Œ›# | j         5  | j                             |¦  «         | j                              ¦   «          d d d ¦  «         w # 1 swxY w Y   w xY w)NFTr   ÚqueuedrS   r—   )rª   Ú_plugin_waitersr?  Ú_plugin_jobrÙ   r�   r¡   r8   r»   r�   r  Ú_plugin_takeoverÚremover«   ÚBaseException)rJ   r[  r]  s      r)   rX  z PluginJobSupport._plugin_acquireS  s   € ØŒ_ð 	-ð 	-ØÔ ×'Ò'¨Ñ,Ô,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð	-ØˆFð"Ø”_ð 8ð 8Ø#Ô3°AÔ6¸#Ð=Ð=À$ÔBRÐBZÐ_c×_pÒ_pÑ_rÔ_rÐBZØœ;×-Ò-Ñ/Ô/ð 1Ý".¡.¤.Ð0Ø%ð 0Ø%)˜FØŸIšI hÑ/Ô/Ð/Øœ×,Ò,°QÐ,Ñ7Ô7Ð7ð  $Ô3°AÔ6¸#Ð=Ð=À$ÔBRÐBZÐ_c×_pÒ_pÑ_rÔ_rÐBZð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8ð Ô(ð "ð "ØÔ'Ð/°D×4EÒ4EÑ4GÔ4GÐ/Ø+.˜Ô(ð"Ø#'×#8Ò#8¸Ñ#=Ô#=ð	"ð "ð "ð "ñ "ô "ð "ð ”ð -ð -ØÔ$×+Ò+¨CÑ0Ô0Ð0Ø”×*Ò*Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -øõ	  -ð "ð "ð "Ø/3˜DÔ,Ø!ð"øøøð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ñ"øð& ”ð -ð -ØÔ$×+Ò+¨CÑ0Ô0Ð0Ø”×*Ò*Ñ,Ô,Ð,ð-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -øøøs®   ˆ/¯3¶3»
G ÁB0DÃ5G ÄDÄG ÄDÄ	
G Ä#GÄ7F*ÅG Å4FÆF"	Æ%F"	Æ*F=Æ=GÇ G ÇGÇG ÇGÇG ÇH-Ç!4H!ÈH-È!H%È%H-È(H%È)H-c                óÒ  — | j         j        }|                     | j        |j        dz  ¦  «        }| j        |d<   	 |                     | j        |j        |j        |j        pt          j
        |j        ¦  «        ¦  «        }| j        }|j        |_        |j        |d<   |                      |||d         ¦  «        \  }}|r||d<   | j                             ||j        ¦  «         || j        k    r)|                      ¦   «          |                      |¦  «         ||_        |d         rVt-          j        |t1          |                      ¦   «         ¦  «        ¦  «         |r t          j        || j        d         ¦  «         t          j        |¦  «         n%# t8          $ r |                      ||¦  «         ‚ w xY w|                      d|d         ¦  «         |                      ¦   «          |S )	Nr  r  ÚleaseÚresumedÚcreated_workspacer&  Úchatr`   ) rI  Ú
controllerÚpark_conversationr'  rx   r  Úopen_external_sessionrz   rq   r   Úautomatic_titlern   rÒ   re   Úplugin_instructionsÚstorage_session_idÚ_plugin_workspacer  rd  Úsave_workspaceÚ_apply_workspaceÚgallery_workspace_idr   Úsync_context_media_pathsr   Úworkspace_output_configÚinject_session_mediaÚschedule_autosaverb  rZ  ÚpublishÚ_plugin_publish_views)rJ   r[  rh  r  Úopenedrg   r  Úcreateds           r)   r`  z!PluginJobSupport._plugin_takeovero  s  € Ø”ZÔ*ˆ
Ø×-Ò-¨d¬k¸3¼<È(Ñ;RÑSÔSˆØ!%Ô!2ˆˆ~Ñð	Ø×5Ò5°d´kÀ3ÔCVÐX[ÔXaÐcfÔclð  dZÕp}ô  qNð  ORô  OYñ  qZô  qZñ  [ô  [ˆFØ”mˆGØ*-Ô*:ˆGÔ'Ø%Ô8ˆF�7‰OØ$(×$:Ò$:¸3ÀÈÐPYÔIZÑ$[Ô$[Ñ!ˆL˜'Øð ;Ø.:�Ð*Ñ+ØŒO×!Ò! ,°Ô0JÑKÔKÐKØ˜tÔ0Ò0Ð0Ø×#Ò#Ñ%Ô%Ð%Ø×%Ò% lÑ3Ô3Ð3Ø+7ˆGÔ(Ø�iÔ ð TÝÔ7¸ÕAYÐZ^×ZvÒZvÑZxÔZxÑAyÔAyÑzÔzÐzØð TÝ!Ô6°wÀÄÈEÔ@RÑSÔSÐSÝÔ+¨GÑ4Ô4Ð4Ð4øÝð 	ð 	ð 	Ø× Ò   fÑ-Ô-Ð-Øð	øøøð 	�Š�V˜V Gœ_Ñ-Ô-Ð-Ø×"Ò"Ñ$Ô$Ð$Øˆs   »EF Æ"F4c                óT  — | j         5  | j        j        D ]0}| j                             |¦  «        |k    r|c cd d d ¦  «         S Œ1| j                             ||¬¦  «        }| j                             |d¦  «         d d d ¦  «         n# 1 swxY w Y   |                      ¦   «          |S )N©ÚfolderT)r  r  rD  Ú	media_dirÚcreateÚprotectÚpublish_workspaces)rJ   rk   r|  r  s       r)   Úplugin_folder_workspacez(PluginJobSupport.plugin_folder_workspaceŒ  s  € ØÔ ð 	8ð 	8Ø $¤Ô 7ð (ð (�Ø”?×,Ò,¨\Ñ:Ô:¸fÒDÐDØ'Ð'Ð'ð	8ð 	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8àDàœ?×1Ò1°$¸vÐ1ÑFÔFˆLØŒO×#Ò# L°$Ñ7Ô7Ð7ð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8ð 	×ÒÑ!Ô!Ð!ØÐs   ˆ0B	Á8B	Â	BÂBc                óî  — |j         dk    r	| j        dfS |j         t          vr	|j         dfS |j        �
|j        dz  n|j         dk    r|j        dz  dz  nd }|r?|j        | j        j        v r,| j                             |j        ¦  «        |k    r	|j        dfS | j	         
                    ¦   «                              t          d¦  «        | j        _        | j                             |j        |¬¦  «        dfS )	Nr   Fr"  r   rg   r  r{  T)rp   r  ÚWORKSPACE_MODESrF   rx   rq  r  rD  r}  rI  rJ  r˜   r   Údefault_moder~  Ústorage_title)rJ   r[  rg   re  r|  s        r)   rn  z"PluginJobSupport._plugin_workspace–  s5  € ØŒ=˜IÒ%Ð%ØÔ$ eÐ+Ð+ØŒ=¥Ð/Ð/Ø”= %Ð'Ð'Ø03´Ð0K�” 9Ñ,Ð,Ðy|ô  zGð  KVò  zVð  zVÐQTÔQ]Ð`iÑQiÐluÑQuÐQuð  \`ˆàð 	7�wÔ3°t´Ô7NÐNÐNÐSWÔSb×SlÒSlÐmtô  nJñ  TKô  TKð  OUò  TUð  TUØÔ/°Ð6Ð6Ø'+¤z×'CÒ'CÑ'EÔ'E×'IÒ'IÍ+ÐW_Ñ'`Ô'`ˆŒÔ$ØŒ×%Ò% gÔ&;ÀFÐ%ÑKÔKÈTÐQÐQr+   c                ó>  ‡ — ‰ j                              ‰ j        ¦  «        du}|j        dk    r|rt	          d¦  «        ‚‰                      ¦   «         }ˆ fd„t          D ¦   «         }g }|j        D �]„}|j        dk    rÿt          j	         
                    |¦  «        |vrÞt          |¦  «        j                             ¦   «         t          v rDt          |d         ¦  «                             dd¬¦  «         t!          ||d         ¦  «        \  }}nm|r(‰ j                              ‰ j        |g¦  «        d	         }nCt          |d
         ¦  «                             dd¬¦  «         t%          ||d
         ¦  «        \  }}t'          j        ‰ j                             t/          |¦  «        ¦  «        d         d¦  «        }|                     |d         d         d	         |d         |d         dœ¦  «         �Œ†‰                      d‰                      ¦   «         ¦  «         |S )zFBring the job's media into its gallery; they go with its message only.Nr   zdLinked media need a workspace with shared storage: this workspace keeps its media in its own folder.c                ó¾   •— h | ]Y}‰j         d          |j                 D ]>}t          j                             t          j                             |¦  «        ¦  «        ’Œ?ŒZS )r&  )r'  r-  r   rñ   Únormcaser!  )r'   r(   rñ   rJ   s      €r)   rË   z2PluginJobSupport._plugin_attach.<locals>.<setcomp>¨  s   ø€ ð  Nð  Nð  NÀ&ÐhlÔhsÐtyÔhzð  |Bô  |Lô  iMð  Nð  NÐ`d•b”g×&Ò&¥r¤w§¢°tÑ'<Ô'<Ñ=Ô=ð  Nð  Nð  Nð  Nr+   r   Úmesh_save_pathT)ÚparentsÚexist_okr   Ú	save_pathrÊ   ÚreadÚsettingsr   ró   rò   )rF  rq   rò   r"  )r  r}  r  ro   rE  rs  r   rr   r   rñ   rˆ  r   ÚsuffixÚlowerr   Úmkdirr   Úadoptr   r   Úmark_media_accessr"  Úadd_pathr@   r?  rv  Úgallery_snapshot)	rJ   r[  rH  rý   Ú
in_galleryÚentriesrñ   Ú_reusedrÊ   s	   `        r)   rY  zPluginJobSupport._plugin_attach¢  sJ  ø€ à”O×-Ò-¨dÔ.?Ñ@Ô@ÈÐLˆ	ØŒ>˜VÒ#Ð#¨	Ð#Ýð  Dñ  Eô  Eð  EØ×-Ò-Ñ/Ô/ˆð Nð  Nð  Nð  NÍOð  Nñ  Nô  Nˆ
ØˆØ”Jð 	Sñ 	SˆDàŒ~ Ò'Ð'­B¬G×,<Ò,<¸TÑ,BÔ,BÈ*Ð,TÐ,TÝ˜‘:”:Ô$×*Ò*Ñ,Ô,Õ0FÐFÐFÝ˜Ð 0Ô1Ñ2Ô2×8Ò8ÀÐPTÐ8ÑUÔUÐUÝ$4°T¸6ÐBRÔ;SÑ$TÔ$T‘M�D˜'˜'Øð VØœ?×0Ò0°Ô1BÀTÀFÑKÔKÈAÔN�D�Då˜ Ô,Ñ-Ô-×3Ò3¸DÈ4Ð3ÑPÔPÐPÝ$:¸4ÀÈÔATÑ$UÔ$U‘M�D˜'Ý#Ô5°d´l×6KÒ6KÍCÐPTÉIÌIÑ6VÔ6VÐW_Ô6`ÐbhÑiÔiˆFØ�NŠN¨¨zÔ(:Ð;NÔ(OÐPQÔ(RÐ]cÐdkÔ]lð  }Cð  DPô  }Qð  Rð  Rñ  Sô  Sð  Sñ  SØ�Š�Y × 5Ò 5Ñ 7Ô 7Ñ8Ô8Ð8Øˆr+   c                ó4  — d| j         _        d|v r4|d         | j        j        v r | j                             |d         ¦  «         | j        j                             | j        |¦  «        }| j	        |d         k    r|  
                    |d         d¬¦  «         |S )NrB   rd  r  F)Ú	associate)rÒ   rl  r  Úsession_workspacesÚ	end_leaserI  rh  Úunpark_conversationr'  r  rp  )rJ   r  Úrestoreds      r)   Ú_plugin_unparkzPluginJobSupport._plugin_unparkº  s–   € Ø,.ˆŒÔ)Ø�fÐÐ ¨¤°D´OÔ4VÐ!VÐ!VØŒO×%Ò% f¨W¤oÑ6Ô6Ð6Ø”:Ô(×<Ò<¸T¼[È&ÑQÔQˆØÔ  ~Ô 6Ò6Ð6Ø×!Ò! &¨Ô"8ÀEÐ!ÑJÔJÐJØˆr+   c                ó   — | j         5  |                      ¦   «          	 |                      |¦  «        }|j        dk    r$d|v r | j                             |d         ¦  «         d | _        n# d | _        w xY w|                      d|d         ¦  «         |                      ¦   «          |d         rH| j	        dz   ddd	œ| _
        |                      d
| j
        ¦  «         |                      | j        ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )Nr   rf  rg  r`   ÚprefillrS   z!Restoring Your Deepy ConversationT)rÎ   rC   rQ  Úrestoration)r  ro  rŸ  rp   r  Údeleter_  rv  rw  rÓ   rV  Ú_start_workerÚ_resume_session)rJ   r[  r  rž  s       r)   rZ  z PluginJobSupport._plugin_restoreÃ  sm  € ØÔ ð 	9ð 	9Ø×ÒÑ!Ô!Ð!ð(Ø×.Ò.¨vÑ6Ô6�Ø”= KÒ/Ð/Ð4GÈ6Ð4QÐ4QØ”O×*Ò*¨6Ð2EÔ+FÑGÔGÐGà#'�Ô Ð ø 4�Ô Ð'Ð'Ð'Ð'Ø�LŠL˜ ¨'Ô!2Ñ3Ô3Ð3Ø×&Ò&Ñ(Ô(Ð(Ø˜	Ô"ð 9Ø+/¬>¸AÑ+=ÐGjÐw{Ð$|Ð$|�Ô!Ø—’˜]¨DÔ,=Ñ>Ô>Ð>Ø×"Ò" 4Ô#7Ñ8Ô8Ð8ð	9ð 	9ð 	9ñ 	9ô 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9ð 	9øøøð 	9ð 	9ð 	9ð 	9ð 	9ð 	9s*   ˆDžAA*Á"DÁ*	A3Á3BDÄDÄ
Dc                óö   — |                       d|                      ¦   «         ¦  «         |                       d|                      ¦   «         ¦  «         |                      ¦   «          |                      ¦   «          d S )Nr"  rŽ  )rv  r•  rŽ  Úpublish_sessionsr€  rI   s    r)   rw  z&PluginJobSupport._plugin_publish_viewsÓ  sh   € Ø�Š�Y × 5Ò 5Ñ 7Ô 7Ñ8Ô8Ð8Ø�Š�Z §¢¡¤Ñ1Ô1Ð1Ø×ÒÑÔÐØ×ÒÑ!Ô!Ð!Ð!Ð!r+   ©r-   r  )F©NN©r-   r2  )r-   r7  ©r-   r@   )r9   r:   r;   r  r  r$  r)  r1  r6  r@  r<  rK  rO  rÙ   rÀ   rX  r`  r�  rn  rY  rŸ  rZ  rw  r<   r+   r)   r  r  ÷   s{  € € € € € Ø@Ð@ðHð Hð Hð HðKð Kð Kð KðCð Cð Cð
Pð Pð Pð Pð Pð_ð _ð _ð _ðð ð ð ðEð Eð EðUð Uð Uð Uð-ð -ð -ðkð kð kð.ð .ð .ð"-ð -ð -ð8ð ð ð:ð ð ð
Rð 
Rð 
Rðð ð ð0ð ð ð9ð 9ð 9ð "ð "ð "ð "ð "r+   r  c                  óŽ   — e Zd ZdZd!d„Zed"d„¦   «         Zed"d„¦   «         Zd#d	„Zd$d%d„Z	d&d„Z
d'dd
d
d
d
dœd(d„Zd)d„Zd*d+d „Zd
S ),ÚDeepyClientzODeepy for one plugin: list gallery media and run requests (WAN2GPPlugin.deepy).rm   r@   c                óZ   — t           €t          d¦  «        ‚t           |c| _         | _        d S )NzGDeepy is available to plugins in the WanGP web UI, once it has started.)r1   r¦   rm   )rJ   rm   s     r)   r’   zDeepyClient.__init__Ý  s+   € ÝÐÝÐhÑiÔiÐiÝ$,¨eÐ!ˆŒ�t”z�z�zr+   r-   c                óx   — | j         j        j        }|                     ¦   «         rdn|                     ¦   «         S )zXWhy Deepy cannot run requests (disabled, or its model is not set up), or "" when it can.rB   )r1   rI  rh  Úis_availableÚrequirement_error_text)rJ   rh  s     r)   Úunavailable_reasonzDeepyClient.unavailable_reasonâ  s8   € ð ”]Ô(Ô3ˆ
Ø×,Ò,Ñ.Ô.ÐWˆrˆr°J×4UÒ4UÑ4WÔ4WÐWr+   c                óH   — | j         j        j                             ¦   «         S )z3The Deepy version jobs run with: "zero" or "prime".)r1   rI  rh  Úget_deepy_typerI   s    r)   Ú
deepy_typezDeepyClient.deepy_typeè  s   € ð Œ}Ô"Ô-×<Ò<Ñ>Ô>Ð>r+   r  c                ó4   — | j                              ¦   «         S )z?Workspaces: id, name, storage_mode and whether the UI shows it.)r1   r  rI   s    r)   r  zDeepyClient.workspacesí  s   € àŒ}×.Ò.Ñ0Ô0Ð0r+   Nrp   rE   r™   c                ó8   — | j                              ||¦  «        S )zuMedia of a workspace (the shown one by default): id, path, kind (image, video, audio, 3d), name, selected, workspace.)r1   r1  )rJ   rp   r™   s      r)   r"  zDeepyClient.galleryñ  s   € àŒ}×+Ò+¨I°tÑ<Ô<Ð<r+   r2  c                ó4   — | j                              ¦   «         S )z(The media selected in the shown gallery.)r1   r6  rI   s    r)   r  zDeepyClient.selectedõ  s   € àŒ}×,Ò,Ñ.Ô.Ð.r+   r<   r   ©ro   rF   rp   rq   re   rn   ro   rF   ústr | os.PathLike | Nonerq   re   rd   c               ó~  — t          |pd¦  «                             ¦   «         }|st          d¦  «        ‚|t          vr+t          dd                     t          ¦  «        › d�¦  «        ‚|€dn2t          |¦  «                             ¦   «                              ¦   «         }|p|�dnd}|t          vr>|| j	        j
        j        vr+t          d	d                     t          ¦  «        › d
�¦  «        ‚|dk    r|�t          d¦  «        ‚|dk    r.| j	                             ||¦  «        dk    rt          d¦  «        ‚| j        rt          | j        ¦  «        ‚| j	                             t!          |¦  «        ¦  «        }t#          | j	        | j        ||||||t          |pd¦  «                             ¦   «         ¬¦	  «	        S )a	  Send a request to Deepy in its own session and return the running job (see docs/PLUGINS.md). instructions: rules added to Deepy Prime's
        system prompt for this job's session only (they survive context compaction, unlike the request); Deepy Zero ignores them.rB   zThe Deepy request is empty.zmedia_mode must be one of z, rB  Nr   r   zworkspace must be one of z$ or the id of an existing workspace.zUA session kept in session_dir needs a lasting workspace: use 'isolated' or 'current'.r   rH  zjLinked media need a workspace with shared storage; this job's workspace keeps its media in its own folder.r¹  )r@   ÚstriprE  ÚMEDIA_MODESr  r   Ú
expanduserÚresolverƒ  r1   r  rD  rK  r²  r¦   r@  Úlistrd   rm   )	rJ   rn   rÌ   ro   rF   rp   rq   re   r�   s	            r)   ÚrunzDeepyClient.runù  sÝ  € õ �V�\˜rÑ"Ô"×(Ò(Ñ*Ô*ˆØð 	<ÝÐ:Ñ;Ô;Ð;Ø�[Ð(Ð(ÝÐS¸$¿)º)ÅKÑ:PÔ:PÐSÐSÐSÑTÔTÐTØ)Ð1�d�dµt¸KÑ7HÔ7H×7SÒ7SÑ7UÔ7U×7]Ò7]Ñ7_Ô7_ˆØÐY°Ð0G * *È[ˆ	Ø�OÐ+Ð+°	ÀÄÔAYÔAaÐ0aÐ0aÝÐy¸¿ºÅ?Ñ9SÔ9SÐyÐyÐyÑzÔzÐzØ˜Ò#Ð#¨Ð(?ÝÐtÑuÔuÐuØ˜ÒÐ D¤M×$DÒ$DÀYÐP[Ñ$\Ô$\Ð`kÒ$kÐ$kÝð  Jñ  Kô  Kð  KØÔ"ð 	8Ý˜tÔ6Ñ7Ô7Ð7Ø”×2Ò2µ4¸±;´;Ñ?Ô?ˆÝ˜œ t¤z°6¸5ÈZÐepð  }Fð  NSÝ%(¨Ð);¸Ñ%<Ô%<×%BÒ%BÑ%DÔ%DðFñ Fô Fð 	Fr+   rk   r|  ústr | os.PathLikec                óš   — | j                              |t          |¦  «                             ¦   «                              ¦   «         ¦  «        S )z]The id of the workspace keeping its media in folder, created (with this name) the first time.)r1   r�  r   r¾  r¿  )rJ   rk   r|  s      r)   Úensure_workspacezDeepyClient.ensure_workspace  s8   € àŒ}×4Ò4°T½4À¹<¼<×;RÒ;RÑ;TÔ;T×;\Ò;\Ñ;^Ô;^Ñ_Ô_Ð_r+   c                óÊ   — ddl m} | j        } ||j        ddd¬¦  «        }d|j        i|_        |�1|j                             |¦  «         |d| j        › �c|_	        |_
        |S )	zÓA WanGPSession whose tasks join the web UI's queue from any thread. With a workspace id, its generations record in that
        workspace without changing the gallery the user is viewing, as external agents' do.r   )r
   FT)Úwebui_stateÚconsole_outputÚconsole_isattyÚwebui_appendÚ
load_queueNzplugin:)Ú
shared.apir
   r1   r'  Úload_inline_queueÚ_gradio_webui_contextr  r˜   rm   Ú_workspace_idÚ_agent_context)rJ   rp   r
   r3   rg   s        r)   Úweb_sessionzDeepyClient.web_session  sŠ   € ð 	,Ð+Ð+Ð+Ð+Ð+Ø”-ˆØ�,¨7¬>È%Ð`eÐtxÐyÑyÔyˆØ)5°wÔ7PÐ(QˆÔ%ØÐ ØÔ×"Ò" 9Ñ-Ô-Ð-Ø<EÐG]ÐQUÔQ[ÐG]ÐG]Ð9ˆGÔ! 7Ô#9Øˆr+   )rm   r@   r«  r¨  r©  )rp   rE   r™   rE   r-   r  rª  )r<   )rn   r@   ro   r@   rF   rº  rp   rE   rq   rE   re   rE   r-   rd   )rk   r@   r|  rÂ  r-   r@   r#   )rp   rE   )r9   r:   r;   r  r’   rM   r²  rµ  r  r"  r  rÁ  rÄ  rÐ  r<   r+   r)   r­  r­  Ú  s$  € € € € € ØYÐYð4ð 4ð 4ð 4ð
 ðXð Xð Xñ „XðXð
 ð?ð ?ð ?ñ „Xð?ð1ð 1ð 1ð 1ð=ð =ð =ð =ð =ð/ð /ð /ð /ðF¸fÐnrð  MQð  gkØ'+ðFð Fð Fð Fð Fð Fð.`ð `ð `ð `ð
ð 
ð 
ð 
ð 
ð 
ð 
r+   r­  r  )r-   r   )r‘   r   r-   r.   )@r  Ú
__future__r   r   r|   r$   r°   r   rÂ   ru   Údataclassesr   Úpathlibr   Útypingr   r   rË  r   r	   r
   r   Úshared.deepyr   r   Úshared.deepy.filesystemr   Úshared.utils.gallery_mediar   Úshared.utils.gallery_sourcesr   r   r   Úshared.utils.media_importsr   Úshared.utils.media_settingsr   Úshared.utils.mesh_outputsr   Úshared.utils.workspace_storager   r   Úshared.utils.workspacesr   rƒ  r½  rš   Úcompiler  r:  r1   r‰   r,   rL   r4   r6   rÁ   r8   r?   rb   rd   rt   r  r­  r<   r+   r)   ú<module>rß     sH  ððð ð ð
 #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø <Ð <Ð <Ð <Ð <Ð <Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aØ =Ð =Ð =Ð =Ð =Ð =Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ 0Ð 0Ð 0Ð 0Ð 0Ð 0à6€Ø€Ø0€ØˆrŒz˜' C§H¢HÐ,gÐ,gÐWfÐ,gÑ,gÔ,gÑ$gÔ$gÑgÐj|Ñ|Ñ}Ô}€Ø€Ø˜3™5œ5€Ð  Ð  Ð  Ñ  ðð ð ð ðð ð ð ð	ð 	ð 	ð 	ð 	�9ñ 	ô 	ð 	ð €�$ÐÑÔð	*ð 	*ð 	*ð 	*ð 	*ñ 	*ô 	*ñ Ôð	*ð
wð 
wð 
wð 
wðZ>ð Z>ð Z>ð Z>ð Z>ñ Z>ô Z>ð Z>ðz5ð 5ð 5ð 5ð`"ð `"ð `"ð `"ð `"ñ `"ô `"ð `"ðFDð Dð Dð Dð Dñ Dô Dð Dð Dð Dr+   