
    iiNf              	       x   d Z ddlZddlZddlZddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZmZ 	 ddlmZ 	 ddlmZ dZ	 dd
lmZ ddlmZ dZ 	 ddl!m"Z# dZ$	 ddl%m&Z' dZ(dZ) e
d      Z*e*dz  dz  Z+e*dz  dz  Z,e*dz  dz  Z-e*dz  dz  Z.dZ/ddddddddddddd d!dd"Z0d#Z1g d"Z2d$efd%Z3d?d&ee   d'e4d(ee5   fd)Z6d*e5d+ed(efd,Zd@d-e7d(efd.Z8d?d*e5d+ed'e4d(e4fd/Z9d?d0ed'e4fd1Z: G d2 d3      Z;d(e5fd4Z<d5ed(e4fd6Z=d5ed(efd7Z>d5ed(efd8Z? G d9 d:      Z@d;eAd(efd<ZBd= ZCeDd>k(  r eC        yy# e$ r< ej&                  j)                  d e e
e      j.                               ddlmZ Y <w xY w# e$ r dZd	ZY Cw xY w# e$ r dZd	Z Y Dw xY w# e$ r dZ#d	Z$Y Kw xY w# e$ r dZ'd	Z(Y Rw xY w)Au7  
실시간 작업 오케스트레이터
3개 팀(dev1/dev2/dev3)에 작업을 동시 배치하고, 완료 감지 시 다음 작업을 즉시 배치.

Usage:
    python3 /home/jay/workspace/orchestrator.py --tasks-file tasks.json
    python3 /home/jay/workspace/orchestrator.py --tasks-file tasks.json --dry-run
    N)datetime)Path)DictListOptional)build_prompt)load_configTF)	INTERRUPT)InterruptFlag)update_memory)snapshot
6937032012z/home/jay/workspacememoryztask-timers.jsonreportseventszorchestrator.log   c38fb9955616e24du   헤르메스(Hermes)u   개발1팀장direct)keyleaderroletypef3e244a7f4f0d036u   오딘(Odin)u   개발2팀장a5dddf38a8c57168u   라(Ra)u   개발3팀장glm)z	dev1-teamz	dev2-teamz	dev3-teamc119085addb0f8b7msgc                 r   t        j                         j                  d      }d| d|  }t        |       	 t        j
                  j                  dd       t        t        dd      5 }|j                  |d	z          d
d
d
       y
# 1 sw Y   y
xY w# t        $ r}t        d|        Y d
}~y
d
}~ww xY w)u(   로그 파일과 stdout에 동시 출력%Y-%m-%d %H:%M:%S[z] Tparentsexist_okautf-8encoding
Nz[LOG WRITE ERROR] )
r   nowstrftimeprintLOG_FILEparentmkdiropenwrite	Exception)r   tslinefes        #/home/jay/workspace/orchestrator.pylogr7   d   s    		 	 !4	5Brd"SE?D	$K(dT:(C'2 	!aGGD4K 	! 	! 	! ("1#&''(s5   3B +B	 B 	BB B 	B6B11B6argsdry_runreturnc                    dg| z   }|r"t        ddj                  |              dddS 	 t        ddj                  |              t        j                  |ddd	      }|j                  j                         }|r	 t        j                  |      S |j                  dk7  rPt        d|j                   d|j                  j                                 d|j                  j                         dS ddiS # t        j                  $ r t        d
|        d|dcY S w xY w# t        j                  $ r t        d       dddcY S t        $ r&}t        d|        dt        |      dcY d}~S d}~ww xY w)u0   cokacdir 명령 실행. dry_run이면 출력만.cokacdirz
[DRY-RUN]  okT)statusr9   z[EXEC]    )capture_outputtexttimeoutz[WARN] non-JSON output: )r?   rawr   z[ERROR] returncode=z	, stderr=error)r?   messager?   z[ERROR] cokacdir timeout (30s)rC   z[ERROR] cokacdir exception: N)r7   join
subprocessrunstdoutstripjsonloadsJSONDecodeError
returncodestderrTimeoutExpiredr1   str)r8   r9   cmdresultrJ   r5   s         r6   run_cokacdirrU   r   sn   ,
Cj#()4006gchhsm_%&DtRP$$&7zz&)) !%f&7&7%8	&--BUBUBWAXYZ%&--2E2E2GHH$ '' 7.vh78"&v667 $$ 9,-!i88 6*1#./!c!f556sO   AD# ?C7 AD# 3D# 7&D D# D  D# ##E6E6E1+E61E6taskteam_idc           	      J    t        || d   | d   | j                  dd            S )u:   팀별 dispatch 프롬프트 생성 (공통 모듈 위임)iddesclevelnormal)_build_team_promptget)rV   rW   s     r6   r   r      s'    gtDz4<'S[A\]]    delay_secondsc                 l    ddl m} t        j                          ||       z   }|j                  d      S )u9   현재 시간 + delay_seconds 후의 절대 시간 반환r   )	timedelta)secondsr   )r   rb   r)   r*   )r`   rb   ts      r6   get_dispatch_timere      s*    "=99A::)**r_   c                 J   t        | |      }t        |   d   }t        d      }t        d| d    d| dt        |   d    d|        t	        d	|d
|dt
        d|dg	|      }|r)|j                  d      dk(  rt        d| d    d|        yt        d| d    d| d|        y)u   특정 팀에 작업 배치r      z[DISPATCH] rY       →  (r   z) at --cron--at--chat--key--oncer9   r?   r>   z[DISPATCH OK] Tz[DISPATCH FAIL] : F)r   TEAMSre   r7   rU   CHAT_IDr^   )rV   rW   r9   promptr   at_timerT   s          r6   dispatch_taskru      s    $(F
.
C#G+d4j\wir%.2J1K5QXPYZ[
	
 F &**X&$.nT$ZLgY78tDzl%y6(CDr_   rF   c                 J    d|  }t        d|dddt        dt        dg	|       y	)
u7   봇A(아누)를 통해 제이회장님께 상태 보고uq   당신은 아누(Anu), 비서실장입니다. 제이회장님께 다음 내용을 간결하게 보고하세요:

rj   rk   1mrl   rm   rn   ro   N)rU   rr   ANU_KEY)rF   r9   rs   s      r6   report_to_anury      sK     G  HO  GP  QF
	
 r_   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	EventWatcheru   events/ 디렉토리의 .done 파일을 감시하는 클래스.
    watchdog 사용 가능 시 inotify 기반, 아니면 폴링 fallback.c                     || _         t        j                         | _        d | _        d| _        	 ddlm} ddlm	} d| _        y # t        $ r
 d| _        Y y w xY w)NFr   FileSystemEventHandlerObserverT)callback	threadingEvent_stop_thread_use_watchdogwatchdog.eventsr~   watchdog.observersr   ImportError)selfr   r~   r   s       r6   __init__zEventWatcher.__init__   sP     __&
"	'>3!%D 	'!&D	's   A AAc                     t         j                  dd       | j                  rt        d       | j	                          yt        d       | j                          y)u   감시 시작Tr!   u1   [WATCHER] watchdog 기반 이벤트 감시 시작u=   [WATCHER] 폴링 기반 이벤트 감시 시작 (5초 간격)N)
EVENTS_DIRr.   r   r7   _start_watchdog_start_pollingr   s    r6   startzEventWatcher.start   sH    5CD  "OP!r_   c                 X   | j                   j                          | j                  r@t        | d      r4| j                  j                          | j                  j                          | j                  r8| j                  j                         r| j                  j                  d       yyy)u   감시 중지	_observer
   )rC   N)	r   setr   hasattrr   stoprG   r   is_aliver   s    r6   r   zEventWatcher.stop   st    

'$"<NN!NN!<<DLL113LLb) 4<r_   c                     ddl m} ddlm} |  G fdd|      } |       | _        | j                  j                   |       t        t              d       | j                  j                          y)	u   watchdog 기반 감시r   r}   r   c                       e Zd Z fdZy)5EventWatcher._start_watchdog.<locals>.DoneFileHandlerc                     |j                   s[|j                  j                  d      r?t        |j                        }t	        d|j
                          j                  |       y y y )N.doneu   [WATCHER] .done 파일 감지: )is_directorysrc_pathendswithr   r7   namer   )r   eventpathwatchers      r6   
on_createdz@EventWatcher._start_watchdog.<locals>.DoneFileHandler.on_created   sV    ))enn.E.Eg.N/D9$))EF$$T* /O)r_   N)__name__
__module____qualname__r   )r   s   r6   DoneFileHandlerr      s    +r_   r   F)	recursiveN)	r   r~   r   r   r   schedulerR   r   r   )r   r~   r   r   r   s       @r6   r   zEventWatcher._start_watchdog   sV    :/	+4 	+ " 13z?eTr_   c                     t        j                  | j                  d      | _        | j                  j	                          y)u   폴링 기반 감시 (fallback)T)targetdaemonN)r   Thread
_poll_loopr   r   r   s    r6   r   zEventWatcher._start_polling	  s*     ''ttLr_   c                    | j                   j                         s	 t        j                         rRt        j	                         D ];  }|j
                  dk(  st        d|j                          | j                  |       = | j                   j                  t               | j                   j                         syy# t        $ r}t        d|        Y d}~Xd}~ww xY w)u=   폴링 루프: EVENTS_DIR에서 .done 파일 주기적 확인r   u'   [WATCHER] .done 파일 감지(폴링): z[WATCHER ERROR] N)r   is_setr   existsiterdirsuffixr7   r   r   r1   waitPOLL_INTERVAL)r   r4   r5   s      r6   r   zEventWatcher._poll_loop  s    **##%,$$&'//1 -88w."I!&& RS MM!,- JJOOM* **##%  ,&qc*++,s   :B> +B> >	CCCN)
r   r   r   __doc__r   r   r   r   r   r    r_   r6   r{   r{      s&    M'	"*$
+r_   r{   c                      t         j                         sdi iS t        t         dd      5 } t        j                  |       cddd       S # 1 sw Y   yxY w)u   task-timers.json 로드tasksrr%   r&   N)
TIMER_FILEr   r/   rL   load)r4   s    r6   load_timersr     sF    }	j#	0 Ayy|  s   A

Atask_idc                     t               }|j                  di       j                  |       }|duxr |j                  d      dk(  S )u*   특정 작업이 완료되었는지 확인r   Nr?   	completedr   r^   r   timers	task_datas      r6   is_task_completedr   %  sB    ]F

7B'++G4ID KY]]8%<%KKr_   c                     t               }|j                  di       j                  |       }|r|j                  d      r|d   S y)u   작업 소요 시간 반환r   duration_humanu   알 수 없음r   r   s      r6   get_task_durationr   ,  sB    ]F

7B'++G4IY]]#34)**r_   c                     t         |  dz  }|j                         r*|j                  d      }t        |      dkD  r|dd dz   S |S y)u   보고서 파일 읽기.mdr%   r&   i  Nu   
... (이하 생략)u   (보고서 파일 없음))REPORTS_DIRr   	read_textlen)r   report_pathcontents      r6   read_reportr   6  sW    7)3/K'''9w<#4C=#:::&r_   c                       e Zd Zddee   defdZd Zdee	   fdZ
dede	fd	Zd
efdZd Zde	defdZde	dee   fdZdefdZdde	defdZd Zd Zd Zd Zy)Orchestratorr   r9   c                 f   || _         || _        g | _        i | _        g | _        t               | _        t        D ci c]  }|d c}| _        t        j                         | _        t        | _        t        rMt        G	 t               }|j!                  d      }|)t#        |      | _        t%        d| j                   d       t(        dz  dz  | _        t,        r	 | j*                  j/                  dd       y y c c}w # t&        $ r}t%        d|        Y d }~Xd }~ww xY w# t&        $ r Y y w xY w)	NTzorchestrator.poll_intervalz[CONFIG] poll_interval=zs (config_loader)u8   [CONFIG] config_loader 로드 실패, 기본값 사용: r   zorchestrator-snapshotsr!   )	all_tasksr9   pendingrunningr   r   _processing_tasks
TEAM_ORDERteam_availabler   r)   
start_timer   _poll_interval_CONFIG_LOADER_AVAILABLE_load_configr^   intr7   r1   	WORKSPACE_snapshot_dir_MEMORY_MANAGER_AVAILABLEr.   )r   r   r9   rd   cfg	_cfg_poll_es          r6   r   zOrchestrator.__init__D  s)    $&(*%'&)e0:;1q$w;",,. $1#(@U"nGG$@A	(*-i.D'1$2E2E1FFWXY
 '14LL$""(((E %# <  UNrdSTTU  s0   
C;>AD  D$  	D!	DD!$	D0/D0c                    t        | j                        | _        | j                  D cg c]  }|j                  d      s| }}|D ]?  }|d   }|t        v s| j
                  j                  |d      s.| j                  ||       A | j                  D cg c]  }|j                  d      r| }}t        |      D ](  }| j                         }|r| j                  ||       ( y yc c}w c c}w )uB   초기 작업 배치: preference 기반 + 빈 팀에 자동 배치team_preferenceFN)listr   r   r^   rq   r   	_dispatch_find_free_team)r   rd   preference_tasksrV   rW   no_pref_tasks	free_teams          r6   assign_initial_tasksz!Orchestrator.assign_initial_taskse  s     DNN+ (,||P!quu=N7OAPP$ 	.D,-G%D$7$7$;$;GU$KtW-	. %)LLQq>O8PQQ' 	D,,.ItY/	 Q Rs   C, C,C1/C1r:   c                 @    t         D ]  }| j                  |   s|c S  y)u*   사용 가능한 팀 반환 (순서대로)N)r   r   )r   rW   s     r6   r   zOrchestrator._find_free_team{  s)    ! 	G""7+	 r_   rV   rW   c                     t        ||| j                        }|r:| j                  j                  |       || j                  |<   d| j
                  |<   yy)u   작업 배치 실행ro   FN)ru   r9   r   remover   r   )r   rV   rW   successs       r6   r   zOrchestrator._dispatch  sL    gt||DLL%$(DLL!+0D( r_   	done_filec                 ^   |j                  d      }	 |j                  |       t        d|j                   d|j                          	 t        |dd	      5 }t        j                  |      }ddd       j                  dd      }|| j                  v rt        d| d       y| j                  j                  |       t        | j                  j                               D ]3  \  }}|d   |k(  st        d| d| d       | j                  ||        y t        d| d       y# t        $ r t        d|j                   d       Y yt
        $ r}t        d|        Y d}~yd}~ww xY w# 1 sw Y   xY w# t
        $ r%}t        d
|j                   d|        Y d}~yd}~ww xY w)u   이벤트 파일(.done) 처리z
.processedz[EVENT] rh   u)    이미 처리됨 (파일 없음, 무시)Nu   [EVENT ERROR] rename 실패: r   r%   r&   z[EVENT ERROR] u    읽기 실패: r    u"    이미 처리 중 (중복 무시)rY   u    완료 이벤트 수신 (팀: )uB    이벤트 수신했지만 실행 중인 작업에 없음 (무시))with_suffixrenamer7   r   FileNotFoundErrorr1   r/   rL   r   r^   r   addr   r   items_handle_completion)	r   r   processed_filer5   r4   
event_datar   rW   rV   s	            r6   handle_done_eventzOrchestrator.handle_done_event  s    #..|<	^,(9>>*%0C0C/DEF	ncG< *!YYq\
* ..B/ d,,,(7)#EFG""7+ "$,,"4"4"67 	hMGTDzW$hwi'FwiqQR''6		h (7)#efg; ! 	(9>>**STU 	/s34	
* * 	.!4!4 55EaSIJ	sM   6D* 
E> E1.E> *"E.E.E))E.1E;6E> >	F,F''F,c                     g }t        | j                  j                               D ])  \  }}|d   }t        |      s|j	                  ||f       + |D ]  \  }}| j                  ||        y)u?   완료된 작업 감지 (fallback용 - 기존 타이머 기반)rY   N)r   r   r   r   appendr   )r   completed_teamsrW   rV   r   s        r6   poll_completionszOrchestrator.poll_completions  st    !$,,"4"4"67 	8MGT4jG )&&7	8
 - 	3MGT##GT2	3r_   c                    |d   }t        |      }t        d| d| d| d       t        |      }t        d| d|dd	  d
       | j                  |= d| j                  |<   | j
                  j                  |       | j                  |      }d}|r2| j                  ||       d|d    d|d    d| }t        d|        nt        d| d       | d}t        d| d| dt        |   d    d| d| dt        | j
                         dt        | j                         dt        | j                         dt        | j                                y)u   작업 완료 처리rY   z[COMPLETED] z by 
    (소요: r   z	[REPORT] rp   Nd   z...Tr   u   다음 배치: ri   rZ   u   ) → z[NEXT] z[IDLE] u    대기 (남은 작업 없음)u"    대기 중 (남은 작업 없음)z[COMPLETION INFO] r   u   ), 소요: u
   , 다음: u   , 진행 현황: 완료 /u   , 진행 중 u	   , 대기 )r   r7   r   r   r   r   r  _get_next_taskr   rq   r   r   r   )r   rW   rV   r   durationreport	next_task	next_infos           r6   r   zOrchestrator._handle_completion  s   t*$W-l7)4y
8*AFG W%iy6$3<.45 LL!'+G$d# ''0		NN9g.))D/):"Yv=N<OvV]U^_I')%&''"@AB")#EFI 	 	gYbw9Q8R Sj
9+ 6%%(%8$93t~~;N:O Pdll+,Ic$,,6G5HJ	
r_   freed_team_idc                     | j                   D ]  }|j                  d      |k(  s|c S  | j                   D ]  }|j                  d      r|c S  | j                   r| j                   d   S y)u   다음 배치할 작업 결정r   r   N)r   r^   )r   r  rV   s      r6   r	  zOrchestrator._get_next_task  so     LL 	Dxx)*m;	
 LL 	D88-.	
 <<<<?"r_   c                 f    t        | j                        dk(  xr t        | j                        dk(  S )u   모든 작업 완료 여부r   )r   r   r   r   s    r6   is_all_donezOrchestrator.is_all_done  s)    4<< A%@#dll*;q*@@r_   labelc                    t         rt        y	 | j                  d| dz  }t        r't        !|j                         r	 t	        |d|        d| d	d
t        j                         j                          dt        | j                         dt        | j                         dt        | j                  j!                                d| j"                  D cg c]  }|d   	 c} g}dj%                  |      dz   }t        ||d      }|rt        d|j&                          |S # t        $ r}t        d|        Y d}~d}~ww xY wc c}w # t        $ r}t        d|        Y d}~yd}~ww xY w)u  현재 오케스트레이션 상태를 memory_manager로 스냅샷 저장.

        _MEMORY_MANAGER_AVAILABLE이 True일 때만 동작하며,
        False이면 조용히 False를 반환합니다.

        Args:
            label: 스냅샷 파일 레이블 (기본값: "auto").

        Returns:
            bool: 저장 성공 시 True, 실패 또는 미사용 시 False.
        NFzstate-r   zbefore-)r  u5   [CHECKPOINT] 체크포인트 저장 실패 (무시): z# Orchestrator State Snapshot []z- timestamp: z- total_tasks: z- completed: z- running: z- pending: rY   r(   i  )	max_charsu"   [MEMORY] 상태 스냅샷 저장: u+   [MEMORY] 스냅샷 저장 실패 (무시): )r   _update_memoryr   _CHECKPOINT_AVAILABLE_checkpoint_snapshotr   r1   r7   r   r)   	isoformatr   r   r   r   r   keysr   rG   r   )	r   r  snapshot_path_cerd   linesr   r>   r   s	            r6   save_state_snapshotz Orchestrator.save_state_snapshot  s}    )N,B	 ..6%1DDM$)=)ImNbNbNdW(w>OP 2%: 8 8 :;<!#dnn"5!67DNN 345d4<<#4#4#6789=1qw=>?E ii&-Gw$GB89K9K8LMNI ! WOPSuUVVW >  	=bTBC	sN   /E D* BE E&AE *	E3EE EE 	E4E//E4c           
         t        j                         | j                  z
  j                         }t	        |      }ddt        | j                         d| ddg}| j                  D ]1  }t        |d         }|j                  d|d    d|d	    d
| d       3 dj                  |      }t        d|        t        || j                         y)u   최종 종합 보고u&   ## 오케스트레이터 최종 보고u   - **총 작업 수**: u   - **전체 소요 시간**: r   u   ### 완료된 작업rY   z- rp   rZ   r  r   r(   z[FINAL REPORT]
ro   N)r   r)   r   total_secondsformat_durationr   r   r   r   r  rG   r7   ry   r9   )r   elapsedelapsed_humanr  rV   r
  
report_msgs          r6   final_reportzOrchestrator.final_report  s    <<>DOO3BBD'0 5$S%8$9:*=/:"
 NN 	QD(d4HLL2d4j\DL>H:QOP	Q YYu%
zl+,j$,,7r_   c           
         t        dt        | j                         dt        | j                         dt        | j                                | j                  j                         D ]   \  }}t        d| d|d    d|d    d	       " y
)u   현재 상태 출력u   [STATUS] 완료: u   , 진행 중: u
   , 대기: z  - rp   rY   ri   rZ   r   N)r7   r   r   r   r   r   )r   rW   rV   s      r6   print_statuszOrchestrator.print_status/  s    DNN 344Fs4<<GXFYYghklplxlxhygz{|!\\//1 	AMGT$wir$t*RV~Q?@	Ar_   c           	      4   t        d       t        d       t        dt        | j                                t        d| j                          t        d       | j	                          | j                          | j                         rt        d       y| j                          | j                          t        | j                        }|j                          	 | j                         st        r(t        "	 t        j                         rt        d       nb	 t!        j"                  | j$                         	 | j                          | j                          | j                          | j                         s|j1                          | j                         r2t        d       t        d       | j3                          t        d       yy# t        $ r Y w xY w# t&        $ r  t        $ r}t        d	|        Y d}~d}~ww xY w# t&        $ rm t        d
       t        dt)        | j*                  j-                                       t        d| j.                  D cg c]  }|d   	 nc c}w c}        Y w xY w# |j1                          w xY w)u'   메인 루프 - 이벤트 기반 감시z<============================================================u/   오케스트레이터 시작 (이벤트 기반)u   총 작업 수: z	Dry-run: u!   배치할 작업이 없습니다.N)r   u7   [INTERRUPT] InterruptFlag 감지 - 안전 종료 시작z[POLL ERROR] u/   [INTERRUPTED] KeyboardInterrupt - 안전 종료u     진행 중이던 작업: u     미완료 대기 작업: rY   u   모든 작업 완료!)r7   r   r   r9   r   r'  r  _process_existing_done_filesr  r{   r   r   _INTERRUPT_AVAILABLE
_INTERRUPTr   r1   timesleepr   KeyboardInterruptr   r   r  r   r   r%  )r   r   r5   rd   s       r6   rI   zOrchestrator.run5  s%   H=>s4>>2345i~&'H 	!!#34 	))+ (>(>?	&&('J,B%,,. YZ! / 

4../	-557))+%%'# &&(8 LLNM'(M / %  )   --s+,,- ! 	QAB-d4<<3D3D3F.G-HIJ-.M1qw.M.M-NOP	Q
 LLNs   H ;G !H <0G ,H 	GH GH H	1H?H H		H AJ#I0/J>J JJ Jc                     t         j                         syt        t         j                               D ]#  }|j                  dk(  s| j                  |       % y)u'   이미 존재하는 .done 파일 처리Nr   )r   r   sortedr   r   r   )r   r4   s     r6   r)  z)Orchestrator._process_existing_done_filest  sH      "
**,- 	*Axx7"&&q)	*r_   NF)auto)r   r   r   r   dictboolr   r   r   rR   r   r   r   r   r  r   r	  r  r  r%  r'  rI   r)  r   r_   r6   r   r   C  s    d4j 4 B,# 1d 1S 1$h4 $hL
3 
#  
T  
DC HTN $AT A% %$ %N8(A=~*r_   r   rc   c                     | dk  rt        |        dS | dk  r$t        | dz        }t        | dz        }| d| dS t        | dz        }t        | dz  dz        }| d| dS )u   소요 시간 포맷팅<   u   초i  u   분 u   시간 u   분)r   )rc   mshs       r6   r!  r!  }  s    |g,s##	4""D3$42%&GA3c""r_   c                  X   t        j                  d      } | j                  ddd       | j                  ddd	
       | j                         }t	        |j
                        }|j                         s$t        d| d       t        j                  d       t        |dd      5 }t        j                  |      }d d d        j                  dg       }|s t        d       t        j                  d       t        ||j                        }|j!                          y # 1 sw Y   exY w)Nu&   실시간 작업 오케스트레이터)descriptionz--tasks-fileTu    작업 목록 JSON 파일 경로)requiredhelpz	--dry-run
store_trueu'   실제 cokacdir 호출 없이 테스트)actionr=  zError: z
 not found   r   r%   r&   r   zError: No tasks found in filero   )argparseArgumentParseradd_argument
parse_argsr   
tasks_filer   r+   sysexitr/   rL   r   r^   r   r9   rI   )parserr8   
tasks_pathr4   datar   orchs          r6   mainrL    s    $$1YZF
<^_
L?hiD doo&J
|:./	j#	0 Ayy| HHWb!E-. t||4DHHJ s   &D  D)__main__r1  )rg   )Er   rA  rL   osrH   rF  r   r,  r   pathlibr   typingr   r   r   prompts.team_promptsr   r]   r   r   insertrR   __file__r-   utils.config_loaderr	   r   r   utils.interruptr
   r+  r   r*  utils.memory_managerr   r  r   utils.checkpointr   r  r  rr   r   r   r   r   r,   r   rq   rx   r   r7   r4  r3  rU   r   re   ru   ry   r{   r   r   r   r   r   floatr!  rL  r   r   r_   r6   <module>rY     s     	  
     ' 'HG%?#
!7-
&D $
"A  &'	!$66
("Y.!H,
x"44 "(	 " 	 "		* 4

(S 
(6tCy 64 6HTN 6:^t ^c ^c ^+S +# + s T d >3  (I+ I+ZT Ls Lt Ls s 	' 	' 	'w* w*t	#U #s #2 zF Y  HHHOOAs4>0012GGH  %L$%  !J !  &N %&  "!"sX   D8 E< F F F, 8=E98E9<	F	F		FF	F)(F),	F98F9