
    VjN                    t    d Z ddlmZ ddlZddlZddlmZmZ e G d d             Z G d d      Z	 e	       Z
y)	u  Live agent status bar for the terminal.

Tracks background agents that the master spawns via the Task tool and
prints a compact one-liner whenever the set changes:

    AGENTS  🔍 research  💻 build-ui  ⚙️ run-tests

Icons are assigned by keyword-matching the agent description:
  🔍  research / search / explore / look / find
  💻  cod / build / implement / fix / write / edit / creat
  🌐  web / fetch / brows / http / url / crawl / scrape
  ✅  done (briefly, before removal)
  🤖  everything else (general AI agent work)

The module is self-contained; nothing in it imports from the rest of the
voice package, so it can be imported anywhere without circular deps.
    )annotationsN)	dataclassfieldc                      e Zd ZU ded<   ded<   dZded<   dZded<   dZded	<   dZded
<    ee	j                        Zded<   edd       ZdddZy)_Agentstr
agent_typedesc task_idFbooldonenotestalled)default_factoryfloat
started_atc                   | j                   ry| j                  ry| j                  j                         t	        fddD              ryt	        fddD              ryt	        fd	d
D              ryt	        fddD              ryy)Nu   ✅u   ⚠️c              3  &   K   | ]  }|v  
 y wN .0kds     B/Users/ahmed/devFolder/Ultron/claude-voice/voice/agent_registry.py	<genexpr>z_Agent.icon.<locals>.<genexpr>+   s      3  2!qAv  2   )researchsearchexplorlookfind
investigatauditanalysanalyzreadchecku   🔍c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z_Agent.icon.<locals>.<genexpr>/   s      >  =!qAv  =r   )codbuild	implementfixwriteeditcreatdeveloprefactoraddgeneratcompilu   💻c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z_Agent.icon.<locals>.<genexpr>3   s!      I  H!qAv  Hr   )	webfetchbrowshttpurlcrawlscrapedownloadopenu   🌐c              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   z_Agent.icon.<locals>.<genexpr>6   s!      E  D!qAv  Dr   )	runexecuttestdeploystartlaunchinstallpipnpmu   ⚙️u   🤖)r   r   r
   lowerany)selfr   s    @r   iconz_Agent.icon$   s    99<<IIOO 3  2 3 3   >  = > >   I  H I I E  D E E    c                   | j                   j                         }t        |      |k  r|n
|d|dz
   dz   }| j                  rE| j                  s9| j                  j                         }t        |      dk  r|n|dd dz   }| d| S |S )z?Short label: the task, plus what it's doing right now if known.N   u   …      u    · )r
   striplenr   r   )rM   	max_charstns       r   labelz_Agent.label;   s    IIOOQ9$A!Oi!m*<u*D99TYY		!AVr\q"v~ASQC= rO   N)returnr   )   )rV   intrZ   r   )__name__
__module____qualname____annotations__r   r   r   r   r   time	monotonicr   propertyrN   rY   r   rO   r   r   r      s]    O
IGSD$D#NGTdnn=J= ,rO   r   c                  P    e Zd ZdZdZddZdddZddZddZdddZ	ddZ
dd	Zy
)AgentRegistryzCThread-safe registry; print_bar() to stdout whenever state changes.g      @c                R    t        j                         | _        g | _        d| _        y )Nr   )	threadingLock_lock_agents	_last_bar)rM   s    r   __init__zAgentRegistry.__init__K   s    ^^%
%' rO   c                
   | j                   5  r(t        fd| j                  D              r
	 d d d        y | j                  j                  t	        ||             d d d        | j                          y # 1 sw Y   xY w)Nc              3  <   K   | ]  }|j                   k(    y wr   )r   r   ar   s     r   r   z$AgentRegistry.add.<locals>.<genexpr>V   s     J\qyyG3\s   )r	   r
   r   )ri   rL   rj   appendr   _render)rM   r	   r
   r   s      `r   r4   zAgentRegistry.addT   sa    ZZ3JT\\JJ Z LL*4IK 
 	 Zs   "A9'A99Bc                    | j                   5  | j                  D ]!  }|j                  |k(  s||_        d|_         n ddd       | j                          y# 1 sw Y   xY w)zLive note from the agent pool's supervisor: what this worker is
        doing RIGHT NOW (tool by tool). Ahmed's 'no clue what it's doing'.FN)ri   rj   r   r   r   rr   )rM   r   r   rp   s       r   progresszAgentRegistry.progress\   sN     ZZ\\99'!AF %AI	 "  	 Zs   AAA c                    | j                   5  | j                  D ]  }|j                  |k(  sd|_         n d d d        | j	                          y # 1 sw Y   xY w)NT)ri   rj   r   r   rr   )rM   r   rp   s      r   r   zAgentRegistry.stalledg   sE    ZZ\\99' $AI " 
 	 Zs   A
AAc                `   | j                   5  d}rt        fd| j                  D        d      }|t        d | j                  D        d      }|d|_        ddd       | j	                          t        j                  | j                  d      }|j                          y# 1 sw Y   KxY w)u   Mark the agent with `task_id` complete (else the oldest running one)
        and schedule its removal — live per-agent, no fixed timeout.Nc              3  X   K   | ]!  }|j                   k(  r|j                  s| # y wr   )r   r   ro   s     r   r   z+AgentRegistry.finish_one.<locals>.<genexpr>u   s*      G,Q"#))w"6qvv  !,s   '*c              3  :   K   | ]  }|j                   r|  y wr   )r   )r   rp   s     r   r   z+AgentRegistry.finish_one.<locals>.<genexpr>x   s     E,Qaffq,s   T)targetdaemon)	ri   nextrj   r   rr   rg   Thread_remove_done_after_delayrF   )rM   r   ry   rW   s    `  r   
finish_onezAgentRegistry.finish_oneo   s     ZZF G$,, GHLN~E$,,EtL!"  	D$A$A$O		 Zs   AB$$B-c                   t        j                  | j                         | j                  5  t	        | j
                        D ]   \  }}|j                  s| j
                  |=  n d d d        | j                          y # 1 sw Y   xY wr   )ra   sleep	_DONE_TTLri   	enumeraterj   r   rr   )rM   irp   s      r   r}   z&AgentRegistry._remove_done_after_delay   s]    

4>>"ZZ!$,,/166Q 0  	 Zs   (A>A>>Bc                   | j                   5  t        | j                        }d d d        s!| j                  rt	        dd       d| _        y |D cg c]!  }|j
                   d|j                          # }}ddj                  |      z   }|| j                  k(  ry || _        t	        d| dd       y # 1 sw Y   xY wc c}w )Nr   T)flush zAGENTS  z   
)ri   listrj   rk   printrN   rY   join)rM   agentsrp   chipsbars        r   rr   zAgentRegistry._render   s    ZZ$,,'F  ~~b%!#289&QAFF81QWWYK(&95::e,,$..  	3%rl$'# Z :s   B7&C7C N)rZ   None)r   )r	   r   r
   r   r   r   rZ   r   )r   r   r   r   rZ   r   )r   r   rZ   r   )r]   r^   r_   __doc__r   rl   r4   rt   r   r~   r}   rr   r   rO   r   re   re   F   s-    MI!	"(rO   re   )r   
__future__r   rg   ra   dataclassesr   r   r   re   registryr   rO   r   <module>r      sH   $ #   ( ( ( (VZ( Z(| ?rO   