+
     Sj1                    v    R t ^ RIHt ^ RIt^ RIt^ RIHtHt ] ! R R4      4       t ! R R4      t	]	! 4       t
R# )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                      ] tR t^t$ R]R&   R]R&   RtR]R&   RtR]R&   ]! ]P                  R	7      t
R
]R&   ]R R l4       tRR R lltRtR# )_Agentstr
agent_typedesc task_idFbooldone)default_factoryfloat
started_atc                   V ^8  d   QhRR/# )   returnr    )formats   "voice/agent_registry.py__annotate___Agent.__annotate__#   s      c     c                	t  a V P                   '       d   R # V P                  P                  4       o\        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       d   R# \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       d   R# \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       d   R# \        ;QJ d    V3R	 lR 4       F  '       g   K   RM	  RM! V3R	 lR 4       4      '       d   R
# R# )u   ✅c              3  ,   <"   T F	  qS9   x  K  	  R # 5iNr   .0kds   & r   	<genexpr>_Agent.icon.<locals>.<genexpr>'   s      3  2!Av  2   TFu   🔍c              3  ,   <"   T F	  qS9   x  K  	  R # 5ir   r   r   s   & r   r!   r"   +   s      >  =!Av  =r#   u   💻c              3  ,   <"   T F	  qS9   x  K  	  R # 5ir   r   r   s   & r   r!   r"   /   s      I  H!Av  Hr#   u   🌐c              3  ,   <"   T F	  qS9   x  K  	  R # 5ir   r   r   s   & r   r!   r"   2   s      E  D!Av  Dr#   u   ⚙️u   🤖)researchsearchexplorlookfind
investigatauditanalysanalyzreadcheck)codbuild	implementfixwriteeditcreatdeveloprefactoraddgeneratcompil)	webfetchbrowshttpurlcrawlscrapedownloadopen)	runexecuttestdeploystartlaunchinstallpipnpm)r   r	   lowerany)selfr    s   &@r   icon_Agent.icon"   s   999IIOO3 3  2 3333 3  2 3 3 3  3 >  = >333 >  = > > >  3 I  H I333 I  H I I I3 E  D E333 E  D E E Er   c                    V ^8  d   QhRRRR/# )r   	max_charsintr   r   r   )r   s   "r   r   r   7   s     H Hs HC Hr   c                    V P                   P                  4       p\        V4      V8:  d   V# VRV^,
           R,           # )z0Short label: truncate with ellipsis if too long.Nu   …)r	   striplen)rR   rV   ts   && r   label_Agent.label7   s8    IIOOFi'qGQQ-?%-GGr   r   N)   )__name__
__module____qualname____firstlineno____annotations__r   r   r   time	monotonicr   propertyrS   r\   __static_attributes__r   r   r   r   r      sQ    O
IGSD$dnn=J= (H Hr   r   c                  b    ] tR t^=tRtRtR R ltRR R lltRR R lltR	 R
 lt	R R lt
RtR# )AgentRegistryzCThread-safe registry; print_bar() to stdout whenever state changes.g      @c                   V ^8  d   QhRR/# r   r   Noner   )r   s   "r   r   AgentRegistry.__annotate__B   s     ! !$ !r   c                	V    \         P                  ! 4       V n        . V n        R V n        R# )r
   N)	threadingLock_lock_agents	_last_bar)rR   s   &r   __init__AgentRegistry.__init__B   s    ^^%
%' r   c               (    V ^8  d   QhRRRRRRRR/# )r   r   r   r	   r   r   rl   r   )r   s   "r   r   rm   K   s(      c  s D r   c           
     	  a V P                   ;_uu_ 4        S'       d`   \        ;QJ d)    V3R  lV P                   4       F  '       g   K   RM	  RM! V3R  lV P                   4       4      '       d    RRR4       R# V P                  P                  \	        WSR7      4       RRR4       V P                  4        R#   + '       g   i     L"; i)c              3  @   <"   T F  qP                   S8H  x  K  	  R # 5ir   )r   r   ar   s   & r   r!   $AgentRegistry.add.<locals>.<genexpr>M   s     J\yyG3\s   TFN)r   r	   r   )rq   rQ   rr   appendr   _render)rR   r   r	   r   s   &&&fr   r;   AgentRegistry.addK   sx    ZZZ33JT\\J333JT\\JJJ Z LL*IK 
 	 Zs"   B>B>'B>3B>>&B>>C	c                    V ^8  d   QhRRRR/# )r   r   r   r   rl   r   )r   s   "r   r   rm   S   s      # t r   c                  a V P                   ;_uu_ 4        RpS'       d!   \        V3R lV P                   4       R4      pVf   \        R V P                   4       R4      pVe   RVn        RRR4       V P	                  4        \
        P                  ! V P                  RR7      pVP                  4        R#   + '       g   i     LT; i)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  v   <"   T F.  pVP                   S8X  g   K  VP                  '       d   K*  Vx  K0  	  R # 5ir   )r   r   ry   s   & r   r!   +AgentRegistry.finish_one.<locals>.<genexpr>Y   s1      G,Q"#))w"6  !?@vv  !q,s   99
9c              3  L   "   T F  qP                   '       d   K  Vx  K  	  R # 5ir   )r   )r   rz   s   & r   r!   r   \   s     E,Qffqq,s   $
$T)targetdaemon)	rq   nextrr   r   r}   ro   Thread_remove_done_after_delayrK   )rR   r   r   r[   s   &f  r   
finish_oneAgentRegistry.finish_oneS   s     ZZZF G$,, GHLN~E$,,EtL!"  	D$A$A$O		 Zs   AB99C		c                   V ^8  d   QhRR/# rk   r   )r   s   "r   r   rm   d   s      $ r   c                	D   \         P                  ! V P                  4       V P                  ;_uu_ 4        \	        V P
                  4       F&  w  rVP                  '       g   K  V P
                  V  M	  R R R 4       V P                  4        R #   + '       g   i     L"; ir   )rd   sleep	_DONE_TTLrq   	enumeraterr   r   r}   )rR   irz   s   &  r   r   &AgentRegistry._remove_done_after_delayd   s_    

4>>"ZZZ!$,,/666Q 0  	 Zs   *B$BB	c                   V ^8  d   QhRR/# rk   r   )r   s   "r   r   rm   r   s     ( ( (r   c                	   V P                   ;_uu_ 4        \        V P                  4      pR R R 4       X'       g)   V P                  '       d   \	        RRR7       RV n        R # V Uu. uF!  q"P
                   RVP                  4        2NK#  	  ppRRP                  V4      ,           pW@P                  8X  d   R # W@n        \	        RV R2RR7       R #   + '       g   i     L; iu upi )Nr
   T)flush zAGENTS  z   
)rq   listrr   rs   printrS   r\   join)rR   agentsrz   chipsbars   &    r   r}   AgentRegistry._renderr   s    ZZZ$,,'F  ~~~b%!#289&QFF81QWWYK(&95::e,,..  	3%rl$'# Z :s   C''C&C#	)rr   rs   rq   N)r
   )r_   r`   ra   rb   __doc__r   rt   r;   r   r   r}   rg   r   r   r   ri   ri   =   s(    MI!"( (r   ri   )r   
__future__r   ro   rd   dataclassesr   r   r   ri   registryr   r   r   <module>r      sK   $ #   ( H H HDG( G(V ?r   