
    Si                        U d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZ  ee      Z eg d      Zd	ed
<   dZded<   dZded<   e G d d             Ze G d d             Z G d d      Zy)uO   utils/delegate_controller.py — 서브에이전트 격리 위임 컨트롤러.    )annotationsN)ThreadPoolExecutoras_completed)	dataclass)Any)
get_logger)delegateclarifymemorysend_messagezfrozenset[str]BLOCKED_TOOLS   int	MAX_DEPTH   MAX_CONCURRENTc                  F    e Zd ZU dZded<   dZded<   dZded<   d	Zd
ed<   y)SubAgentTasku1   서브에이전트에 위임할 단일 태스크.strgoalN
str | Nonecontextlist[str] | Nonetoolsets2   r   max_iterations)__name__
__module____qualname____doc____annotations__r   r   r        J/home/jay/workspace/.worktrees/task-2117-dev1/utils/delegate_controller.pyr   r      s)    ;
IGZ!%H%NCr#   r   c                  ^    e Zd ZU dZ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<   y)SubAgentResultu!   서브에이전트 실행 결과.r   
task_indexr   statusNr   summaryg        floatduration_secondsr   	api_callserror)	r   r   r   r    r!   r)   r+   r,   r-   r"   r#   r$   r&   r&      s8    +OKGZ!e!IsE:r#   r&   c                  :    e Zd ZdZdd	dZd
dZddZddZddZy)DelegateControlleruL   서브에이전트 배치 실행 및 위임 깊이/동시 실행 수 제어.c                    || _         g | _        t        j                         | _        t        j
                         | _        y N)_depth_active_children	threadingLock_children_lockEvent_interrupted)selfparent_depths     r$   __init__zDelegateController.__init__-   s/    '+-'nn.%OO-r#   c                    | j                   t        k\  rddt         d| j                    fS | j                  5  t        | j                        t
        k\  rddt
         dfcddd       S 	 ddd       y# 1 sw Y   yxY w)u6   위임 가능 여부와 거부 이유를 반환한다.Fu   최대 위임 깊이(u   ) 초과: 현재 깊이=u   최대 동시 자식(u   ) 초과N)TOK)r2   r   r6   lenr3   r   r9   s    r$   can_delegatezDelegateController.can_delegate3   s    ;;)#1)<TUYU`U`Tabbb   	O4(()^; 5n5EXNN	O 	O;	O 	O s   (A44A=c                F    |sg S |D cg c]  }|t         vs| c}S c c}w )u2   BLOCKED_TOOLS에 포함된 도구를 제거한다.)r   )r9   r   ts      r$   filter_toolszDelegateController.filter_tools<   s%    I#>aq'=>>>s   c           
     *   |sg S ddl m} g }t        t        |      t              }t        |      5 }i }t        |      D ]  \  }}| j                  j                         r|j                  t        |dd             >t        |j                  |j                  | j                  |j                        xs d|j                         }	| j"                  5  | j$                  j                  |       ddd       |j'                  ||	| j(                  d	z   | j                  |      }
|||
<    t+        |      D ]  }
||
   }	 |
j-                         }| j"                  5  || j$                  v r| j$                  j3                  |       ddd       |j                  |       t4        j7                  d|j8                  |j:                  |j<                          	 ddd       |j?                  d        |S # 1 sw Y   xY w# t.        $ r!}t        |d
t1        |            }Y d}~d}~ww xY w# 1 sw Y   xY w# | j"                  5  || j$                  v r| j$                  j3                  |       ddd       w # 1 sw Y   w xY wxY w# 1 sw Y   xY w)uG   배치 서브에이전트를 ThreadPoolExecutor로 병렬 실행한다.r   )run_subagent)max_workersinterruptedz&Controller interrupted before dispatch)r'   r(   r-   N)r   r   r   r      r-   z SubAgent[%d] status=%s dur=%.2fsc                    | j                   S r1   )r'   )rs    r$   <lambda>z(DelegateController.run.<locals>.<lambda>r   s
    1<< r#   )key) utils.delegate_runnerrE   minr>   r   r   	enumerater8   is_setappendr&   r   r   r   rC   r   r   r6   r3   submitr2   r   result	Exceptionr   removeloggerdebugr'   r(   r+   sort)r9   tasksrE   resultsworkersexecutor
future_mapidxtaskpatchedfutresexcs                r$   runzDelegateController.runB   sU   I6(*c%j.1G4 $	s)+J&u- &	T$$++-NN&'*#0"J & LL!..t}}=E#'#6#6	 (( 6))0056 oolGT[[1_dN_N_ade"%
3+&. $J/ s o>**,C ,, >$"7"77 1188=> s#?QTQ[Q[]`]q]qrs3$	sL 	/0)6 6 ! Y(CsSVxXCY> >,, >$"7"77 1188=> > >A$	s $	ss   B"J	G40AJ	?HJ	*H.AJ	4G>9J		H+
H&!H:&H++H:.H73J	:J*I:1	J:J?JJ		Jc                x    | j                   j                          t        j                  d| j                         y)u8   모든 활성 자식에게 인터럽트를 전파한다.z2DelegateController: interrupt broadcast (depth=%d)N)r8   setrV   rW   r2   r?   s    r$   interrupt_childrenz%DelegateController.interrupt_childrenu   s'    I4;;Wr#   N)r   )r:   r   returnNone)rh   ztuple[bool, str])r   r   rh   z	list[str])rY   zlist[SubAgentTask]rh   zlist[SubAgentResult])rh   ri   )	r   r   r   r    r;   r@   rC   rd   rg   r"   r#   r$   r/   r/   *   s     V.?1fXr#   r/   )r    
__future__r   r4   concurrent.futuresr   r   dataclassesr   typingr   utils.loggerr   r   rV   	frozensetr   r!   r   r   r   r&   r/   r"   r#   r$   <module>rp      s    U "  ? !  #	H	 )*[ \~ \	3        NX NXr#   