Ë
    À7jh  ã                  ól   — d Z ddlmZ ddlmZ ddlmZ ddlmZ  ed«      Z	dZ
dZdd	„Ze
fdd
„Zdd„Zy)u  Read-only web project discovery and classification.

We classify a directory by the presence of marker files only. We NEVER read the
contents of wp-config.php, .env, composer.json secrets, etc. â€” only that the
files exist. SECURITY: no .env values, no credentials, no private keys.
é    )Úannotations)ÚPath)ÚAny)Ú
get_loggerzdiscovery.projects)z/var/wwwz/srv/wwwz/srvé   c                ó:  — | dz  j                  «       rdt        | «      ddœS | dz  j                  «       r"| dz  j                  «       rdt        | «      ddœS | dz  j                  «       rd	t        | «      d	dœS | d
z  j                  «       rdt        | «      ddœS y)zEClassify a single directory. Returns None if it isn't a project root.zwp-config.phpÚ	wordpressÚphp)ÚtypeÚpathÚruntimeÚartisanzcomposer.jsonÚlaravelzpackage.jsonÚnodez
index.htmlÚstaticN)ÚexistsÚstr)r   s    úL/var/www/downloads.wolfpanel.net/public_html/agent/src/discovery/projects.pyÚclassifyr      s�   € àˆÑ×&Ñ&Ô(Ø#¬S°«YÀ5ÑIÐIØˆyÑ× Ñ Ô"¨¨Ñ(>×'FÑ'FÔ'HØ!¬3¨t«9ÀÑGÐGØˆ~Ñ×%Ñ%Ô'Ø¬¨D«	¸fÑEÐEØˆ|Ñ×#Ñ#Ô%Ø ¬#¨d«)ÀÑIÐIØó    c                ó  — g }t        «       }| D ]z  }t        |«      }|j                  «       sŒt        |t        «      D ]I  }t        |«      |v rŒt        |«      }|sŒ|j                  t        |«      «       |j                  |«       ŒK Œ| |S )zDScan common web roots and classify each immediate project directory.)	Úsetr   Úis_dirÚ_candidate_dirsÚ
_MAX_DEPTHr   r   ÚaddÚappend)ÚrootsÚprojectsÚseenÚrootÚbaseÚ	candidateÚresults          r   Úfind_projectsr%   "   s‡   € à%'€HÜ“U€DØò 
(ˆÜ�D‹zˆØ�{‰{Œ}ØÜ(¨¬zÓ:ò 	(ˆIÜ�9‹~ Ñ%ØÜ˜iÓ(ˆFÚØ—‘œ˜Y›Ô(Ø—‘ Õ'ñ	(ð	
(ð €Or   c              #  óÜ   K  — | –— t        d|dz   «      D ]C  }dj                  dg|z  «      }	 | j                  |«      D ]  }|j                  «       sŒ|–— Œ ŒE y# t        $ r Y ŒRw xY w­w)z?Yield directories up to max_depth below base (and base itself).é   ú/Ú*N)ÚrangeÚjoinÚglobr   ÚOSError)r"   Ú	max_depthÚdepthÚpatternr   s        r   r   r   4   sw   è ø€ à
‚JÜ�q˜) a™-Ó(ò ˆØ—(‘(˜C˜5 5™=Ó)ˆð	ØŸ	™	 'Ó*ò �Ø—;‘;•=Ø“Jññøô ò 	Ùð	üs.   ‚,A,¯$AÁAÁA,Á	A)Á&A,Á(A)Á)A,N)r   r   Úreturnzdict[str, Any] | None)r   ztuple[str, ...]r1   zlist[dict[str, Any]])r"   r   r.   Úint)Ú__doc__Ú
__future__r   Úpathlibr   Útypingr   Úloggerr   ÚlogÚ
_WEB_ROOTSr   r   r%   r   © r   r   ú<module>r;      sA   ðñõ #å Ý å áÐ%Ó&€à-€
Ø€
ó
ð ,6ô ô$
r   