Ë
    DÆjÔ  ã                   ón   — d Z ddlZddlZddlZddlZ edj                  «       «      Zd„ Z G d„ d«      Z	y)a\  Find assets in index.json with plain code: class path + filters, alias table, BM25 word ranking.

    from lookup import Library
    lib = Library('index.json')
    lib.search('yellow cab', style='toy', game_use=True, limit=5)
    lib.search(path='vehicle.service', max_tris=5000)
The same algorithm lives in browse/lookup.mjs for the browse page.
é    Nz_a an and the of with for to in on at by from my our some big small little old new one two threec                 ó¤  — g }t        j                  d| xs dj                  «       «      D ]¢  }|r|t        v rŒt	        |«      dkD  rA|j                  d«      r0|j                  d«      s|d d j                  d«      r|d d n|d d }n5t	        |«      dkD  r'|j                  d	«      r|j                  d
«      s|d d }|j                  |«       Œ¤ |S )Nz
[^a-z0-9]+Ú é   ÚesÚseséþÿÿÿ)ÚchÚshÚxéÿÿÿÿÚsÚss)ÚreÚsplitÚlowerÚSTOPÚlenÚendswithÚappend)ÚtextÚoutÚts      ú9/home/claude-agent/forge-build/forge-assets/lib/lookup.pyÚtokensr      s½   € Ø
€CÜ�X‰X�m d¢j¨b×%7Ñ%7Ó%9Ó:ò ˆÙ�Aœ‘IØÜˆq‹6�AŠ:˜!Ÿ*™* TÔ*°1·:±:¸eÔ3DØ˜C˜R˜&Ÿ/™/Ð*;Ô<��#�2‘À!ÀCÀRÀ&‰AÜ�‹V�aŠZ˜AŸJ™J sœO°A·J±J¸tÔ4DØ�#�2�ˆAØ�
‰
�1�ðð €Jó    c                   ó0   — e Zd Zd„ Zd„ Zd„ Z	 	 dd„Zd„ Zy)ÚLibraryc                 ó„  — t        |t        «      r|nt        j                  t	        |«      «      }|| _        |d   | _        t        |d   j                  «       d„ ¬«      | _	        g | _
        i }| j                  D ]Õ  }|d   j                  d«      d   }t        dj                  |d	   |d
   dj                  |d   «      |j                  dd«      j                  dd«      g«      «      }i }|D ]  }|j                  |d«      dz   ||<   Œ | j                  j!                  |t#        |«      f«       |D ]  }|j                  |d«      dz   ||<   Œ Œ× i | _        |d   j                  «       D ]„  \  }	}
|
d   j                  «       D ]i  \  }}|d   D ]\  }d|v rt        |j                  dd«      «      n|gD ]5  }| j$                  j'                  |g «      j!                  |	› d|› d|› �«       Œ7 Œ^ Œk Œ† | j                  D �ch c]  }|d   j                  d«      d   ’Œ c}| _        t#        | j                  «      }|j                  «       D ��ci c]*  \  }}|t+        j,                  d||z
  dz   |dz   z  z   «      “Œ, c}}| _        t1        d„ | j                  D «       «      t3        d|«      z  | _        y c c}w c c}}w )NÚassetsÚaliasesc                 ó    — t        | d   «       S ©Nr   )r   )Úkvs    r   ú<lambda>z"Library.__init__.<locals>.<lambda>    s   € ÄCÈÈ1ÉÃJÀ;€ r   ©ÚkeyÚidú/r   ú ÚnameÚsummaryÚtagsú.ú-é   ÚtreeÚgroupsÚclassesg      à?c              3   ó&   K  — | ]	  \  }}|–— Œ y ­w)N© )Ú.0Ú_Úls      r   ú	<genexpr>z#Library.__init__.<locals>.<genexpr>6   s   è ø€ Ò/™T˜Q ”qÑ/ùs   ‚)Ú
isinstanceÚdictÚjsonÚloadÚopenÚindexr   ÚsortedÚitemsr    Údocsr   r   ÚjoinÚreplaceÚgetr   r   Úclass_wordsÚ
setdefaultÚfilledÚmathÚlogÚidfÚsumÚmaxÚavg)ÚselfÚindex_path_or_dictÚdÚdfÚaÚclsÚwordsÚtfÚwÚkindÚnodeÚgrpÚgÚnÚcs                  r   Ú__init__zLibrary.__init__   s©  € Ü",Ð-?ÄÔ"FÑÌDÏIÉIÔVZÐ[mÓVnÓLoˆØˆŒ
Ø˜‘kˆŒÜ˜a 	™l×0Ñ0Ó2Ñ8NÔOˆŒØˆŒ	ØˆØ—‘ò 	)ˆAØ�D‘'—-‘- Ó$ QÑ'ˆCÜ˜3Ÿ8™8 Q v¡Y°°)±¸c¿h¹hÀqÈÁyÓ>QÐSV×S^ÑS^Ð_bÐdgÓSh×SpÑSpÐqtÐvyÓSzÐ${Ó|Ó}ˆEØˆBØò )�ØŸ™˜q !› qÑ(��1’ð)à�I‰I×Ñ˜b¤# e£*Ð-Ô.Øò )�ØŸ™˜q !› qÑ(��1’ñ)ð	)ð ˆÔØ˜F™)Ÿ/™/Ó+ò 	Y‰JˆD�$Ø˜x™.×.Ñ.Ó0ò Y‘��QØ˜Y™<ò Y�CØ>AÀS¹jœV C§K¡K°°SÓ$9Ô:ÈsÈeò Y˜Ø×(Ñ(×3Ñ3°A°rÓ:×AÑAÀTÀFÈ!ÈCÈ5ÐPQÐRUÐQVÐBWÕXñYñYñYð	Yð
 7;·k±kÖB°�q˜‘w—}‘} SÓ)¨!Ó,ÒBˆŒÜ�—‘ÓˆØIKÏÉË×TÁÀÀA�A”t—x‘x  Q¨¡U¨R¡Z°A¸±FÑ$;Ñ ;Ó<Ñ<ÓTˆŒÜÑ/ T§Y¡YÔ/Ó/´#°a¸³)Ñ;ˆ�ùò CùãTs   ÈJ7É/J<c                 óV  — dt        j                  dd|j                  «       «      z   dz   }ddj                  t	        |«      «      z   dz   }| j
                  D ]L  \  }}dj                  t	        |«      «      }d|› d�|v s|sŒ+d|› d�|v sŒ4||j                  d|› d�d«      fc S  d|fS )z@Longest alias phrase found in q -> (class prefix, q without it).r)   z[^a-z0-9 -]+N)r   Úsubr   rB   r   r    rC   )rN   ÚqÚlowÚltokÚphraseÚpathÚpts          r   Úresolve_aliaszLibrary.resolve_alias8   s³   € à”B—F‘F˜?¨C°·±³Ó;Ñ;¸cÑAˆØ�S—X‘Xœf Q›iÓ(Ñ(¨3Ñ.ˆØ ŸL™Lò 	=‰LˆF�DØ—‘œ& ›.Ó)ˆBØ�6�(˜!ˆ} Ñ#ª°°2°$°a¨y¸DÒ/@Ø˜SŸ[™[¨1¨V¨H°A¨¸Ó<Ð<Ò<ð	=ð �Qˆwˆr   c	                 ó:  — |d   j                  d«      d   }	|r|	|k(  s|	j                  |dz   «      sy|r	|d   |k7  ry|r|d   |vry|r|d   sy|r	|d	   |kD  ry|�t        |d
   «      |k7  ry|r*|\  }
}}|d   }|
r|d   |
kD  s|r|d   |kD  s
|r	|d   |kD  ryy)Nr'   r(   r   r-   FÚstyleÚstatusÚgame_useÚtrisÚrigÚsizerV   r7   ÚhT)r   Ú
startswithÚbool)rN   rR   rd   rh   ri   rj   Úmax_trisÚriggedÚfitsrS   rV   r7   rn   r   s                 r   Ú_filterzLibrary._filterB   sÍ   € Ø�‰g�m‰m˜CÓ  Ñ#ˆÙ˜ š¨¯©°t¸c±zÔ(BØÙ�Q�w‘Z 5Ò(ØÙ�a˜‘k¨Ñ/ØÙ˜A˜jšMØÙ˜˜&™	 HÒ,ØØÐ¤$ q¨¡x£.°FÒ":ØÙØ‰GˆAˆq�!Ø�&‘	ˆAÙ�a˜‘f˜q’j¡a¨A¨c©F°QªJ¹AÀ!ÀCÁ&È1Â*ØØr   Nc
                 ó’  — t        j                  «       }
d }|r|s| j                  |«      \  }}|r|}t        |«      }g }|r´|s²|D ��cg c]%  }| j                  j                  |g «      D ]  }|‘Œ Œ' }}}|D �cg c]  }|| j                  v sŒ|‘Œ }}|rt        t        |«      «      dk(  r|d   nd }nA|r?t        t        |«      «      }d d t        t        j                  «       |
z
  dz  d«      g d|dœS g }t        | j                  «      D ]¶  \  }}| j                  ||||||||«      sŒ| j                  |   \  }}d}|D ]X  }|j                  |d«      }|sŒ|| j                  j                  |d«      |z  dz  |dd	d
|z  | j                   z  z   z  z   z  z  }ŒZ |r|s|sŒ—|d   dk(  r|dz  }|j#                  ||f«       Œ¸ |j%                  d„ ¬«       ||t        t        j                  «       |
z
  dz  d«      |d |	 D ��cg c]  \  }}t'        |t        |d«      ¬«      ‘Œ c}}t        |«      |dœS c c}}w c c}w c c}}w )Nr/   r   iè  é   )rd   ÚaliasÚmsÚhitsÚtotalÚgapsg        gš™™™™™@g333333ó?g      Ð?g      è?ri   Úapprovedg{®Gáz„?c                 ó   — | d    S r"   r4   )r   s    r   r$   z Library.search.<locals>.<lambda>z   s   €   1¡ € r   r%   r   )Úscore)ÚtimeÚperf_counterrf   r   rE   rD   rG   r   Úsetr?   ÚroundÚ	enumerater   rt   rA   rJ   rM   r   Úsortr:   )rN   r`   rd   rh   ri   rj   rq   rr   rs   ÚlimitÚt0Ú
alias_pathÚrestÚqtr{   rV   r\   ÚnamedÚfullry   ÚirR   rU   Úlnr~   Úfr   s                              r   ÚsearchzLibrary.searchW   so  € ä×ÑÓ ˆØˆ
Ù‘TØ#×1Ñ1°!Ó4ÑˆJ˜ÙØ!�Ü�A‹YˆàˆÙ‘dØ "×H˜1¨D×,<Ñ,<×,@Ñ,@ÀÀBÓ,GÒH q’QÐH�QÐHˆEÑHØ$Ö9˜!¨¨T¯[©[Ò(8’AÐ9ˆDÐ9ÙÜ"%¤c¨$£i£.°AÒ"5�t˜A’w¸4‘ÙÜœc %›jÓ)�Ø $¨t¼5Ä$×BSÑBSÓBUÐXZÑBZÐ^bÑAbÐdeÓ;fÐprØ!"¨Dñ2ð 2àˆÜ˜dŸk™kÓ*ò 	$‰DˆAˆqØ—<‘<  4¨°¸À(ÈFÐTXÔYØØ—Y‘Y˜q‘\‰FˆB�ØˆEØò d�Ø—F‘F˜1˜a“L�ÚØ˜TŸX™XŸ\™\¨!¨QÓ/°!Ñ3°cÑ9¸QÀÈÈcÐTVÉhÐY]×YaÑYaÑNaÑHaÑAbÑ=bÑcÑc‘Eðdñ ™%©
ØØ�‰{˜jÒ(Ø˜‘�Ø�K‰K˜ ˜
Õ#ð	$ð 	�	‰	‘oˆ	Ô&Ø z¼Ä×@QÑ@QÓ@SÐVXÑ@XÐ\`Ñ?`ÐbcÓ9dØ@DÀVÀeÀ×M¹¸¸1œ˜a¤u¨Q°£{Ö3ÓMÔX[Ð\`ÓXaÐkoñqð 	qùó1 IùÚ9ùó0 Ns   Á	*H8Á:H>ÂH>È!Ic                 ó    — | j                   d   S )Nr0   )r>   )rN   s    r   r0   zLibrary.tree~   s   € Ø�z‰z˜&Ñ!Ð!r   )	r   NN)r|   ÚlegacyTNNNé
   )Ú__name__Ú
__module__Ú__qualname__r]   rf   rt   r�   r0   r4   r   r   r   r      s'   „ ò<ò8òð* w{Ø "ó%qóN"r   r   )
Ú__doc__r;   rH   r   r   r�   r   r   r   r   r4   r   r   ú<module>r—      s7   ðñ÷ × á
Ðl×rÑrÓtÓu€ò
÷d"ò d"r   