+
    „WÝj™  ã                  ó0  a € 0 t $ R t^ RIHt ^ RIHt ^ RIt^ RIt^ RIt^ RI	t	^ RI
t]P                  ! ]4      tRtRtRtRt]P&                  ! 4       tRsR]R&   / tR	]R
&   R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R lt R# )uÂ  Live model-load progress from the managed llama-server router.

Children emit per-tensor progress ({stages, current, value}) which the router relays ONLY over its
/models/sse stream â€” GET /models carries just the coarse status. The watcher starts on first call,
reconnects with backoff (the router bounces on download/eject), and never raises into callers: no
router, no state file, or no SSE support (older engines) all read as "nothing loading".
)Úannotations)ÚsuppressNg333333ë?g      @g      ^@zthreading.Thread | NoneÚ_watcherúdict[str, dict]Ú	_snapshotc               ó    € V ^8„  d   QhRRRR/# )é   ÚxÚfloatÚreturnÚint© )Úformats   "ÚZC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\local_runtime\load_progress.pyÚ__annotate__r      s   € ÷ ,ñ ,ˆEð ,�cñ ,ó    c           
     óN   € \        ^ \        ^d\        V ^d,          4      4      4      # )é    )ÚmaxÚminÚround)r	   s   &r   Ú_pctr      s   € Üˆq”#�cœ5  S¥›>Ó*Ó+Ð+r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Ústagesz	list[str]ÚcurrentÚstrÚvaluer
   r   r   r   )r   s   "r   r   r   "   s(   € ÷ ñ ˜yð °3ð ¸uð Èñ r   c                óx  € V '       d   W9  g   \        V 4      ^8X  d   \        V4      # V  Uu. uF  q3R8w  g   K  VNK  	  ppV'       d   R\        ,
          \        V4      ,          MRpRpV  F:  pVR8X  d   \        MTpWq8X  d   \        WhV,          ,           4      u # Wh,          pK<  	  \        V4      # u upi )z=Map (stage, in-stage value) onto one 0-100 range, text-heavy.Ú
text_modelg      ð?ç        )Úlenr   Ú_TEXT_STAGE_SHARE)	r   r   r   ÚsÚextrasÚextra_shareÚoffsetÚstageÚshares	   &&&      r   Ú_composite_percentr(   "   s    € ç�WÔ*¬c°&«k¸QÔ.>Ü�E‹{ÐÙÓ5™�A¨Ñ#4�aˆa™€FÐ5ß=C�3Ô*Õ*¬c°&«kÖ9È€KØ€FÛˆØ%*¨lÔ%:Õ!ÀˆØÔÜ˜¨¥Õ.Ó/Ò/Ø�Šñ	 ô
 �‹;Ðùò 6s
   ®B7»B7c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[str, str] | Noner   )r   s   "r   r   r   1   s   € ÷ ñ Ð)ñ r   c                 ó   € ^ RI Hp  V ! 4       # )zU(base_root, api_key) of the managed router via the ownership-guarded reader, or None.©Úmanaged_root)Ú!hermes_cli.local_runtime.endpointr,   r+   s    r   Ú	_endpointr.   1   s   € å>á‹>Ðr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úmodelr   ÚeventÚdataÚdictr   ÚNoner   )r   s   "r   r   r   8   s(   € ÷ 'ñ '˜ð ' Cð '¨tð '¸ñ 'r   c                ó  € \         ;_uu_ 4        \        VP                  R R4      4      pV\        9   Ed   VR8X  Ed    VP                  R4      ;'       g    / pVP                  R4      ;'       g    .  Uu. uF  p\        V4      NK  	  pp\        VP                  RR4      4      pVP                  R4      p\        P                  V RRRRR	^ R
R/4      p	\        P                  ! 4       V	R
&   V'       dG   \        V\        \        34      '       d+   WyR&   \        V4      V	R&   \        Wg\        V4      4      V	R	&   M-V. \        ORN59   d   VR8w  d   \        P                  V R4       RRR4       R# u upi   + '       g   i     R# ; i)ÚstatusÚ ÚloadingÚprogressr   r   r   r&   r   ÚpercentÚtsÚmodel_removeN)Ú_lockr   ÚgetÚ_LOAD_EVENTSr   Ú
setdefaultÚtimeÚ	monotonicÚ
isinstancer   r
   r(   Úpop)
r0   r1   r2   r6   r9   r"   r   r   r   Úentrys
   &&&       r   Ú_apply_eventrF   8   sD  € ß	ŽÜ�T—X‘X˜h¨Ó+Ó,ˆØ”LÕ  V¨yÕ%8Ø—x‘x 
Ó+×1Ð1¨rˆHØ'/§|¡|°HÓ'=×'CÐ'CÀÐ'CÓEÑ'C ”c˜!–fÑ'CˆFÐEÜ˜(Ÿ,™, y°"Ó5Ó6ˆGØ—L‘L Ó)ˆEÜ×(Ñ(¨°¸"¸gÀsÈIÐWXÐZ^Ð`cÐ0dÓeˆEÜŸ.š.Ó*ˆE�$‰Kßœ: e¬c´5¨\×:Ò:Ø!(�g‘Ü!& u£��g‘Ü#5°fÄuÈUÃ|Ó#T��iÑ øØÐ5œÐ5 nÑ5Ô5¸&ÀIÔ:Mä�M‰M˜% Ô&÷ 
‰ùò F÷	 
�ˆús+   �AE:ÁE:Á2E:Á7E5ÂC E:Å5E:Å:F	c               ó   € V ^8„  d   QhRR/# ©r   r   r4   r   )r   s   "r   r   r   K   s   € ÷ ñ ˜ñ r   c                 ó„   € \         ;_uu_ 4        \        P                  4        R R R 4       R #   + '       g   i     R # ; i)N)r=   r   Úclearr   r   r   Ú_clear_snapshotrK   K   s   € ß	ŽÜ�‰Ô÷ 
��Šús   �.®?	c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   r   P   s   € ÷  'ñ  '�ñ  'r   c                 óÒ  €  \        4       p V f'   \        4        \        P                  ! \        4       K5  V w  r \
        P                  P                  V R2RRV 2RR/R7      p\
        P                  P                  V^<R7      ;_uu_ 4       pR	p \        VR
4      '       d   VP                  R4      MVP                  R4      pV'       g   EMWV,          pRV9   g   KP  VP                  R^4      w  ruVP                  RR4      P                  4       pVP                  R4      '       g   KV  \!        \"        P$                  \&        4      ;_uu_ 4        \"        P(                  ! VR,          P                  4       4      p	\+        \-        V	P/                  RR4      4      \-        V	P/                  RR4      4      V	P/                  R4      ;'       g    / 4       RRR4       EK  RRR4       \        4        \        P                  ! \        4       EK    + '       g   i     EKL  ; i  + '       g   i     LL; i  \0         d!   p
\2        P5                  RT
4        Rp
?
LuRp
?
ii ; i)TNz/models/sseÚAuthorizationzBearer ÚAcceptztext/event-stream)Úheaders)Útimeoutr   Úread1i   ó   
zutf-8Úreplacezdata::é   NNr0   r7   r1   r2   z"load-progress SSE reconnecting: %s)r.   rK   rA   ÚsleepÚ_RECONNECT_DELAY_SÚurllibÚrequestÚRequestÚurlopenÚhasattrrR   ÚreadÚsplitÚdecodeÚstripÚ
startswithr   ÚjsonÚJSONDecodeErrorÚ	TypeErrorÚloadsrF   r   r>   Ú	ExceptionÚloggerÚdebug)ÚendpointÚbaseÚkeyÚreqÚrÚbufÚchunkÚlineÚtextÚmsgÚexcs              r   Ú_watchrt   P   sÑ  € Ø
Ü“;ˆØÒÜÔÜ�JŠJÔ)Ô*ÙØ‰	ˆð	DÜ—.‘.×(Ñ(¨D¨6°Ð)=Ø 7¨3¨% °(Ð<OðHQÐ(ó RˆCä—‘×'Ñ'¨°RÐ'×8Ô8¸AØ�ØÜ-4°Q¸×-@Ò-@˜AŸG™G DœMÀaÇfÁfÈTÃl�Eß ÙØ•L�CØ 3ž,Ø$'§I¡I¨e°QÓ$7™	˜Ø#Ÿ{™{¨7°IÓ>×DÑDÓF˜Ø#Ÿ™¨w×7Ò7Ù$Ü%¤d×&:Ñ&:¼I×FÕFÜ"&§*¢*¨T°"­X¯^©^Ó-=Ó">˜CÜ(¬¨S¯W©W°W¸bÓ-AÓ)BÄCÈÏÉÐPWÐY[ÓH\ÓD]Ø),¯©°«×)>Ð)>¸Bô@÷ GÒF÷ 9ô( 	ÔÜ�
Š
Ô%×&÷ G×FÑFú÷ 9×8ûô  ô 	DÜ�L‰LÐ=¸s×CÑCûð	Dús\   »AH; Â?H(ÃH(Ã"A3H(ÅBH	ÇH(Ç$H; ÈH%È
H(È(H8	È3H; È8H; È;I&ÉI!É!I&c               ó   € V ^8„  d   QhRR/# rH   r   )r   s   "r   r   r   s   s   € ÷ ñ ˜ñ r   c                 ó  € \         ;_uu_ 4        \        e   \        P                  4       '       g2   \        P                  ! \
        RRR7      s\        P                  4        R R R 4       R #   + '       g   i     R # ; i)NTzllamacpp-load-progress)ÚtargetÚdaemonÚname)r=   r   Úis_aliveÚ	threadingÚThreadrt   Ústartr   r   r   Ú_ensure_watcherr~   s   sF   € ç	ŽÜÒ¤8×#4Ñ#4×#6Ò#6Ü ×'Ò'¬v¸dÐIaÔbˆHÜ�N‰NÔ÷ 
��Šús   �"A-²1A-Á-A>	c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   {   s   € ÷ Uñ U˜oñ Ur   c                 ób  € \        4        \        P                  ! 4       p \        ;_uu_ 4        \        P                  4        UUu/ uF=  w  rWR,          ,
          \        8  g   K  VRVR,          RVR,          RVR,          /bK?  	  uppuuRRR4       # u uppi   + '       g   i     R# ; i)z{model_id: {"stage", "value", "percent"}} for models loading right now. Empty when
nothing is loading (or nothing is knowable).r;   r&   r   r:   N)r~   rA   rB   r=   r   ÚitemsÚ_STALE_ENTRY_TTL_S)ÚnowÚmÚes      r   Úget_loading_progressr†   {   s‡   € ô ÔÜ
�.Š.Ó
€Cß	Žä%ŸO™OÔ-ôUÙ-‘D�A°¸µwµÔASÑ1Sô W��G˜Q˜w�Z¨°!°Gµ*¸iÈÈ9ÍÐVÒVÙ-òU÷ 
ŠùóU÷ 
�ˆús#   ®BÁB
Á'"B
Â	BÂBÂB.	c               ó    € V ^8„  d   QhRRRR/# )r   r0   r   r   zdict | Noner   )r   s   "r   r   r   …   s   € ÷ 5ñ 5 ð 5¨ñ 5r   c                óà  € \        4       pVf   R#  ^ RIHpHp V! . VORV! V 4       2N5R^/ p^ p\        T\        4      '       d   TM.  Fm  p\        \        \        4      ;_uu_ 4        TP                  R4      '       d/   \        T\        TP                  R4      ;'       g    ^ 4      4      pRRR4       Ko  	  T^ 8”  d   RT/# R#   \         d     R# i ; i  + '       g   i     K¡  ; i)uË  {"processed": tokens} while the managed server is prompt-processing for ``model``, or None
(idle, decoding, unreachable, or foreign server).

/slots exposes ``n_prompt_tokens_processed`` but no total, so callers supply the denominator.
The busiest processing slot wins: a parallel small request freezes its counter during decode
while a live prefill keeps climbing. One HTTP call per poll; every failure reads as "no
prefill" â€” garnish, never load-bearing.
N)Úchild_queryÚmanaged_get_jsonz/slots?Ú	timeout_sÚis_processingÚn_prompt_tokens_processedÚ	processed)r.   r-   r‰   rŠ   rf   rC   Úlistr   rd   Ú
ValueErrorr>   r   r   )r0   Úepr‰   rŠ   ÚslotsÚbestÚslots   &      r   Úget_prefill_progressr•   …   sá   € ô 
‹€BØ	‚zÙðßSá ÐR "ÐR¨±¸EÓ0BÐ/CÐ&DÒRÐPQÑRˆð €DÜ# E¬4×0Ò0‘°bÒ8ˆÜ”i¤×,Õ,Ø�x‰x˜×(Ò(Ü˜4¤ T§X¡XÐ.IÓ%J×%OÐ%OÈaÓ!PÓQ�÷ -Ñ,ñ 9ð #'¨¤(ˆK˜ÐÐ4°Ð4øô ô Úðú÷ -×,Ð,ús#   ’C
 Á+:CÂ&CÃ
CÃCÃC-)Ústatus_changeÚmodel_status)!Ú__conditional_annotations__Ú__doc__Ú
__future__r   Ú
contextlibr   rb   Úloggingr{   rA   Úurllib.requestrX   Ú	getLoggerÚ__name__rg   r!   rW   r‚   r?   ÚLockr=   r   Ú__annotations__r   r   r(   r.   rF   rK   rt   r~   r†   r•   )r˜   s   @r   Ú<module>r¢      s™   øðôõ #å Û Û Û Û Û à	×	Ò	˜8Ó	$€àÐ ØÐ ØÐ Ø0€à�ŠÓ€Ø$(€Ð
!Ó (Ø€	ˆ?Ó õ,õõõ'õ&õ
 'õFõU÷5r   